import { createMockApp } from './chunk-BRVIXGUW.mjs';
import { createCimplifyClient } from './chunk-NWUEWUX2.mjs';
import { z } from 'zod';

var cimplifyRegistry = z.registry();
function registerSchema(schema, meta) {
  cimplifyRegistry.add(schema, meta);
  return schema;
}
var MoneySchema = registerSchema(
  z.string().regex(/^-?\d+\.\d{2}$/, 'Money must be a decimal string with exactly 2 decimals (e.g. "12.50")'),
  { id: "Money", description: "Strict 2-decimal money string", version: "1.0.0" }
);
var MoneyLooseSchema = registerSchema(
  z.string().regex(/^-?\d+(\.\d+)?$/, "Must be a decimal string"),
  { id: "MoneyLoose", description: "Decimal string with arbitrary precision", version: "1.0.0" }
);
var IsoDateTimeSchema = registerSchema(z.iso.datetime(), {
  id: "IsoDateTime",
  description: "ISO 8601 date-time",
  version: "1.0.0"
});
var TimestampSchema = registerSchema(
  z.union([z.iso.datetime(), z.string().min(1)]),
  {
    id: "Timestamp",
    description: "ISO 8601 or any non-empty string (boundary use)",
    version: "1.0.0"
  }
);
var CurrencyCodeSchema = registerSchema(
  z.string().length(3, "currency must be a 3-letter ISO 4217 code").regex(/^[A-Z]{3}$/, "currency must be uppercase letters"),
  { id: "CurrencyCode", description: "ISO 4217 currency code", version: "1.0.0" }
);
var CountryCodeSchema = registerSchema(
  z.string().length(2, "countryCode must be ISO 3166-1 alpha-2").regex(/^[A-Z]{2}$/, "countryCode must be uppercase letters"),
  { id: "CountryCode", description: "ISO 3166-1 alpha-2 country code", version: "1.0.0" }
);
var LocaleSchema = registerSchema(
  z.string().regex(/^[a-z]{2}(_[A-Z]{2})?$/, "locale must look like 'en' or 'en_GH'"),
  { id: "Locale", description: "BCP-47-ish locale", version: "1.0.0" }
);
var PhoneE164Schema = registerSchema(
  z.string().regex(/^\+?[0-9]{7,15}$/, "phoneTel should be E.164-ish digits (7\u201315)"),
  { id: "PhoneE164", description: "E.164-ish phone number", version: "1.0.0" }
);
var SeedNameSchema = registerSchema(
  z.enum([
    "default",
    "empty",
    "reesa-storefront",
    "restaurant",
    "retail",
    "services",
    "grocery",
    "fashion"
  ]),
  { id: "SeedName", description: "Mock seed identifier", version: "1.0.0" }
);
var ProductTypeSchema = registerSchema(
  z.enum(["product", "service", "digital", "bundle", "composite"]),
  { id: "ProductType", description: "Product type discriminator", version: "1.0.0" }
);
var LineTypeSchema = registerSchema(
  z.enum(["simple", "service", "digital", "bundle", "composite"]),
  { id: "LineType", description: "Cart line type discriminator", version: "1.0.0" }
);
var ServiceStatusSchema = registerSchema(
  z.enum(["pending", "confirmed", "completed", "cancelled"]),
  { id: "ServiceStatus", description: "Service booking status", version: "1.0.0" }
);
var SchemaViolationError = class extends Error {
  constructor(message, label, issues) {
    super(message);
    this.label = label;
    this.issues = issues;
    this.name = "SchemaViolationError";
  }
  toJSON() {
    return {
      type: "https://cimplify.io/errors/schema-violation",
      title: "Schema Violation",
      status: 422,
      detail: `${this.label} did not match its schema`,
      errors: this.issues
    };
  }
};
function makeAssertion(schema, label) {
  return (value) => {
    const result = schema.safeParse(value);
    if (!result.success) {
      const pretty = z.prettifyError(result.error);
      const issues = result.error.issues.map((i) => ({
        path: i.path.map(String),
        message: i.message,
        code: i.code
      }));
      throw new SchemaViolationError(
        `${label} schema violation:
${pretty}`,
        label,
        issues
      );
    }
  };
}
var BrandSocialSchema = z.object({
  label: z.string().min(1),
  href: z.string().url(),
  icon: z.string().optional()
});
var BrandNavLinkSchema = z.object({
  label: z.string().min(1),
  href: z.string().min(1)
});
var BrandPolicySectionSchema = z.object({
  heading: z.string().min(1),
  body: z.union([
    z.string().min(1),
    z.object({ intro: z.string(), bullets: z.array(z.string()).min(1) })
  ])
});
var BrandPolicyPageSchema = z.object({
  eyebrow: z.string(),
  title: z.string().min(1),
  lastUpdated: z.string().min(1),
  sections: z.array(BrandPolicySectionSchema).min(1)
});
var BrandContactSchema = z.object({
  email: z.string().email(),
  phone: z.string().min(1),
  phoneTel: PhoneE164Schema,
  streetAddress: z.string().min(1),
  city: z.string().min(1),
  countryCode: CountryCodeSchema,
  hours: z.string().optional()
});
var BrandHeroSchema = z.object({
  badge: z.string().optional(),
  title: z.string().min(1),
  subtitle: z.string().min(1),
  primaryCtaLabel: z.string().min(1),
  secondaryCtaLabel: z.string().optional(),
  secondaryCtaHref: z.string().optional()
});
var BrandFaqSchema = z.object({
  eyebrow: z.string().optional(),
  title: z.string().min(1),
  sections: z.array(
    z.object({
      title: z.string(),
      items: z.array(z.object({ q: z.string(), a: z.string() }))
    })
  )
});
var BrandSchema = registerSchema(
  z.object({
    // Identity
    name: z.string().min(1),
    shortName: z.string().min(1),
    microTag: z.string(),
    description: z.string().min(20, "description should be at least 20 characters"),
    schemaType: z.string().min(1),
    currency: CurrencyCodeSchema,
    locale: LocaleSchema,
    contact: BrandContactSchema,
    socials: z.array(BrandSocialSchema),
    header: z.object({ nav: z.array(BrandNavLinkSchema).min(1) }),
    hero: BrandHeroSchema,
    // Optional sections — render conditionally when present
    trustItems: z.array(
      z.object({
        label: z.string().min(1),
        value: z.string().min(1),
        description: z.string().min(1),
        iconKey: z.string().min(1)
      })
    ).optional(),
    brandStrip: z.object({ headline: z.string(), brands: z.array(z.string()).min(1) }).optional(),
    promo: z.object({
      badge: z.string().optional(),
      title: z.string().min(1),
      body: z.string().min(1),
      ctaLabel: z.string().min(1),
      ctaHref: z.string().min(1)
    }).optional(),
    // Standalone policy pages
    terms: BrandPolicyPageSchema,
    privacy: BrandPolicyPageSchema,
    shipping: BrandPolicyPageSchema,
    returns: BrandPolicyPageSchema,
    accessibility: BrandPolicyPageSchema,
    // Misc
    newsletter: z.object({
      eyebrow: z.string().optional(),
      title: z.string().min(1),
      body: z.string()
    }),
    about: z.object({
      eyebrow: z.string().optional(),
      title: z.string().min(1),
      paragraphs: z.array(z.string().min(1)).min(1),
      sections: z.array(z.object({ heading: z.string().min(1), body: z.string().min(1) })).optional()
    }),
    faq: BrandFaqSchema,
    account: z.object({
      loginEyebrow: z.string().min(1),
      loginTitle: z.string().min(1),
      loginSubtitle: z.string().optional(),
      signupEyebrow: z.string().min(1),
      signupTitle: z.string().min(1),
      signupSubtitle: z.string().optional(),
      accountEyebrow: z.string().min(1),
      accountTitle: z.string().min(1)
    }),
    contactPage: z.object({
      eyebrow: z.string().optional(),
      title: z.string().min(1),
      body: z.string()
    }),
    trackOrder: z.object({
      eyebrow: z.string().optional(),
      title: z.string().min(1),
      body: z.string()
    }),
    footer: z.object({
      blurb: z.string().optional(),
      sitemap: z.array(z.unknown()).optional(),
      poweredBy: z.object({ label: z.string().min(1), href: z.string().min(1) }).optional()
    }),
    llms: z.object({ summary: z.string().min(20) }),
    mock: z.object({
      seed: SeedNameSchema,
      businessId: z.string().regex(/^bus_/, "businessId should start with 'bus_'")
    })
  }),
  {
    id: "Brand",
    description: "Single-source-of-truth contract for lib/brand.ts in storefront templates",
    version: "1.0.0"
  }
);
var assertBrand = makeAssertion(BrandSchema, "brand");
var BundleSelectionInputSchema = z.object({
  component_id: z.string(),
  variant_id: z.string().optional(),
  quantity: z.number().int().positive(),
  scheduled_start: z.string().optional(),
  scheduled_end: z.string().optional()
});
var CompositeSelectionInputSchema = z.object({
  component_id: z.string().optional(),
  source_product_id: z.string().optional(),
  source_stock_id: z.string().optional(),
  source_type: z.enum(["product", "stock", "add_on", "standalone"]).optional(),
  quantity: z.number().int().positive().optional()
});
var CustomerInputValueSchema = z.object({
  field_id: z.string(),
  field_name: z.string().optional(),
  field_type: z.string().optional(),
  value: z.unknown()
});
var AddItemPayloadSchema = registerSchema(
  z.object({
    item_id: z.string().min(1),
    quantity: z.number().int().positive(),
    variant_id: z.string().optional(),
    quote_id: z.string().optional(),
    add_on_options: z.array(z.string()).optional(),
    bundle_selections: z.array(BundleSelectionInputSchema).optional(),
    composite_selections: z.array(CompositeSelectionInputSchema).optional(),
    scheduled_start: z.string().optional(),
    scheduled_end: z.string().optional(),
    staff_id: z.string().optional(),
    resource_id: z.string().optional(),
    special_instructions: z.string().optional(),
    customer_inputs: z.array(CustomerInputValueSchema).optional(),
    billing_plan_id: z.string().optional(),
    metadata: z.record(z.string(), z.unknown()).optional()
  }),
  {
    id: "AddItemPayload",
    description: "POST /cart/items request body \u2014 strict on shape, lenient on optional fields",
    version: "1.0.0"
  }
);
var assertAddItemPayload = makeAssertion(AddItemPayloadSchema, "payload");
var VariantDisplayAttributeSchema = z.object({
  axis_id: z.string(),
  axis_name: z.string(),
  value_id: z.string(),
  value_name: z.string()
});
var VariantInfoSchema = registerSchema(
  z.object({
    id: z.string(),
    name: z.string(),
    sku: z.string().optional(),
    price: MoneySchema,
    price_adjustment: MoneySchema,
    is_default: z.boolean(),
    display_attributes: z.array(VariantDisplayAttributeSchema).optional(),
    images: z.array(z.string()).optional()
  }),
  {
    id: "VariantInfo",
    description: "Variant axis values + display attributes \u2014 emitted on cart line items",
    version: "1.1.0"
  }
);
var VariantDetailsSchema = z.object({
  variant_id: z.string(),
  sku: z.string().optional(),
  properties: z.record(z.string(), z.string())
});
var ChosenPriceSchema = z.object({
  base_price: MoneySchema,
  final_price: MoneySchema,
  markup_percentage: MoneySchema,
  markup_amount: MoneySchema,
  markup_discount_percentage: MoneySchema,
  markup_discount_amount: MoneySchema
});
var SelectedAddOnOptionSchema = registerSchema(
  z.object({
    option_id: z.string(),
    add_on_id: z.string(),
    name: z.string(),
    price: MoneySchema,
    quantity: z.number().int().nonnegative(),
    is_required: z.boolean(),
    selected_at: TimestampSchema,
    price_info: z.unknown().optional()
  }),
  {
    id: "SelectedAddOnOption",
    description: "A specific add-on option chosen for a cart line",
    version: "1.0.0"
  }
);
var AddOnInDetailsSchema = registerSchema(
  z.object({
    add_on_id: z.string(),
    name: z.string(),
    min_selections: z.number().int().nonnegative(),
    max_selections: z.number().int().nonnegative(),
    selected_options: z.array(z.string()),
    is_required: z.boolean()
  }),
  {
    id: "AddOnInDetails",
    description: "Add-on group as embedded inside add_on_details \u2014 selected_options is an ID list",
    version: "1.0.0"
  }
);
var AddOnDetailsSchema = registerSchema(
  z.object({
    selected_options: z.array(SelectedAddOnOptionSchema),
    total_add_on_price: MoneySchema,
    add_ons: z.array(AddOnInDetailsSchema)
  }),
  {
    id: "AddOnDetails",
    description: "Combined add-on selection state for a cart line",
    version: "1.0.0"
  }
);
var AddOnOptionDetailsSchema = registerSchema(
  z.object({
    id: z.string(),
    name: z.string(),
    is_required: z.boolean(),
    description: z.string().optional(),
    price: MoneySchema.optional(),
    image_url: z.string().optional()
  }),
  {
    id: "AddOnOptionDetails",
    description: "Option-level details (one per chosen add-on option)",
    version: "1.0.0"
  }
);
var AddOnGroupDetailsSchema = registerSchema(
  z.object({
    id: z.string(),
    name: z.string(),
    is_multiple_allowed: z.boolean(),
    min_selections: z.number().int().nonnegative(),
    max_selections: z.number().int().nonnegative(),
    required: z.boolean(),
    options: z.array(AddOnOptionDetailsSchema)
  }),
  {
    id: "AddOnGroupDetails",
    description: "Group-level details for an add-on; contains its options",
    version: "1.0.0"
  }
);
var BundleResolvedSchema = z.looseObject({
  bundle_id: z.string(),
  selections: z.array(z.unknown())
});
var CompositeResolvedSchema = z.looseObject({
  composite_id: z.string(),
  selections: z.array(z.unknown()),
  breakdown: z.object({
    base_price: MoneySchema,
    components_total: MoneySchema,
    final_price: MoneySchema,
    tier_applied: z.string().optional()
  }).optional()
});
var DiscountDetailsSchema = z.object({
  applied_count: z.number().int().nonnegative(),
  total_amount: MoneySchema,
  discount_ids: z.array(z.string())
});
var CartItemSchema = registerSchema(
  z.looseObject({
    id: z.string(),
    cart_id: z.string(),
    item_id: z.string(),
    quantity: z.number().int().nonnegative(),
    line_key: z.string(),
    line_type: LineTypeSchema,
    name: z.string(),
    description: z.string().optional(),
    image_url: z.string().optional(),
    category_id: z.string().optional(),
    category_name: z.string().optional(),
    is_available: z.boolean(),
    variant_id: z.string().optional(),
    variant_name: z.string().optional(),
    variant_info: VariantInfoSchema.optional(),
    variant_details: VariantDetailsSchema.optional(),
    base_price: MoneySchema,
    add_ons_price: MoneySchema,
    total_price: MoneySchema,
    item_discount_amount: MoneySchema,
    price_info: ChosenPriceSchema,
    add_on_option_ids: z.array(z.string()),
    add_on_ids: z.array(z.string()),
    add_on_details: AddOnDetailsSchema,
    add_on_options: z.array(AddOnOptionDetailsSchema),
    add_ons: z.array(AddOnGroupDetailsSchema),
    scheduled_start: z.string().optional(),
    scheduled_end: z.string().optional(),
    staff_id: z.string().optional(),
    resource_id: z.string().optional(),
    service_status: ServiceStatusSchema.optional(),
    confirmation_code: z.string().optional(),
    special_instructions: z.string().optional(),
    customer_inputs: z.array(CustomerInputValueSchema).optional(),
    bundle_selections: z.unknown().optional(),
    bundle_resolved: BundleResolvedSchema.optional(),
    composite_selections: z.unknown().optional(),
    composite_resolved: CompositeResolvedSchema.optional(),
    billing_plan_id: z.string().optional(),
    applied_discount_ids: z.array(z.string()),
    discount_details: DiscountDetailsSchema.optional(),
    metadata: z.record(z.string(), z.unknown()).optional(),
    created_at: TimestampSchema,
    updated_at: TimestampSchema
  }),
  {
    id: "CartItem",
    description: "Cart line item \u2014 loose so backend additions don't break old SDK clients",
    version: "1.0.0"
  }
);
var assertCartItem = makeAssertion(CartItemSchema, "cartItem");
var CartPricingSchema = registerSchema(
  z.object({
    subtotal: MoneySchema,
    total_discounts: MoneySchema,
    tax_amount: MoneySchema,
    service_charge: MoneySchema,
    total_price: MoneySchema,
    currency: CurrencyCodeSchema,
    tax_rate: MoneySchema.optional(),
    service_charge_rate: MoneySchema.optional(),
    tax_inclusive: z.boolean(),
    deposit_required: z.boolean(),
    deposit_amount: MoneySchema
  }),
  {
    id: "CartPricing",
    description: "Cart-level pricing roll-up \u2014 subtotal, tax, service, total",
    version: "1.0.0"
  }
);
var CartSchema = registerSchema(
  z.looseObject({
    id: z.string(),
    business_id: z.string(),
    items: z.array(CartItemSchema),
    pricing: CartPricingSchema,
    customer_info: z.object({
      name: z.string(),
      email: z.string().optional(),
      phone: z.string().optional(),
      address: z.string().optional()
    }),
    created_at: TimestampSchema,
    updated_at: TimestampSchema,
    expires_at: TimestampSchema,
    status: z.string(),
    source: z.string(),
    channel: z.string()
  }),
  {
    id: "Cart",
    description: "Full cart envelope \u2014 loose for forward-compat with backend additions",
    version: "1.0.0"
  }
);
var assertCart = makeAssertion(CartSchema, "cart");
var CheckoutCustomerSchema = z.object({
  name: z.string().min(1),
  email: z.string().email(),
  phone: z.string().min(1),
  notes: z.string().optional(),
  save_details: z.boolean().optional()
});
var CheckoutBodySchema = registerSchema(
  z.object({
    cart_id: z.string().min(1),
    location_id: z.string().optional(),
    customer: CheckoutCustomerSchema,
    order_type: z.string().min(1),
    address_info: z.record(z.string(), z.unknown()).optional(),
    payment_method: z.string().min(1),
    mobile_money_details: z.object({ phone_number: z.string(), provider: z.string() }).optional(),
    special_instructions: z.string().optional(),
    metadata: z.record(z.string(), z.unknown()).optional(),
    pay_currency: z.string().optional(),
    fx_quote_id: z.string().optional()
  }),
  {
    id: "CheckoutBody",
    description: "POST /checkout request body",
    version: "1.0.0"
  }
);
var assertCheckoutBody = makeAssertion(CheckoutBodySchema, "checkoutBody");
var AuthorizationTypeSchema = z.enum(["otp", "pin", "phone", "birthday", "address"]);
var NextActionSchema = z.discriminatedUnion("type", [
  z.object({ type: z.literal("none") }),
  z.object({ type: z.literal("redirect"), authorization_url: z.string() }),
  z.object({
    type: z.literal("authorization"),
    authorization_type: z.string(),
    display_text: z.string().optional()
  })
]);
var CheckoutResponseSchema = registerSchema(
  z.looseObject({
    order_id: z.string().min(1),
    order_number: z.string().min(1),
    payment_status: z.string().min(1),
    payment_reference: z.string().optional(),
    requires_authorization: z.boolean(),
    authorization_type: AuthorizationTypeSchema.optional(),
    next_action: NextActionSchema,
    provider: z.string().optional(),
    authorization_url: z.string().optional(),
    display_text: z.string().optional(),
    bill_token: z.string().optional(),
    client_secret: z.string().optional(),
    public_key: z.string().optional()
  }),
  {
    id: "CheckoutResponse",
    description: "POST /checkout response \u2014 loose for payment-provider field additions",
    version: "1.0.0"
  }
);
var assertCheckoutResponse = makeAssertion(CheckoutResponseSchema, "checkout");

