Files
Netbox-Store/host_agent/tests/test_journal.py
T
MrBlake f36d6be511
CI / php-store (push) Waiting to run
CI / python-components (push) Waiting to run
feat: add NetBox plugin store
2026-08-24 20:51:25 +02:00

73 lines
2.5 KiB
Python

from __future__ import annotations
import tempfile
import unittest
from pathlib import Path
from support import * # noqa: F403
from netbox_store_agent.errors import ConflictError
from netbox_store_agent.journal import Journal, ManagedPlugin
from netbox_store_agent.protocol import OperationRequest
class JournalTests(unittest.TestCase):
def setUp(self) -> None:
self.temporary = tempfile.TemporaryDirectory()
self.journal = Journal(Path(self.temporary.name) / "journal.sqlite3")
self.key = "20f4274f-d4e5-42bf-9164-967b1a774481"
self.request = OperationRequest(
"eea17d87-8944-4ee2-a076-363338ab746d",
"install",
"demo-plugin",
"1.2.3",
"opaque",
"alice",
)
def tearDown(self) -> None:
self.temporary.cleanup()
def test_idempotency_same_payload_returns_existing(self) -> None:
first, created = self.journal.submit(self.key, self.request)
second, created_again = self.journal.submit(self.key, self.request)
self.assertTrue(created)
self.assertFalse(created_again)
self.assertEqual(first["operation_id"], second["operation_id"])
def test_idempotency_conflict(self) -> None:
self.journal.submit(self.key, self.request)
changed = OperationRequest(**{**self.request.as_dict(), "requested_by": "mallory"})
with self.assertRaises(ConflictError):
self.journal.submit(self.key, changed)
def test_claim_is_exactly_once(self) -> None:
self.journal.submit(self.key, self.request)
self.assertTrue(self.journal.claim(self.key))
self.assertFalse(self.journal.claim(self.key))
def test_running_recovery_is_manual(self) -> None:
self.journal.submit(self.key, self.request)
self.journal.claim(self.key)
self.assertEqual(self.journal.recover_interrupted(), 1)
operation = self.journal.get_operation(self.key)
self.assertEqual(operation["state"], "manual_recovery")
def test_managed_plugin_round_trip(self) -> None:
plugin = ManagedPlugin(
"demo-plugin",
"demo-plugin",
"demo_plugin",
"1.2.3",
False,
({"sha256": "a" * 64},),
)
self.journal.upsert_managed_plugin(plugin)
self.assertEqual(self.journal.get_managed_plugin("demo-plugin"), plugin)
self.journal.delete_managed_plugin("demo-plugin")
self.assertIsNone(self.journal.get_managed_plugin("demo-plugin"))
if __name__ == "__main__":
unittest.main()