@admoai/sdk-scenarios 1.3.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/CHANGELOG.md +25 -0
- package/README.md +18 -0
- package/package.json +1 -1
- package/scenarios.feature +148 -1
- package/scenarios.json +345 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,31 @@ Versioning: a scenario added or an `expect` tightened is a **minor** release; a
|
|
|
4
4
|
removed, or a `request`/`expect` key renamed (every SDK's interpreter must change), is a
|
|
5
5
|
**major** one. Each SDK vendors one version and its own CI checks the vendored bytes against it.
|
|
6
6
|
|
|
7
|
+
## 1.4.0 — 2026-11-08
|
|
8
|
+
|
|
9
|
+
Adds live scenarios ST1-ST12 for the standard native formats (admoai/adhub#4733): what the
|
|
10
|
+
engine now serves, asserted against a real decision-engine, and moves `schemaVersion` to 4.
|
|
11
|
+
Five new live `expect.creative` keys, each with exactly the semantics of the fixture key of the
|
|
12
|
+
same name, so an interpreter can share one check between `fixtureScenarios` and `scenarios`:
|
|
13
|
+
- `metadata`: an object limited to `effectiveStandardFormatKey`, `effectiveStandardFormatVersion`,
|
|
14
|
+
`templateSource` and `assetContext`. Each listed key must equal the served value exactly; `null`
|
|
15
|
+
means the key is absent from the served metadata.
|
|
16
|
+
- `templateKey`: the served `template.key`.
|
|
17
|
+
- `contentKeys`: the served creative's plain content keys are exactly this set (order is not
|
|
18
|
+
asserted; slides and matched points are not plain contents).
|
|
19
|
+
- `styleIn`: a non-empty list; the served `template.style` is one of them.
|
|
20
|
+
- `journeyStageKey`: the served creative's `journey.stageKey` equals it; only valid with
|
|
21
|
+
`"journey": true`.
|
|
22
|
+
ST1-ST8 serve the min and full Ad of Card, Expandable Banner, Branded Assets and Standard Video;
|
|
23
|
+
ST9 is a Card whose creative cannot satisfy its contract and is not served (no ad); ST10 is the
|
|
24
|
+
legacy `home` placement, whose metadata names no standard and carries no asset context; ST11 is a
|
|
25
|
+
Journey whose first stage's screen cannot satisfy its standard, skipped, so the next stage's screen
|
|
26
|
+
answers; ST12 is a Journey screen serving the saved Card style. Carousel is not in this version:
|
|
27
|
+
its slides are not served yet. Live runs need the `sdk_st_*` placements of the mock seed (11: nine
|
|
28
|
+
Ad placements and the two Journey entry placements `sdk_st_journey_skip` and
|
|
29
|
+
`sdk_st_journey_styles`). A runner that does not know `schemaVersion` 4 must refuse the manifest;
|
|
30
|
+
adopting 1.4.0 requires executing the five keys. The 39 live scenarios and F1-F25 are unchanged.
|
|
31
|
+
|
|
7
32
|
## 1.3.0 — 2026-11-05
|
|
8
33
|
|
|
9
34
|
Adds fixture scenarios F16–F25 with a `slideTracking` block (admoai/adhub#4733): what the app
|
package/README.md
CHANGED
|
@@ -37,3 +37,21 @@ or a key renamed), add a `CHANGELOG.md` entry, and run `sdk/scenarios/check.sh`.
|
|
|
37
37
|
into the package's `fixtures/golden-wire/`; that directory is never committed, and a change to a
|
|
38
38
|
golden file needs a version bump too); each SDK then
|
|
39
39
|
moves to it in its own PR. See `docs/guides/sdk-ci.md`.
|
|
40
|
+
|
|
41
|
+
## Schema versions
|
|
42
|
+
|
|
43
|
+
A runner must refuse a `schemaVersion` it does not execute.
|
|
44
|
+
|
|
45
|
+
| `schemaVersion` | Adds | Package |
|
|
46
|
+
| --- | --- | --- |
|
|
47
|
+
| 1 | live `scenarios` | 1.0.0 |
|
|
48
|
+
| 2 | `fixtureScenarios` (offline, golden wire) | 1.2.0 |
|
|
49
|
+
| 3 | `slideTracking` on a fixture scenario | 1.3.0 |
|
|
50
|
+
| 4 | live `expect.creative` keys `metadata`, `templateKey`, `contentKeys`, `styleIn`, `journeyStageKey` (ST1-ST12) | 1.4.0 |
|
|
51
|
+
|
|
52
|
+
The v4 keys, same semantics as the fixture keys of the same name: `metadata` is limited to
|
|
53
|
+
`effectiveStandardFormatKey`, `effectiveStandardFormatVersion`, `templateSource` and `assetContext`
|
|
54
|
+
(exact value per key, `null` = absent); `templateKey` is the served `template.key`; `contentKeys`
|
|
55
|
+
is the exact set of plain content keys (order not asserted); `styleIn` is a non-empty list the
|
|
56
|
+
served `template.style` belongs to; `journeyStageKey` is the served `journey.stageKey` (only with
|
|
57
|
+
`"journey": true`). Live runs of ST1-ST12 need the `sdk_st_*` placements of adhub's mock seed.
|
package/package.json
CHANGED
package/scenarios.feature
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# promises a publisher's app, in the same words for all three. CI regenerates it and fails on
|
|
7
7
|
# any difference, so it cannot drift from what the runners execute.
|
|
8
8
|
# How it is published and kept fresh: docs/guides/sdk-ci.md, Section 7.
|
|
9
|
-
# Manifest schemaVersion:
|
|
9
|
+
# Manifest schemaVersion: 4
|
|
10
10
|
|
|
11
11
|
Feature: Cross-SDK decision & tracking contract
|
|
12
12
|
Shared cross-SDK E2E scenario manifest. ONE definition, executed by a thin interpreter in each
|
|
@@ -385,6 +385,153 @@ Feature: Cross-SDK decision & tracking contract
|
|
|
385
385
|
And every tap and every click sends its beacon, on every call
|
|
386
386
|
And the engine accepts every beacon
|
|
387
387
|
|
|
388
|
+
@ST @standard-formats
|
|
389
|
+
Scenario: ST1 — a Card with only its required content serves under the Card standard
|
|
390
|
+
Given the app requests placement "sdk_st_card_min"
|
|
391
|
+
Then an ad is served
|
|
392
|
+
And exactly 1 decision is returned
|
|
393
|
+
And the creative is not a Journey Ad
|
|
394
|
+
And the creative's assetContext is absent
|
|
395
|
+
And the creative's effectiveStandardFormatKey is "card"
|
|
396
|
+
And the creative's effectiveStandardFormatVersion is 1
|
|
397
|
+
And the creative's templateSource is "admoai_standard"
|
|
398
|
+
And the template key is "card"
|
|
399
|
+
And the creative's contents are exactly "image", "destination_url"
|
|
400
|
+
|
|
401
|
+
@ST @standard-formats
|
|
402
|
+
Scenario: ST2 — a Card with every optional content serves them all, in a style the standard defines
|
|
403
|
+
Given the app requests placement "sdk_st_card_full"
|
|
404
|
+
Then an ad is served
|
|
405
|
+
And exactly 1 decision is returned
|
|
406
|
+
And the creative is not a Journey Ad
|
|
407
|
+
And the creative's assetContext is absent
|
|
408
|
+
And the creative's effectiveStandardFormatKey is "card"
|
|
409
|
+
And the creative's effectiveStandardFormatVersion is 1
|
|
410
|
+
And the creative's templateSource is "admoai_standard"
|
|
411
|
+
And the template key is "card"
|
|
412
|
+
And the creative's contents are exactly "image", "brand_logo", "headline", "supporting_text", "cta_text", "destination_url"
|
|
413
|
+
And the template style is one of "default", "tall"
|
|
414
|
+
|
|
415
|
+
@ST @standard-formats
|
|
416
|
+
Scenario: ST3 — an Expandable Banner with only its required content serves under the Expandable Banner standard
|
|
417
|
+
Given the app requests placement "sdk_st_expandable_banner_min"
|
|
418
|
+
Then an ad is served
|
|
419
|
+
And exactly 1 decision is returned
|
|
420
|
+
And the creative is not a Journey Ad
|
|
421
|
+
And the creative's assetContext is absent
|
|
422
|
+
And the creative's effectiveStandardFormatKey is "expandable_banner"
|
|
423
|
+
And the creative's effectiveStandardFormatVersion is 1
|
|
424
|
+
And the creative's templateSource is "admoai_standard"
|
|
425
|
+
And the template key is "expandable_banner"
|
|
426
|
+
And the creative's contents are exactly "teaser_image", "expanded_image", "destination_url"
|
|
427
|
+
|
|
428
|
+
@ST @standard-formats
|
|
429
|
+
Scenario: ST4 — an Expandable Banner with every optional content serves them all
|
|
430
|
+
Given the app requests placement "sdk_st_expandable_banner_full"
|
|
431
|
+
Then an ad is served
|
|
432
|
+
And exactly 1 decision is returned
|
|
433
|
+
And the creative is not a Journey Ad
|
|
434
|
+
And the creative's assetContext is absent
|
|
435
|
+
And the creative's effectiveStandardFormatKey is "expandable_banner"
|
|
436
|
+
And the creative's effectiveStandardFormatVersion is 1
|
|
437
|
+
And the creative's templateSource is "admoai_standard"
|
|
438
|
+
And the template key is "expandable_banner"
|
|
439
|
+
And the creative's contents are exactly "teaser_image", "teaser_headline", "expanded_image", "headline", "supporting_text", "cta_text", "destination_url", "disclaimer"
|
|
440
|
+
|
|
441
|
+
@ST @standard-formats
|
|
442
|
+
Scenario: ST5 — a Branded Asset with only its required content serves with its asset context
|
|
443
|
+
Given the app requests placement "sdk_st_branded_assets_min"
|
|
444
|
+
Then an ad is served
|
|
445
|
+
And exactly 1 decision is returned
|
|
446
|
+
And the creative is not a Journey Ad
|
|
447
|
+
And the creative's assetContext is "vehicle_marker"
|
|
448
|
+
And the creative's effectiveStandardFormatKey is "branded_assets"
|
|
449
|
+
And the creative's effectiveStandardFormatVersion is 1
|
|
450
|
+
And the creative's templateSource is "admoai_standard"
|
|
451
|
+
And the template key is "branded_assets"
|
|
452
|
+
And the creative's contents are exactly "branded_image"
|
|
453
|
+
|
|
454
|
+
@ST @standard-formats
|
|
455
|
+
Scenario: ST6 — a Branded Asset with every optional content serves them all, with its asset context
|
|
456
|
+
Given the app requests placement "sdk_st_branded_assets_full"
|
|
457
|
+
Then an ad is served
|
|
458
|
+
And exactly 1 decision is returned
|
|
459
|
+
And the creative is not a Journey Ad
|
|
460
|
+
And the creative's assetContext is "vehicle_marker"
|
|
461
|
+
And the creative's effectiveStandardFormatKey is "branded_assets"
|
|
462
|
+
And the creative's effectiveStandardFormatVersion is 1
|
|
463
|
+
And the creative's templateSource is "admoai_standard"
|
|
464
|
+
And the template key is "branded_assets"
|
|
465
|
+
And the creative's contents are exactly "branded_image", "accessible_label", "destination_url"
|
|
466
|
+
|
|
467
|
+
@ST @standard-formats
|
|
468
|
+
Scenario: ST7 — a Standard Video with only its required content serves under the Standard Video standard
|
|
469
|
+
Given the app requests placement "sdk_st_standard_video_min"
|
|
470
|
+
Then an ad is served
|
|
471
|
+
And exactly 1 decision is returned
|
|
472
|
+
And the creative is not a Journey Ad
|
|
473
|
+
And the creative's assetContext is absent
|
|
474
|
+
And the creative's effectiveStandardFormatKey is "standard_video"
|
|
475
|
+
And the creative's effectiveStandardFormatVersion is 1
|
|
476
|
+
And the creative's templateSource is "admoai_standard"
|
|
477
|
+
And the template key is "standard_video"
|
|
478
|
+
And the creative's contents are exactly "video_asset", "poster_image"
|
|
479
|
+
|
|
480
|
+
@ST @standard-formats
|
|
481
|
+
Scenario: ST8 — a Standard Video with every optional content serves them all
|
|
482
|
+
Given the app requests placement "sdk_st_standard_video_full"
|
|
483
|
+
Then an ad is served
|
|
484
|
+
And exactly 1 decision is returned
|
|
485
|
+
And the creative is not a Journey Ad
|
|
486
|
+
And the creative's assetContext is absent
|
|
487
|
+
And the creative's effectiveStandardFormatKey is "standard_video"
|
|
488
|
+
And the creative's effectiveStandardFormatVersion is 1
|
|
489
|
+
And the creative's templateSource is "admoai_standard"
|
|
490
|
+
And the template key is "standard_video"
|
|
491
|
+
And the creative's contents are exactly "video_asset", "poster_image", "brand_logo", "headline", "supporting_text", "cta_text", "destination_url", "disclaimer"
|
|
492
|
+
|
|
493
|
+
@ST @standard-formats
|
|
494
|
+
Scenario: ST9 — a standard Ad whose creative cannot satisfy its standard's contract is not served
|
|
495
|
+
Given the app requests placement "sdk_st_card_incomplete"
|
|
496
|
+
Then no ad is served, and the placement answers with a clean no-fill
|
|
497
|
+
|
|
498
|
+
@ST @standard-formats
|
|
499
|
+
Scenario: ST10 — a legacy creative names no standard and carries no asset context
|
|
500
|
+
Given the app requests placement "home"
|
|
501
|
+
Then an ad is served
|
|
502
|
+
And exactly 1 decision is returned
|
|
503
|
+
And the creative is not a Journey Ad
|
|
504
|
+
And the creative's assetContext is absent
|
|
505
|
+
And the creative's effectiveStandardFormatKey is absent
|
|
506
|
+
And the creative's effectiveStandardFormatVersion is absent
|
|
507
|
+
And the creative's templateSource is absent
|
|
508
|
+
|
|
509
|
+
@ST @standard-formats
|
|
510
|
+
Scenario: ST11 — a Journey screen that cannot satisfy its standard is skipped and the next stage's screen answers
|
|
511
|
+
Given the app requests placement "sdk_st_journey_skip"
|
|
512
|
+
And the request carries a fresh session id
|
|
513
|
+
And the user has opted in to Journey Ads
|
|
514
|
+
Then an ad is served
|
|
515
|
+
And exactly 1 decision is returned
|
|
516
|
+
And the creative is a Journey Ad
|
|
517
|
+
And the creative's assetContext is absent
|
|
518
|
+
And the creative's effectiveStandardFormatKey is "card"
|
|
519
|
+
And the creative's effectiveStandardFormatVersion is 1
|
|
520
|
+
And the creative's templateSource is "admoai_standard"
|
|
521
|
+
And the template key is "card"
|
|
522
|
+
And the Journey stage is "complete"
|
|
523
|
+
|
|
524
|
+
@ST @standard-formats
|
|
525
|
+
Scenario: ST12 — a Journey screen serves the Card style saved on it
|
|
526
|
+
Given the app requests placement "sdk_st_journey_styles"
|
|
527
|
+
And the request carries a fresh session id
|
|
528
|
+
And the user has opted in to Journey Ads
|
|
529
|
+
Then an ad is served
|
|
530
|
+
And exactly 1 decision is returned
|
|
531
|
+
And the creative is a Journey Ad
|
|
532
|
+
And the template key is "card"
|
|
533
|
+
And the template style is one of "default", "tall"
|
|
534
|
+
|
|
388
535
|
@F @fixture
|
|
389
536
|
Scenario: F1 — a Native Display creative exposes its standard format, version and template source
|
|
390
537
|
Given the app decodes the golden card.full response
|
package/scenarios.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"schemaVersion":
|
|
2
|
+
"schemaVersion": 4,
|
|
3
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
|
{
|
|
@@ -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": [
|