from types import SimpleNamespace from core.citations import ( build_missing_citations_block, extract_citations_from_context, is_smalltalk_message, resposta_indica_sem_informacao, ) def test_extracts_pdf_citations_from_context_headers_and_deduplicates(): chunks = [ "[CABE\u00c7ALHO FONTE: redes.pdf:2]\nConteudo A", "[CABE\u00c7ALHO FONTE: redes.pdf:2]\nConteudo repetido", "[CABE\u00c7ALHO FONTE: storage.pdf:7]\nConteudo B", ] citations = extract_citations_from_context(chunks) assert [citation.token for citation in citations] == [ "[redes.pdf:2]", "[storage.pdf:7]", ] def test_extracts_pdf_citations_from_document_metadata(): doc = SimpleNamespace( page_content="Sem cabecalho", metadata={"source": "/tmp/material.pdf", "page_number": 3, "chunk_id": "abc"}, ) citations = extract_citations_from_context([doc]) assert len(citations) == 1 assert citations[0].filename == "material.pdf" assert citations[0].page == 3 assert citations[0].chunk_id == "abc" def test_build_missing_citations_block_ignores_already_present_tokens(): citations = extract_citations_from_context([ "[CABE\u00c7ALHO FONTE: redes.pdf:2]\nConteudo A", "[CABE\u00c7ALHO FONTE: storage.pdf:7]\nConteudo B", ]) block = build_missing_citations_block("Resposta com [redes.pdf:2]", citations) assert block == "\n\nFontes:\n[storage.pdf:7]" def test_smalltalk_is_detected_without_matching_real_questions(): assert is_smalltalk_message("Ol\u00e1!") assert is_smalltalk_message("tudo bem?") assert is_smalltalk_message("obrigado") assert not is_smalltalk_message("Ola, quais sao as quotas no storage?") assert not is_smalltalk_message("Explica o plano de storage do TUTS") def test_detects_lack_of_information(): assert resposta_indica_sem_informacao("Não há informações disponíveis nos materiais sobre X") assert resposta_indica_sem_informacao("Não encontrei nos materiais") assert resposta_indica_sem_informacao("Não foi encontrado") assert resposta_indica_sem_informacao("Não existe informação suficiente") assert resposta_indica_sem_informacao("Os materiais não indicam isso.") assert not resposta_indica_sem_informacao("O plano de storage do TUTS oferece 10GB de cota.")