diff --git a/tests/test_scanner.py b/tests/test_scanner.py index 7e31a82..02869de 100644 --- a/tests/test_scanner.py +++ b/tests/test_scanner.py @@ -1,7 +1,8 @@ from pathlib import Path import pytest +import hashlib -from modules.scanner import listar_ficheiros +from modules.scanner import listar_ficheiros, listar_ficheiros_unicos def criar_estrutura_testes(base_dir): @@ -105,3 +106,86 @@ def test_listar_ficheiros_nomes_especiais(tmp_path): nomes = [Path(f).name for f in ficheiros] assert "ficheiro_éxamplo-çãõ.txt" in nomes + + +def criar_ficheiro(caminho, conteudo="conteudo"): + caminho.write_text(conteudo) + + +def sha256_do_texto(texto: str) -> str: + return hashlib.sha256(texto.encode()).hexdigest() + + +def test_listar_ficheiros_unicos_sem_duplicados(tmp_path): + # criar tres ficheiros diferentes + f1 = tmp_path / "a.txt" + f2 = tmp_path / "b.txt" + f3 = tmp_path / "c.txt" + criar_ficheiro(f1, "conteudo1") + criar_ficheiro(f2, "conteudo2") + criar_ficheiro(f3, "conteudo3") + + resultado = listar_ficheiros_unicos(str(tmp_path)) + assert isinstance(resultado, dict) + assert len(resultado) == 3 # cada ficheiro com assinatura unica + caminhos_listados = [c for caminhos in resultado.values() + for c in caminhos] + assert set(caminhos_listados) == {str(f1), str(f2), str(f3)} + + +def test_listar_ficheiros_unicos_com_duplicados(tmp_path): + # criar dois ficheiros iguais e um diferente + f1 = tmp_path / "x.txt" + f2 = tmp_path / "y.txt" + f3 = tmp_path / "z.txt" + criar_ficheiro(f1, "conteudo_duplicado") + criar_ficheiro(f2, "conteudo_duplicado") + criar_ficheiro(f3, "conteudo_unico") + + resultado = listar_ficheiros_unicos(str(tmp_path)) + assert isinstance(resultado, dict) + assert len(resultado) == 2 # apenas duas assinaturas unicas + + # verificar que os ficheiros duplicados estão no mesmo grupo + duplicados = [caminhos for caminhos in resultado.values() + if len(caminhos) > 1] + assert len(duplicados) == 1 + assert set(duplicados[0]) == {str(f1), str(f2)} + + +def test_listar_ficheiros_unicos_respeita_incluir_ocultos(tmp_path): + f1 = tmp_path / "normal.txt" + f2 = tmp_path / ".oculto.txt" + criar_ficheiro(f1, "visivel") + criar_ficheiro(f2, "oculto") + + # Testar com ocultos incluídos + resultado = listar_ficheiros_unicos(str(tmp_path), incluir_ocultos=True) + caminhos_listados = [c for caminhos in resultado.values() + for c in caminhos] + assert set(caminhos_listados) == {str(f1), str(f2)} + + # Testar com ocultos excluídos + resultado_sem_ocultos = listar_ficheiros_unicos( + str(tmp_path), incluir_ocultos=False + ) + caminhos_listados_sem = [ + c for caminhos in resultado_sem_ocultos.values() for c in caminhos + ] + assert str(f2) not in caminhos_listados_sem + assert str(f1) in caminhos_listados_sem + + +def test_listar_ficheiros_unicos_respeita_extensoes(tmp_path): + f1 = tmp_path / "a.txt" + f2 = tmp_path / "b.jpg" + criar_ficheiro(f1) + criar_ficheiro(f2) + + # Só listar ficheiros .txt + resultado = listar_ficheiros_unicos(str(tmp_path), extensoes=[".txt"]) + caminhos_listados = [c for caminhos in resultado.values() + for c in caminhos] + + assert str(f1) in caminhos_listados + assert str(f2) not in caminhos_listados