"""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