diff --git a/rest/nodejs/src/api/discovery.ts b/rest/nodejs/src/api/discovery.ts index 1518fdd..096226d 100644 --- a/rest/nodejs/src/api/discovery.ts +++ b/rest/nodejs/src/api/discovery.ts @@ -140,9 +140,9 @@ export class DiscoveryService { "dev.ucp.shopping": [ { version: this.ucpVersion, - spec: `https://ucp.dev/${this.ucpVersion}/specification/shopping`, + spec: `https://ucp.dev/${this.ucpVersion}/specification/overview`, transport: "rest", - schema: `https://ucp.dev/${this.ucpVersion}/services/shopping/openapi.json`, + schema: `https://ucp.dev/${this.ucpVersion}/services/shopping/rest.openapi.json`, endpoint: new URL(c.req.url).origin, }, ], @@ -151,45 +151,21 @@ export class DiscoveryService { "dev.ucp.shopping.checkout": [ { version: this.ucpVersion, - spec: `https://ucp.dev/${this.ucpVersion}/specification/shopping/checkout`, + spec: `https://ucp.dev/${this.ucpVersion}/specification/checkout`, schema: `https://ucp.dev/${this.ucpVersion}/schemas/shopping/checkout.json`, }, ], "dev.ucp.shopping.order": [ { version: this.ucpVersion, - spec: `https://ucp.dev/${this.ucpVersion}/specification/shopping/order`, + spec: `https://ucp.dev/${this.ucpVersion}/specification/order`, schema: `https://ucp.dev/${this.ucpVersion}/schemas/shopping/order.json`, }, ], - "dev.ucp.shopping.refund": [ - { - version: this.ucpVersion, - spec: `https://ucp.dev/${this.ucpVersion}/specification/shopping/refund`, - schema: `https://ucp.dev/${this.ucpVersion}/schemas/shopping/refund.json`, - extends: "dev.ucp.shopping.order", - }, - ], - "dev.ucp.shopping.return": [ - { - version: this.ucpVersion, - spec: `https://ucp.dev/${this.ucpVersion}/specification/shopping/return`, - schema: `https://ucp.dev/${this.ucpVersion}/schemas/shopping/return.json`, - extends: "dev.ucp.shopping.order", - }, - ], - "dev.ucp.shopping.dispute": [ - { - version: this.ucpVersion, - spec: `https://ucp.dev/${this.ucpVersion}/specification/shopping/dispute`, - schema: `https://ucp.dev/${this.ucpVersion}/schemas/shopping/dispute.json`, - extends: "dev.ucp.shopping.order", - }, - ], "dev.ucp.shopping.discount": [ { version: this.ucpVersion, - spec: `https://ucp.dev/${this.ucpVersion}/specification/shopping/discount`, + spec: `https://ucp.dev/${this.ucpVersion}/specification/discount`, schema: `https://ucp.dev/${this.ucpVersion}/schemas/shopping/discount.json`, extends: "dev.ucp.shopping.checkout", }, @@ -197,7 +173,7 @@ export class DiscoveryService { "dev.ucp.shopping.fulfillment": [ { version: this.ucpVersion, - spec: `https://ucp.dev/${this.ucpVersion}/specification/shopping/fulfillment`, + spec: `https://ucp.dev/${this.ucpVersion}/specification/fulfillment`, schema: `https://ucp.dev/${this.ucpVersion}/schemas/shopping/fulfillment.json`, extends: "dev.ucp.shopping.checkout", }, @@ -205,7 +181,7 @@ export class DiscoveryService { "dev.ucp.shopping.buyer_consent": [ { version: this.ucpVersion, - spec: `https://ucp.dev/${this.ucpVersion}/specification/shopping/buyer_consent`, + spec: `https://ucp.dev/${this.ucpVersion}/specification/buyer-consent`, schema: `https://ucp.dev/${this.ucpVersion}/schemas/shopping/buyer_consent.json`, extends: "dev.ucp.shopping.checkout", }, diff --git a/rest/nodejs/test/discovery.test.ts b/rest/nodejs/test/discovery.test.ts index 4a4fae1..81c232a 100644 --- a/rest/nodejs/test/discovery.test.ts +++ b/rest/nodejs/test/discovery.test.ts @@ -19,10 +19,19 @@ import { Hono } from "hono"; import { DiscoveryService } from "../src/api/discovery"; +type DiscoveryDeclaration = { + version: string; + spec: string; + schema: string; +}; + type DiscoveryResponse = { ucp: { - services: Record>; - capabilities: Record>; + services: Record< + string, + Array + >; + capabilities: Record; }; }; @@ -41,23 +50,43 @@ test("merchant profile uses schema-compliant discovery registries", async () => assert.equal(shoppingServices.length, 1); assert.equal(shoppingServices[0]?.transport, "rest"); assert.equal(shoppingServices[0]?.endpoint, "http://localhost"); + assert.equal( + shoppingServices[0]?.spec, + `https://ucp.dev/${discoveryService.ucpVersion}/specification/overview` + ); + assert.equal( + shoppingServices[0]?.schema, + `https://ucp.dev/${discoveryService.ucpVersion}/services/shopping/rest.openapi.json` + ); assert.equal(Array.isArray(body.ucp.capabilities), false); assert.deepEqual(Object.keys(body.ucp.capabilities).sort(), [ "dev.ucp.shopping.buyer_consent", "dev.ucp.shopping.checkout", "dev.ucp.shopping.discount", - "dev.ucp.shopping.dispute", "dev.ucp.shopping.fulfillment", "dev.ucp.shopping.order", - "dev.ucp.shopping.refund", - "dev.ucp.shopping.return", ]); + const specSlugs: Record = { + "dev.ucp.shopping.buyer_consent": "buyer-consent", + "dev.ucp.shopping.checkout": "checkout", + "dev.ucp.shopping.discount": "discount", + "dev.ucp.shopping.fulfillment": "fulfillment", + "dev.ucp.shopping.order": "order", + }; for (const [name, declarations] of Object.entries(body.ucp.capabilities)) { assert.ok(Array.isArray(declarations), `${name} must be an array`); assert.equal(declarations.length, 1); assert.equal(declarations[0]?.version, discoveryService.ucpVersion); + assert.equal( + declarations[0]?.spec, + `https://ucp.dev/${discoveryService.ucpVersion}/specification/${specSlugs[name]}` + ); + assert.equal( + declarations[0]?.schema, + `https://ucp.dev/${discoveryService.ucpVersion}/schemas/shopping/${name.split(".").at(-1)}.json` + ); } });