fix: typer exit codes, JWT 7d expiry, shared test fixtures, AdminTab query, mantine 9.6.3
This commit is contained in:
parent
03af41e837
commit
696db34c90
16 changed files with 210 additions and 251 deletions
|
|
@ -9,7 +9,7 @@ from pathlib import Path
|
|||
import pytest
|
||||
|
||||
from app.flows import store, sync
|
||||
from app.flows.lfx_client import LfxClient, LfxNotFound
|
||||
from app.flows.lfx_client import LfxNotFound
|
||||
from app.flows.schemas import SyncReport
|
||||
from app.flows.sync import lfx_id_for
|
||||
from app.settings import settings
|
||||
|
|
@ -22,19 +22,9 @@ def _seed_dir(tmp_path: Path, name: str = "simple_rule.json") -> Path:
|
|||
return tmp_path
|
||||
|
||||
|
||||
def load_fixture(name: str) -> dict:
|
||||
"""Alias of the shared conftest helper (kept for call-site stability)."""
|
||||
return load_flow_fixture(name)
|
||||
|
||||
|
||||
def _lfx() -> LfxClient:
|
||||
"""Alias of the shared lfx_client fixture logic (call-site stability)."""
|
||||
return LfxClient(settings.lfx_url, api_key=settings.lfx_api_key or None)
|
||||
|
||||
|
||||
async def test_sync_adds_new_flow(session, lfx_server, tmp_path):
|
||||
async def test_sync_adds_new_flow(session, lfx_server, lfx_client, tmp_path):
|
||||
_seed_dir(tmp_path)
|
||||
report = await sync.sync_from_directory(session, _lfx(), tmp_path)
|
||||
report = await sync.sync_from_directory(session, lfx_client, tmp_path)
|
||||
assert report.added == ["simple_rule"]
|
||||
assert report.errors == {}
|
||||
definition = store.get_definition_by_source_path(session, "simple_rule.json")
|
||||
|
|
@ -46,83 +36,83 @@ async def test_sync_adds_new_flow(session, lfx_server, tmp_path):
|
|||
assert versions[0].deployed_at is not None
|
||||
|
||||
|
||||
async def test_sync_skips_ignored_files(session, lfx_server, tmp_path):
|
||||
async def test_sync_skips_ignored_files(session, lfx_server, lfx_client, tmp_path):
|
||||
_seed_dir(tmp_path)
|
||||
(tmp_path / ".flowsignore").write_text("simple_rule\n", encoding="utf-8")
|
||||
report = await sync.sync_from_directory(session, _lfx(), tmp_path)
|
||||
report = await sync.sync_from_directory(session, lfx_client, tmp_path)
|
||||
assert report.added == [] and report.errors == {}
|
||||
assert store.get_definition_by_source_path(session, "simple_rule.json") is None
|
||||
|
||||
|
||||
async def test_sync_skips_unchanged(session, lfx_server, tmp_path):
|
||||
async def test_sync_skips_unchanged(session, lfx_server, lfx_client, tmp_path):
|
||||
_seed_dir(tmp_path)
|
||||
first = await sync.sync_from_directory(session, _lfx(), tmp_path)
|
||||
first = await sync.sync_from_directory(session, lfx_client, tmp_path)
|
||||
assert first.added == ["simple_rule"]
|
||||
second = await sync.sync_from_directory(session, _lfx(), tmp_path)
|
||||
second = await sync.sync_from_directory(session, lfx_client, tmp_path)
|
||||
assert second.skipped == ["simple_rule"]
|
||||
assert second.added == second.updated == []
|
||||
definition = store.get_definition_by_source_path(session, "simple_rule.json")
|
||||
assert len(store.list_versions(session, definition.id)) == 1
|
||||
|
||||
|
||||
async def test_sync_updates_on_change_and_replaces_lfx(session, lfx_server, tmp_path):
|
||||
async def test_sync_updates_on_change_and_replaces_lfx(session, lfx_server, lfx_client, tmp_path):
|
||||
_seed_dir(tmp_path)
|
||||
await sync.sync_from_directory(session, _lfx(), tmp_path)
|
||||
await sync.sync_from_directory(session, lfx_client, tmp_path)
|
||||
definition = store.get_definition_by_source_path(session, "simple_rule.json")
|
||||
old_lfx_id = lfx_id_for(definition.id, 1)
|
||||
|
||||
doc = load_fixture("simple_rule.json")
|
||||
doc = load_flow_fixture("simple_rule.json")
|
||||
doc["description"] = "geaendert"
|
||||
(tmp_path / "simple_rule.json").write_text(json.dumps(doc))
|
||||
|
||||
report = await sync.sync_from_directory(session, _lfx(), tmp_path)
|
||||
report = await sync.sync_from_directory(session, lfx_client, tmp_path)
|
||||
assert report.updated == ["simple_rule"]
|
||||
versions = store.list_versions(session, definition.id)
|
||||
assert [v.version_no for v in versions] == [1, 2]
|
||||
assert versions[1].lfx_flow_id == lfx_id_for(definition.id, 2)
|
||||
# Superseded LFX registration is gone.
|
||||
with pytest.raises(LfxNotFound):
|
||||
await _lfx().flow_info(old_lfx_id)
|
||||
await lfx_client.flow_info(old_lfx_id)
|
||||
|
||||
|
||||
async def test_sync_deletes_missing_file_with_cascade(session, lfx_server, tmp_path):
|
||||
async def test_sync_deletes_missing_file_with_cascade(session, lfx_server, lfx_client, tmp_path):
|
||||
_seed_dir(tmp_path)
|
||||
await sync.sync_from_directory(session, _lfx(), tmp_path)
|
||||
await sync.sync_from_directory(session, lfx_client, tmp_path)
|
||||
definition = store.get_definition_by_source_path(session, "simple_rule.json")
|
||||
version = store.list_versions(session, definition.id)[0]
|
||||
run = store.create_run(session, version, input={"a": 1}, tenant_id="default")
|
||||
lfx_id = lfx_id_for(definition.id, 1)
|
||||
|
||||
(tmp_path / "simple_rule.json").unlink()
|
||||
report = await sync.sync_from_directory(session, _lfx(), tmp_path)
|
||||
report = await sync.sync_from_directory(session, lfx_client, tmp_path)
|
||||
assert report.deleted == ["simple_rule"]
|
||||
assert store.get_definition_by_source_path(session, "simple_rule.json") is None
|
||||
with pytest.raises(store.NotFoundError):
|
||||
store.get_run(session, run.id)
|
||||
with pytest.raises(LfxNotFound):
|
||||
await _lfx().flow_info(lfx_id)
|
||||
await lfx_client.flow_info(lfx_id)
|
||||
|
||||
|
||||
async def test_sync_reports_invalid_json(session, lfx_server, tmp_path):
|
||||
async def test_sync_reports_invalid_json(session, lfx_server, lfx_client, tmp_path):
|
||||
(tmp_path / "kaputt.json").write_text("{kein json")
|
||||
report = await sync.sync_from_directory(session, _lfx(), tmp_path)
|
||||
report = await sync.sync_from_directory(session, lfx_client, tmp_path)
|
||||
assert "kaputt.json" in report.errors
|
||||
assert report.added == []
|
||||
assert store.list_definitions(session) == []
|
||||
|
||||
|
||||
async def test_sync_missing_dir_raises(session, lfx_server, tmp_path):
|
||||
async def test_sync_missing_dir_raises(session, lfx_server, lfx_client, tmp_path):
|
||||
with pytest.raises(FileNotFoundError):
|
||||
await sync.sync_from_directory(session, _lfx(), tmp_path / "gibts-nicht")
|
||||
await sync.sync_from_directory(session, lfx_client, tmp_path / "gibts-nicht")
|
||||
|
||||
|
||||
async def test_sync_rename_updates_definition_name(session, lfx_server, tmp_path):
|
||||
async def test_sync_rename_updates_definition_name(session, lfx_server, lfx_client, tmp_path):
|
||||
_seed_dir(tmp_path)
|
||||
await sync.sync_from_directory(session, _lfx(), tmp_path)
|
||||
doc = load_fixture("simple_rule.json")
|
||||
await sync.sync_from_directory(session, lfx_client, tmp_path)
|
||||
doc = load_flow_fixture("simple_rule.json")
|
||||
doc["name"] = "umbenannt"
|
||||
(tmp_path / "simple_rule.json").write_text(json.dumps(doc))
|
||||
report = await sync.sync_from_directory(session, _lfx(), tmp_path)
|
||||
report = await sync.sync_from_directory(session, lfx_client, tmp_path)
|
||||
assert report.updated == ["simple_rule"]
|
||||
definition = store.get_definition_by_source_path(session, "simple_rule.json")
|
||||
assert definition.name == "umbenannt"
|
||||
|
|
@ -146,11 +136,6 @@ async def test_sync_endpoint_returns_report(
|
|||
assert response.json()["skipped"] == ["simple_rule"]
|
||||
|
||||
|
||||
def _langflow_doc(name: str, langflow_id: str) -> dict:
|
||||
"""Alias of the shared conftest helper (kept for call-site stability)."""
|
||||
return langflow_export_doc(name, langflow_id)
|
||||
|
||||
|
||||
async def test_sync_endpoint_pulls_from_langflow_then_syncs(
|
||||
client, lfx_server, tmp_path, monkeypatch, login, override_langflow
|
||||
):
|
||||
|
|
@ -159,7 +144,7 @@ async def test_sync_endpoint_pulls_from_langflow_then_syncs(
|
|||
langflow_id = "22222222-3333-4444-8555-666666666666"
|
||||
override_langflow(
|
||||
flows=[{"id": langflow_id, "name": "Gehaltserhöhung"}],
|
||||
docs={langflow_id: _langflow_doc("Gehaltserhöhung", langflow_id)},
|
||||
docs={langflow_id: langflow_export_doc("Gehaltserhöhung", langflow_id)},
|
||||
)
|
||||
response = await client.post("/api/flows/sync")
|
||||
assert response.status_code == 200, response.text
|
||||
|
|
@ -188,7 +173,7 @@ async def test_sync_endpoint_pull_reuses_same_named_file(
|
|||
langflow_id = "44444444-5555-4666-8777-888888888888"
|
||||
override_langflow(
|
||||
flows=[{"id": langflow_id, "name": "simple_rule"}],
|
||||
docs={langflow_id: _langflow_doc("simple_rule", langflow_id)},
|
||||
docs={langflow_id: langflow_export_doc("simple_rule", langflow_id)},
|
||||
)
|
||||
response = await client.post("/api/flows/sync")
|
||||
assert response.status_code == 200, response.text
|
||||
|
|
@ -210,7 +195,7 @@ async def test_sync_endpoint_pull_error_continues(
|
|||
good_id = "33333333-4444-4555-8666-777777777777"
|
||||
override_langflow(
|
||||
flows=[{"id": good_id, "name": "Gut"}, {"id": "kaputt-id", "name": "Kaputt"}],
|
||||
docs={good_id: _langflow_doc("Gut", good_id)},
|
||||
docs={good_id: langflow_export_doc("Gut", good_id)},
|
||||
)
|
||||
response = await client.post("/api/flows/sync")
|
||||
assert response.status_code == 200, response.text
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue