Files
computer-playbook/tests/unit/cli/mirror/test_sync.py
T
Environment TestandClaude Sonnet 4.6 1530788dbe feat(mirror): add repository segment to GHCR image path
Image names now follow {owner}/{repository}/mirror/{registry}/{name}
instead of {owner}/mirror/{registry}/{name}.

- GHCRProvider: add `repository` param + `add_args()`/`from_args()` classmethods
  as SPOT for CLI argument registration and provider construction
- sync, resolver: use GHCRProvider.add_args() / from_args() (no duplication)
- Workflows: resolve repository name via scripts/meta/resolve/repository/name.sh
  and pass --ghcr-repository to sync and publish
- mirrors.sh: require and forward GHCR_REPOSITORY env var
- deploy/development/mirrors.py: derive repository from GITHUB_REPOSITORY
- Tests: update expected paths, argv and env fixtures

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 00:20:41 +02:00

53 lines
1.6 KiB
Python

from __future__ import annotations
import unittest
from unittest.mock import patch
from cli.mirror.model import ImageRef
import cli.mirror.sync.__main__ as sync_main
class TestMirrorSync(unittest.TestCase):
def test_only_missing_skips_existing_destination(self) -> None:
image = ImageRef(
role="web-app-nextcloud",
service="app",
name="nextcloud",
version="31.0.0",
source="docker.io/library/nextcloud:31.0.0",
registry="docker.io",
)
with (
patch("cli.mirror.sync.__main__.iter_role_images", return_value=[image]),
patch.object(
sync_main.GHCRProvider,
"image_base",
return_value="ghcr.io/acme/myrepo/mirror/docker.io/nextcloud",
),
patch.object(
sync_main.GHCRProvider, "tag_exists", return_value=True
) as mock_tag_exists,
patch.object(sync_main.GHCRProvider, "mirror") as mock_mirror,
patch(
"sys.argv",
[
"mirror-sync",
"--ghcr-namespace",
"acme",
"--ghcr-repository",
"myrepo",
"--only-missing",
],
),
):
result = sync_main.main()
self.assertEqual(result, 0)
mock_tag_exists.assert_called_once_with(image)
mock_mirror.assert_not_called()
if __name__ == "__main__": # pragma: no cover
unittest.main()