feat: expand import ingestion workflow with staging previews, transactional commits, and new API tests
This commit is contained in:
70
tests/test_import_api.py
Normal file
70
tests/test_import_api.py
Normal file
@@ -0,0 +1,70 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
from models.project import MiningOperationType, Project
|
||||
from models.scenario import Scenario, ScenarioStatus
|
||||
|
||||
|
||||
def test_project_import_preview_and_commit_flow(
|
||||
client: TestClient,
|
||||
unit_of_work_factory,
|
||||
) -> None:
|
||||
with unit_of_work_factory() as uow:
|
||||
assert uow.projects is not None
|
||||
existing = Project(
|
||||
name="Existing Project",
|
||||
location="Chile",
|
||||
operation_type=MiningOperationType.OPEN_PIT,
|
||||
)
|
||||
uow.projects.create(existing)
|
||||
|
||||
csv_content = (
|
||||
"name,location,operation_type\n"
|
||||
"Existing Project,Peru,underground\n"
|
||||
"New Project,Canada,open pit\n"
|
||||
)
|
||||
|
||||
preview_response = client.post(
|
||||
"/imports/projects/preview",
|
||||
files={"file": ("projects.csv", csv_content, "text/csv")},
|
||||
)
|
||||
assert preview_response.status_code == 200
|
||||
preview_data = preview_response.json()
|
||||
assert preview_data["summary"]["accepted"] == 2
|
||||
token = preview_data["stage_token"]
|
||||
assert token
|
||||
|
||||
commit_response = client.post(
|
||||
"/imports/projects/commit",
|
||||
json={"token": token},
|
||||
)
|
||||
assert commit_response.status_code == 200
|
||||
commit_data = commit_response.json()
|
||||
assert commit_data["summary"] == {"created": 1, "updated": 1}
|
||||
|
||||
with unit_of_work_factory() as uow:
|
||||
assert uow.projects is not None
|
||||
projects = {project.name: project for project in uow.projects.list()}
|
||||
assert "Existing Project" in projects and "New Project" in projects
|
||||
assert (
|
||||
projects["Existing Project"].operation_type
|
||||
== MiningOperationType.UNDERGROUND
|
||||
)
|
||||
|
||||
repeat_commit = client.post(
|
||||
"/imports/projects/commit",
|
||||
json={"token": token},
|
||||
)
|
||||
assert repeat_commit.status_code == 404
|
||||
|
||||
|
||||
def test_scenario_import_commit_invalid_token_returns_404(
|
||||
client: TestClient,
|
||||
) -> None:
|
||||
response = client.post(
|
||||
"/imports/scenarios/commit",
|
||||
json={"token": "missing-token"},
|
||||
)
|
||||
assert response.status_code == 404
|
||||
assert "Unknown scenario import token" in response.json()["detail"]
|
||||
Reference in New Issue
Block a user