@admoai/sdk-scenarios 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/scenarios.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "schemaVersion": 2,
3
- "description": "Shared cross-SDK E2E scenario manifest. ONE definition, executed by a thin interpreter in each SDK, so the three suites cannot drift. Declarative only: given a request, expect an outcome. Sponsored Pin tracking scenarios add `pinTracking`: the point-tracking calls an app makes on the served pins, as data, and the beacons that must reach the engine. Procedural scenarios (log capture, concurrency, retry, TTL waits) stay hand-written per SDK. Mirrored byte-identically into all three repos; a checksum test fails the build if the copies diverge. Every expected value here was verified against a live local decision-engine before being written. `fixtureScenarios` (schemaVersion 2) run offline: each decodes one golden decision-wire file (ui/platform/lib/ad-formats/golden-wire in adhub, shipped in this package under fixtures/golden-wire/) after optional `edits`, and asserts what the publisher's app reads from the decoded creative. `contentKeys` is the exact set of plain content keys (slides and matched points are asserted through their own fields); a key in `contentKeysAbsent` must decode as absent (null), never as an empty string or a placeholder; a null in `metadata` means absent. A runner that does not execute fixtureScenarios must refuse schemaVersion 2.",
2
+ "schemaVersion": 4,
3
+ "description": "Shared cross-SDK E2E scenario manifest. ONE definition, executed by a thin interpreter in each SDK, so the three suites cannot drift. Declarative only: given a request, expect an outcome. Sponsored Pin tracking scenarios add `pinTracking`: the point-tracking calls an app makes on the served pins, as data, and the beacons that must reach the engine. Procedural scenarios (log capture, concurrency, retry, TTL waits) stay hand-written per SDK. Mirrored byte-identically into all three repos; a checksum test fails the build if the copies diverge. Every expected value here was verified against a live local decision-engine before being written. `fixtureScenarios` (schemaVersion 2) run offline: each decodes one golden decision-wire file (ui/platform/lib/ad-formats/golden-wire in adhub, shipped in this package under fixtures/golden-wire/) after optional `edits`, and asserts what the publisher's app reads from the decoded creative. `contentKeys` is the exact set of plain content keys (slides and matched points are asserted through their own fields); a key in `contentKeysAbsent` must decode as absent (null), never as an empty string or a placeholder; a null in `metadata` means absent. A runner that does not execute fixtureScenarios must refuse schemaVersion 2. A fixture scenario may add `slideTracking` (package 1.3.0, schemaVersion 3; a runner that does not execute it must refuse schemaVersion 3): `steps` the app takes on the decoded creative (`slideView`/`slideClick` with a 1-based slide index, `newResponse`, `fireClick` with a key or null for no key, `custom` with a key) and the beacons that must be dispatched: `beacons` is the exact ordered list of first-party beacons, each named by the tracker it must be (`slide`+`view`/`click`, or creative `click`/`custom`, with `response`), and `thirdPartyBeacons` the exact multiset of third-party tracker ids dispatched (their order is not asserted). An edit `at` `tracking` targets the creative's tracking object.",
4
4
  "scenarios": [
5
5
  {
6
6
  "id": "L1",
@@ -941,6 +941,350 @@
941
941
  "engineAcceptsEveryBeacon": true
942
942
  }
943
943
  }
