@adcp/client 4.13.0 → 4.14.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/bin/adcp.js +23 -23
- package/dist/lib/testing/agent-tester.d.ts +1 -1
- package/dist/lib/testing/agent-tester.d.ts.map +1 -1
- package/dist/lib/testing/agent-tester.js +22 -1
- package/dist/lib/testing/agent-tester.js.map +1 -1
- package/dist/lib/testing/client.d.ts +6 -0
- package/dist/lib/testing/client.d.ts.map +1 -1
- package/dist/lib/testing/client.js +42 -3
- package/dist/lib/testing/client.js.map +1 -1
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
- package/dist/lib/testing/compliance/comply.js +49 -2
- package/dist/lib/testing/compliance/comply.js.map +1 -1
- package/dist/lib/testing/index.d.ts +1 -1
- package/dist/lib/testing/index.d.ts.map +1 -1
- package/dist/lib/testing/index.js +6 -2
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/orchestrator.d.ts.map +1 -1
- package/dist/lib/testing/orchestrator.js +7 -0
- package/dist/lib/testing/orchestrator.js.map +1 -1
- package/dist/lib/testing/scenarios/index.d.ts +1 -1
- package/dist/lib/testing/scenarios/index.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/index.js +4 -1
- package/dist/lib/testing/scenarios/index.js.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.d.ts +24 -0
- package/dist/lib/testing/scenarios/media-buy.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.js +318 -0
- package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.js +3 -0
- package/dist/lib/testing/scenarios/schema-compliance.js.map +1 -1
- package/dist/lib/testing/scenarios/signals.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/signals.js +4 -1
- package/dist/lib/testing/scenarios/signals.js.map +1 -1
- package/dist/lib/testing/types.d.ts +1 -1
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/utils/response-schemas.d.ts +9 -0
- package/dist/lib/utils/response-schemas.d.ts.map +1 -0
- package/dist/lib/utils/response-schemas.js +59 -0
- package/dist/lib/utils/response-schemas.js.map +1 -0
- package/dist/lib/utils/response-unwrapper.d.ts +2 -2
- package/dist/lib/utils/response-unwrapper.d.ts.map +1 -1
- package/dist/lib/utils/response-unwrapper.js +3 -91
- package/dist/lib/utils/response-unwrapper.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/lib/testing/orchestrator.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/lib/testing/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export { testHealthCheck } from './health';
|
|
7
7
|
export { testDiscovery } from './discovery';
|
|
8
|
-
export { testCreateMediaBuy, testFullSalesFlow, testCreativeSync, testCreativeInline, testCreativeReference, testSyncAudiences, resolveAccountForAudiences, selectProduct, selectPricingOption, buildCreateMediaBuyRequest, } from './media-buy';
|
|
8
|
+
export { testCreateMediaBuy, testFullSalesFlow, testCreativeSync, testCreativeInline, testCreativeReference, testSyncAudiences, resolveAccountForAudiences, selectProduct, selectPricingOption, buildCreateMediaBuyRequest, testMediaBuyLifecycle, testTerminalStateEnforcement, testPackageLifecycle, } from './media-buy';
|
|
9
9
|
export { testCreativeFlow, testCreativeLifecycle } from './creative';
|
|
10
10
|
export { testSignalsFlow } from './signals';
|
|
11
11
|
export { testErrorHandling, testValidation, testPricingEdgeCases, testTemporalValidation, testBehaviorAnalysis, testResponseConsistency, } from './edge-cases';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/scenarios/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,0BAA0B,EAC1B,aAAa,EACb,mBAAmB,EACnB,0BAA0B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/scenarios/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,0BAA0B,EAC1B,aAAa,EACb,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGrE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,2BAA2B,EAC3B,8BAA8B,EAC9B,uBAAuB,EACvB,sBAAsB,EACtB,4BAA4B,EAC5B,gCAAgC,EAChC,8BAA8B,EAC9B,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGjH,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAG3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Re-exports all test scenarios for easy importing.
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.testErrorTransport = exports.testErrorStructure = exports.testErrorCodes = exports.testSchemaCompliance = exports.likelySupportsV3 = exports.testCapabilityDiscovery = exports.hasSITools = exports.testSIHandoff = exports.testSIAvailability = exports.testSISessionLifecycle = exports.hasCampaignGovernanceTools = exports.hasGovernanceTools = exports.testCampaignGovernanceDelivery = exports.testCampaignGovernanceConditions = exports.testCampaignGovernanceDenied = exports.testCampaignGovernance = exports.testPropertyListFilters = exports.testGovernanceContentStandards = exports.testGovernancePropertyLists = exports.testResponseConsistency = exports.testBehaviorAnalysis = exports.testTemporalValidation = exports.testPricingEdgeCases = exports.testValidation = exports.testErrorHandling = exports.testSignalsFlow = exports.testCreativeLifecycle = exports.testCreativeFlow = exports.buildCreateMediaBuyRequest = exports.selectPricingOption = exports.selectProduct = exports.resolveAccountForAudiences = exports.testSyncAudiences = exports.testCreativeReference = exports.testCreativeInline = exports.testCreativeSync = exports.testFullSalesFlow = exports.testCreateMediaBuy = exports.testDiscovery = exports.testHealthCheck = void 0;
|
|
8
|
+
exports.testErrorTransport = exports.testErrorStructure = exports.testErrorCodes = exports.testSchemaCompliance = exports.likelySupportsV3 = exports.testCapabilityDiscovery = exports.hasSITools = exports.testSIHandoff = exports.testSIAvailability = exports.testSISessionLifecycle = exports.hasCampaignGovernanceTools = exports.hasGovernanceTools = exports.testCampaignGovernanceDelivery = exports.testCampaignGovernanceConditions = exports.testCampaignGovernanceDenied = exports.testCampaignGovernance = exports.testPropertyListFilters = exports.testGovernanceContentStandards = exports.testGovernancePropertyLists = exports.testResponseConsistency = exports.testBehaviorAnalysis = exports.testTemporalValidation = exports.testPricingEdgeCases = exports.testValidation = exports.testErrorHandling = exports.testSignalsFlow = exports.testCreativeLifecycle = exports.testCreativeFlow = exports.testPackageLifecycle = exports.testTerminalStateEnforcement = exports.testMediaBuyLifecycle = exports.buildCreateMediaBuyRequest = exports.selectPricingOption = exports.selectProduct = exports.resolveAccountForAudiences = exports.testSyncAudiences = exports.testCreativeReference = exports.testCreativeInline = exports.testCreativeSync = exports.testFullSalesFlow = exports.testCreateMediaBuy = exports.testDiscovery = exports.testHealthCheck = void 0;
|
|
9
9
|
// Health check
|
|
10
10
|
var health_1 = require("./health");
|
|
11
11
|
Object.defineProperty(exports, "testHealthCheck", { enumerable: true, get: function () { return health_1.testHealthCheck; } });
|
|
@@ -24,6 +24,9 @@ Object.defineProperty(exports, "resolveAccountForAudiences", { enumerable: true,
|
|
|
24
24
|
Object.defineProperty(exports, "selectProduct", { enumerable: true, get: function () { return media_buy_1.selectProduct; } });
|
|
25
25
|
Object.defineProperty(exports, "selectPricingOption", { enumerable: true, get: function () { return media_buy_1.selectPricingOption; } });
|
|
26
26
|
Object.defineProperty(exports, "buildCreateMediaBuyRequest", { enumerable: true, get: function () { return media_buy_1.buildCreateMediaBuyRequest; } });
|
|
27
|
+
Object.defineProperty(exports, "testMediaBuyLifecycle", { enumerable: true, get: function () { return media_buy_1.testMediaBuyLifecycle; } });
|
|
28
|
+
Object.defineProperty(exports, "testTerminalStateEnforcement", { enumerable: true, get: function () { return media_buy_1.testTerminalStateEnforcement; } });
|
|
29
|
+
Object.defineProperty(exports, "testPackageLifecycle", { enumerable: true, get: function () { return media_buy_1.testPackageLifecycle; } });
|
|
27
30
|
// Creative agent testing
|
|
28
31
|
var creative_1 = require("./creative");
|
|
29
32
|
Object.defineProperty(exports, "testCreativeFlow", { enumerable: true, get: function () { return creative_1.testCreativeFlow; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/testing/scenarios/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,eAAe;AACf,mCAA2C;AAAlC,yGAAA,eAAe,OAAA;AAExB,YAAY;AACZ,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AAEtB,yBAAyB;AACzB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/testing/scenarios/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,eAAe;AACf,mCAA2C;AAAlC,yGAAA,eAAe,OAAA;AAExB,YAAY;AACZ,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AAEtB,yBAAyB;AACzB,yCAcqB;AAbnB,+GAAA,kBAAkB,OAAA;AAClB,8GAAA,iBAAiB,OAAA;AACjB,6GAAA,gBAAgB,OAAA;AAChB,+GAAA,kBAAkB,OAAA;AAClB,kHAAA,qBAAqB,OAAA;AACrB,8GAAA,iBAAiB,OAAA;AACjB,uHAAA,0BAA0B,OAAA;AAC1B,0GAAA,aAAa,OAAA;AACb,gHAAA,mBAAmB,OAAA;AACnB,uHAAA,0BAA0B,OAAA;AAC1B,kHAAA,qBAAqB,OAAA;AACrB,yHAAA,4BAA4B,OAAA;AAC5B,iHAAA,oBAAoB,OAAA;AAGtB,yBAAyB;AACzB,uCAAqE;AAA5D,4GAAA,gBAAgB,OAAA;AAAE,iHAAA,qBAAqB,OAAA;AAEhD,wBAAwB;AACxB,qCAA4C;AAAnC,0GAAA,eAAe,OAAA;AAExB,oBAAoB;AACpB,2CAOsB;AANpB,+GAAA,iBAAiB,OAAA;AACjB,4GAAA,cAAc,OAAA;AACd,kHAAA,oBAAoB,OAAA;AACpB,oHAAA,sBAAsB,OAAA;AACtB,kHAAA,oBAAoB,OAAA;AACpB,qHAAA,uBAAuB,OAAA;AAGzB,iCAAiC;AACjC,2CAUsB;AATpB,yHAAA,2BAA2B,OAAA;AAC3B,4HAAA,8BAA8B,OAAA;AAC9B,qHAAA,uBAAuB,OAAA;AACvB,oHAAA,sBAAsB,OAAA;AACtB,0HAAA,4BAA4B,OAAA;AAC5B,8HAAA,gCAAgC,OAAA;AAChC,4HAAA,8BAA8B,OAAA;AAC9B,gHAAA,kBAAkB,OAAA;AAClB,wHAAA,0BAA0B,OAAA;AAG5B,kDAAkD;AAClD,mEAAiH;AAAxG,gIAAA,sBAAsB,OAAA;AAAE,4HAAA,kBAAkB,OAAA;AAAE,uHAAA,aAAa,OAAA;AAAE,oHAAA,UAAU,OAAA;AAE9E,kCAAkC;AAClC,+CAA2E;AAAlE,uHAAA,uBAAuB,OAAA;AAAE,gHAAA,gBAAgB,OAAA;AAElD,4BAA4B;AAC5B,yDAA2D;AAAlD,yHAAA,oBAAoB,OAAA;AAE7B,0DAA0D;AAC1D,uDAA4F;AAAnF,kHAAA,cAAc,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AAAE,sHAAA,kBAAkB,OAAA"}
|
|
@@ -85,4 +85,28 @@ export declare function testSyncAudiences(agentUrl: string, options: TestOptions
|
|
|
85
85
|
steps: TestStepResult[];
|
|
86
86
|
profile?: AgentProfile;
|
|
87
87
|
}>;
|
|
88
|
+
/**
|
|
89
|
+
* Test: Media Buy Lifecycle
|
|
90
|
+
* Exercises the full state machine: create -> pause -> resume -> get status -> cancel
|
|
91
|
+
*/
|
|
92
|
+
export declare function testMediaBuyLifecycle(agentUrl: string, options: TestOptions): Promise<{
|
|
93
|
+
steps: TestStepResult[];
|
|
94
|
+
profile?: AgentProfile;
|
|
95
|
+
}>;
|
|
96
|
+
/**
|
|
97
|
+
* Test: Terminal State Enforcement
|
|
98
|
+
* Verifies agents reject updates to media buys in terminal states.
|
|
99
|
+
*/
|
|
100
|
+
export declare function testTerminalStateEnforcement(agentUrl: string, options: TestOptions): Promise<{
|
|
101
|
+
steps: TestStepResult[];
|
|
102
|
+
profile?: AgentProfile;
|
|
103
|
+
}>;
|
|
104
|
+
/**
|
|
105
|
+
* Test: Package Lifecycle
|
|
106
|
+
* Tests package-level pause/resume independent of media buy status.
|
|
107
|
+
*/
|
|
108
|
+
export declare function testPackageLifecycle(agentUrl: string, options: TestOptions): Promise<{
|
|
109
|
+
steps: TestStepResult[];
|
|
110
|
+
profile?: AgentProfile;
|
|
111
|
+
}>;
|
|
88
112
|
//# sourceMappingURL=media-buy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-buy.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/scenarios/media-buy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAKjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAY,MAAM,4BAA4B,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"media-buy.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/scenarios/media-buy.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,9 @@ exports.testCreativeInline = testCreativeInline;
|
|
|
19
19
|
exports.testCreativeReference = testCreativeReference;
|
|
20
20
|
exports.resolveAccountForAudiences = resolveAccountForAudiences;
|
|
21
21
|
exports.testSyncAudiences = testSyncAudiences;
|
|
22
|
+
exports.testMediaBuyLifecycle = testMediaBuyLifecycle;
|
|
23
|
+
exports.testTerminalStateEnforcement = testTerminalStateEnforcement;
|
|
24
|
+
exports.testPackageLifecycle = testPackageLifecycle;
|
|
22
25
|
const client_1 = require("../client");
|
|
23
26
|
const discovery_1 = require("./discovery");
|
|
24
27
|
/**
|
|
@@ -207,6 +210,7 @@ async function testCreateMediaBuy(agentUrl, options) {
|
|
|
207
210
|
async () => client.createMediaBuy(createRequest));
|
|
208
211
|
let mediaBuyId;
|
|
209
212
|
if (createResult?.success && createResult?.data) {
|
|
213
|
+
steps.push((0, client_1.validateResponseSchema)('create_media_buy', createResult.data));
|
|
210
214
|
const mediaBuy = createResult.data;
|
|
211
215
|
const nested = mediaBuy.media_buy;
|
|
212
216
|
mediaBuyId = (mediaBuy.media_buy_id || nested?.media_buy_id);
|
|
@@ -276,6 +280,7 @@ async function testFullSalesFlow(agentUrl, options) {
|
|
|
276
280
|
include_snapshot: true,
|
|
277
281
|
}));
|
|
278
282
|
if (snapshotResult?.success && snapshotResult?.data) {
|
|
283
|
+
steps.push((0, client_1.validateResponseSchema)('get_media_buys', snapshotResult.data));
|
|
279
284
|
const mediaBuys = snapshotResult.data.media_buys || [];
|
|
280
285
|
const mediaBuy = mediaBuys.find((item) => item.media_buy_id === mediaBuyId) || mediaBuys[0];
|
|
281
286
|
const packages = mediaBuy?.packages || [];
|
|
@@ -569,6 +574,7 @@ async function testCreativeInline(agentUrl, options) {
|
|
|
569
574
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
570
575
|
async () => client.createMediaBuy(createRequest));
|
|
571
576
|
if (createResult?.success && createResult?.data) {
|
|
577
|
+
steps.push((0, client_1.validateResponseSchema)('create_media_buy', createResult.data));
|
|
572
578
|
const mediaBuy = createResult.data;
|
|
573
579
|
const nested = mediaBuy.media_buy;
|
|
574
580
|
const mediaBuyId = (mediaBuy.media_buy_id || nested?.media_buy_id);
|
|
@@ -701,6 +707,7 @@ async function testCreativeReference(agentUrl, options) {
|
|
|
701
707
|
});
|
|
702
708
|
const { result: createResult, step: createStep } = await (0, client_1.runStep)('Create media buy with referenced creative', 'create_media_buy', async () => client.executeTask('create_media_buy', createRequest));
|
|
703
709
|
if (createResult?.success && createResult?.data) {
|
|
710
|
+
steps.push((0, client_1.validateResponseSchema)('create_media_buy', createResult.data));
|
|
704
711
|
const mediaBuy = createResult.data;
|
|
705
712
|
const mediaBuyId = mediaBuy.media_buy_id || mediaBuy.media_buy?.media_buy_id;
|
|
706
713
|
const packages = mediaBuy.packages || mediaBuy.media_buy?.packages;
|
|
@@ -905,4 +912,315 @@ async function testSyncAudiences(agentUrl, options) {
|
|
|
905
912
|
steps.push(deleteStep);
|
|
906
913
|
return { steps, profile };
|
|
907
914
|
}
|
|
915
|
+
// ---------------------------------------------------------------------------
|
|
916
|
+
// State Machine Compliance Scenarios
|
|
917
|
+
// ---------------------------------------------------------------------------
|
|
918
|
+
/**
|
|
919
|
+
* Extract media buy status from a response, handling nested shapes.
|
|
920
|
+
*/
|
|
921
|
+
function extractStatus(data) {
|
|
922
|
+
const nested = data.media_buy;
|
|
923
|
+
return (data.status ?? nested?.status);
|
|
924
|
+
}
|
|
925
|
+
/**
|
|
926
|
+
* Test: Media Buy Lifecycle
|
|
927
|
+
* Exercises the full state machine: create -> pause -> resume -> get status -> cancel
|
|
928
|
+
*/
|
|
929
|
+
async function testMediaBuyLifecycle(agentUrl, options) {
|
|
930
|
+
const steps = [];
|
|
931
|
+
const client = (0, client_1.createTestClient)(agentUrl, options.protocol || 'mcp', options);
|
|
932
|
+
// Create a media buy to work with
|
|
933
|
+
const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);
|
|
934
|
+
steps.push(...createSteps);
|
|
935
|
+
if (!mediaBuyId || !profile?.tools.includes('update_media_buy')) {
|
|
936
|
+
return { steps, profile };
|
|
937
|
+
}
|
|
938
|
+
// Step 1: Pause the media buy
|
|
939
|
+
const { result: pauseResult, step: pauseStep } = await (0, client_1.runStep)('Pause media buy', 'update_media_buy', async () => client.updateMediaBuy({
|
|
940
|
+
media_buy_id: mediaBuyId,
|
|
941
|
+
paused: true,
|
|
942
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
943
|
+
}));
|
|
944
|
+
if (pauseResult?.success && pauseResult?.data) {
|
|
945
|
+
const data = pauseResult.data;
|
|
946
|
+
const status = extractStatus(data);
|
|
947
|
+
pauseStep.details = `Paused media buy, status: ${status}`;
|
|
948
|
+
pauseStep.response_preview = JSON.stringify({ media_buy_id: mediaBuyId, status }, null, 2);
|
|
949
|
+
if (status && status !== 'paused') {
|
|
950
|
+
pauseStep.warnings = [`Expected status 'paused', got '${status}'`];
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
else if (pauseResult && !pauseResult.success) {
|
|
954
|
+
pauseStep.passed = false;
|
|
955
|
+
pauseStep.error = pauseResult.error || 'Pause operation failed';
|
|
956
|
+
}
|
|
957
|
+
steps.push(pauseStep);
|
|
958
|
+
// Step 2: Resume the media buy
|
|
959
|
+
const { result: resumeResult, step: resumeStep } = await (0, client_1.runStep)('Resume media buy', 'update_media_buy', async () => client.updateMediaBuy({
|
|
960
|
+
media_buy_id: mediaBuyId,
|
|
961
|
+
paused: false,
|
|
962
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
963
|
+
}));
|
|
964
|
+
if (resumeResult?.success && resumeResult?.data) {
|
|
965
|
+
const data = resumeResult.data;
|
|
966
|
+
const status = extractStatus(data);
|
|
967
|
+
resumeStep.details = `Resumed media buy, status: ${status}`;
|
|
968
|
+
resumeStep.response_preview = JSON.stringify({ media_buy_id: mediaBuyId, status }, null, 2);
|
|
969
|
+
if (status && status !== 'active' && status !== 'pending_activation') {
|
|
970
|
+
resumeStep.warnings = [`Expected status 'active' or 'pending_activation', got '${status}'`];
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
else if (resumeResult && !resumeResult.success) {
|
|
974
|
+
resumeStep.passed = false;
|
|
975
|
+
resumeStep.error = resumeResult.error || 'Resume operation failed';
|
|
976
|
+
}
|
|
977
|
+
steps.push(resumeStep);
|
|
978
|
+
// Step 3: Get status and check valid_actions (if get_media_buys available)
|
|
979
|
+
if (profile.tools.includes('get_media_buys')) {
|
|
980
|
+
const { result: statusResult, step: statusStep } = await (0, client_1.runStep)('Get media buy status and valid_actions', 'get_media_buys', async () => client.executeTask('get_media_buys', {
|
|
981
|
+
media_buy_ids: [mediaBuyId],
|
|
982
|
+
}));
|
|
983
|
+
if (statusResult?.success && statusResult?.data) {
|
|
984
|
+
const mediaBuys = (statusResult.data.media_buys || []);
|
|
985
|
+
const mediaBuy = mediaBuys.find((item) => item.media_buy_id === mediaBuyId) || mediaBuys[0];
|
|
986
|
+
if (!mediaBuy) {
|
|
987
|
+
statusStep.passed = false;
|
|
988
|
+
statusStep.error = 'get_media_buys did not return the created media buy';
|
|
989
|
+
}
|
|
990
|
+
else {
|
|
991
|
+
const validActions = mediaBuy.valid_actions;
|
|
992
|
+
statusStep.details = `Status: ${mediaBuy.status}, valid_actions: ${validActions ? validActions.join(', ') : 'not provided'}`;
|
|
993
|
+
statusStep.response_preview = JSON.stringify({
|
|
994
|
+
media_buy_id: mediaBuy.media_buy_id,
|
|
995
|
+
status: mediaBuy.status,
|
|
996
|
+
valid_actions: validActions,
|
|
997
|
+
}, null, 2);
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
else if (statusResult && !statusResult.success) {
|
|
1001
|
+
statusStep.passed = false;
|
|
1002
|
+
statusStep.error = statusResult.error || 'get_media_buys failed';
|
|
1003
|
+
}
|
|
1004
|
+
steps.push(statusStep);
|
|
1005
|
+
}
|
|
1006
|
+
// Step 4: Cancel the media buy
|
|
1007
|
+
const { result: cancelResult, step: cancelStep } = await (0, client_1.runStep)('Cancel media buy', 'update_media_buy', async () => client.updateMediaBuy({
|
|
1008
|
+
media_buy_id: mediaBuyId,
|
|
1009
|
+
canceled: true,
|
|
1010
|
+
cancellation_reason: 'AdCP compliance test — lifecycle scenario',
|
|
1011
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
1012
|
+
}));
|
|
1013
|
+
if (cancelResult?.success && cancelResult?.data) {
|
|
1014
|
+
const data = cancelResult.data;
|
|
1015
|
+
const status = extractStatus(data);
|
|
1016
|
+
cancelStep.details = `Canceled media buy, status: ${status}`;
|
|
1017
|
+
cancelStep.response_preview = JSON.stringify({ media_buy_id: mediaBuyId, status }, null, 2);
|
|
1018
|
+
if (status && status !== 'canceled') {
|
|
1019
|
+
cancelStep.warnings = [`Expected status 'canceled', got '${status}'`];
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
else if (cancelResult && !cancelResult.success) {
|
|
1023
|
+
// NOT_CANCELLABLE is a valid response — agent may not support cancellation
|
|
1024
|
+
const error = cancelResult.error || '';
|
|
1025
|
+
if (error.includes('NOT_CANCELLABLE') || error.includes('not_cancellable')) {
|
|
1026
|
+
cancelStep.passed = true;
|
|
1027
|
+
cancelStep.details = 'Agent does not support cancellation (NOT_CANCELLABLE)';
|
|
1028
|
+
}
|
|
1029
|
+
else {
|
|
1030
|
+
cancelStep.passed = false;
|
|
1031
|
+
cancelStep.error = cancelResult.error || 'Cancel operation failed';
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
steps.push(cancelStep);
|
|
1035
|
+
return { steps, profile };
|
|
1036
|
+
}
|
|
1037
|
+
/**
|
|
1038
|
+
* Test: Terminal State Enforcement
|
|
1039
|
+
* Verifies agents reject updates to media buys in terminal states.
|
|
1040
|
+
*/
|
|
1041
|
+
async function testTerminalStateEnforcement(agentUrl, options) {
|
|
1042
|
+
const steps = [];
|
|
1043
|
+
const client = (0, client_1.createTestClient)(agentUrl, options.protocol || 'mcp', options);
|
|
1044
|
+
// Create and cancel a media buy
|
|
1045
|
+
const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);
|
|
1046
|
+
steps.push(...createSteps);
|
|
1047
|
+
if (!mediaBuyId || !profile?.tools.includes('update_media_buy')) {
|
|
1048
|
+
return { steps, profile };
|
|
1049
|
+
}
|
|
1050
|
+
// Cancel the media buy to put it in a terminal state
|
|
1051
|
+
const { result: cancelResult, step: cancelStep } = await (0, client_1.runStep)('Cancel media buy (setup)', 'update_media_buy', async () => client.updateMediaBuy({
|
|
1052
|
+
media_buy_id: mediaBuyId,
|
|
1053
|
+
canceled: true,
|
|
1054
|
+
cancellation_reason: 'AdCP compliance test — terminal state enforcement',
|
|
1055
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
1056
|
+
}));
|
|
1057
|
+
if (cancelResult?.success && cancelResult?.data) {
|
|
1058
|
+
const data = cancelResult.data;
|
|
1059
|
+
cancelStep.details = `Canceled media buy, status: ${extractStatus(data)}`;
|
|
1060
|
+
}
|
|
1061
|
+
else if (cancelResult && !cancelResult.success) {
|
|
1062
|
+
const error = cancelResult.error || '';
|
|
1063
|
+
if (error.includes('NOT_CANCELLABLE') || error.includes('not_cancellable')) {
|
|
1064
|
+
// Agent doesn't support cancellation — can't test terminal state enforcement
|
|
1065
|
+
cancelStep.passed = true;
|
|
1066
|
+
cancelStep.details = 'Agent does not support cancellation — skipping terminal state tests';
|
|
1067
|
+
steps.push(cancelStep);
|
|
1068
|
+
return { steps, profile };
|
|
1069
|
+
}
|
|
1070
|
+
cancelStep.passed = false;
|
|
1071
|
+
cancelStep.error = cancelResult.error || 'Cancel setup failed';
|
|
1072
|
+
}
|
|
1073
|
+
steps.push(cancelStep);
|
|
1074
|
+
// Try to pause the canceled media buy — should be rejected
|
|
1075
|
+
const { result: pauseResult, step: pauseStep } = await (0, client_1.runStep)('Update canceled media buy (expect rejection)', 'update_media_buy', async () => client.updateMediaBuy({
|
|
1076
|
+
media_buy_id: mediaBuyId,
|
|
1077
|
+
paused: true,
|
|
1078
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
1079
|
+
}));
|
|
1080
|
+
if (pauseResult?.success) {
|
|
1081
|
+
pauseStep.passed = false;
|
|
1082
|
+
pauseStep.error = 'Agent accepted update to canceled media buy — should reject with INVALID_STATE';
|
|
1083
|
+
}
|
|
1084
|
+
else if (pauseResult) {
|
|
1085
|
+
// Agent returned { success: false } — correct behavior
|
|
1086
|
+
pauseStep.passed = true;
|
|
1087
|
+
const error = pauseResult.error || '';
|
|
1088
|
+
const hasExpectedCode = error.includes('INVALID_STATE') || error.includes('invalid_state');
|
|
1089
|
+
pauseStep.details = hasExpectedCode
|
|
1090
|
+
? 'Correctly rejected with INVALID_STATE'
|
|
1091
|
+
: `Correctly rejected update to canceled media buy: ${error}`;
|
|
1092
|
+
if (!hasExpectedCode && error) {
|
|
1093
|
+
pauseStep.warnings = ['Agent rejected the update but did not use INVALID_STATE error code'];
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
// else: pauseResult is undefined (exception thrown) — runStep already set passed=false and error
|
|
1097
|
+
steps.push(pauseStep);
|
|
1098
|
+
// Try to cancel again — should also be rejected (or idempotent)
|
|
1099
|
+
const { result: reCancelResult, step: reCancelStep } = await (0, client_1.runStep)('Cancel already-canceled media buy (expect rejection)', 'update_media_buy', async () => client.updateMediaBuy({
|
|
1100
|
+
media_buy_id: mediaBuyId,
|
|
1101
|
+
canceled: true,
|
|
1102
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
1103
|
+
}));
|
|
1104
|
+
if (reCancelResult?.success) {
|
|
1105
|
+
// Idempotent cancellation is acceptable
|
|
1106
|
+
reCancelStep.passed = true;
|
|
1107
|
+
reCancelStep.details = 'Agent accepted re-cancellation (idempotent) — acceptable behavior';
|
|
1108
|
+
}
|
|
1109
|
+
else if (reCancelResult) {
|
|
1110
|
+
reCancelStep.passed = true;
|
|
1111
|
+
const error = reCancelResult.error || '';
|
|
1112
|
+
reCancelStep.details = `Correctly rejected re-cancellation: ${error}`;
|
|
1113
|
+
}
|
|
1114
|
+
steps.push(reCancelStep);
|
|
1115
|
+
return { steps, profile };
|
|
1116
|
+
}
|
|
1117
|
+
/**
|
|
1118
|
+
* Test: Package Lifecycle
|
|
1119
|
+
* Tests package-level pause/resume independent of media buy status.
|
|
1120
|
+
*/
|
|
1121
|
+
async function testPackageLifecycle(agentUrl, options) {
|
|
1122
|
+
const steps = [];
|
|
1123
|
+
const client = (0, client_1.createTestClient)(agentUrl, options.protocol || 'mcp', options);
|
|
1124
|
+
// Create a media buy
|
|
1125
|
+
const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);
|
|
1126
|
+
steps.push(...createSteps);
|
|
1127
|
+
if (!mediaBuyId || !profile?.tools.includes('update_media_buy')) {
|
|
1128
|
+
return { steps, profile };
|
|
1129
|
+
}
|
|
1130
|
+
// Find a package ID — try get_media_buys first, fall back to convention
|
|
1131
|
+
let packageId = 'pkg-0';
|
|
1132
|
+
if (profile.tools.includes('get_media_buys')) {
|
|
1133
|
+
const { result: fetchResult, step: fetchStep } = await (0, client_1.runStep)('Fetch package IDs', 'get_media_buys', async () => client.executeTask('get_media_buys', {
|
|
1134
|
+
media_buy_ids: [mediaBuyId],
|
|
1135
|
+
}));
|
|
1136
|
+
if (fetchResult?.success && fetchResult?.data) {
|
|
1137
|
+
const mediaBuys = (fetchResult.data.media_buys || []);
|
|
1138
|
+
const mediaBuy = mediaBuys.find((item) => item.media_buy_id === mediaBuyId) || mediaBuys[0];
|
|
1139
|
+
const packages = (mediaBuy?.packages || []);
|
|
1140
|
+
if (packages[0]?.package_id) {
|
|
1141
|
+
packageId = packages[0].package_id;
|
|
1142
|
+
fetchStep.details = `Found package ${packageId}`;
|
|
1143
|
+
}
|
|
1144
|
+
else {
|
|
1145
|
+
fetchStep.details = `No packages found, falling back to '${packageId}'`;
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
else if (fetchResult && !fetchResult.success) {
|
|
1149
|
+
fetchStep.passed = false;
|
|
1150
|
+
fetchStep.error = fetchResult.error || 'get_media_buys failed during package ID discovery';
|
|
1151
|
+
}
|
|
1152
|
+
steps.push(fetchStep);
|
|
1153
|
+
}
|
|
1154
|
+
// Step 1: Pause a package
|
|
1155
|
+
const { result: pauseResult, step: pauseStep } = await (0, client_1.runStep)('Pause package', 'update_media_buy', async () => client.updateMediaBuy({
|
|
1156
|
+
media_buy_id: mediaBuyId,
|
|
1157
|
+
packages: [{ package_id: packageId, paused: true }],
|
|
1158
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
1159
|
+
}));
|
|
1160
|
+
if (pauseResult?.success && pauseResult?.data) {
|
|
1161
|
+
const data = pauseResult.data;
|
|
1162
|
+
const affectedPackages = (data.affected_packages || []);
|
|
1163
|
+
const pkg = affectedPackages.find(p => p.package_id === packageId) || affectedPackages[0];
|
|
1164
|
+
pauseStep.details = `Paused package ${packageId}, paused: ${pkg?.paused}`;
|
|
1165
|
+
pauseStep.response_preview = JSON.stringify({
|
|
1166
|
+
media_buy_id: mediaBuyId,
|
|
1167
|
+
media_buy_status: extractStatus(data),
|
|
1168
|
+
package_id: pkg?.package_id,
|
|
1169
|
+
package_paused: pkg?.paused,
|
|
1170
|
+
}, null, 2);
|
|
1171
|
+
}
|
|
1172
|
+
else if (pauseResult && !pauseResult.success) {
|
|
1173
|
+
pauseStep.passed = false;
|
|
1174
|
+
pauseStep.error = pauseResult.error || 'Package pause failed';
|
|
1175
|
+
}
|
|
1176
|
+
steps.push(pauseStep);
|
|
1177
|
+
// Step 2: Resume the package
|
|
1178
|
+
const { result: resumeResult, step: resumeStep } = await (0, client_1.runStep)('Resume package', 'update_media_buy', async () => client.updateMediaBuy({
|
|
1179
|
+
media_buy_id: mediaBuyId,
|
|
1180
|
+
packages: [{ package_id: packageId, paused: false }],
|
|
1181
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- intentional: test request bypasses strict typing
|
|
1182
|
+
}));
|
|
1183
|
+
if (resumeResult?.success && resumeResult?.data) {
|
|
1184
|
+
const data = resumeResult.data;
|
|
1185
|
+
const affectedPackages = (data.affected_packages || []);
|
|
1186
|
+
const pkg = affectedPackages.find(p => p.package_id === packageId) || affectedPackages[0];
|
|
1187
|
+
resumeStep.details = `Resumed package ${packageId}, paused: ${pkg?.paused}`;
|
|
1188
|
+
resumeStep.response_preview = JSON.stringify({
|
|
1189
|
+
media_buy_id: mediaBuyId,
|
|
1190
|
+
media_buy_status: extractStatus(data),
|
|
1191
|
+
package_id: pkg?.package_id,
|
|
1192
|
+
package_paused: pkg?.paused,
|
|
1193
|
+
}, null, 2);
|
|
1194
|
+
}
|
|
1195
|
+
else if (resumeResult && !resumeResult.success) {
|
|
1196
|
+
resumeStep.passed = false;
|
|
1197
|
+
resumeStep.error = resumeResult.error || 'Package resume failed';
|
|
1198
|
+
}
|
|
1199
|
+
steps.push(resumeStep);
|
|
1200
|
+
// Step 3: Verify media buy is still active
|
|
1201
|
+
if (profile.tools.includes('get_media_buys')) {
|
|
1202
|
+
const { result: verifyResult, step: verifyStep } = await (0, client_1.runStep)('Verify media buy still active after package operations', 'get_media_buys', async () => client.executeTask('get_media_buys', {
|
|
1203
|
+
media_buy_ids: [mediaBuyId],
|
|
1204
|
+
}));
|
|
1205
|
+
if (verifyResult?.success && verifyResult?.data) {
|
|
1206
|
+
const mediaBuys = (verifyResult.data.media_buys || []);
|
|
1207
|
+
const mediaBuy = mediaBuys.find((item) => item.media_buy_id === mediaBuyId) || mediaBuys[0];
|
|
1208
|
+
const status = mediaBuy?.status;
|
|
1209
|
+
if (status === 'active' || status === 'pending_activation') {
|
|
1210
|
+
verifyStep.details = `Media buy still ${status} after package-level operations`;
|
|
1211
|
+
}
|
|
1212
|
+
else {
|
|
1213
|
+
verifyStep.details = `Media buy status is '${status}' — expected 'active' or 'pending_activation'`;
|
|
1214
|
+
verifyStep.warnings = [`Package-level pause/resume changed media buy status to '${status}'`];
|
|
1215
|
+
}
|
|
1216
|
+
verifyStep.response_preview = JSON.stringify({ media_buy_id: mediaBuy?.media_buy_id, status }, null, 2);
|
|
1217
|
+
}
|
|
1218
|
+
else if (verifyResult && !verifyResult.success) {
|
|
1219
|
+
verifyStep.passed = false;
|
|
1220
|
+
verifyStep.error = verifyResult.error || 'get_media_buys verification failed';
|
|
1221
|
+
}
|
|
1222
|
+
steps.push(verifyStep);
|
|
1223
|
+
}
|
|
1224
|
+
return { steps, profile };
|
|
1225
|
+
}
|
|
908
1226
|
//# sourceMappingURL=media-buy.js.map
|