diff --git a/src/creative_agent/data/standard_formats.py b/src/creative_agent/data/standard_formats.py index aa74610..a4034e4 100644 --- a/src/creative_agent/data/standard_formats.py +++ b/src/creative_agent/data/standard_formats.py @@ -83,19 +83,19 @@ def create_impression_tracker_asset() -> LibAssets: ) -def create_click_tracker_asset() -> LibAssets: - """Create an optional click tracker asset for 3rd party tracking. +def create_click_url_asset() -> LibAssets: + """Create a required clickthrough URL asset. - This creates a URL asset with url_type='tracker_redirect' that can be used - for third-party click tracking redirects. + This creates a URL asset with url_type='clickthrough' for the landing page + destination when users click on the ad. """ return create_asset( - asset_id="click_tracker", + asset_id="click_url", asset_type=AssetType.url, - required=False, + required=True, requirements={ - "url_type": "tracker_redirect", - "description": "3rd party click tracking redirect URL", + "url_type": "clickthrough", + "description": "Clickthrough destination URL", }, ) @@ -173,7 +173,6 @@ def create_responsive_render( requirements={"description": "Text prompt describing the desired creative"}, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), # Concrete formats for backward compatibility @@ -199,7 +198,6 @@ def create_responsive_render( requirements={"description": "Text prompt describing the desired creative"}, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -224,7 +222,6 @@ def create_responsive_render( requirements={"description": "Text prompt describing the desired creative"}, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -249,7 +246,6 @@ def create_responsive_render( requirements={"description": "Text prompt describing the desired creative"}, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -274,7 +270,6 @@ def create_responsive_render( requirements={"description": "Text prompt describing the desired creative"}, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -299,7 +294,6 @@ def create_responsive_render( requirements={"description": "Text prompt describing the desired creative"}, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -324,7 +318,6 @@ def create_responsive_render( requirements={"description": "Text prompt describing the desired creative"}, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -349,7 +342,6 @@ def create_responsive_render( requirements={"description": "Text prompt describing the desired creative"}, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), ] @@ -411,7 +403,6 @@ def create_responsive_render( asset_type=AssetType.vast, required=True, ), - create_click_tracker_asset(), ], ), # Concrete formats for backward compatibility @@ -470,7 +461,6 @@ def create_responsive_render( "description": "VAST 4.x compatible tag", }, ), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -623,16 +613,8 @@ def create_responsive_render( "acceptable_formats": ["jpg", "png", "gif", "webp"], }, ), - create_asset( - asset_id="click_url", - asset_type=AssetType.url, - required=True, - requirements={ - "description": "Clickthrough destination URL", - }, - ), + create_click_url_asset(), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), # Concrete formats for backward compatibility @@ -655,16 +637,8 @@ def create_responsive_render( "acceptable_formats": ["jpg", "png", "gif", "webp"], }, ), - create_asset( - asset_id="click_url", - asset_type=AssetType.url, - required=True, - requirements={ - "description": "Clickthrough destination URL", - }, - ), + create_click_url_asset(), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -686,13 +660,8 @@ def create_responsive_render( "acceptable_formats": ["jpg", "png", "gif", "webp"], }, ), - create_asset( - asset_id="click_url", - asset_type=AssetType.url, - required=True, - ), + create_click_url_asset(), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -714,13 +683,8 @@ def create_responsive_render( "acceptable_formats": ["jpg", "png", "gif", "webp"], }, ), - create_asset( - asset_id="click_url", - asset_type=AssetType.url, - required=True, - ), + create_click_url_asset(), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -742,13 +706,8 @@ def create_responsive_render( "acceptable_formats": ["jpg", "png", "gif", "webp"], }, ), - create_asset( - asset_id="click_url", - asset_type=AssetType.url, - required=True, - ), + create_click_url_asset(), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -770,13 +729,8 @@ def create_responsive_render( "acceptable_formats": ["jpg", "png", "gif", "webp"], }, ), - create_asset( - asset_id="click_url", - asset_type=AssetType.url, - required=True, - ), + create_click_url_asset(), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -798,13 +752,8 @@ def create_responsive_render( "acceptable_formats": ["jpg", "png", "gif", "webp"], }, ), - create_asset( - asset_id="click_url", - asset_type=AssetType.url, - required=True, - ), + create_click_url_asset(), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -826,13 +775,8 @@ def create_responsive_render( "acceptable_formats": ["jpg", "png", "gif", "webp"], }, ), - create_asset( - asset_id="click_url", - asset_type=AssetType.url, - required=True, - ), + create_click_url_asset(), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), ] @@ -858,7 +802,6 @@ def create_responsive_render( }, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), # Concrete formats for backward compatibility @@ -882,7 +825,6 @@ def create_responsive_render( }, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -904,7 +846,6 @@ def create_responsive_render( }, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -926,7 +867,6 @@ def create_responsive_render( }, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -948,7 +888,6 @@ def create_responsive_render( }, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -970,7 +909,6 @@ def create_responsive_render( }, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), CreativeFormat( @@ -992,7 +930,6 @@ def create_responsive_render( }, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), ] @@ -1015,7 +952,6 @@ def create_responsive_render( required=True, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), ] @@ -1119,14 +1055,7 @@ def create_responsive_render( "description": "Author name for editorial context", }, ), - create_asset( - asset_id="click_url", - asset_type=AssetType.url, - required=True, - requirements={ - "description": "Landing page URL", - }, - ), + create_click_url_asset(), create_asset( asset_id="disclosure", asset_type=AssetType.text, @@ -1136,7 +1065,6 @@ def create_responsive_render( }, ), create_impression_tracker_asset(), - create_click_tracker_asset(), ], ), ] diff --git a/tests/unit/test_click_tracker.py b/tests/unit/test_click_tracker.py deleted file mode 100644 index daaa5f1..0000000 --- a/tests/unit/test_click_tracker.py +++ /dev/null @@ -1,113 +0,0 @@ -"""Unit tests for click_tracker asset functionality.""" - -from creative_agent.data.standard_formats import ( - STANDARD_FORMATS, - create_click_tracker_asset, -) - -# Expected formats that should have click_tracker -EXPECTED_FORMATS_WITH_CLICK_TRACKER = [ - # Generative formats - "display_generative", - "display_300x250_generative", - "display_728x90_generative", - "display_320x50_generative", - "display_160x600_generative", - "display_336x280_generative", - "display_300x600_generative", - "display_970x250_generative", - # Image formats - "display_image", - "display_300x250_image", - "display_728x90_image", - "display_320x50_image", - "display_160x600_image", - "display_336x280_image", - "display_300x600_image", - "display_970x250_image", - # HTML formats - "display_html", - "display_300x250_html", - "display_728x90_html", - "display_160x600_html", - "display_336x280_html", - "display_300x600_html", - "display_970x250_html", - # JS format - "display_js", - # VAST formats - "video_vast", - "video_vast_30s", - # Native - "native_content", -] - - -class TestClickTrackerAsset: - """Tests for the click_tracker asset helper function.""" - - def test_click_tracker_asset_id(self): - """Test click_tracker has correct asset_id.""" - tracker = create_click_tracker_asset() - assert tracker.asset_id == "click_tracker" - - def test_click_tracker_asset_type(self): - """Test click_tracker is a URL type asset.""" - tracker = create_click_tracker_asset() - assert tracker.asset_type.value == "url" - - def test_click_tracker_is_optional(self): - """Test click_tracker is not required.""" - tracker = create_click_tracker_asset() - assert tracker.required is False - - def test_click_tracker_url_type(self): - """Test click_tracker uses tracker_redirect url_type.""" - tracker = create_click_tracker_asset() - assert tracker.requirements["url_type"] == "tracker_redirect" - - def test_click_tracker_has_description(self): - """Test click_tracker has a description in requirements.""" - tracker = create_click_tracker_asset() - assert "description" in tracker.requirements - assert "click" in tracker.requirements["description"].lower() - - -class TestClickTrackerFormatCoverage: - """Tests for click_tracker coverage across formats.""" - - def test_click_tracker_format_count(self): - """Verify exactly 27 formats have click_tracker.""" - count = sum(1 for fmt in STANDARD_FORMATS if "click_tracker" in [a.asset_id for a in (fmt.assets or [])]) - assert count == 27 - - def test_click_tracker_on_expected_formats(self): - """Verify click_tracker is on all expected formats.""" - for fmt in STANDARD_FORMATS: - asset_ids = [a.asset_id for a in (fmt.assets or [])] - if fmt.format_id.id in EXPECTED_FORMATS_WITH_CLICK_TRACKER: - assert "click_tracker" in asset_ids, f"{fmt.format_id.id} should have click_tracker" - - def test_click_tracker_only_on_expected_formats(self): - """Verify click_tracker is only on formats in the expected list.""" - for fmt in STANDARD_FORMATS: - asset_ids = [a.asset_id for a in (fmt.assets or [])] - if "click_tracker" in asset_ids: - assert fmt.format_id.id in EXPECTED_FORMATS_WITH_CLICK_TRACKER, ( - f"{fmt.format_id.id} has click_tracker but is not in expected list" - ) - - def test_click_tracker_not_on_non_clickable_formats(self): - """Verify click_tracker is NOT on formats without click functionality.""" - # Audio and DOOH don't support click tracking - # VAST video formats DO support click tracking (external to VAST tag) - non_clickable_types = ["audio", "dooh"] - for fmt in STANDARD_FORMATS: - fmt_type = str(fmt.type).lower() if fmt.type else "" - asset_ids = [a.asset_id for a in (fmt.assets or [])] - - # Skip if not a non-clickable type - if not any(t in fmt_type for t in non_clickable_types): - continue - - assert "click_tracker" not in asset_ids, f"{fmt.format_id.id} ({fmt_type}) should not have click_tracker"