944
+ },
945
+ {
946
+ "id": "ST1",
947
+ "title": "a Card with only its required content serves under the Card standard",
948
+ "request": {
949
+ "placements": [
950
+ {
951
+ "key": "sdk_st_card_min"
952
+ }
953
+ ]
954
+ },
955
+ "expect": {
956
+ "outcome": "served",
957
+ "decisions": 1,
958
+ "creative": {
959
+ "journey": false,
960
+ "templateKey": "card",
961
+ "contentKeys": [
962
+ "image",
963
+ "destination_url"
964
+ ],
965
+ "metadata": {
966
+ "effectiveStandardFormatKey": "card",
967
+ "effectiveStandardFormatVersion": 1,
968
+ "templateSource": "admoai_standard",
969
+ "assetContext": null
970
+ }
971
+ }
972
+ }
973
+ },
974
+ {
975
+ "id": "ST2",
976
+ "title": "a Card with every optional content serves them all, in a style the standard defines",
977
+ "request": {
978
+ "placements": [
979
+ {
980
+ "key": "sdk_st_card_full"
981
+ }
982
+ ]
983
+ },
984
+ "expect": {
985
+ "outcome": "served",
986
+ "decisions": 1,
987
+ "creative": {
988
+ "journey": false,
989
+ "templateKey": "card",
990
+ "contentKeys": [
991
+ "image",
992
+ "brand_logo",
993
+ "headline",
994
+ "supporting_text",
995
+ "cta_text",
996
+ "destination_url"
997
+ ],
998
+ "metadata": {
999
+ "effectiveStandardFormatKey": "card",
1000
+ "effectiveStandardFormatVersion": 1,
1001
+ "templateSource": "admoai_standard",
1002
+ "assetContext": null
1003
+ },
1004
+ "styleIn": [
1005
+ "default",
1006
+ "tall"
1007
+ ]
1008
+ }
1009
+ }
1010
+ },
1011
+ {
1012
+ "id": "ST3",
1013
+ "title": "an Expandable Banner with only its required content serves under the Expandable Banner standard",
1014
+ "request": {
1015
+ "placements": [
1016
+ {
1017
+ "key": "sdk_st_expandable_banner_min"
1018
+ }
1019
+ ]
1020
+ },
1021
+ "expect": {
1022
+ "outcome": "served",
1023
+ "decisions": 1,
1024
+ "creative": {
1025
+ "journey": false,
1026
+ "templateKey": "expandable_banner",
1027
+ "contentKeys": [
1028
+ "teaser_image",
1029
+ "expanded_image",
1030
+ "destination_url"
1031
+ ],
1032
+ "metadata": {
1033
+ "effectiveStandardFormatKey": "expandable_banner",
1034
+ "effectiveStandardFormatVersion": 1,
1035
+ "templateSource": "admoai_standard",
1036
+ "assetContext": null
1037
+ }
1038
+ }
1039
+ }
1040
+ },
1041
+ {
1042
+ "id": "ST4",
1043
+ "title": "an Expandable Banner with every optional content serves them all",
1044
+ "request": {
1045
+ "placements": [
1046
+ {
1047
+ "key": "sdk_st_expandable_banner_full"
1048
+ }
1049
+ ]
1050
+ },
1051
+ "expect": {
1052
+ "outcome": "served",
1053
+ "decisions": 1,
1054
+ "creative": {
1055
+ "journey": false,
1056
+ "templateKey": "expandable_banner",
1057
+ "contentKeys": [
1058
+ "teaser_image",
1059
+ "teaser_headline",
1060
+ "expanded_image",
1061
+ "headline",
1062
+ "supporting_text",
1063
+ "cta_text",
1064
+ "destination_url",
1065
+ "disclaimer"
1066
+ ],
1067
+ "metadata": {
1068
+ "effectiveStandardFormatKey": "expandable_banner",
1069
+ "effectiveStandardFormatVersion": 1,
1070
+ "templateSource": "admoai_standard",
1071
+ "assetContext": null
1072
+ }
1073
+ }
1074
+ }
1075
+ },
1076
+ {
1077
+ "id": "ST5",
1078
+ "title": "a Branded Asset with only its required content serves with its asset context",
1079
+ "request": {
1080
+ "placements": [
1081
+ {
1082
+ "key": "sdk_st_branded_assets_min"
1083
+ }
1084
+ ]
1085
+ },
1086
+ "expect": {
1087
+ "outcome": "served",
1088
+ "decisions": 1,
1089
+ "creative": {
1090
+ "journey": false,
1091
+ "templateKey": "branded_assets",
1092
+ "contentKeys": [
1093
+ "branded_image"
1094
+ ],
1095
+ "metadata": {
1096
+ "effectiveStandardFormatKey": "branded_assets",
1097
+ "effectiveStandardFormatVersion": 1,
1098
+ "templateSource": "admoai_standard",
1099
+ "assetContext": "vehicle_marker"
1100
+ }
1101
+ }
1102
+ }
1103
+ },
1104
+ {
1105
+ "id": "ST6",
1106
+ "title": "a Branded Asset with every optional content serves them all, with its asset context",
1107
+ "request": {
1108
+ "placements": [
1109
+ {
1110
+ "key": "sdk_st_branded_assets_full"
1111
+ }
1112
+ ]
1113
+ },
1114
+ "expect": {
1115
+ "outcome": "served",
1116
+ "decisions": 1,
1117
+ "creative": {
1118
+ "journey": false,
1119
+ "templateKey": "branded_assets",
1120
+ "contentKeys": [
1121
+ "branded_image",
1122
+ "accessible_label",
1123
+ "destination_url"
1124
+ ],
1125
+ "metadata": {
1126
+ "effectiveStandardFormatKey": "branded_assets",
1127
+ "effectiveStandardFormatVersion": 1,
1128
+ "templateSource": "admoai_standard",
1129
+ "assetContext": "vehicle_marker"
1130
+ }
1131
+ }
1132
+ }
1133
+ },
1134
+ {
1135
+ "id": "ST7",
1136
+ "title": "a Standard Video with only its required content serves under the Standard Video standard",
1137
+ "request": {
1138
+ "placements": [
1139
+ {
1140
+ "key": "sdk_st_standard_video_min"
1141
+ }
1142
+ ]
1143
+ },
1144
+ "expect": {
1145
+ "outcome": "served",
1146
+ "decisions": 1,
1147
+ "creative": {
1148
+ "journey": false,
1149
+ "templateKey": "standard_video",
1150
+ "contentKeys": [
1151
+ "video_asset",
1152
+ "poster_image"
1153
+ ],
1154
+ "metadata": {
1155
+ "effectiveStandardFormatKey": "standard_video",
1156
+ "effectiveStandardFormatVersion": 1,
1157
+ "templateSource": "admoai_standard",
1158
+ "assetContext": null
1159
+ }
1160
+ }
1161
+ }
1162
+ },
1163
+ {
1164
+ "id": "ST8",
1165
+ "title": "a Standard Video with every optional content serves them all",
1166
+ "request": {
1167
+ "placements": [
1168
+ {
1169
+ "key": "sdk_st_standard_video_full"
1170
+ }
1171
+ ]
1172
+ },
1173
+ "expect": {
1174
+ "outcome": "served",
1175
+ "decisions": 1,
1176
+ "creative": {
1177
+ "journey": false,
1178
+ "templateKey": "standard_video",
1179
+ "contentKeys": [
1180
+ "video_asset",
1181
+ "poster_image",
1182
+ "brand_logo",
1183
+ "headline",
1184
+ "supporting_text",
1185
+ "cta_text",
1186
+ "destination_url",
1187
+ "disclaimer"
1188
+ ],
1189
+ "metadata": {
1190
+ "effectiveStandardFormatKey": "standard_video",
1191
+ "effectiveStandardFormatVersion": 1,
1192
+ "templateSource": "admoai_standard",
1193
+ "assetContext": null
1194
+ }
1195
+ }
1196
+ }
1197
+ },
1198
+ {
1199
+ "id": "ST9",
1200
+ "title": "a standard Ad whose creative cannot satisfy its standard's contract is not served",
1201
+ "request": {
1202
+ "placements": [
1203
+ {
1204
+ "key": "sdk_st_card_incomplete"
1205
+ }
1206
+ ]
1207
+ },
1208
+ "expect": {
1209
+ "outcome": "noAd"
1210
+ }
1211
+ },
1212
+ {
1213
+ "id": "ST10",
1214
+ "title": "a legacy creative names no standard and carries no asset context",
1215
+ "request": {
1216
+ "placements": [
1217
+ {
1218
+ "key": "home"
1219
+ }
1220
+ ]
1221
+ },
1222
+ "expect": {
1223
+ "outcome": "served",
1224
+ "decisions": 1,
1225
+ "creative": {
1226
+ "journey": false,
1227
+ "metadata": {
1228
+ "effectiveStandardFormatKey": null,
1229
+ "effectiveStandardFormatVersion": null,
1230
+ "templateSource": null,
1231
+ "assetContext": null
1232
+ }
1233
+ }
1234
+ }
1235
+ },
1236
+ {
1237
+ "id": "ST11",
1238
+ "title": "a Journey screen that cannot satisfy its standard is skipped and the next stage's screen answers",
1239
+ "request": {
1240
+ "placements": [
1241
+ {
1242
+ "key": "sdk_st_journey_skip"
1243
+ }
1244
+ ],
1245
+ "session": "auto",
1246
+ "journeyOpt": "in"
1247
+ },
1248
+ "expect": {
1249
+ "outcome": "served",
1250
+ "decisions": 1,
1251
+ "creative": {
1252
+ "journey": true,
1253
+ "journeyStageKey": "complete",
1254
+ "templateKey": "card",
1255
+ "metadata": {
1256
+ "effectiveStandardFormatKey": "card",
1257
+ "effectiveStandardFormatVersion": 1,
1258
+ "templateSource": "admoai_standard",
1259
+ "assetContext": null
1260
+ }
1261
+ }
1262
+ }
1263
+ },
1264
+ {
1265
+ "id": "ST12",
1266
+ "title": "a Journey screen serves the Card style saved on it",
1267
+ "request": {
1268
+ "placements": [
1269
+ {
1270
+ "key": "sdk_st_journey_styles"
1271
+ }
1272
+ ],
1273
+ "session": "auto",
1274
+ "journeyOpt": "in"
1275
+ },
1276
+ "expect": {
1277
+ "outcome": "served",
1278
+ "decisions": 1,
1279
+ "creative": {
1280
+ "journey": true,
1281
+ "templateKey": "card",
1282
+ "styleIn": [
1283
+ "default",
1284
+ "tall"
1285
+ ]
1286
+ }
1287
+ }
944
1288
  }
