fix(acms): fix format violations and remove duplicate step definitions in uko_persistence tests
CI / helm (pull_request) Successful in 55s
CI / e2e_tests (pull_request) Failing after 1m5s
CI / build (pull_request) Failing after 44s
CI / security (pull_request) Failing after 1m7s
CI / typecheck (pull_request) Failing after 1m7s
CI / integration_tests (pull_request) Failing after 1m6s
CI / push-validation (pull_request) Successful in 1m21s
CI / lint (pull_request) Successful in 1m46s
CI / quality (pull_request) Successful in 2m5s
CI / unit_tests (pull_request) Failing after 7m12s
CI / coverage (pull_request) Has been skipped
CI / docker (pull_request) Has been skipped
CI / benchmark-publish (pull_request) Has been skipped
CI / status-check (pull_request) Failing after 3s
CI / benchmark-regression (pull_request) Failing after 31s

This commit is contained in:
2026-05-05 02:49:54 +00:00
parent de610530d6
commit ba7870da3e
4 changed files with 82 additions and 135 deletions
+6 -5
View File
@@ -27,10 +27,10 @@ class UKOPersistenceBenchmarks:
"""Set up benchmark fixtures."""
self.triple_count = triple_count
self.temp_dir = tempfile.mkdtemp()
# Create mock graph backend
self.graph_backend = MagicMock(spec=GraphIndexBackend)
# Create sample triples
self.triples = [
{
@@ -40,7 +40,7 @@ class UKOPersistenceBenchmarks:
}
for i in range(triple_count)
]
# Set up graph backend to return triples
self.graph_backend.query.return_value = [
{
@@ -54,6 +54,7 @@ class UKOPersistenceBenchmarks:
def teardown(self, triple_count: int) -> None:
"""Clean up after benchmark."""
import shutil
shutil.rmtree(self.temp_dir, ignore_errors=True)
def time_save_with_in_memory_backend(self, triple_count: int) -> None:
@@ -80,7 +81,7 @@ class UKOPersistenceBenchmarks:
"""Benchmark restore() with InMemoryPersistenceBackend."""
persistence_backend = InMemoryPersistenceBackend()
persistence_backend.save("local/benchmark", self.triples)
service = UKOGraphPersistence(
graph_backend=self.graph_backend,
project="local/benchmark",
@@ -92,7 +93,7 @@ class UKOPersistenceBenchmarks:
"""Benchmark restore() with JSONFilePersistenceBackend."""
persistence_backend = JSONFilePersistenceBackend(self.temp_dir)
persistence_backend.save("local/benchmark", self.triples)
service = UKOGraphPersistence(
graph_backend=self.graph_backend,
project="local/benchmark",
+70 -116
View File
@@ -79,20 +79,15 @@ def _capture_uko_logs() -> Generator[list[dict[str, Any]]]:
# =================================================================
@given("uko a JSON file persistence backend in a temp directory")
def step_json_file_persistence_backend(context: Any) -> None:
"""Create a JSON file persistence backend in a temp directory."""
temp_dir = tempfile.mkdtemp()
context.uko_temp_dir = temp_dir
context.uko_json_backend = JSONFilePersistenceBackend(temp_dir)
@given("uko a JSON file persistence backend in a non-existent temp directory")
def step_json_file_persistence_backend_nonexistent(context: Any) -> None:
"""Create a JSON file persistence backend in a non-existent temp directory."""
temp_dir = Path(tempfile.gettempdir()) / "uko_test_nonexistent" / "subdir"
context.uko_temp_dir = str(temp_dir)
context.uko_json_backend = JSONFilePersistenceBackend(temp_dir)
# Set uko_test_triples so parameterized save steps work without a prior
# "uko an in-memory persistence backend" step.
context.uko_test_triples = create_sample_triples()
@given("uko the JSON file contains corrupted JSON data")
@@ -104,7 +99,7 @@ def step_json_file_corrupted(context: Any) -> None:
path.write_text("{invalid json content", encoding="utf-8")
@given("uko the JSON file contains valid JSON but missing \"triples\" key")
@given('uko the JSON file contains valid JSON but missing "triples" key')
def step_json_file_missing_triples_key(context: Any) -> None:
"""Create a JSON file with valid JSON but missing triples key."""
backend: JSONFilePersistenceBackend = context.uko_json_backend
@@ -128,7 +123,7 @@ def step_json_file_unreadable(context: Any) -> None:
context.uko_unreadable_file = path
@when("uko I load from the JSON file backend for project \"local/test\"")
@when('uko I load from the JSON file backend for project "local/test"')
def step_load_from_json_backend(context: Any) -> None:
"""Load from JSON file backend, capturing any log output."""
backend: JSONFilePersistenceBackend = context.uko_json_backend
@@ -140,7 +135,9 @@ def step_load_from_json_backend(context: Any) -> None:
@then("uko the result should be an empty list")
def step_result_is_empty_list(context: Any) -> None:
"""Verify result is an empty list."""
assert context.uko_load_result == [], f"Expected empty list, got {context.uko_load_result}"
assert context.uko_load_result == [], (
f"Expected empty list, got {context.uko_load_result}"
)
@then("uko a warning should be logged for load failure")
@@ -148,7 +145,8 @@ def step_warning_logged_for_load_failure(context: Any) -> None:
"""Verify a warning was logged for load failure."""
logs: list[dict[str, Any]] = context.uko_captured_logs
warning_events = [
e for e in logs
e
for e in logs
if e.get("log_level") == "warning" and "load_failed" in e.get("event", "")
]
assert warning_events, (
@@ -190,18 +188,13 @@ def step_call_save_on_persistence_service(context: Any) -> None:
context.uko_captured_logs = entries
@then("uko the save result should be 0")
def step_save_result_is_zero(context: Any) -> None:
"""Verify save result is 0."""
assert context.uko_save_result == 0, f"Expected 0, got {context.uko_save_result}"
@then("uko a warning should be logged for query failure")
def step_warning_logged_for_query_failure(context: Any) -> None:
"""Verify a warning was logged for query failure."""
logs: list[dict[str, Any]] = context.uko_captured_logs
warning_events = [
e for e in logs
e
for e in logs
if e.get("log_level") == "warning" and "query_failed" in e.get("event", "")
]
assert warning_events, (
@@ -214,7 +207,7 @@ def step_warning_logged_for_query_failure(context: Any) -> None:
# =================================================================
@given("uko a persistence backend with triples missing the \"subject\" key")
@given('uko a persistence backend with triples missing the "subject" key')
def step_persistence_backend_missing_subject(context: Any) -> None:
"""Create a persistence backend with triples missing subject."""
backend = InMemoryPersistenceBackend()
@@ -230,7 +223,7 @@ def step_persistence_backend_missing_subject(context: Any) -> None:
context.uko_persistence_backend = backend
@given("uko a persistence backend with triples missing the \"predicate\" key")
@given('uko a persistence backend with triples missing the "predicate" key')
def step_persistence_backend_missing_predicate(context: Any) -> None:
"""Create a persistence backend with triples missing predicate."""
backend = InMemoryPersistenceBackend()
@@ -246,7 +239,7 @@ def step_persistence_backend_missing_predicate(context: Any) -> None:
context.uko_persistence_backend = backend
@given("uko a persistence backend with triples missing the \"object\" key")
@given('uko a persistence backend with triples missing the "object" key')
def step_persistence_backend_missing_object(context: Any) -> None:
"""Create a persistence backend with triples missing object."""
backend = InMemoryPersistenceBackend()
@@ -334,12 +327,6 @@ def step_call_restore_on_persistence_service(context: Any) -> None:
context.uko_captured_logs = entries
@then("uko the restore result should be 0")
def step_restore_result_is_zero(context: Any) -> None:
"""Verify restore result is 0."""
assert context.uko_restore_result == 0, f"Expected 0, got {context.uko_restore_result}"
@then("uko no triples should be added to the graph backend")
def step_no_triples_added(context: Any) -> None:
"""Verify no triples were added to the graph backend."""
@@ -373,7 +360,8 @@ def step_warning_logged_for_triple_failure(context: Any) -> None:
"""Verify a warning was logged for triple failure."""
logs: list[dict[str, Any]] = context.uko_captured_logs
warning_events = [
e for e in logs
e
for e in logs
if e.get("log_level") == "warning" and "triple_failed" in e.get("event", "")
]
assert warning_events, (
@@ -427,7 +415,9 @@ def step_persistence_service_with_mixed_backend(context: Any) -> None:
@then("uko the restore result should be greater than 0")
def step_restore_result_greater_than_zero(context: Any) -> None:
"""Verify restore result is greater than 0."""
assert context.uko_restore_result > 0, f"Expected > 0, got {context.uko_restore_result}"
assert context.uko_restore_result > 0, (
f"Expected > 0, got {context.uko_restore_result}"
)
@then("uko warnings should be logged for failed triples")
@@ -435,7 +425,8 @@ def step_warnings_logged_for_failed_triples(context: Any) -> None:
"""Verify warnings were logged for failed triples."""
logs: list[dict[str, Any]] = context.uko_captured_logs
warning_events = [
e for e in logs
e
for e in logs
if e.get("log_level") == "warning" and "triple_failed" in e.get("event", "")
]
assert warning_events, (
@@ -448,27 +439,16 @@ def step_warnings_logged_for_failed_triples(context: Any) -> None:
# =================================================================
@given("uko an in-memory persistence backend")
def step_in_memory_persistence_backend(context: Any) -> None:
"""Create an in-memory persistence backend."""
context.uko_persistence_backend = InMemoryPersistenceBackend()
@given("uko I save triples to the persistence backend for project \"local/test\"")
def step_given_save_triples_test(context: Any) -> None:
"""Save triples for project local/test (Given variant)."""
backend: InMemoryPersistenceBackend = context.uko_persistence_backend
backend.save("local/test", create_sample_triples())
@when("uko I clear the persistence backend for project \"local/test\"")
@when('uko I clear the persistence backend for project "local/test"')
def step_clear_persistence_backend(context: Any) -> None:
"""Clear the persistence backend for a project."""
backend: InMemoryPersistenceBackend = context.uko_persistence_backend
backend.clear("local/test")
@then("uko loading from the persistence backend for project \"local/test\" should return empty list")
@then(
'uko loading from the persistence backend for project "local/test" should return empty list'
)
def step_load_after_clear_returns_empty(context: Any) -> None:
"""Verify loading after clear returns empty list."""
backend: InMemoryPersistenceBackend = context.uko_persistence_backend
@@ -476,42 +456,16 @@ def step_load_after_clear_returns_empty(context: Any) -> None:
assert result == [], f"Expected empty list, got {result}"
@given("uko I save triples to the persistence backend for project \"local/test1\"")
def step_given_save_triples_test1(context: Any) -> None:
"""Save triples for project test1 (Given variant)."""
backend: InMemoryPersistenceBackend = context.uko_persistence_backend
backend.save("local/test1", create_sample_triples())
@given("uko I save triples to the persistence backend for project \"local/test2\"")
def step_given_save_triples_test2(context: Any) -> None:
"""Save triples for project test2 (Given variant)."""
backend: InMemoryPersistenceBackend = context.uko_persistence_backend
backend.save("local/test2", create_sample_triples())
@when("uko I save triples to the persistence backend for project \"local/test1\"")
def step_save_triples_test1(context: Any) -> None:
"""Save triples for project test1."""
backend: InMemoryPersistenceBackend = context.uko_persistence_backend
backend.save("local/test1", create_sample_triples())
@when("uko I save triples to the persistence backend for project \"local/test2\"")
def step_save_triples_test2(context: Any) -> None:
"""Save triples for project test2."""
backend: InMemoryPersistenceBackend = context.uko_persistence_backend
backend.save("local/test2", create_sample_triples())
@when("uko I clear the persistence backend for project \"local/test1\"")
@when('uko I clear the persistence backend for project "local/test1"')
def step_clear_persistence_backend_test1(context: Any) -> None:
"""Clear the persistence backend for project test1."""
backend: InMemoryPersistenceBackend = context.uko_persistence_backend
backend.clear("local/test1")
@then("uko loading from the persistence backend for project \"local/test1\" should return empty list")
@then(
'uko loading from the persistence backend for project "local/test1" should return empty list'
)
def step_load_test1_returns_empty(context: Any) -> None:
"""Verify loading test1 after clear returns empty list."""
backend: InMemoryPersistenceBackend = context.uko_persistence_backend
@@ -519,7 +473,9 @@ def step_load_test1_returns_empty(context: Any) -> None:
assert result == [], f"Expected empty list, got {result}"
@then("uko loading from the persistence backend for project \"local/test2\" should return the saved triples")
@then(
'uko loading from the persistence backend for project "local/test2" should return the saved triples'
)
def step_load_test2_returns_saved(context: Any) -> None:
"""Verify loading test2 returns the saved triples."""
backend: InMemoryPersistenceBackend = context.uko_persistence_backend
@@ -527,7 +483,7 @@ def step_load_test2_returns_saved(context: Any) -> None:
assert len(result) == 2, f"Expected 2 triples, got {len(result)}"
@when("uko I clear the persistence backend for project \"local/nonexistent\"")
@when('uko I clear the persistence backend for project "local/nonexistent"')
def step_clear_nonexistent_project(context: Any) -> None:
"""Clear a non-existent project."""
backend: InMemoryPersistenceBackend = context.uko_persistence_backend
@@ -541,7 +497,9 @@ def step_clear_nonexistent_project(context: Any) -> None:
@then("uko no error should be raised")
def step_no_error_raised(context: Any) -> None:
"""Verify no error was raised."""
assert context.uko_clear_error is None, f"Expected no error, got {context.uko_clear_error}"
assert context.uko_clear_error is None, (
f"Expected no error, got {context.uko_clear_error}"
)
# =================================================================
@@ -549,15 +507,7 @@ def step_no_error_raised(context: Any) -> None:
# =================================================================
@given("uko a graph backend with no triples")
def step_graph_backend_no_triples(context: Any) -> None:
"""Create a mock graph backend with no triples."""
backend = create_mock_graph_backend()
backend.query.return_value = []
context.uko_graph_backend = backend
@given("uko a UKOGraphPersistence service with project \"local/my-app\"")
@given('uko a UKOGraphPersistence service with project "local/my-app"')
def step_persistence_service_with_project(context: Any) -> None:
"""Create a UKOGraphPersistence service with a specific project."""
graph_backend = context.uko_graph_backend
@@ -576,12 +526,12 @@ def step_access_project_property(context: Any) -> None:
context.uko_project_value = service.project
@then("uko the project property should return \"local/my-app\"")
@then('uko the project property should return "local/my-app"')
def step_project_property_returns_value(context: Any) -> None:
"""Verify the project property returns the correct value."""
assert (
context.uko_project_value == "local/my-app"
), f"Expected 'local/my-app', got {context.uko_project_value}"
assert context.uko_project_value == "local/my-app", (
f"Expected 'local/my-app', got {context.uko_project_value}"
)
@then("uko attempting to set the project property should raise AttributeError")
@@ -600,9 +550,9 @@ def step_project_property_is_readonly(context: Any) -> None:
# =================================================================
@given("uko a graph backend with triples for resource \"01HQ8ZDRX50000000000000020\"")
@given("uko a mock graph backend with two sample triples")
def step_graph_backend_with_triples_020(context: Any) -> None:
"""Create a graph backend with triples."""
"""Create a mock graph backend with two sample triples for lifecycle tests."""
backend = create_mock_graph_backend()
backend.query.return_value = [
{
@@ -631,14 +581,16 @@ def step_persistence_service_with_json_backend(context: Any) -> None:
)
@when("uko I save the graph state")
@when("uko I save the graph state via the persistence service")
def step_save_graph_state(context: Any) -> None:
"""Save the graph state."""
"""Save the graph state via the pre-configured persistence service."""
service: UKOGraphPersistence = context.uko_persistence_service
context.uko_save_result = service.save()
@when("uko I restore the graph state into a fresh backend with the same JSON file backend")
@when(
"uko I restore the graph state into a fresh backend with the same JSON file backend"
)
def step_restore_graph_state_with_json_backend(context: Any) -> None:
"""Restore the graph state into a fresh backend."""
fresh_backend = create_mock_graph_backend()
@@ -656,16 +608,9 @@ def step_restore_graph_state_with_json_backend(context: Any) -> None:
def step_restored_backend_has_same_triples(context: Any) -> None:
"""Verify the restored backend has the same triples."""
fresh_backend = context.uko_fresh_backend
assert (
fresh_backend.add_triple.call_count == 2
), f"Expected 2 add_triple calls, got {fresh_backend.add_triple.call_count}"
@when("uko I save triples to the JSON file backend for project \"local/test\"")
def step_save_triples_to_json_backend(context: Any) -> None:
"""Save triples to the JSON file backend."""
backend: JSONFilePersistenceBackend = context.uko_json_backend
backend.save("local/test", create_sample_triples())
assert fresh_backend.add_triple.call_count == 2, (
f"Expected 2 add_triple calls, got {fresh_backend.add_triple.call_count}"
)
@then("uko the base directory should be created")
@@ -688,7 +633,9 @@ def step_json_file_exists(context: Any) -> None:
# =================================================================
@then("uko creating UKOGraphPersistence with whitespace-only project should raise ValueError")
@then(
"uko creating UKOGraphPersistence with whitespace-only project should raise ValueError"
)
def step_persistence_service_whitespace_project(context: Any) -> None:
"""Verify creating service with whitespace-only project raises ValueError."""
graph_backend = context.uko_graph_backend
@@ -703,7 +650,9 @@ def step_persistence_service_whitespace_project(context: Any) -> None:
pass
@then("uko saving to JSON file backend with whitespace-only project should raise ValueError")
@then(
"uko saving to JSON file backend with whitespace-only project should raise ValueError"
)
def step_save_json_whitespace_project(context: Any) -> None:
"""Verify saving with whitespace-only project raises ValueError."""
backend: JSONFilePersistenceBackend = context.uko_json_backend
@@ -714,7 +663,9 @@ def step_save_json_whitespace_project(context: Any) -> None:
pass
@then("uko loading from JSON file backend with whitespace-only project should raise ValueError")
@then(
"uko loading from JSON file backend with whitespace-only project should raise ValueError"
)
def step_load_json_whitespace_project(context: Any) -> None:
"""Verify loading with whitespace-only project raises ValueError."""
backend: JSONFilePersistenceBackend = context.uko_json_backend
@@ -725,7 +676,9 @@ def step_load_json_whitespace_project(context: Any) -> None:
pass
@then("uko saving to persistence backend with whitespace-only project should raise ValueError")
@then(
"uko saving to persistence backend with whitespace-only project should raise ValueError"
)
def step_save_memory_whitespace_project(context: Any) -> None:
"""Verify saving with whitespace-only project raises ValueError."""
backend: InMemoryPersistenceBackend = context.uko_persistence_backend
@@ -736,7 +689,9 @@ def step_save_memory_whitespace_project(context: Any) -> None:
pass
@then("uko loading from persistence backend with whitespace-only project should raise ValueError")
@then(
"uko loading from persistence backend with whitespace-only project should raise ValueError"
)
def step_load_memory_whitespace_project(context: Any) -> None:
"""Verify loading with whitespace-only project raises ValueError."""
backend: InMemoryPersistenceBackend = context.uko_persistence_backend
@@ -804,9 +759,8 @@ def step_info_log_no_data(context: Any) -> None:
"""Verify an info log was recorded for no data."""
logs: list[dict[str, Any]] = context.uko_captured_logs
info_events = [
e for e in logs
e
for e in logs
if e.get("log_level") == "info" and "no_data" in e.get("event", "")
]
assert info_events, (
f"Expected an info log with 'no_data' event, got: {logs}"
)
assert info_events, f"Expected an info log with 'no_data' event, got: {logs}"
+2 -2
View File
@@ -148,10 +148,10 @@ Feature: UKO Graph Persistence — Full Coverage for Error Paths and Edge Cases
# =================================================================
Scenario: Full save/restore lifecycle with JSONFilePersistenceBackend
Given uko a graph backend with triples for resource "01HQ8ZDRX50000000000000020"
Given uko a mock graph backend with two sample triples
And uko a JSON file persistence backend in a temp directory
And uko a UKOGraphPersistence service with the JSON file backend
When uko I save the graph state
When uko I save the graph state via the persistence service
And uko I restore the graph state into a fresh backend with the same JSON file backend
Then uko the restored backend should have the same triples
+4 -12
View File
@@ -74,9 +74,7 @@ def main() -> int:
persistence_backend=persistence_backend,
)
saved_count = service.save()
assert saved_count == 2, (
f"Expected 2 triples saved, got {saved_count}"
)
assert saved_count == 2, f"Expected 2 triples saved, got {saved_count}"
json_path = persistence_backend._path_for("local/test")
assert json_path.exists(), f"Expected JSON file at {json_path}"
@@ -121,9 +119,7 @@ def main() -> int:
],
)
assert temp_dir.exists(), (
f"Expected directory to be created: {temp_dir}"
)
assert temp_dir.exists(), f"Expected directory to be created: {temp_dir}"
json_path = persistence_backend._path_for("local/test")
assert json_path.exists(), f"Expected JSON file at {json_path}"
@@ -145,9 +141,7 @@ def main() -> int:
json_path.write_text("{invalid json content", encoding="utf-8")
result = persistence_backend.load("local/test")
assert result == [], (
f"Expected empty list for corrupted file, got {result}"
)
assert result == [], f"Expected empty list for corrupted file, got {result}"
print("uko-persistence-corrupted-file-ok")
return 0
@@ -223,9 +217,7 @@ def main() -> int:
persistence_backend=backend,
)
restored = service.restore()
assert restored == 0, (
f"Expected 0 triples restored, got {restored}"
)
assert restored == 0, f"Expected 0 triples restored, got {restored}"
graph_backend.add_triple.assert_not_called()
print("uko-persistence-restore-skips-incomplete-ok")