""" 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"