""" Pruebas de _build_move_clauses: nombres únicos por archivo lógico (G4), evitando colisiones con múltiples data files / logs y sin descartar otros tipos. """ from app.sql.sql_manager import SQLServerManager, LogicalFile def _paths(clauses): """Extrae las rutas destino (lo que va tras 'TO N') de cada cláusula MOVE.""" out = [] for c in clauses: # MOVE N'logico' TO N'ruta' ruta = c.split("TO N'")[1].rstrip("'") out.append(ruta) return out def test_un_data_un_log(): files = [ LogicalFile("EMP_dat", "X.mdf", "D"), LogicalFile("EMP_log", "X.ldf", "L"), ] clauses = SQLServerManager._build_move_clauses("EMP", "C:\\D", files) rutas = _paths(clauses) assert rutas == ["C:\\D\\EMP.mdf", "C:\\D\\EMP_log.ldf"] def test_multiples_data_files_sin_colision(): files = [ LogicalFile("d1", "a.mdf", "D"), LogicalFile("d2", "b.ndf", "D"), LogicalFile("d3", "c.ndf", "D"), LogicalFile("l1", "a.ldf", "L"), ] clauses = SQLServerManager._build_move_clauses("EMP", "C:\\D", files) rutas = _paths(clauses) assert rutas == [ "C:\\D\\EMP.mdf", "C:\\D\\EMP_1.ndf", "C:\\D\\EMP_2.ndf", "C:\\D\\EMP_log.ldf", ] # No debe haber rutas duplicadas (la causa del bug original). assert len(set(rutas)) == len(rutas) def test_multiples_logs_sin_colision(): files = [ LogicalFile("d1", "a.mdf", "D"), LogicalFile("l1", "a.ldf", "L"), LogicalFile("l2", "b.ldf", "L"), ] rutas = _paths(SQLServerManager._build_move_clauses("EMP", "C:\\D", files)) assert rutas == ["C:\\D\\EMP.mdf", "C:\\D\\EMP_log.ldf", "C:\\D\\EMP_log_1.ldf"] assert len(set(rutas)) == len(rutas) def test_tipo_no_data_ni_log_no_se_descarta(): # Tipos como FILESTREAM/full-text (p. ej. 'S') deben moverse, no ignorarse. files = [ LogicalFile("d1", "a.mdf", "D"), LogicalFile("l1", "a.ldf", "L"), LogicalFile("fs stream!", "fs", "S"), ] clauses = SQLServerManager._build_move_clauses("EMP", "C:\\D", files) assert len(clauses) == 3 # ninguno descartado rutas = _paths(clauses) # El nombre lógico se sanea (no alfanumérico → '_'). assert "C:\\D\\EMP_fs_stream_" in rutas[2] assert len(set(rutas)) == len(rutas) def test_cada_archivo_logico_genera_una_clausula(): files = [LogicalFile(f"f{i}", f"f{i}", "D") for i in range(5)] clauses = SQLServerManager._build_move_clauses("DB", "C:\\D", files) assert len(clauses) == 5 assert len(set(_paths(clauses))) == 5 # todas únicas