78 lines
2.6 KiB
Python
78 lines
2.6 KiB
Python
"""
|
|
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
|