You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
4.0 KiB
118 lines
4.0 KiB
import pytest
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_metadata_export_returns_core_tables(api_client) -> None:
|
|
response = await api_client.get("/api/exports/metadata")
|
|
|
|
assert response.status_code == 200
|
|
payload = response.json()
|
|
assert "exported_at" in payload
|
|
assert "users" in payload["data"]
|
|
assert "directories" in payload["data"]
|
|
assert "backends" in payload["data"]
|
|
assert isinstance(payload["data"]["users"], list)
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_metadata_validate_reports_invalid_snapshot(api_client) -> None:
|
|
response = await api_client.post(
|
|
"/api/exports/metadata/validate",
|
|
json={"data": {"users": [], "directories": []}},
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
payload = response.json()
|
|
assert payload["ok"] is False
|
|
assert any("root directory" in issue for issue in payload["issues"])
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_restore_plan_returns_validation_token_for_valid_snapshot(api_client) -> None:
|
|
export_response = await api_client.get("/api/exports/metadata")
|
|
snapshot = export_response.json()["data"]
|
|
|
|
response = await api_client.post(
|
|
"/api/exports/metadata/restore-plan",
|
|
json={"data": snapshot},
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
payload = response.json()
|
|
assert payload["ok"] is True
|
|
assert payload["validation_token"]
|
|
assert payload["summary"]["users"] >= 1
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_metadata_integrity_reports_ok_for_clean_runtime(api_client) -> None:
|
|
response = await api_client.get("/api/exports/metadata/integrity")
|
|
|
|
assert response.status_code == 200
|
|
assert response.json()["ok"] is True
|
|
assert response.json()["issues"] == []
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_metadata_import_restores_exported_snapshot(api_client, raw_api_client) -> None:
|
|
export_response = await api_client.get("/api/exports/metadata")
|
|
assert export_response.status_code == 200
|
|
snapshot = export_response.json()["data"]
|
|
plan_response = await api_client.post(
|
|
"/api/exports/metadata/restore-plan",
|
|
json={"data": snapshot},
|
|
)
|
|
validation_token = plan_response.json()["validation_token"]
|
|
|
|
import_response = await api_client.post(
|
|
"/api/exports/metadata/import",
|
|
json={"data": snapshot, "confirm_replace": True, "validation_token": validation_token},
|
|
)
|
|
assert import_response.status_code == 200
|
|
assert "users" in import_response.json()["imported_tables"]
|
|
assert "reconcile_all_files" in import_response.json()["scheduled_jobs"]
|
|
|
|
login_response = await raw_api_client.post(
|
|
"/api/auth/login",
|
|
json={"username": "admin", "password": "changeme-iron"},
|
|
)
|
|
assert login_response.status_code == 200
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_metadata_import_rejects_invalid_snapshot(api_client) -> None:
|
|
response = await api_client.post(
|
|
"/api/exports/metadata/import",
|
|
json={"data": {"users": [], "directories": []}, "confirm_replace": True, "validation_token": "bad"},
|
|
)
|
|
|
|
assert response.status_code == 400
|
|
assert response.json()["error"]["code"] == "validation_error"
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_metadata_import_requires_explicit_confirmation(api_client) -> None:
|
|
export_response = await api_client.get("/api/exports/metadata")
|
|
snapshot = export_response.json()["data"]
|
|
|
|
response = await api_client.post(
|
|
"/api/exports/metadata/import",
|
|
json={"data": snapshot},
|
|
)
|
|
|
|
assert response.status_code == 400
|
|
assert response.json()["error"]["code"] == "validation_error"
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_metadata_import_requires_current_validation_token(api_client) -> None:
|
|
export_response = await api_client.get("/api/exports/metadata")
|
|
snapshot = export_response.json()["data"]
|
|
|
|
response = await api_client.post(
|
|
"/api/exports/metadata/import",
|
|
json={"data": snapshot, "confirm_replace": True, "validation_token": "stale-token"},
|
|
)
|
|
|
|
assert response.status_code == 400
|
|
assert response.json()["error"]["code"] == "validation_error"
|
|
|