< Return to Summary | File Generated: Thu Apr 17 2025 12:17:48 GMT+0000 (Coordinated Universal Time)

multiple-sellers >> conflicting-seller (OpenBookingSimpleFlow >> ScheduledSession)

Booking Flow: OpenBookingSimpleFlow

Opportunity Type: ScheduledSession

Feature: Core / Multiple Sellers (Implemented)

Test: SellerMismatchError for inconsistent Sellers of OrderItems

Runs C1, C2 and B where Sellers of OrderItems do not match and check SellerMismatchError is returned in all cases.

Running only this test

npm start -- --runInBand test/features/core/multiple-sellers/implemented/conflicting-seller-test.js

Is this test failing?

The OpenActive Reference Implementation test result for this test can be used as a reference to help with debugging.


⚠️ 12 passed with 0 failures, 57 warnings and 36 suggestions


✅ Fetch Opportunities

Local Microservice Test Interface for OrderItem 0 Request

POST http://localhost:3000/test-interface/datasets/uat-ci/opportunities

{
  "@type": "ScheduledSession",
  "superEvent": {
    "@type": "SessionSeries",
    "organizer": {
      "@type": "Organization",
      "@id": "https://localhost:5001/api/identifiers/sellers/1"
    }
  },
  "@context": [
    "https://openactive.io/",
    "https://openactive.io/test-interface"
  ],
  "test:testOpportunityCriteria": "https://openactive.io/test-interface#TestOpportunityBookable",
  "test:testOpenBookingFlow": "https://openactive.io/test-interface#OpenBookingSimpleFlow"
}

Response status code: 200 OK. Responded in 131.141946ms.

{
  "@context": "https://openactive.io/",
  "@type": "ScheduledSession",
  "@id": "https://localhost:5001/api/identifiers/scheduled-sessions/5/events/48"
}

Local Microservice Test Interface for OrderItem 1 Request

POST http://localhost:3000/test-interface/datasets/uat-ci/opportunities

{
  "@type": "ScheduledSession",
  "superEvent": {
    "@type": "SessionSeries",
    "organizer": {
      "@type": "Organization",
      "@id": "https://localhost:5001/api/identifiers/sellers/2"
    }
  },
  "@context": [
    "https://openactive.io/",
    "https://openactive.io/test-interface"
  ],
  "test:testOpportunityCriteria": "https://openactive.io/test-interface#TestOpportunityBookable",
  "test:testOpenBookingFlow": "https://openactive.io/test-interface#OpenBookingSimpleFlow"
}

Response status code: 200 OK. Responded in 51.665107ms.

{
  "@context": "https://openactive.io/",
  "@type": "ScheduledSession",
  "@id": "https://localhost:5001/api/identifiers/scheduled-sessions/533/events/5321"
}

Opportunity Feed extract for OrderItem 0 Request

GET http://localhost:3000/opportunity/https%3A%2F%2Flocalhost%3A5001%2Fapi%2Fidentifiers%2Fscheduled-sessions%2F5%2Fevents%2F48?useCacheIfAvailable=true


Response status code: 200 OK. Responded in 23.496021ms.