945
1289
  ],
946
1290
  "fixtureScenarios": [
@@ -1591,6 +1935,634 @@
1591
1935
  }
1592
1936
  ]
1593
1937
  }
1938
+ },
1939
+ {
1940
+ "id": "F16",
1941
+ "title": "a slide's view beacon is sent once per served response, however often the slide is shown",
1942
+ "comment": "Keyed on the signed view URL, never on the slideId: re-rendering or scrolling back to a slide must not count it again (BR-SDK-04, Q19).",
1943
+ "fixture": {
1944
+ "golden": "carousel.full",
1945
+ "edits": [
1946
+ {
1947
+ "at": "tracking",
1948
+ "add": "thirdPartyTrackers",
1949
+ "value": [
1950
+ {
1951
+ "trackerId": "tpt_fixture_click_any",
1952
+ "eventType": "click",
1953
+ "matchType": "any",
1954
+ "url": "https://adserver.example/click?c=any"
1955
+ },
1956
+ {
1957
+ "trackerId": "tpt_fixture_click_default",
1958
+ "eventType": "click",
1959
+ "matchType": "specific",
1960
+ "eventKey": "default",
1961
+ "url": "https://adserver.example/click?c=default"
1962
+ },
1963
+ {
1964
+ "trackerId": "tpt_fixture_click_other",
1965
+ "eventType": "click",
1966
+ "matchType": "specific",
1967
+ "eventKey": "save_offer",
1968
+ "url": "https://adserver.example/click?c=other"
1969
+ },
1970
+ {
1971
+ "trackerId": "tpt_fixture_impression",
1972
+ "eventType": "impression",
1973
+ "url": "https://adserver.example/imp"
1974
+ }
1975
+ ]
1976
+ }
1977
+ ]
1978
+ },
1979
+ "expect": {
1980
+ "decodes": true
1981
+ },
1982
+ "slideTracking": {
1983
+ "steps": [
1984
+ {
1985
+ "slideView": 1
1986
+ },
1987
+ {
1988
+ "slideView": 1
1989
+ },
1990
+ {
1991
+ "slideView": 2
1992
+ },
1993
+ {
1994
+ "slideView": 1
1995
+ }
1996
+ ],
1997
+ "expect": {
1998
+ "beacons": [
1999
+ {
2000
+ "slide": 1,
2001
+ "view": "slide_view"
2002
+ },
2003
+ {
2004
+ "slide": 2,
2005
+ "view": "slide_view"
2006
+ }
2007
+ ],
2008
+ "thirdPartyBeacons": []
2009
+ }
2010
+ }
2011
+ },
2012
+ {
2013
+ "id": "F17",
2014
+ "title": "the same slide in a new decision response counts again",
2015
+ "comment": "A new response carries new signed URLs for the same slides. The runner simulates it by decoding the same golden file again with every first-party tracker URL suffixed `&response=N` (N = 2, 3, ...); `response` in an expected beacon names which one (default 1).",
2016
+ "fixture": {
2017
+ "golden": "carousel.full",
2018
+ "edits": [
2019
+ {
2020
+ "at": "tracking",
2021
+ "add": "thirdPartyTrackers",
2022
+ "value": [
2023
+ {
2024
+ "trackerId": "tpt_fixture_click_any",
2025
+ "eventType": "click",
2026
+ "matchType": "any",
2027
+ "url": "https://adserver.example/click?c=any"
2028
+ },
2029
+ {
2030
+ "trackerId": "tpt_fixture_click_default",
2031
+ "eventType": "click",
2032
+ "matchType": "specific",
2033
+ "eventKey": "default",
2034
+ "url": "https://adserver.example/click?c=default"
2035
+ },
2036
+ {
2037
+ "trackerId": "tpt_fixture_click_other",
2038
+ "eventType": "click",
2039
+ "matchType": "specific",
2040
+ "eventKey": "save_offer",
2041
+ "url": "https://adserver.example/click?c=other"
2042
+ },
2043
+ {
2044
+ "trackerId": "tpt_fixture_impression",
2045
+ "eventType": "impression",
2046
+ "url": "https://adserver.example/imp"
2047
+ }
2048
+ ]
2049
+ }
2050
+ ]
2051
+ },
2052
+ "expect": {
2053
+ "decodes": true
2054
+ },
2055
+ "slideTracking": {
2056
+ "steps": [
2057
+ {
2058
+ "slideView": 1
2059
+ },
2060
+ {
2061
+ "newResponse": true
2062
+ },
2063
+ {
2064
+ "slideView": 1
2065
+ },
2066
+ {
2067
+ "slideView": 1
2068
+ }
2069
+ ],
2070
+ "expect": {
2071
+ "beacons": [
2072
+ {
2073
+ "slide": 1,
2074
+ "view": "slide_view"
2075
+ },
2076
+ {
2077
+ "slide": 1,
2078
+ "view": "slide_view",
2079
+ "response": 2
2080
+ }
2081
+ ],
2082
+ "thirdPartyBeacons": []
2083
+ }
2084
+ }
2085
+ },
2086
+ {
2087
+ "id": "F18",
2088
+ "title": "a slide clicked before its view was sent sends the view, then the click, then the creative's applicable third-party click trackers once",
2089
+ "comment": "Applicable means a click tracker matching any click, or the `default` click specifically; a tracker for another click key and an impression tracker do not fire (BR-SDK-05, Q14, Q18).",
2090
+ "fixture": {
2091
+ "golden": "carousel.full",
2092
+ "edits": [
2093
+ {
2094
+ "at": "tracking",
2095
+ "add": "thirdPartyTrackers",
2096
+ "value": [
2097
+ {
2098
+ "trackerId": "tpt_fixture_click_any",
2099
+ "eventType": "click",
2100
+ "matchType": "any",
2101
+ "url": "https://adserver.example/click?c=any"
2102
+ },
2103
+ {
2104
+ "trackerId": "tpt_fixture_click_default",
2105
+ "eventType": "click",
2106
+ "matchType": "specific",
2107
+ "eventKey": "default",
2108
+ "url": "https://adserver.example/click?c=default"
2109
+ },
2110
+ {
2111
+ "trackerId": "tpt_fixture_click_other",
2112
+ "eventType": "click",
2113
+ "matchType": "specific",
2114
+ "eventKey": "save_offer",
2115
+ "url": "https://adserver.example/click?c=other"
2116
+ },
2117
+ {
2118
+ "trackerId": "tpt_fixture_impression",
2119
+ "eventType": "impression",
2120
+ "url": "https://adserver.example/imp"
2121
+ }
2122
+ ]
2123
+ }
2124
+ ]
2125
+ },
2126
+ "expect": {
2127
+ "decodes": true
2128
+ },
2129
+ "slideTracking": {
2130
+ "steps": [
2131
+ {
2132
+ "slideClick": 2
2133
+ }
2134
+ ],
2135
+ "expect": {
2136
+ "beacons": [
2137
+ {
2138
+ "slide": 2,
2139
+ "view": "slide_view"
2140
+ },
2141
+ {
2142
+ "slide": 2,
2143
+ "click": "default"
2144
+ }
2145
+ ],
2146
+ "thirdPartyBeacons": [
2147
+ "tpt_fixture_click_any",
2148
+ "tpt_fixture_click_default"
2149
+ ]
2150
+ }
2151
+ }
2152
+ },
2153
+ {
2154
+ "id": "F19",
2155
+ "title": "a slide clicked after its view sends only the click, on every click",
2156
+ "fixture": {
2157
+ "golden": "carousel.full",
2158
+ "edits": [
2159
+ {
2160
+ "at": "tracking",
2161
+ "add": "thirdPartyTrackers",
2162
+ "value": [
2163
+ {
2164
+ "trackerId": "tpt_fixture_click_any",
2165
+ "eventType": "click",
2166
+ "matchType": "any",
2167
+ "url": "https://adserver.example/click?c=any"
2168
+ },
2169
+ {
2170
+ "trackerId": "tpt_fixture_click_default",
2171
+ "eventType": "click",
2172
+ "matchType": "specific",
2173
+ "eventKey": "default",
2174
+ "url": "https://adserver.example/click?c=default"
2175
+ },
2176
+ {
2177
+ "trackerId": "tpt_fixture_click_other",
2178
+ "eventType": "click",
2179
+ "matchType": "specific",
2180
+ "eventKey": "save_offer",
2181
+ "url": "https://adserver.example/click?c=other"
2182
+ },
2183
+ {
2184
+ "trackerId": "tpt_fixture_impression",
2185
+ "eventType": "impression",
2186
+ "url": "https://adserver.example/imp"
2187
+ }
2188
+ ]
2189
+ }
2190
+ ]
2191
+ },
2192
+ "expect": {
2193
+ "decodes": true
2194
+ },
2195
+ "slideTracking": {
2196
+ "steps": [
2197
+ {
2198
+ "slideView": 2
2199
+ },
2200
+ {
2201
+ "slideClick": 2
2202
+ },
2203
+ {
2204
+ "slideClick": 2
2205
+ }
2206
+ ],
2207
+ "expect": {
2208
+ "beacons": [
2209
+ {
2210
+ "slide": 2,
2211
+ "view": "slide_view"
2212
+ },
2213
+ {
2214
+ "slide": 2,
2215
+ "click": "default"
2216
+ },
2217
+ {
2218
+ "slide": 2,
2219
+ "click": "default"
2220
+ }
2221
+ ],
2222
+ "thirdPartyBeacons": [
2223
+ "tpt_fixture_click_any",
2224
+ "tpt_fixture_click_default",
2225
+ "tpt_fixture_click_any",
2226
+ "tpt_fixture_click_default"
2227
+ ]
2228
+ }
2229
+ }
2230
+ },
2231
+ {
2232
+ "id": "F20",
2233
+ "title": "slide views never send third-party click trackers",
2234
+ "fixture": {
2235
+ "golden": "carousel.full",
2236
+ "edits": [
2237
+ {
2238
+ "at": "tracking",
2239
+ "add": "thirdPartyTrackers",
2240
+ "value": [
2241
+ {
2242
+ "trackerId": "tpt_fixture_click_any",
2243
+ "eventType": "click",
2244
+ "matchType": "any",
2245
+ "url": "https://adserver.example/click?c=any"
2246
+ },
2247
+ {
2248
+ "trackerId": "tpt_fixture_click_default",
2249
+ "eventType": "click",
2250
+ "matchType": "specific",
2251
+ "eventKey": "default",
2252
+ "url": "https://adserver.example/click?c=default"
2253
+ },
2254
+ {
2255
+ "trackerId": "tpt_fixture_click_other",
2256
+ "eventType": "click",
2257
+ "matchType": "specific",
2258
+ "eventKey": "save_offer",
2259
+ "url": "https://adserver.example/click?c=other"
2260
+ },
2261
+ {
2262
+ "trackerId": "tpt_fixture_impression",
2263
+ "eventType": "impression",
2264
+ "url": "https://adserver.example/imp"
2265
+ }
2266
+ ]
2267
+ }
2268
+ ]
2269
+ },
2270
+ "expect": {
2271
+ "decodes": true
2272
+ },
2273
+ "slideTracking": {
2274
+ "steps": [
2275
+ {
2276
+ "slideView": 1
2277
+ },
2278
+ {
2279
+ "slideView": 2
2280
+ },
2281
+ {
2282
+ "slideView": 3
2283
+ }
2284
+ ],
2285
+ "expect": {
2286
+ "beacons": [
2287
+ {
2288
+ "slide": 1,
2289
+ "view": "slide_view"
2290
+ },
2291
+ {
2292
+ "slide": 2,
2293
+ "view": "slide_view"
2294
+ },
2295
+ {
2296
+ "slide": 3,
2297
+ "view": "slide_view"
2298
+ }
2299
+ ],
2300
+ "thirdPartyBeacons": []
2301
+ }
2302
+ }
2303
+ },
2304
+ {
2305
+ "id": "F21",
2306
+ "title": "a Carousel has no creative-level click: fireClick sends nothing, so slide clicks go through the slide helper",
2307
+ "comment": "Publishers must not route a slide tap through fireClick (BR-SDK-03, Q9).",
2308
+ "fixture": {
2309
+ "golden": "carousel.full",
2310
+ "edits": [
2311
+ {
2312
+ "at": "tracking",
2313
+ "add": "thirdPartyTrackers",
2314
+ "value": [
2315
+ {
2316
+ "trackerId": "tpt_fixture_click_any",
2317
+ "eventType": "click",
2318
+ "matchType": "any",
2319
+ "url": "https://adserver.example/click?c=any"
2320
+ },
2321
+ {
2322
+ "trackerId": "tpt_fixture_click_default",
2323
+ "eventType": "click",
2324
+ "matchType": "specific",
2325
+ "eventKey": "default",
2326
+ "url": "https://adserver.example/click?c=default"
2327
+ },
2328
+ {
2329
+ "trackerId": "tpt_fixture_click_other",
2330
+ "eventType": "click",
2331
+ "matchType": "specific",
2332
+ "eventKey": "save_offer",
2333
+ "url": "https://adserver.example/click?c=other"
2334
+ },
2335
+ {
2336
+ "trackerId": "tpt_fixture_impression",
2337
+ "eventType": "impression",
2338
+ "url": "https://adserver.example/imp"
2339
+ }
2340
+ ]
2341
+ }
2342
+ ]
2343
+ },
2344
+ "expect": {
2345
+ "decodes": true
2346
+ },
2347
+ "slideTracking": {
2348
+ "steps": [
2349
+ {
2350
+ "fireClick": null
2351
+ }
2352
+ ],
2353
+ "expect": {
2354
+ "beacons": [],
2355
+ "thirdPartyBeacons": []
2356
+ }
2357
+ }
2358
+ },
2359
+ {
2360
+ "id": "F22",
2361
+ "title": "fireClick with no key sends the default click of a standard",
2362
+ "comment": "Every standard seeds its click with key `default`, which is what fireClick sends without a key (BR-SDK-06, Q12).",
2363
+ "fixture": {
2364
+ "golden": "card.full",
2365
+ "edits": [
2366
+ {
2367
+ "at": "tracking",
2368
+ "add": "thirdPartyTrackers",
2369
+ "value": [
2370
+ {
2371
+ "trackerId": "tpt_fixture_click_any",
2372
+ "eventType": "click",
2373
+ "matchType": "any",
2374
+ "url": "https://adserver.example/click?c=any"
2375
+ },
2376
+ {
2377
+ "trackerId": "tpt_fixture_click_default",
2378
+ "eventType": "click",
2379
+ "matchType": "specific",
2380
+ "eventKey": "default",
2381
+ "url": "https://adserver.example/click?c=default"
2382
+ },
2383
+ {
2384
+ "trackerId": "tpt_fixture_click_other",
2385
+ "eventType": "click",
2386
+ "matchType": "specific",
2387
+ "eventKey": "save_offer",
2388
+ "url": "https://adserver.example/click?c=other"
2389
+ },
2390
+ {
2391
+ "trackerId": "tpt_fixture_impression",
2392
+ "eventType": "impression",
2393
+ "url": "https://adserver.example/imp"
2394
+ }
2395
+ ]
2396
+ }
2397
+ ]
2398
+ },
2399
+ "expect": {
2400
+ "decodes": true
2401
+ },
2402
+ "slideTracking": {
2403
+ "steps": [
2404
+ {
2405
+ "fireClick": null
2406
+ }
2407
+ ],
2408
+ "expect": {
2409
+ "beacons": [
2410
+ {
2411
+ "click": "default"
2412
+ }
2413
+ ],
2414
+ "thirdPartyBeacons": [
2415
+ "tpt_fixture_click_any",
2416
+ "tpt_fixture_click_default"
2417
+ ]
2418
+ }
2419
+ }
2420
+ },
2421
+ {
2422
+ "id": "F23",
2423
+ "title": "expand and close are sent verbatim as custom events and are not clicks",
2424
+ "comment": "The publisher calls them when the banner actually expands or closes; no click is sent and no third-party click tracker fires (BR-SDK-07).",
2425
+ "fixture": {
2426
+ "golden": "expandable_banner.full",
2427
+ "edits": [
2428
+ {
2429
+ "at": "tracking",
2430
+ "add": "thirdPartyTrackers",
2431
+ "value": [
2432
+ {
2433
+ "trackerId": "tpt_fixture_click_any",
2434
+ "eventType": "click",
2435
+ "matchType": "any",
2436
+ "url": "https://adserver.example/click?c=any"
2437
+ },
2438
+ {
2439
+ "trackerId": "tpt_fixture_click_default",
2440
+ "eventType": "click",
2441
+ "matchType": "specific",
2442
+ "eventKey": "default",
2443
+ "url": "https://adserver.example/click?c=default"
2444
+ },
2445
+ {
2446
+ "trackerId": "tpt_fixture_click_other",
2447
+ "eventType": "click",
2448
+ "matchType": "specific",
2449
+ "eventKey": "save_offer",
2450
+ "url": "https://adserver.example/click?c=other"
2451
+ },
2452
+ {
2453
+ "trackerId": "tpt_fixture_impression",
2454
+ "eventType": "impression",
2455
+ "url": "https://adserver.example/imp"
2456
+ }
2457
+ ]
2458
+ }
2459
+ ]
2460
+ },
2461
+ "expect": {
2462
+ "decodes": true
2463
+ },
2464
+ "slideTracking": {
2465
+ "steps": [
2466
+ {
2467
+ "custom": "expand"
2468
+ },
2469
+ {
2470
+ "custom": "close"
2471
+ }
2472
+ ],
2473
+ "expect": {
2474
+ "beacons": [
2475
+ {
2476
+ "custom": "expand"
2477
+ },
2478
+ {
2479
+ "custom": "close"
2480
+ }
2481
+ ],
2482
+ "thirdPartyBeacons": []
2483
+ }
2484
+ }
2485
+ },
2486
+ {
2487
+ "id": "F24",
2488
+ "title": "an asset tap is sent verbatim as a custom event and is not a click",
2489
+ "comment": "BR-SDK-07.",
2490
+ "fixture": {
2491
+ "golden": "branded_assets.full",
2492
+ "edits": [
2493
+ {
2494
+ "at": "tracking",
2495
+ "add": "thirdPartyTrackers",
2496
+ "value": [
2497
+ {
2498
+ "trackerId": "tpt_fixture_click_any",
2499
+ "eventType": "click",
2500
+ "matchType": "any",
2501
+ "url": "https://adserver.example/click?c=any"
2502
+ },
2503
+ {
2504
+ "trackerId": "tpt_fixture_click_default",
2505
+ "eventType": "click",
2506
+ "matchType": "specific",
2507
+ "eventKey": "default",
2508
+ "url": "https://adserver.example/click?c=default"
2509
+ },
2510
+ {
2511
+ "trackerId": "tpt_fixture_click_other",
2512
+ "eventType": "click",
2513
+ "matchType": "specific",
2514
+ "eventKey": "save_offer",
2515
+ "url": "https://adserver.example/click?c=other"
2516
+ },
2517
+ {
2518
+ "trackerId": "tpt_fixture_impression",
2519
+ "eventType": "impression",
2520
+ "url": "https://adserver.example/imp"
2521
+ }
2522
+ ]
2523
+ }
2524
+ ]
2525
+ },
2526
+ "expect": {
2527
+ "decodes": true
2528
+ },
2529
+ "slideTracking": {
2530
+ "steps": [
2531
+ {
2532
+ "custom": "asset_tap"
2533
+ }
2534
+ ],
2535
+ "expect": {
2536
+ "beacons": [
2537
+ {
2538
+ "custom": "asset_tap"
2539
+ }
2540
+ ],
2541
+ "thirdPartyBeacons": []
2542
+ }
2543
+ }
2544
+ },
2545
+ {
2546
+ "id": "F25",
2547
+ "title": "a Standard Video without a destination sends no click",
2548
+ "comment": "No destination means no click action and no click tracker (BR-SDK-08).",
2549
+ "fixture": {
2550
+ "golden": "standard_video.minimal"
2551
+ },
2552
+ "expect": {
2553
+ "decodes": true
2554
+ },
2555
+ "slideTracking": {
2556
+ "steps": [
2557
+ {
2558
+ "fireClick": null
2559
+ }
2560
+ ],
2561
+ "expect": {
2562
+ "beacons": [],
2563
+ "thirdPartyBeacons": []
2564
+ }
2565
+ }
1594
2566
  }
1595
2567
  ]
1596
2568
  }