// src/testing/client.ts
var TEST_BASE_URL = "http://test.local";
async function toForwardedRequest(input, init) {
  if (input instanceof Request) {
    return {
      method: init?.method ?? input.method,
      headers: new Headers(init?.headers ?? input.headers),
      body: init?.body ?? (["GET", "HEAD"].includes(input.method) ? void 0 : await input.text())
    };
  }
  return {
    method: init?.method ?? "GET",
    headers: new Headers(init?.headers ?? {}),
    body: init?.body ?? void 0
  };
}
function createTestClient(options = {}) {
  const mock = createMockApp(options);
  let sessionToken;
  const fetchImpl = async (input, init) => {
    const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
    if (!url.startsWith(TEST_BASE_URL)) {
      return globalThis.fetch(input, init);
    }
    const path = url.slice(TEST_BASE_URL.length);
    const fwd = await toForwardedRequest(input, init);
    if (sessionToken) fwd.headers.set("x-session-token", sessionToken);
    const res = await mock.request(path, {
      method: fwd.method,
      headers: fwd.headers,
      body: fwd.body
    });
    const echoed = res.headers.get("x-session-token");
    if (echoed) sessionToken = echoed;
    return res;
  };
  const client = createCimplifyClient({
    baseUrl: TEST_BASE_URL,
    // Link mock lives at /v1/link on the same Hono app, so point the SDK's
    // separate Link transport at the same TEST_BASE_URL.
    linkApiUrl: TEST_BASE_URL,
    publicKey: "test-public-key",
    suppressPublicKeyWarning: true,
    fetch: fetchImpl
  });
  return {
    client,
    mock,
    reset: () => {
      mock.deps.resetAll();
      sessionToken = void 0;
    },
    dispose: () => {
      mock.deps.resetAll();
      sessionToken = void 0;
    }
  };
}
async function pickProduct(client, opts) {
  const list = await client.catalogue.getProducts();
  if (!list.ok) throw list.error;
  const body = list.value;
  const products = body.items ?? [];
  if (products.length === 0) throw new Error("No products in catalogue (wrong seed?)");
  if (opts.slug) {
    const found = products.find((p) => p.slug === opts.slug);
    if (!found) throw new Error(`Product slug "${opts.slug}" not found in catalogue`);
    return found;
  }
  return products.find((p) => p.type === "product") ?? products[0];
}
var fixtures = {
  /**
   * Add the first available product (or a named one) to the cart.
   * Picks the first variant if the product has variants.
   */
  async addFirstProduct(client, opts = {}) {
    const product = await pickProduct(client, opts);
    let variantId;
    if (opts.withVariant !== false) {
      const variants = await client.catalogue.getVariants(product.id);
      if (variants.ok && variants.value.length > 0) {
        variantId = variants.value[0]?.id;
      }
    }
    const res = await client.cart.addItem({
      item_id: product.id,
      quantity: 1,
      variant_id: variantId
    });
    if (!res.ok) throw res.error;
    return { product, variantId };
  },
  /** A minimal valid customer object for checkout. */
  customer(overrides = {}) {
    return {
      name: overrides.name ?? "Test Customer",
      email: overrides.email ?? "test@example.com",
      phone: overrides.phone ?? "+233244000000"
    };
  },
  /**
   * Run the full guest auth flow (request OTP → verify) and return
   * the new session token. The mock's permissive auth mode echoes
   * the code in `request_otp`, so we don't need to read it.
   */
  async authenticate(client, contact = "test@example.com", code = "123456") {
    const req = await client.auth.requestOtp(contact);
    if (!req.ok) throw req.error;
    const verify = await client.auth.verifyOtp(contact, code);
    if (!verify.ok) throw verify.error;
    const value = verify.value;
    return { token: value.session_token ?? "", customerId: value.customer_id ?? "" };
  }
};

