Files
alfred/tests/domain/releases/test_value_objects.py
T
2026-05-26 21:45:11 +02:00

107 lines
3.7 KiB
Python

"""Tests for the releases domain value objects: EpisodeRange, ReleaseMode."""
import pytest
from alfred.domain.releases_TO_CHECK.value_objects import EpisodeRange, ReleaseMode
from alfred.domain.shared_TO_CHECK.exceptions import ValidationError
from alfred.domain.tv_shows.value_objects import EpisodeNumber
# ---------------------------------------------------------------------------
# ReleaseMode
# ---------------------------------------------------------------------------
class TestReleaseMode:
def test_values(self):
assert ReleaseMode.PACK.value == "pack"
assert ReleaseMode.EPISODIC.value == "episodic"
def test_str_subclass(self):
# ReleaseMode is a (str, Enum) — string equality should work.
assert ReleaseMode.PACK == "pack"
assert ReleaseMode.EPISODIC == "episodic"
# ---------------------------------------------------------------------------
# EpisodeRange
# ---------------------------------------------------------------------------
class TestEpisodeRangeConstruction:
def test_single_episode(self):
r = EpisodeRange(EpisodeNumber(1), EpisodeNumber(1))
assert r.start == EpisodeNumber(1)
assert r.end == EpisodeNumber(1)
def test_multi_episode(self):
r = EpisodeRange(EpisodeNumber(2), EpisodeNumber(4))
assert r.start == EpisodeNumber(2)
assert r.end == EpisodeNumber(4)
def test_end_before_start_raises(self):
with pytest.raises(ValidationError):
EpisodeRange(EpisodeNumber(5), EpisodeNumber(3))
def test_start_must_be_episode_number(self):
with pytest.raises(ValidationError):
EpisodeRange(1, EpisodeNumber(2)) # type: ignore[arg-type]
def test_end_must_be_episode_number(self):
with pytest.raises(ValidationError):
EpisodeRange(EpisodeNumber(1), 2) # type: ignore[arg-type]
class TestEpisodeRangeOperations:
def test_count_single(self):
assert EpisodeRange(EpisodeNumber(1), EpisodeNumber(1)).count() == 1
def test_count_multi(self):
assert EpisodeRange(EpisodeNumber(1), EpisodeNumber(3)).count() == 3
def test_count_large(self):
assert EpisodeRange(EpisodeNumber(1), EpisodeNumber(10)).count() == 10
def test_numbers_single(self):
r = EpisodeRange(EpisodeNumber(2), EpisodeNumber(2))
assert r.numbers() == (EpisodeNumber(2),)
def test_numbers_multi(self):
r = EpisodeRange(EpisodeNumber(2), EpisodeNumber(4))
assert r.numbers() == (
EpisodeNumber(2),
EpisodeNumber(3),
EpisodeNumber(4),
)
def test_is_single_true(self):
assert EpisodeRange(EpisodeNumber(1), EpisodeNumber(1)).is_single()
def test_is_single_false(self):
assert not EpisodeRange(EpisodeNumber(1), EpisodeNumber(2)).is_single()
def test_str_single(self):
assert str(EpisodeRange(EpisodeNumber(2), EpisodeNumber(2))) == "E02"
def test_str_multi(self):
assert str(EpisodeRange(EpisodeNumber(2), EpisodeNumber(4))) == "E02-E04"
def test_repr(self):
r = EpisodeRange(EpisodeNumber(1), EpisodeNumber(3))
assert repr(r) == "EpisodeRange(1, 3)"
def test_equality(self):
a = EpisodeRange(EpisodeNumber(1), EpisodeNumber(3))
b = EpisodeRange(EpisodeNumber(1), EpisodeNumber(3))
c = EpisodeRange(EpisodeNumber(1), EpisodeNumber(2))
assert a == b
assert a != c
def test_hashable(self):
ranges = {
EpisodeRange(EpisodeNumber(1), EpisodeNumber(1)),
EpisodeRange(EpisodeNumber(1), EpisodeNumber(1)),
EpisodeRange(EpisodeNumber(2), EpisodeNumber(3)),
}
assert len(ranges) == 2