139 lines
4.1 KiB
Python
139 lines
4.1 KiB
Python
"""
|
|
Pruebas de enrutamiento automático (restore_local | forward) en RestoreWorker.
|
|
"""
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from app.engine.restore_worker import RestoreDeferred, RestoreWorker
|
|
|
|
|
|
@pytest.fixture
|
|
def base_config(tmp_path):
|
|
return {
|
|
"paths": {
|
|
"input_folder": str(tmp_path / "in"),
|
|
"processed_folder": str(tmp_path / "processed"),
|
|
"failed_folder": str(tmp_path / "failed"),
|
|
"extract_folder": str(tmp_path / "extract"),
|
|
"data_sql_folder": str(tmp_path / "data"),
|
|
"seven_zip_exe": "C:\\Program Files\\7-Zip\\7z.exe",
|
|
},
|
|
"sql": {"server": "localhost", "use_windows_auth": True},
|
|
"timeouts": {"extract_minutes": 30, "restore_minutes": 60},
|
|
"panel": {
|
|
"api_url": "http://panel:3000",
|
|
"api_token": "tok",
|
|
"instance_key": "Alfa",
|
|
},
|
|
}
|
|
|
|
|
|
def test_collect_zip_paths_simple(tmp_path, base_config):
|
|
z = tmp_path / "in" / "NODO.ZIP"
|
|
z.parent.mkdir(parents=True)
|
|
z.write_bytes(b"z")
|
|
worker = RestoreWorker("job-1", base_config)
|
|
paths = worker._collect_zip_paths(str(z))
|
|
assert paths == [str(z)]
|
|
|
|
|
|
def test_collect_zip_paths_multipart(tmp_path, base_config):
|
|
folder = tmp_path / "in"
|
|
folder.mkdir(parents=True)
|
|
p1 = folder / "NODO.ZIP.001"
|
|
p2 = folder / "NODO.ZIP.002"
|
|
p1.write_bytes(b"1")
|
|
p2.write_bytes(b"2")
|
|
worker = RestoreWorker("job-1", base_config)
|
|
paths = worker._collect_zip_paths(str(p1))
|
|
assert len(paths) == 2
|
|
assert all(Path(p).exists() for p in paths)
|
|
|
|
|
|
def test_resolve_route_envia_instance_key(monkeypatch, base_config):
|
|
worker = RestoreWorker("job-1", base_config)
|
|
captured = {}
|
|
|
|
def fake_resolve(api_url, api_token, filename, instance_key=None):
|
|
captured["instance_key"] = instance_key
|
|
return {
|
|
"action": "restore_local",
|
|
"db_name": "DB1",
|
|
"node_key": "NODO",
|
|
"target": {
|
|
"id": 1,
|
|
"name": "Alfa",
|
|
"server": "localhost",
|
|
"username": "sa",
|
|
"password": "x",
|
|
"data_folder": "C:\\Data",
|
|
},
|
|
}
|
|
|
|
monkeypatch.setattr(
|
|
"app.engine.restore_worker.panel_client.resolve_route", fake_resolve
|
|
)
|
|
monkeypatch.setattr(
|
|
"app.engine.restore_worker.JobRepository.update_node_and_db", lambda *a, **k: None
|
|
)
|
|
|
|
class FakeJob:
|
|
source_name = "NODO.ZIP"
|
|
source_path = "C:\\in\\NODO.ZIP"
|
|
|
|
route = worker._resolve_route(FakeJob())
|
|
assert route["action"] == "restore_local"
|
|
assert captured["instance_key"] == "Alfa"
|
|
|
|
|
|
def test_resolve_route_sin_instance_key_diferido(base_config):
|
|
base_config["panel"]["instance_key"] = ""
|
|
worker = RestoreWorker("job-1", base_config)
|
|
|
|
class FakeJob:
|
|
source_name = "NODO.ZIP"
|
|
source_path = "C:\\in\\NODO.ZIP"
|
|
|
|
with pytest.raises(RestoreDeferred, match="instance_key"):
|
|
worker._resolve_route(FakeJob())
|
|
|
|
|
|
def test_legacy_mode_no_cambia_comportamiento(monkeypatch, base_config):
|
|
base_config["panel"]["mode"] = "orchestrator"
|
|
worker = RestoreWorker("job-1", base_config)
|
|
assert worker._legacy_panel_mode() == "orchestrator"
|
|
|
|
captured = {}
|
|
|
|
def fake_resolve(api_url, api_token, filename, instance_key=None):
|
|
captured["instance_key"] = instance_key
|
|
return {
|
|
"action": "forward",
|
|
"db_name": "DB1",
|
|
"node_key": "NODO",
|
|
"target": {
|
|
"id": 2,
|
|
"name": "Omega",
|
|
"ssh_host": "h",
|
|
"ssh_username": "u",
|
|
"ssh_password": "p",
|
|
"input_folder": "D:\\In",
|
|
},
|
|
}
|
|
|
|
monkeypatch.setattr(
|
|
"app.engine.restore_worker.panel_client.resolve_route", fake_resolve
|
|
)
|
|
monkeypatch.setattr(
|
|
"app.engine.restore_worker.JobRepository.update_node_and_db", lambda *a, **k: None
|
|
)
|
|
|
|
class FakeJob:
|
|
source_name = "NODO.ZIP"
|
|
source_path = "C:\\in\\NODO.ZIP"
|
|
|
|
route = worker._resolve_route(FakeJob())
|
|
assert route["action"] == "forward"
|
|
assert captured["instance_key"] == "Alfa"
|