export { AddItemPayloadSchema, AddOnDetailsSchema, AddOnGroupDetailsSchema, AddOnInDetailsSchema, AddOnOptionDetailsSchema, AuthorizationTypeSchema, BrandContactSchema, BrandFaqSchema, BrandHeroSchema, BrandNavLinkSchema, BrandPolicyPageSchema, BrandPolicySectionSchema, BrandSchema, BrandSocialSchema, BundleResolvedSchema, BundleSelectionInputSchema, CartItemSchema, CartPricingSchema, CartSchema, CheckoutBodySchema, CheckoutCustomerSchema, CheckoutResponseSchema, ChosenPriceSchema, CompositeResolvedSchema, CompositeSelectionInputSchema, CountryCodeSchema, CurrencyCodeSchema, CustomerInputValueSchema, DiscountDetailsSchema, IsoDateTimeSchema, LineTypeSchema, LocaleSchema, MoneyLooseSchema, MoneySchema, NextActionSchema, PhoneE164Schema, ProductTypeSchema, SchemaViolationError, SeedNameSchema, SelectedAddOnOptionSchema, ServiceStatusSchema, TimestampSchema, VariantDetailsSchema, VariantDisplayAttributeSchema, VariantInfoSchema, assertAddItemPayload, assertBrand, assertCart, assertCartItem, assertCheckoutBody, assertCheckoutResponse, cimplifyRegistry, createTestClient, fixtures, makeAssertion, registerSchema };