{
  "data": {
    "@context": [
      "https://openactive.io/"
    ],
    "@type": "ScheduledSession",
    "@id": "https://localhost:5001/api/identifiers/scheduled-sessions/5/events/48",
    "startDate": "2025-04-18T13:04:25+00:00",
    "endDate": "2025-04-18T16:27:25+00:00",
    "superEvent": {
      "@type": "SessionSeries",
      "@id": "https://localhost:5001/api/identifiers/session-series/5",
      "identifier": 5,
      "name": "Soft Yoga",
      "activity": [
        {
          "@type": "Concept",
          "@id": "https://openactive.io/activity-list#bf1a5e00-cdcf-465d-8c5a-6f57040b7f7e",
          "inScheme": "https://openactive.io/activity-list",
          "prefLabel": "Yoga"
        }
      ],
      "eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode",
      "offers": [
        {
          "@type": "Offer",
          "@id": "https://localhost:5001/api/identifiers/session-series/5#/offers/0",
          "name": "Adult",
          "acceptedPaymentMethod": [
            "http://purl.org/goodrelations/v1#Cash",
            "http://purl.org/goodrelations/v1#PaymentMethodCreditCard"
          ],
          "ageRestriction": {
            "@type": "QuantitativeValue",
            "name": "Adult",
            "maxValue": 59,
            "minValue": 18
          },
          "allowCustomerCancellationFullRefund": false,
          "openBookingPrepayment": "https://openactive.io/Required",
          "price": 13.81,
          "priceCurrency": "GBP"
        }
      ],
      "organizer": {
        "@type": "Organization",
        "@id": "https://localhost:5001/api/identifiers/sellers/1",
        "name": "Acme Fitness Ltd",
        "isOpenBookingAllowed": true,
        "sameAs": [
          "https://socialmedia.com/AcmeFitnessLtd"
        ],
        "taxMode": "https://openactive.io/TaxGross",
        "telephone": "04919 519300",
        "termsOfService": [
          {
            "@type": "PrivacyPolicy",
            "name": "Privacy Policy",
            "requiresExplicitConsent": false,
            "url": "https://example.com/privacy.html"
          }
        ],
        "url": "http://dexter.name"
      },
      "url": "https://www.example.com/sessions/5"
    },
    "duration": "PT3H23M",
    "maximumAttendeeCapacity": 42,
    "remainingAttendeeCapacity": 42
  }
}

Opportunity Feed extract for OrderItem 1 Request

GET http://localhost:3000/opportunity/https%3A%2F%2Flocalhost%3A5001%2Fapi%2Fidentifiers%2Fscheduled-sessions%2F533%2Fevents%2F5321?useCacheIfAvailable=true


Response status code: 200 OK. Responded in 19.447857ms.

{
  "data": {
    "@context": [
      "https://openactive.io/"
    ],
    "@type": "ScheduledSession",
    "@id": "https://localhost:5001/api/identifiers/scheduled-sessions/533/events/5321",
    "startDate": "2025-04-22T05:40:25+00:00",
    "endDate": "2025-04-22T09:30:25+00:00",
    "superEvent": {
      "@type": "SessionSeries",
      "@id": "https://localhost:5001/api/identifiers/session-series/533",
      "identifier": 533,
      "name": "Frozen Cycling",
      "activity": [
        {
          "@type": "Concept",
          "@id": "https://openactive.io/activity-list#4a19873e-118e-43f4-b86e-05acba8fb1de",
          "inScheme": "https://openactive.io/activity-list",
          "prefLabel": "Cycling"
        }
      ],
      "eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode",
      "offers": [
        {
          "@type": "Offer",
          "@id": "https://localhost:5001/api/identifiers/session-series/533#/offers/0",
          "name": "Adult (off-peak)",
          "acceptedPaymentMethod": [
            "http://purl.org/goodrelations/v1#Cash",
            "http://purl.org/goodrelations/v1#PaymentMethodCreditCard"
          ],
          "ageRestriction": {
            "@type": "QuantitativeValue",
            "name": "Adult (off-peak)",
            "maxValue": 59,
            "minValue": 18
          },
          "allowCustomerCancellationFullRefund": true,
          "latestCancellationBeforeStartDate": "P1DT16H",
          "price": 11.02,
          "priceCurrency": "GBP",
          "validFromBeforeStartDate": "P10DT23H51M"
        }
      ],
      "organizer": {
        "@type": "Organization",
        "@id": "https://localhost:5001/api/identifiers/sellers/2",
        "name": "Road Runner Bookcamp Ltd",
        "isOpenBookingAllowed": true,
        "sameAs": [
          "https://socialmedia.com/RoadRunnerBookcampLtd"
        ],
        "taxMode": "https://openactive.io/TaxNet",
        "telephone": "08378 989507",
        "termsOfService": [
          {
            "@type": "PrivacyPolicy",
            "name": "Privacy Policy",
            "requiresExplicitConsent": false,
            "url": "https://example.com/privacy.html"
          }
        ],
        "url": "http://ernest.biz"
      },
      "url": "https://www.example.com/sessions/533"
    },
    "duration": "PT3H50M",
    "maximumAttendeeCapacity": 18,
    "remainingAttendeeCapacity": 18
  }
}

