import pytest from dirty_equals import IsList from dmp.audiences.enums import AudienceTarget from dmp.audiences.filters import AudienceFilters, FanSegmentInFilter, Operator from dmp.fandata.enums import FanSegment class TestAudienceFilters: def test_set_include_secondary_fans_for_ads_empty(self) -> None: filters = AudienceFilters.model_construct( include_secondary_fans=None, fan_segments=None, ) filters.set_include_secondary_fans(target=AudienceTarget.ADS) assert filters.include_secondary_fans is True assert filters.fan_segments is None @pytest.mark.parametrize( ( "include_secondary_fans", "fan_segments", "expected_include_secondary_fans", "expected_fan_segments", ), [ ( None, FanSegmentInFilter.model_construct(value=[], operator=Operator.INCLUDE), True, FanSegmentInFilter.model_construct(value=[], operator=Operator.INCLUDE), ), ( None, FanSegmentInFilter.model_construct(value=[], operator=Operator.EXCLUDE), True, FanSegmentInFilter.model_construct(value=[], operator=Operator.EXCLUDE), ), ( None, FanSegmentInFilter.model_construct( value=[FanSegment.NEW_FANS], operator=Operator.INCLUDE ), False, FanSegmentInFilter.model_construct( value=[FanSegment.NEW_FANS], operator=Operator.INCLUDE ), ), ( None, FanSegmentInFilter.model_construct( value=[ FanSegment.NEW_FANS, FanSegment.SECONDARY_FANS, ], operator=Operator.INCLUDE, ), True, FanSegmentInFilter.model_construct( value=[ FanSegment.NEW_FANS, FanSegment.SECONDARY_FANS, ], operator=Operator.INCLUDE, ), ), ( None, FanSegmentInFilter.model_construct( value=[FanSegment.SECONDARY_FANS], operator=Operator.EXCLUDE ), False, FanSegmentInFilter.model_construct( value=[FanSegment.SECONDARY_FANS], operator=Operator.EXCLUDE ), ), ( None, FanSegmentInFilter.model_construct( value=[FanSegment.NEW_FANS], operator=Operator.EXCLUDE ), True, FanSegmentInFilter.model_construct( value=[FanSegment.NEW_FANS], operator=Operator.EXCLUDE ), ), ( None, FanSegmentInFilter.model_construct( value=[ FanSegment.SECONDARY_FANS, ], operator=Operator.INCLUDE, ), True, FanSegmentInFilter.model_construct( value=FanSegment.choices(), operator=Operator.EXCLUDE, ), ), ], ) def test_set_include_secondary_fans_for_ads( self, include_secondary_fans: bool | None, fan_segments: FanSegmentInFilter | None, expected_include_secondary_fans: bool, expected_fan_segments: FanSegmentInFilter, ) -> None: filters = AudienceFilters.model_construct( include_secondary_fans=include_secondary_fans, fan_segments=fan_segments, ) filters.set_include_secondary_fans(target=AudienceTarget.ADS) assert filters.include_secondary_fans == expected_include_secondary_fans assert filters.fan_segments assert filters.fan_segments.operator == expected_fan_segments.operator assert filters.fan_segments.value == IsList( *expected_fan_segments.value, check_order=False ) def test_set_include_secondary_fans_for_non_ads(self) -> None: filters = AudienceFilters.model_construct( include_secondary_fans=None, fan_segments=FanSegmentInFilter( value=[], operator=Operator.INCLUDE, ), ) filters.set_include_secondary_fans(target=AudienceTarget.EMAIL) assert filters.include_secondary_fans is None