rag_template / tests /test_metadata.py
Guilherme Favaron
Sync: Complete project update (Phase 6) - API, Metadata, Eval, Docs
a686b1b
"""
Testes para sistema de metadados.
"""
import pytest
from datetime import datetime
from src.metadata import DocumentMetadata, MetadataManager
class TestDocumentMetadata:
"""Testes para classe DocumentMetadata."""
def test_create_metadata(self):
"""Testa criacao de metadata."""
metadata = DocumentMetadata(
document_type="PDF",
tags=["tech", "ai"],
author="John Doe"
)
assert metadata.document_type == "PDF"
assert metadata.tags == ["tech", "ai"]
assert metadata.author == "John Doe"
def test_to_dict(self):
"""Testa conversao para dicionario."""
metadata = DocumentMetadata(
document_type="PDF",
upload_date=datetime(2026, 1, 23, 10, 30),
tags=["tech"]
)
data = metadata.to_dict()
assert data['document_type'] == "PDF"
assert data['upload_date'] == "2026-01-23T10:30:00"
assert data['tags'] == ["tech"]
assert 'author' not in data # None nao deve aparecer
def test_from_dict(self):
"""Testa criacao a partir de dicionario."""
data = {
'document_type': 'TXT',
'upload_date': '2026-01-23T10:30:00',
'tags': ['doc', 'test']
}
metadata = DocumentMetadata.from_dict(data)
assert metadata.document_type == 'TXT'
assert metadata.upload_date == datetime(2026, 1, 23, 10, 30)
assert metadata.tags == ['doc', 'test']
def test_to_json(self):
"""Testa conversao para JSON."""
metadata = DocumentMetadata(
document_type="PDF",
tags=["tech"]
)
json_str = metadata.to_json()
assert '"document_type": "PDF"' in json_str
assert '"tags": ["tech"]' in json_str
def test_from_json(self):
"""Testa criacao a partir de JSON."""
json_str = '{"document_type": "PDF", "tags": ["tech"], "author": "Test"}'
metadata = DocumentMetadata.from_json(json_str)
assert metadata.document_type == "PDF"
assert metadata.tags == ["tech"]
assert metadata.author == "Test"
class TestMetadataManager:
"""Testes para classe MetadataManager."""
@pytest.fixture
def mock_db(self, mocker):
"""Mock do DatabaseManager."""
return mocker.Mock()
@pytest.fixture
def manager(self, mock_db):
"""Instancia de MetadataManager."""
return MetadataManager(mock_db)
def test_validate_metadata_valid(self, manager):
"""Testa validacao de metadata valido."""
metadata = DocumentMetadata(
document_type="PDF",
security_level="public",
tags=["tech", "ai"]
)
assert manager.validate_metadata(metadata) is True
def test_validate_metadata_invalid_type(self, manager):
"""Testa validacao com tipo invalido."""
metadata = DocumentMetadata(
document_type="INVALID"
)
with pytest.raises(ValueError, match="document_type invalido"):
manager.validate_metadata(metadata)
def test_validate_metadata_invalid_security(self, manager):
"""Testa validacao com security_level invalido."""
metadata = DocumentMetadata(
security_level="top_secret" # Nao existe
)
with pytest.raises(ValueError, match="security_level invalido"):
manager.validate_metadata(metadata)
def test_validate_metadata_invalid_tags(self, manager):
"""Testa validacao com tags invalidas."""
metadata = DocumentMetadata(
tags="not_a_list" # Deve ser lista
)
with pytest.raises(ValueError, match="tags deve ser uma lista"):
manager.validate_metadata(metadata)
def test_build_filters_dict(self):
"""Testa construcao de dicionario de filtros."""
from ui.filters_component import build_filters_dict
filters = build_filters_dict(
doc_type="PDF",
security_level="public",
author="John",
department=None,
tags=["tech", "ai"],
date_from="2026-01-01",
date_to="2026-12-31"
)
assert filters['document_type'] == "PDF"
assert filters['security_level'] == "public"
assert filters['author'] == "John"
assert 'department' not in filters
assert filters['tags'] == ["tech", "ai"]
assert filters['upload_date_from'] == "2026-01-01"
assert filters['upload_date_to'] == "2026-12-31"
def test_build_filters_dict_invalid_date(self):
"""Testa que datas invalidas sao ignoradas."""
from ui.filters_component import build_filters_dict
filters = build_filters_dict(
doc_type="PDF",
security_level=None,
author=None,
department=None,
tags=None,
date_from="invalid-date",
date_to="2026-99-99"
)
assert 'upload_date_from' not in filters
assert 'upload_date_to' not in filters
def test_format_active_filters(self):
"""Testa formatacao de filtros ativos."""
from ui.filters_component import format_active_filters
filters = {
'document_type': 'PDF',
'tags': ['tech', 'ai'],
'author': 'John'
}
formatted = format_active_filters(filters)
assert '**Filtros Ativos:**' in formatted
assert 'Tipo: `PDF`' in formatted
assert 'Tags: `tech`, `ai`' in formatted
assert 'Autor: `John`' in formatted
def test_format_active_filters_empty(self):
"""Testa formatacao com filtros vazios."""
from ui.filters_component import format_active_filters
formatted = format_active_filters({})
assert formatted == "Nenhum filtro ativo"
def test_clear_all_filters(self):
"""Testa limpeza de todos os filtros."""
from ui.filters_component import clear_all_filters
result = clear_all_filters()
assert result[0] is None # doc_type
assert result[1] is None # security_level
assert result[2] is None # author
assert result[3] is None # department
assert result[4] is None # tags
assert result[5] == "" # date_from
assert result[6] == "" # date_to
assert result[7] == "Nenhum filtro ativo"
if __name__ == "__main__":
pytest.main([__file__, "-v"])