Specs

✅ Fetch Opportunities >> validation of Opportunity Feed extract for OrderItem 0

Specs

Validations

✅ Fetch Opportunities >> validation of Opportunity Feed extract for OrderItem 1

Specs

Validations

❔ C1

C1 Request

PUT https://localhost:5001/api/openbooking/order-quote-templates/d66e5b55-0551-4d38-91c9-c532f4f49722

{
  "@context": "https://openactive.io/",
  "@type": "OrderQuote",
  "brokerRole": "https://openactive.io/AgentBroker",
  "broker": {
    "@type": "Organization",
    "name": "MyFitnessApp",
    "url": "https://myfitnessapp.example.com",
    "description": "A fitness app for all the community",
    "logo": {
      "@type": "ImageObject",
      "url": "http://data.myfitnessapp.org.uk/images/logo.png"
    },
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "Alan Peacock Way",
      "addressLocality": "Village East",
      "addressRegion": "Middlesbrough",
      "postalCode": "TS4 3AE",
      "addressCountry": "GB"
    }
  },
  "seller": "https://localhost:5001/api/identifiers/sellers/1",
  "orderedItem": [
    {
      "@type": "OrderItem",
      "position": 0,
      "acceptedOffer": "https://localhost:5001/api/identifiers/session-series/5#/offers/0",
      "orderedItem": "https://localhost:5001/api/identifiers/scheduled-sessions/5/events/48"
    },
    {
      "@type": "OrderItem",
      "position": 1,
      "acceptedOffer": "https://localhost:5001/api/identifiers/session-series/533#/offers/0",
      "orderedItem": "https://localhost:5001/api/identifiers/scheduled-sessions/533/events/5321"
    }
  ],
  "payment": {
    "@type": "Payment",
    "name": "AcmeBroker Points",
    "accountId": "SN1593",
    "paymentProviderId": "STRIPE"
  }
}

Response status code: 500 Internal Server Error. Responded in 25.064452ms.

{
  "@context": "https://openactive.io/",
  "@type": "SellerMismatchError",
  "name": "At least one of the 'OrderItem's did not match the specified 'seller'.",
  "statusCode": 500,
  "description": "OrderItem at position 1 did not match the specified SellerId"
}

✅ C1 >> validation of C1

Specs

Validations

✅ Assert Opportunity Capacity (after C1)

Specs

✅ Assert Opportunity Capacity (after C1) >> validation of Opportunity Feed extract for OrderItem 0

Specs

Validations

✅ Assert Opportunity Capacity (after C1) >> validation of Opportunity Feed extract for OrderItem 1

Specs

Validations

❔ C2

C2 Request

PUT https://localhost:5001/api/openbooking/order-quotes/d66e5b55-0551-4d38-91c9-c532f4f49722

