---
id: TST-ACC-BKS-084
title: Exchange Rates integration suite
kind: integration
product_area: accounting
module: books
revision: 1
status: draft
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
repository: services-accounting
files:
  - >-
    modules/books/tests/integration/services/persistence/exchange-rates.integration.spec.js
implements:
  - ATS-ACC-BKS-004-02
  - ATS-ACC-BKS-004-04
  - ATS-ACC-BKS-004-05
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 5
isolation: >-
  The suite owns isolated workspace identities and database fixtures; cleanup
  removes only its seeded records.
assertion_bindings:
  - scenario: ATS-ACC-BKS-004-02
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/exchange-rates.integration.spec.js#refuses
      a second rate for the currency on the same day
  - scenario: ATS-ACC-BKS-004-02
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/exchange-rates.integration.spec.js#refuses
      changing the unit, the currency or the day: a rate’s identity is
      write-once
  - scenario: ATS-ACC-BKS-004-02
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/exchange-rates.integration.spec.js#refuses
      changing the write-once source of a manual rate instead of dropping the
      change (DEF-ACT-0010)
  - scenario: ATS-ACC-BKS-004-04
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/exchange-rates.integration.spec.js#asks
      the provider once for every provider-sourced currency, with the unit, its
      base and the day, and writes provider rows with the platform’s ids
  - scenario: ATS-ACC-BKS-004-04
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/exchange-rates.integration.spec.js#skips
      a currency whose day already holds a rate, reports one the provider did
      not price, and stores a quote on the provider’s own earlier day
  - scenario: ATS-ACC-BKS-004-05
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/exchange-rates.integration.spec.js#refuses
      a currency that takes its rates from the table, one the unit is not
      enabled for, and a unit with no provider currency
  - scenario: ATS-ACC-BKS-004-05
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/exchange-rates.integration.spec.js#refuses
      provider_unavailable and provider_declined, writing nothing
unmapped: false
evidence:
  - provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/exchange-rates.integration.spec.js
execution_notes: >-
  The file exists at the pinned revision; this registration records no execution
  result.
---

# Exchange Rates integration suite

## Verification Boundary

The suite exercises books configuration against the migrated local database. Its fixtures and transaction contexts determine the records and service paths under test.

## What This Suite Proves

The individual assertion references identify the acceptance outcomes this file exercises. When a scenario spans several suites, this file supplies only its listed assertions; qualification must include the other bindings and any recorded coverage finding.

## What It Does Not Prove

Local database execution does not prove deployed infrastructure, external provider availability or console behavior. No result is claimed for the pinned revision until the suite runs and its evidence is reviewed.

## Real Dependencies and Test Doubles

PostgreSQL and exchange-rate persistence are real. Provider responses are supplied through the test’s provider port, so these examples do not reach the external provider.

## Must Not Be Doubled

The database constraints, transaction paths and production persistence functions named by the assertions must remain real. A memory store cannot establish the recorded database proof.
