1
0
Fork 0
mirror of https://github.com/containers/ansible-podman-collections.git synced 2026-02-04 07:11:49 +00:00
ansible-podman-collections/tests/unit/plugins/modules/test_podman_image_lib.py
Sergey 4d1917ac57
Add unittests for podman_image (#961)
Signed-off-by: Sagi Shnaidman <sshnaidm@redhat.com>
2025-08-06 00:05:07 +03:00

156 lines
7.2 KiB
Python

from __future__ import absolute_import, division, print_function
__metaclass__ = type
import pytest
from ansible_collections.containers.podman.plugins.module_utils.podman.podman_image_lib import ImageRepository
class TestImageRepository:
"""Unit tests for ImageRepository class - specifically testing issue #947 fix."""
@pytest.mark.parametrize(
"name, tag, expected_full_name, expected_delimiter, description",
[
# Issue #947 scenario: tag with version and digest should use : delimiter
(
"docker.io/valkey/valkey",
"8-bookworm@sha256:fec42f399876eb6faf9e008570597741c87ff7662a54185593e74b09ce83d177",
"docker.io/valkey/valkey:8-bookworm@sha256:fec42f399876eb6faf9e008570597741c87ff7662a54185593e74b09ce83d177",
":",
"Issue #947 - version@digest should use : delimiter",
),
# Pure digest should use @ delimiter
(
"docker.io/library/alpine",
"sha256:abc123def456abc123def456abc123def456abc123def456abc123def456abc1",
"docker.io/library/alpine@sha256:abc123def456abc123def456abc123def456abc123def456abc123def456abc1",
"@",
"Pure digest should use @ delimiter",
),
# Regular tag should use : delimiter
(
"docker.io/library/alpine",
"3.19",
"docker.io/library/alpine:3.19",
":",
"Regular tag should use : delimiter",
),
# Another version@digest combination
(
"quay.io/prometheus/prometheus",
"v2.45.0@sha256:8d1dca1de3c9b6ba49e0e3a87e8e57c8fcb2e36e6f165f8969c0c9a48a80a9a2",
"quay.io/prometheus/prometheus:v2.45.0@sha256:8d1dca1de3c9b6ba49e0e3a87e8e57c8fcb2e36e6f165f8969c0c9a48a80a9a2",
":",
"Complex registry with version@digest should use : delimiter",
),
# Edge case: tag starts with sha256 but is not pure digest
(
"docker.io/library/alpine",
"sha256tag-v1.0",
"docker.io/library/alpine:sha256tag-v1.0",
":",
"Tag starting with sha256 but not pure digest should use : delimiter",
),
# Default latest tag
("alpine", "latest", "alpine:latest", ":", "Default latest tag should use : delimiter"),
# Registry with port
(
"localhost:5000/test/image",
"v1.0@sha256:deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef",
"localhost:5000/test/image:v1.0@sha256:deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef",
":",
"Registry with port and version@digest should use : delimiter",
),
# Pure short digest
("alpine", "sha256:abc123", "alpine@sha256:abc123", "@", "Short pure digest should use @ delimiter"),
],
)
def test_image_repository_delimiter_selection(self, name, tag, expected_full_name, expected_delimiter, description):
"""Test that ImageRepository selects the correct delimiter for different tag formats."""
repo = ImageRepository(name, tag)
assert (
repo.full_name == expected_full_name
), f"{description}: Expected {expected_full_name}, got {repo.full_name}"
assert (
repo.delimiter == expected_delimiter
), f"{description}: Expected delimiter '{expected_delimiter}', got '{repo.delimiter}'"
assert repo.name == name, f"Name should be preserved: Expected {name}, got {repo.name}"
assert repo.tag == tag, f"Tag should be preserved: Expected {tag}, got {repo.tag}"
def test_issue_947_specific_scenario(self):
"""Test the exact scenario reported in issue #947."""
name = "docker.io/valkey/valkey"
tag = "8-bookworm@sha256:fec42f399876eb6faf9e008570597741c87ff7662a54185593e74b09ce83d177"
repo = ImageRepository(name, tag)
# Before the fix, this would have been:
# docker.io/valkey/valkey@8-bookworm@sha256:fec42f399876eb6faf9e008570597741c87ff7662a54185593e74b09ce83d177
# After the fix, it should be:
# docker.io/valkey/valkey:8-bookworm@sha256:fec42f399876eb6faf9e008570597741c87ff7662a54185593e74b09ce83d177
expected = (
"docker.io/valkey/valkey:8-bookworm@sha256:fec42f399876eb6faf9e008570597741c87ff7662a54185593e74b09ce83d177"
)
assert (
repo.full_name == expected
), f"Issue #947 fix verification failed. Expected: {expected}, Got: {repo.full_name}"
def test_repository_parsing(self):
"""Test that repository name parsing works correctly with various formats."""
test_cases = [
# (input_name, expected_name, expected_parsed_tag)
("alpine", "alpine", None),
("alpine:3.19", "alpine", "3.19"),
("alpine@sha256:abc123", "alpine", "sha256:abc123"),
("registry.io/alpine:latest", "registry.io/alpine", "latest"),
("localhost:5000/test:v1.0", "localhost:5000/test", "v1.0"),
]
for input_name, expected_name, expected_parsed_tag in test_cases:
repo = ImageRepository(input_name, "latest") # default tag
assert (
repo.name == expected_name
), f"Name parsing failed for {input_name}: Expected {expected_name}, got {repo.name}"
assert (
repo.parsed_tag == expected_parsed_tag
), f"Tag parsing failed for {input_name}: Expected {expected_parsed_tag}, got {repo.parsed_tag}"
def test_delimiter_logic_precision(self):
"""Test the precise logic for delimiter selection."""
# Test cases that specifically target the delimiter selection logic
test_cases = [
# Tag that starts with sha256: should use @
("image", "sha256:abc123", "@"),
# Tag that contains sha256 but doesn't start with sha256: should use :
("image", "v1.0-sha256-abc123", ":"),
("image", "release-sha256:abc123", ":"),
("image", "sha256suffix", ":"),
# Version followed by digest should use :
("image", "1.0@sha256:abc123", ":"),
("image", "latest@sha256:abc123", ":"),
]
for name, tag, expected_delimiter in test_cases:
repo = ImageRepository(name, tag)
assert (
repo.delimiter == expected_delimiter
), f"Delimiter selection failed for tag '{tag}': Expected '{expected_delimiter}', got '{repo.delimiter}'"
def test_original_name_preservation(self):
"""Test that original_name is always preserved."""
test_cases = [
"alpine",
"alpine:3.19",
"alpine@sha256:abc123",
"registry.io/namespace/image:tag",
]
for original in test_cases:
repo = ImageRepository(original, "latest")
assert (
repo.original_name == original
), f"Original name not preserved: Expected {original}, got {repo.original_name}"