---
id: TST-COM-CAT-122
title: Alternatives Verification
kind: unit
product_area: commerce
module: catalog
revision: 1
status: draft
product_intent: proposed
source_sha:
  services-commerce: c8b66a98e2490617aec38ba5c8165dd9bd0a8f9b
repository: services-commerce
files:
  - modules/promotions/tests/unit/pricing/alternatives.spec.js
implements:
  - ATS-COM-CAT-016-01
  - ATS-COM-CAT-016-02
  - ATS-COM-CAT-016-03
  - ATS-COM-CAT-016-04
  - ATS-COM-CAT-016-05
  - ATS-COM-CAT-016-09
environment: mock
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 1
isolation: In-process fixtures; any shared port replacement is restored by the suite.
binding_evidence:
  - scenario: ATS-COM-CAT-016-01
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#1. combine = yes,
      member: $80.00 less 25 % is $60.00 (tax 8 % is $4.80)
  - scenario: ATS-COM-CAT-016-01
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#2. combine = no,
      member: audience pricing $80.00 against $100.00 less 25 % = $75.00; the promotional price wins
  - scenario: ATS-COM-CAT-016-01
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#3. combine = no,
      student at $60.00: audience pricing wins, EARLY25 consumes no use, and the buyer is told why
  - scenario: ATS-COM-CAT-016-01
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#is the same
      answer for the same input
  - scenario: ATS-COM-CAT-016-02
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#takes one of two
      when the other loses on its own line: A a better price on the guide, B a worse one on the mug
  - scenario: ATS-COM-CAT-016-02
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#tries the fifth
      and later one at a time in entry order
  - scenario: ATS-COM-CAT-016-02
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#leaves the fifth
      unused when it does not lower the total
  - scenario: ATS-COM-CAT-016-02
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#asks for at most
      sixteen distinct alternatives when four promotions stay off audience prices
  - scenario: ATS-COM-CAT-016-03
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#Q2: line-level
      before order-level: 10 % and $20 off the order on $100.00 is $70.00, not $72.00
  - scenario: ATS-COM-CAT-016-04
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#5. exclusive code
      against the automatic outcome: VIP5 (5 %) would give $76.00, Fall 10 % gives $72.00; VIP5 is
      dropped and consumes no use
  - scenario: ATS-COM-CAT-016-04
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#Q5: every
      combination of the exclusive codes: the better of two exclusive codes wins whatever the order
      entered
  - scenario: ATS-COM-CAT-016-04
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#Q5: the exclusive
      code that loses to another is refused, naming the one that holds the line
  - scenario: ATS-COM-CAT-016-05
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#Q4: a tie goes to
      audience pricing, and the tied code is not used up
  - scenario: ATS-COM-CAT-016-05
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#Q7: the
      comparison is the order total before tax and shipping
  - scenario: ATS-COM-CAT-016-05
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#Q3: the minimum
      order is measured on the qualifying lines after the line-level promotions
  - scenario: ATS-COM-CAT-016-09
    source: >-
      services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#records as
      applied only the promotions that gave a discount; a code that gave nothing is rejected and not
      applied
evidence:
  - 'services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js'
  - >-
    services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#Real: the library
    end to end.
  - >-
    services-commerce:modules/promotions/tests/unit/pricing/alternatives.spec.js#Doubled: nothing.
    proves_controls: [TC-PI-001, TC-PI-002]
execution_constraints:
  - No execution is performed in this documentation back-fill.
verification_boundary: >-
  Bindings identify the existing assertions contributing to each scenario; several suites can
  jointly cover a compound scenario.
---

# Alternatives Verification

## Verification Boundary

The suite exercises the isolated rule, calculation or adapter with its supplied fixtures. It does not establish storage or distributed behaviour.

## What This Suite Proves

The alternatives assertions contribute to the scenarios listed in the register. Each binding retains its exact source test anchor so a reviewer can distinguish an individual contribution from the complete scenario.

## What It Does Not Prove

The register records source inspection only. It establishes no run result, delivery qualification or Product approval.

## Real Dependencies and Test Doubles

The production function under test is real. Its collaborators are supplied as fixtures or replaced ports where the suite declares them.

## Must Not Be Doubled

Keep the production function under test and its refusal or arithmetic result real. Replacing that function with a fixture removes the claimed proof.