{
  "@context": "https://openactive.io/",
  "@type": "OrderQuote",
  "brokerRole": "https://openactive.io/AgentBroker",
  "broker": {
    "@type": "Organization",
    "name": "MyFitnessApp",
    "url": "https://myfitnessapp.example.com",
    "description": "A fitness app for all the community",
    "logo": {
      "@type": "ImageObject",
      "url": "http://data.myfitnessapp.org.uk/images/logo.png"
    },
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "Alan Peacock Way",
      "addressLocality": "Village East",
      "addressRegion": "Middlesbrough",
      "postalCode": "TS4 3AE",
      "addressCountry": "GB"
    }
  },
  "seller": "https://localhost:5001/api/identifiers/sellers/1",
  "customer": {
    "@type": "Person",
    "email": "[email protected]",
    "givenName": "Wilderman",
    "familyName": "Steve",
    "identifier": "de89322e-32a1-48cd-9c59-dae75b1d0b18"
  },
  "orderedItem": [
    {
      "@type": "OrderItem",
      "position": 0,
      "acceptedOffer": "https://localhost:5001/api/identifiers/session-series/5#/offers/0",
      "orderedItem": "https://localhost:5001/api/identifiers/scheduled-sessions/5/events/48"
    },
    {
      "@type": "OrderItem",
      "position": 1,
      "acceptedOffer": "https://localhost:5001/api/identifiers/session-series/533#/offers/0",
      "orderedItem": "https://localhost:5001/api/identifiers/scheduled-sessions/533/events/5321"
    }
  ],
  "payment": {
    "@type": "Payment",
    "name": "AcmeBroker Points",
    "accountId": "SN1593",
    "paymentProviderId": "STRIPE"
  }
}

Response status code: 500 Internal Server Error. Responded in 46.151399ms.

{
  "@context": "https://openactive.io/",
  "@type": "SellerMismatchError",
  "name": "At least one of the 'OrderItem's did not match the specified 'seller'.",
  "statusCode": 500,
  "description": "OrderItem at position 1 did not match the specified SellerId"
}

✅ C2 >> validation of C2

Specs

Validations

✅ Assert Opportunity Capacity (after C2)

Specs

✅ Assert Opportunity Capacity (after C2) >> validation of Opportunity Feed extract for OrderItem 0

Specs

Validations

✅ Assert Opportunity Capacity (after C2) >> validation of Opportunity Feed extract for OrderItem 1

Specs

Validations

✅ B

B Request

PUT https://localhost:5001/api/openbooking/orders/d66e5b55-0551-4d38-91c9-c532f4f49722

{
  "@context": "https://openactive.io/",
  "@type": "Order",
  "brokerRole": "https://openactive.io/AgentBroker",
  "broker": {
    "@type": "Organization",
    "name": "MyFitnessApp",
    "url": "https://myfitnessapp.example.com",
    "description": "A fitness app for all the community",
    "logo": {
      "@type": "ImageObject",
      "url": "http://data.myfitnessapp.org.uk/images/logo.png"
    },
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "Alan Peacock Way",
      "addressLocality": "Village East",
      "addressRegion": "Middlesbrough",
      "postalCode": "TS4 3AE",
      "addressCountry": "GB"
    }
  },
  "seller": "https://localhost:5001/api/identifiers/sellers/1",
  "customer": {
    "@type": "Person",
    "email": "[email protected]",
    "givenName": "Wilderman",
    "familyName": "Steve",
    "identifier": "de89322e-32a1-48cd-9c59-dae75b1d0b18"
  },
  "orderedItem": [
    {
      "@type": "OrderItem",
      "position": 0,
      "acceptedOffer": "https://localhost:5001/api/identifiers/session-series/5#/offers/0",
      "orderedItem": "https://localhost:5001/api/identifiers/scheduled-sessions/5/events/48"
    },
    {
      "@type": "OrderItem",
      "position": 1,
      "acceptedOffer": "https://localhost:5001/api/identifiers/session-series/533#/offers/0",
      "orderedItem": "https://localhost:5001/api/identifiers/scheduled-sessions/533/events/5321"
    }
  ],
  "totalPaymentDue": {
    "@type": "PriceSpecification",
    "price": 0,
    "priceCurrency": "GBP"
  }
}

Response status code: 500 Internal Server Error. Responded in 22.021192ms.

{
  "@context": "https://openactive.io/",
  "@type": "SellerMismatchError",
  "name": "At least one of the 'OrderItem's did not match the specified 'seller'.",
  "statusCode": 500,
  "description": "OrderItem at position 1 did not match the specified SellerId"
}

Specs

✅ B >> validation of B

Specs

Validations