Provide managed generated artifact storage
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from types import SimpleNamespace
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
|
||||
from govoplan_core.auth import ApiPrincipal
|
||||
from govoplan_core.core.access import PrincipalRef
|
||||
from govoplan_core.core.files import ManagedArtifactStore, ManagedArtifactWriteRequest
|
||||
from govoplan_files.backend.capabilities import FilesArtifactStore
|
||||
|
||||
|
||||
def principal() -> ApiPrincipal:
|
||||
return ApiPrincipal(
|
||||
principal=PrincipalRef(
|
||||
account_id="account-1",
|
||||
membership_id="membership-1",
|
||||
tenant_id="tenant-1",
|
||||
scopes=frozenset({"files:file:upload"}),
|
||||
),
|
||||
account=object(),
|
||||
user=SimpleNamespace(id="user-1"),
|
||||
)
|
||||
|
||||
|
||||
class _Session:
|
||||
def query(self):
|
||||
raise AssertionError("not used")
|
||||
|
||||
def flush(self):
|
||||
raise AssertionError("not used")
|
||||
|
||||
|
||||
def stored():
|
||||
return SimpleNamespace(
|
||||
asset=SimpleNamespace(
|
||||
id="file-1",
|
||||
display_path="Generated/Templates/result.html",
|
||||
owner_type="user",
|
||||
),
|
||||
version=SimpleNamespace(
|
||||
id="version-1",
|
||||
filename_at_upload="result.html",
|
||||
content_type="text/html",
|
||||
size_bytes=6,
|
||||
checksum_sha256="0" * 64,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class FilesArtifactStoreTests(unittest.TestCase):
|
||||
def test_plain_write_uses_files_authority_and_returns_provider_neutral_ref(self) -> None:
|
||||
service = FilesArtifactStore()
|
||||
self.assertIsInstance(service, ManagedArtifactStore)
|
||||
request = ManagedArtifactWriteRequest(
|
||||
filename="result.html",
|
||||
payload=b"result",
|
||||
content_type="text/html",
|
||||
folder="Generated/Templates",
|
||||
metadata={"producer_module": "templates"},
|
||||
)
|
||||
with patch("govoplan_files.backend.capabilities.create_file_asset", return_value=stored()) as create:
|
||||
result = service.store_artifact(_Session(), principal(), request=request)
|
||||
self.assertEqual("file-1", result.file_asset_id)
|
||||
self.assertEqual("version-1", result.file_version_id)
|
||||
self.assertEqual("tenant-1", create.call_args.kwargs["tenant_id"])
|
||||
self.assertEqual("user-1", create.call_args.kwargs["owner_id"])
|
||||
self.assertEqual(b"result", create.call_args.kwargs["data"])
|
||||
|
||||
def test_idempotent_write_uses_source_provenance_without_payload_metadata(self) -> None:
|
||||
request = ManagedArtifactWriteRequest(
|
||||
filename="result.html",
|
||||
payload=b"secret body",
|
||||
content_type="text/html",
|
||||
idempotency_key="render-1",
|
||||
metadata={"producer_module": "templates", "output_sha256": "a" * 64},
|
||||
)
|
||||
with patch(
|
||||
"govoplan_files.backend.capabilities.sync_file_asset_from_source",
|
||||
return_value=(stored(), "unchanged", None),
|
||||
) as sync:
|
||||
FilesArtifactStore().store_artifact(_Session(), principal(), request=request)
|
||||
metadata = sync.call_args.kwargs["metadata"]
|
||||
self.assertEqual("render-1", metadata["source_provenance"]["external_id"])
|
||||
self.assertNotIn("secret body", str(metadata))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user