Skip to content

Commit 32a0307

Browse files
committed
test: align media-buy fixtures with beta 7 schema
1 parent 34da0fb commit 32a0307

10 files changed

Lines changed: 109 additions & 61 deletions

examples/minimal_sales_agent.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,8 @@ async def create_media_buy(
280280
return CreateMediaBuySuccessResponse(
281281
media_buy_id=media_buy_id,
282282
buyer_ref=buyer_ref,
283+
confirmed_at="2026-05-01T00:00:00Z",
284+
revision=1,
283285
packages=confirmed_packages,
284286
).model_dump(mode="json", exclude_none=True)
285287

examples/type_aliases_demo.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ def handle_create_media_buy_response(
4242
success = CreateMediaBuySuccessResponse(
4343
media_buy_id="mb_12345",
4444
buyer_ref="ref_67890",
45+
confirmed_at="2026-05-01T00:00:00Z",
46+
revision=1,
4547
packages=[],
4648
)
4749
handle_create_media_buy_response(success)

tests/integration/test_a2a_context_id.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,12 @@ async def get_products(self, params: Any, context: Any = None) -> dict[str, Any]
7070
return {"products": []}
7171

7272
async def create_media_buy(self, params: Any, context: Any = None) -> dict[str, Any]:
73-
return {"media_buy_id": "mb-1", "packages": []}
73+
return {
74+
"media_buy_id": "mb-1",
75+
"confirmed_at": "2026-05-01T00:00:00Z",
76+
"revision": 1,
77+
"packages": [],
78+
}
7479

7580

7681
def _part_data_dict(part: pb.Part) -> dict[str, Any] | None:
@@ -276,6 +281,8 @@ async def execute(self, context: RequestContext, event_queue: EventQueue) -> Non
276281
if state == pb.TaskState.TASK_STATE_COMPLETED:
277282
data: dict[str, Any] = {
278283
"media_buy_id": "mb-1",
284+
"confirmed_at": "2026-05-01T00:00:00Z",
285+
"revision": 1,
279286
"packages": [],
280287
"approved": True,
281288
}

tests/test_client.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,8 @@ async def test_get_media_buys_parses_response():
10511051
{
10521052
"media_buy_id": "mb-1",
10531053
"status": "active",
1054+
"confirmed_at": "2026-05-01T00:00:00Z",
1055+
"revision": 1,
10541056
"currency": "USD",
10551057
"total_budget": 5000.0,
10561058
"packages": [
@@ -1115,6 +1117,8 @@ async def test_get_media_buys_parses_snapshot_response():
11151117
{
11161118
"media_buy_id": "mb-2",
11171119
"status": "active",
1120+
"confirmed_at": "2026-05-01T00:00:00Z",
1121+
"revision": 1,
11181122
"currency": "USD",
11191123
"total_budget": 10000.0,
11201124
"packages": [

tests/test_decisioning_handler.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@ class _Platform(DecisioningPlatform):
189189
async def create_media_buy(self, req, ctx):
190190
return CreateMediaBuySuccessResponse(
191191
media_buy_id="mb_xyz",
192+
confirmed_at="2026-05-01T00:00:00Z",
193+
revision=1,
192194
packages=[],
193195
status="active",
194196
)
@@ -268,6 +270,7 @@ async def update_media_buy(self, media_buy_id, patch, ctx):
268270
seen_args["patch_paused"] = patch.paused
269271
return UpdateMediaBuySuccessResponse(
270272
media_buy_id=media_buy_id,
273+
revision=2,
271274
status="paused",
272275
packages=[],
273276
)

tests/test_decisioning_webhook_emit.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -412,10 +412,16 @@ def get_products(self, req, ctx):
412412
return {"products": []}
413413

414414
def create_media_buy(self, req, ctx):
415-
return CreateMediaBuySuccessResponse(media_buy_id="mb_1", packages=[], status="active")
415+
return CreateMediaBuySuccessResponse(
416+
media_buy_id="mb_1",
417+
confirmed_at="2026-05-01T00:00:00Z",
418+
revision=1,
419+
packages=[],
420+
status="active",
421+
)
416422

417423
def update_media_buy(self, media_buy_id, patch, ctx):
418-
return {"media_buy_id": media_buy_id, "status": "active"}
424+
return {"media_buy_id": media_buy_id, "revision": 2, "status": "active"}
419425

420426
def sync_creatives(self, req, ctx):
421427
return {"creatives": []}
@@ -434,13 +440,17 @@ def get_products(self, req, ctx):
434440
def create_media_buy(self, req, ctx):
435441
async def _review(task_ctx):
436442
return CreateMediaBuySuccessResponse(
437-
media_buy_id="mb_after_review", packages=[], status="active"
443+
media_buy_id="mb_after_review",
444+
confirmed_at="2026-05-01T00:00:00Z",
445+
revision=1,
446+
packages=[],
447+
status="active",
438448
)
439449

440450
return ctx.handoff_to_task(_review)
441451

442452
def update_media_buy(self, media_buy_id, patch, ctx):
443-
return {"media_buy_id": media_buy_id, "status": "active"}
453+
return {"media_buy_id": media_buy_id, "revision": 2, "status": "active"}
444454

445455
def sync_creatives(self, req, ctx):
446456
return {"creatives": []}

tests/test_idempotency.py

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@
2323
UUID_RE = re.compile(r"^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$")
2424

2525

26+
def _media_buy_data(media_buy_id: str, **extra: Any) -> dict[str, Any]:
27+
return {
28+
"media_buy_id": media_buy_id,
29+
"confirmed_at": "2026-05-01T00:00:00Z",
30+
"revision": 1,
31+
"packages": [],
32+
**extra,
33+
}
34+
35+
2636
class TestKeyHelpers:
2737
def test_generate_key_returns_uuid_v4(self) -> None:
2838
key = _idempotency.generate_key()
@@ -550,17 +560,7 @@ async def test_replayed_surfaces_on_result(self) -> None:
550560
artifacts=[
551561
Artifact(
552562
artifact_id="a1",
553-
parts=[
554-
Part(
555-
root=DataPart(
556-
data={
557-
"replayed": True,
558-
"media_buy_id": "mb_1",
559-
"packages": [],
560-
}
561-
)
562-
)
563-
],
563+
parts=[Part(root=DataPart(data=_media_buy_data("mb_1", replayed=True)))],
564564
)
565565
],
566566
)
@@ -585,7 +585,7 @@ async def test_injects_key_into_mcp_call(self) -> None:
585585
mock_result = MagicMock()
586586
mock_result.isError = False
587587
mock_result.content = []
588-
mock_result.structuredContent = {"media_buy_id": "mb_1"}
588+
mock_result.structuredContent = _media_buy_data("mb_1")
589589
session.call_tool = AsyncMock(return_value=mock_result)
590590
with patch.object(adapter, "_get_session", AsyncMock(return_value=session)):
591591
await adapter._call_mcp_tool("create_media_buy", {"brand": "acme"})
@@ -676,11 +676,7 @@ async def test_replayed_surfaces_via_mcp(self) -> None:
676676
mock_result = MagicMock()
677677
mock_result.isError = False
678678
mock_result.content = []
679-
mock_result.structuredContent = {
680-
"replayed": True,
681-
"media_buy_id": "mb_1",
682-
"packages": [],
683-
}
679+
mock_result.structuredContent = _media_buy_data("mb_1", replayed=True)
684680
session.call_tool = AsyncMock(return_value=mock_result)
685681
with patch.object(adapter, "_get_session", AsyncMock(return_value=session)):
686682
result = await adapter._call_mcp_tool("create_media_buy", {"brand": "acme"})
@@ -851,7 +847,7 @@ async def fake_send(request: Any) -> Any: # noqa: D401
851847
artifacts=[
852848
Artifact(
853849
artifact_id="a1",
854-
parts=[DataPart(data={"media_buy_id": "mb_1"})],
850+
parts=[DataPart(data=_media_buy_data("mb_1"))],
855851
)
856852
],
857853
)

tests/test_idempotency_storyboard.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@ def _task_with_data(data: dict[str, Any]) -> Task:
4848
)
4949

5050

51+
def _media_buy_data(media_buy_id: str, **extra: Any) -> dict[str, Any]:
52+
return {
53+
"media_buy_id": media_buy_id,
54+
"confirmed_at": "2026-05-01T00:00:00Z",
55+
"revision": 1,
56+
"packages": [],
57+
**extra,
58+
}
59+
60+
5161
def _cfg() -> AgentConfig:
5262
return AgentConfig(
5363
id="storyboard_seller",
@@ -136,11 +146,7 @@ async def mock_send(request: Any) -> SendMessageSuccessResponse:
136146
data = dict(seller_cache[key])
137147
data["replayed"] = True
138148
return SendMessageSuccessResponse(result=_task_with_data(data))
139-
fresh = {
140-
"media_buy_id": f"mb_{uuid.uuid4().hex[:8]}",
141-
"idempotency_key": key,
142-
"packages": [],
143-
}
149+
fresh = _media_buy_data(f"mb_{uuid.uuid4().hex[:8]}", idempotency_key=key)
144150
seller_cache[key] = fresh
145151
return SendMessageSuccessResponse(result=_task_with_data(fresh))
146152

@@ -212,11 +218,7 @@ async def mock_send(request: Any) -> SendMessageSuccessResponse:
212218
data = dict(seller_cache[key])
213219
data["replayed"] = True
214220
return SendMessageSuccessResponse(result=_task_with_data(data))
215-
fresh = {
216-
"media_buy_id": f"mb_{uuid.uuid4().hex[:8]}",
217-
"idempotency_key": key,
218-
"packages": [],
219-
}
221+
fresh = _media_buy_data(f"mb_{uuid.uuid4().hex[:8]}", idempotency_key=key)
220222
seller_cache[key] = fresh
221223
return SendMessageSuccessResponse(result=_task_with_data(fresh))
222224

@@ -253,7 +255,7 @@ async def mock_send(request: Any) -> SendMessageSuccessResponse:
253255
return SendMessageSuccessResponse(result=_task_with_data(data))
254256
mb_id = f"mb_{uuid.uuid4().hex[:8]}"
255257
created_ids.add(mb_id)
256-
fresh = {"media_buy_id": mb_id, "idempotency_key": key, "packages": []}
258+
fresh = _media_buy_data(mb_id, idempotency_key=key)
257259
seller_cache[key] = fresh
258260
return SendMessageSuccessResponse(result=_task_with_data(fresh))
259261

tests/test_implementation_config.py

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
from concurrent.futures import ThreadPoolExecutor
1515
from typing import Any
16-
from unittest.mock import AsyncMock, MagicMock
1716

1817
import pytest
1918

@@ -22,14 +21,12 @@
2221
DecisioningCapabilities,
2322
DecisioningPlatform,
2423
InMemoryTaskRegistry,
25-
ProductConfigStore,
2624
SingletonAccounts,
2725
)
2826
from adcp.decisioning.handler import PlatformHandler
2927
from adcp.decisioning.implementation_config import ProductConfigStore as _ProductConfigStoreProto
3028
from adcp.server.base import ToolContext
3129

32-
3330
# ---------------------------------------------------------------------------
3431
# Fixtures
3532
# ---------------------------------------------------------------------------
@@ -80,6 +77,17 @@ def _make_handler(
8077
)
8178

8279

80+
def _create_success(media_buy_id: str):
81+
from adcp.types import CreateMediaBuySuccessResponse
82+
83+
return CreateMediaBuySuccessResponse(
84+
media_buy_id=media_buy_id,
85+
confirmed_at="2026-05-01T00:00:00Z",
86+
revision=1,
87+
packages=[],
88+
)
89+
90+
8391
# ---------------------------------------------------------------------------
8492
# Tests
8593
# ---------------------------------------------------------------------------
@@ -100,9 +108,8 @@ class _Platform(DecisioningPlatform):
100108

101109
async def create_media_buy(self, req, ctx, configs=None):
102110
received_configs.append(configs or {})
103-
from adcp.types import CreateMediaBuySuccessResponse
104111

105-
return CreateMediaBuySuccessResponse(media_buy_id="mb_001", packages=[])
112+
return _create_success("mb_001")
106113

107114
handler = _make_handler(_Platform(), executor, config_store=_Store())
108115
req = _make_request(["pid1", "pid2", "pid3"])
@@ -132,9 +139,8 @@ class _Platform(DecisioningPlatform):
132139

133140
async def create_media_buy(self, req, ctx, configs=None):
134141
received_configs.append(configs or {})
135-
from adcp.types import CreateMediaBuySuccessResponse
136142

137-
return CreateMediaBuySuccessResponse(media_buy_id="mb_002", packages=[])
143+
return _create_success("mb_002")
138144

139145
handler = _make_handler(_Platform(), executor, config_store=_Store())
140146
req = _make_request(["pid1", "pid2", "pid3"])
@@ -156,9 +162,7 @@ class _Platform(DecisioningPlatform):
156162
accounts = SingletonAccounts(account_id="seller")
157163

158164
async def create_media_buy(self, req, ctx, configs=None):
159-
from adcp.types import CreateMediaBuySuccessResponse
160-
161-
return CreateMediaBuySuccessResponse(media_buy_id="mb_003", packages=[])
165+
return _create_success("mb_003")
162166

163167
handler = _make_handler(_Platform(), executor, config_store=_Store())
164168
req = _make_request(["pid1"])
@@ -183,9 +187,7 @@ class _Platform(DecisioningPlatform):
183187
accounts = SingletonAccounts(account_id="seller")
184188

185189
async def create_media_buy(self, req, ctx, configs=None):
186-
from adcp.types import CreateMediaBuySuccessResponse
187-
188-
return CreateMediaBuySuccessResponse(media_buy_id="mb_004", packages=[])
190+
return _create_success("mb_004")
189191

190192
handler = _make_handler(_Platform(), executor, config_store=_Store())
191193
req = _make_request(["pid1"])
@@ -213,9 +215,8 @@ class _Platform(DecisioningPlatform):
213215

214216
async def create_media_buy(self, req, ctx, configs=None):
215217
received_configs.append(configs or {})
216-
from adcp.types import CreateMediaBuySuccessResponse
217218

218-
return CreateMediaBuySuccessResponse(media_buy_id="mb_005", packages=[])
219+
return _create_success("mb_005")
219220

220221
handler = _make_handler(_Platform(), executor, config_store=_Store())
221222
req = _make_request(None) # proposal_id flow, packages=None
@@ -236,9 +237,8 @@ class _Platform(DecisioningPlatform):
236237

237238
async def create_media_buy(self, req, ctx, configs=None):
238239
received_configs.append(configs or {})
239-
from adcp.types import CreateMediaBuySuccessResponse
240240

241-
return CreateMediaBuySuccessResponse(media_buy_id="mb_006", packages=[])
241+
return _create_success("mb_006")
242242

243243
import warnings
244244

@@ -271,9 +271,8 @@ class _Platform(DecisioningPlatform):
271271

272272
async def create_media_buy(self, req, ctx): # no configs kwarg
273273
received_req_ids.append(req.idempotency_key)
274-
from adcp.types import CreateMediaBuySuccessResponse
275274

276-
return CreateMediaBuySuccessResponse(media_buy_id="mb_007", packages=[])
275+
return _create_success("mb_007")
277276

278277
handler = _make_handler(_Platform(), executor, config_store=_Store())
279278
req = _make_request(["pid1"])
@@ -287,9 +286,9 @@ async def create_media_buy(self, req, ctx): # no configs kwarg
287286

288287
def test_product_config_store_protocol_exported() -> None:
289288
"""ProductConfigStore is importable from adcp.decisioning."""
290-
from adcp.decisioning import ProductConfigStore as PCS
289+
from adcp.decisioning import ProductConfigStore as ProductConfigStoreExport
291290

292-
assert PCS is _ProductConfigStoreProto
291+
assert ProductConfigStoreExport is _ProductConfigStoreProto
293292

294293

295294
def test_no_store_with_configs_kwarg_emits_warning(executor) -> None:
@@ -301,9 +300,7 @@ class _Platform(DecisioningPlatform):
301300
accounts = SingletonAccounts(account_id="seller")
302301

303302
async def create_media_buy(self, req, ctx, configs=None):
304-
from adcp.types import CreateMediaBuySuccessResponse
305-
306-
return CreateMediaBuySuccessResponse(media_buy_id="mb_008", packages=[])
303+
return _create_success("mb_008")
307304

308305
with warnings.catch_warnings(record=True) as caught:
309306
warnings.simplefilter("always")

0 commit comments

Comments
 (0)