feature/integracion-panel-restore-targets
This commit is contained in:
77
tests/test_sql_manager_move.py
Normal file
77
tests/test_sql_manager_move.py
Normal file
@@ -0,0 +1,77 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user