---
id: TST-COM-FUL-081
title: Shipping configuration
kind: integration
product_area: commerce
module: fulfillment
revision: 1
status: draft
source_sha:
  services-commerce: c8b66a98e2490617aec38ba5c8165dd9bd0a8f9b
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
repository: services-commerce
files:
  - >-
    modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js
implements:
  - ATS-COM-FUL-010-02
  - ATS-COM-FUL-010-03
  - ATS-COM-FUL-010-04
  - ATS-COM-FUL-011-01
  - ATS-COM-FUL-011-04
  - ATS-COM-FUL-011-06
  - ATS-COM-FUL-011-07
  - ATS-COM-FUL-011-09
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 3
isolation: >-
  Run-created workspace identifiers and fixture records in the prepared test database; concurrency
  cases own their extra connections.
evidence:
  - repository: services-commerce
    path: >-
      modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js
    test_titles:
      - 'writes the zone under the id its name suggests, the countries upper-cased, at version 1'
      - 'replaces it at the version read, and refuses the stale version 409'
      - >-
        lists the zones in priority order, by search, and the active ones with their active
        strategies in position order
      - 'refuses a taken id 400, and deletes a zone with its strategies (404 after)'
      - >-
        holds the rules before the row: bands in ascending order with the open one last, a carrier
        naming its account, no bands on a flat one
      - >-
        lists a zone’s strategies in position order, filters by kind, replaces one at its version
        and deletes it
      - >-
        writes an account with its connection reference and shipper number and no secret, lists by
        carrier, and refuses deleting one a strategy rates through (409)
      - >-
        refuses a UPS account without its Integration Platform connection 400 connection_required,
        writing nothing
      - >-
        refuses a replacement that takes a UPS account’s connection away 400 connection_required,
        the account unchanged
      - >-
        answers the shirt shippable with no weight, the e-book not shippable, an unknown product
        absent
      - 'reads the ship-to party’s preferred address whole, and nothing for a party with none'
      - 'requires no shipping for a checkout of an e-book alone: no option, zero, no zone consulted'
      - >-
        rates five shirts to Texas by the Texas zone: the band for the weight and UPS Ground through
        the Integration Platform with the markup, the first option selected when none was chosen
      - >-
        honours the buyer’s choice when the zone offers it, and replaces a choice the zone does not
        offer with the first option, saying so
      - >-
        rates the rest of the country by the domestic zone, the per-unit option counting the five
        units, free above the subtotal
      - >-
        rates an address nowhere else, and no address at all, by the worldwide zone, with the
        warning when the address is unknown
      - >-
        charges nothing with a warning when no zone matches (the worldwide zone inactive) and when
        the zone offers no option in the currency
      - >-
        never reads another tenant’s zones: the other tenant’s rating sees its own domestic zone,
        not this tenant’s changes
      - >-
        writes a pickup strategy with no charge and its location: the warehouse it names, or the
        location named on it
      - >-
        offers each pick-up at zero beside the zone’s shipped options, kind pickup, with where the
        buyer collects
      - 'leaves a pick-up at an inactive warehouse unrated, by its reason'
      - 'selects the pick-up the buyer chose, charging nothing'
      - >-
        holds a pickup strategy’s rules before the row: a location named, one only, no charge; and a
        shipped kind naming none
    scenario_anchors:
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#writes
        the zone under the id its name suggests, the countries upper-cased, at version 1
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#replaces
        it at the version read, and refuses the stale version 409
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#refuses
        a taken id 400, and deletes a zone with its strategies (404 after)
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#holds
        the rules before the row: bands in ascending order with the open one last, a carrier naming
        its account, no bands on a flat one
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#holds
        a pickup strategy’s rules before the row: a location named, one only, no charge; and a
        shipped kind naming none
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#refuses
        a UPS account without its Integration Platform connection 400 connection_required, writing
        nothing
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#refuses
        a replacement that takes a UPS account’s connection away 400 connection_required, the
        account unchanged
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#writes
        an account with its connection reference and shipper number and no secret, lists by carrier,
        and refuses deleting one a strategy rates through (409)
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#requires
        no shipping for a checkout of an e-book alone: no option, zero, no zone consulted
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#charges
        nothing with a warning when no zone matches (the worldwide zone inactive) and when the zone
        offers no option in the currency
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#rates
        an address nowhere else, and no address at all, by the worldwide zone, with the warning when
        the address is unknown
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#honours
        the buyer’s choice when the zone offers it, and replaces a choice the zone does not offer
        with the first option, saying so
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#offers
        each pick-up at zero beside the zone’s shipped options, kind pickup, with where the buyer
        collects
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#leaves
        a pick-up at an inactive warehouse unrated, by its reason
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#selects
        the pick-up the buyer chose, charging nothing
      - >-
        services-commerce:modules/shipping/tests/integration/services/persistence/shipping-configuration.integration.spec.js#never
        reads another tenant’s zones: the other tenant’s rating sees its own domestic zone, not this
        tenant’s changes
---

# Shipping configuration

## Verification Boundary

This suite checks shipping configuration against the prepared PostgreSQL database. Its entry points are the persistence and service functions used by the tests.

## What This Suite Proves

The bound scenarios identify the assertions this suite contributes. Source anchors retain the exact test cases; where a capability scenario has several contributing suites, a single binding does not imply that every branch runs here.

## What It Does Not Prove

Direct service and persistence calls do not establish the full HTTP permission contract, deployed scheduling or browser behavior. No execution result is claimed by this register.

## Real Dependencies and Test Doubles

The database and imported Commerce persistence services are real. Fixtures create the records owned by this run. Time-sensitive cases use a controlled clock where the source fixture supplies one.

## Must Not Be Doubled

Keep the database constraints, row visibility and persistence writes real when claiming this integration coverage. A canned repository response cannot replace the boundary being checked.
