---
id: TST-COM-ORD-083
title: Promotions that do and do not combine with audience prices
kind: api-lifecycle
product_area: commerce
module: orders
revision: 1
status: draft
source_sha:
  services-commerce: c8b66a98e2490617aec38ba5c8165dd9bd0a8f9b
repository: services-commerce
files:
  - modules/orders/tests/e2e/promotion-alternatives.e2e.spec.js
implements:
  - ATS-COM-ORD-015-08
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 2
isolation: The suite creates its own test workspace records and removes them using the fixture cleanup.
evidence:
  - provenance: test
    source: 'services-commerce:modules/orders/tests/e2e/promotion-alternatives.e2e.spec.js'
    test_cases:
      - 'previews the T-shirt on the Standard price: $25.00 less $7.50 is $17.50, lower than the Member $18.00'
      - >-
        explains the win in the customer’s words: the promotional price $17.50 on the $25.00 Standard price is
        lower than her Members price $18.00
      - 'places the order on the winning price, with the tax of 8 % computed on $17.50'
      - redeems STD30 once
      - keeps the Member price $18.00 and applies nothing
      - 'explains why, in the customer’s words'
      - 'places the order at the Member price, redeems nothing, and the code keeps its use'
      - >-
        takes 20 % off the Standard price: $25.00 less $5.00 is $20.00, the audience price being the Standard
        price
      - >-
        previews both lines on the Standard price, the $10.00 spread $6.76 / $3.24 by largest remainder:
        $27.00 against $28.00
      - 'places the order with each line carrying its share, the tax on each net line'
      - 'credits the cancelled T-shirt its own net $18.24 and its $1.46 of tax, $19.70'
      - 'LOW5 then HIGH20: the better code applies, the other is refused naming it'
      - 'HIGH20 then LOW5: the better code applies, the other is refused naming it'
      - places the order with the winning code applied
      - 'consumes the use of HIGH20 alone, LOW5 none'
      - 'records LOW5 on the order as not applied, with its explanation'
      - 'stores the Standard price $25.00 on the line at placement, beside her Member price $18.00'
      - >-
        applies STD30 after placement on the lower of her $18.00 and the Standard $25.00 less 30 %, $17.50:
        she saves $0.50, not both
      - 'applies YES25, which combines, to her Member price: 25 % of $18.00 is $4.50, $13.50'
      - 'refuses STD30 for an order placed before the Standard price was stored, with the staff message'
scenario_coverage:
  - scenario: ATS-COM-ORD-015-08
    test_cases:
      - >-
        applies STD30 after placement on the lower of her $18.00 and the Standard $25.00 less 30 %, $17.50:
        she saves $0.50, not both
      - 'applies YES25, which combines, to her Member price: 25 % of $18.00 is $4.50, $13.50'
      - 'refuses STD30 for an order placed before the Standard price was stored, with the staff message'
    scope: >-
      The cited cases exercise the scenario’s listed fixture outcomes; this register makes no verified
      conformance claim.
dependency_evidence:
  provenance: test
  source: 'services-commerce:modules/orders/tests/e2e/promotion-alternatives.e2e.spec.js'
  declared_by_test: >-
    the composed handler, the routes, the workflows, the pricing engine on both bases, the promotions library
    and persistence, the cancellation workflow, PostgreSQL. Doubled: the signing key pair, the other services'
    tables and Accounting (local stand-ins).
---

# Promotions that do and do not combine with audience prices

## Verification Boundary

The suite drives the composed local API dispatcher and its registered routes.

## What This Suite Proves

The registered cases check promotions that do and do not combine with audience prices with their fixture records and assertions. Scenario bindings name only the examples those cases exercise.

## What It Does Not Prove

A registered file supplies no run result or verified conformance by itself. Local fixtures do not establish deployed cross-service behavior or complete browser journeys.

## Real Dependencies and Test Doubles

PostgreSQL and the exercised Commerce persistence or workflow code are real. Remote service records, clocks and transports follow the suite’s fixtures.

## Must Not Be Doubled

The database constraints, role restrictions, locks and transactions exercised by this suite must use PostgreSQL.
