---
id: TST-COM-FUL-003
title: Data jobs
kind: api-lifecycle
product_area: commerce
module: fulfillment
revision: 1
status: draft
source_sha:
  services-commerce: c8b66a98e2490617aec38ba5c8165dd9bd0a8f9b
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
repository: services-commerce
files:
  - modules/data-operations/tests/e2e/data-jobs.e2e.spec.js
implements:
  - ATS-COM-FUL-020-01
  - ATS-COM-FUL-020-02
  - ATS-COM-FUL-020-04
  - ATS-COM-FUL-020-07
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 5
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/data-operations/tests/e2e/data-jobs.e2e.spec.js
    test_titles:
      - 'accepts the validation, answering the job validating, its counts and where to read it'
      - >-
        answers a second submission of the same body under the same Idempotency-Key with the same
        job, reused
      - 'reads the job back once its batch has run: validated, its impact one create, nothing applied'
      - >-
        lists the tenant’s store jobs, the validation among them, and refuses a state outside the
        vocabulary
      - pages the job’s results and rejections by position
      - >-
        answers the key missing before the apply, and the store as its load carried it once the job
        is applied and run
      - >-
        refuses a principal holding the read key alone on every data-job route of the collection,
        403 permission_missing
      - 'refuses a portal member: the routes are console access'
      - 'refuses the ordinary store routes, 403 TenantUnavailable'
      - 'keeps serving the data-job routes: the engine’s surface is what the load is made of'
    scenario_anchors:
      - >-
        services-commerce:modules/data-operations/tests/e2e/data-jobs.e2e.spec.js#refuses a
        principal holding the read key alone on every data-job route of the collection, 403
        permission_missing
      - >-
        services-commerce:modules/data-operations/tests/e2e/data-jobs.e2e.spec.js#refuses a portal
        member: the routes are console access
      - >-
        services-commerce:modules/data-operations/tests/e2e/data-jobs.e2e.spec.js#answers a second
        submission of the same body under the same Idempotency-Key with the same job, reused
      - >-
        services-commerce:modules/data-operations/tests/e2e/data-jobs.e2e.spec.js#refuses the
        ordinary store routes, 403 TenantUnavailable
      - >-
        services-commerce:modules/data-operations/tests/e2e/data-jobs.e2e.spec.js#keeps serving the
        data-job routes: the engine’s surface is what the load is made of
      - >-
        services-commerce:modules/data-operations/tests/e2e/data-jobs.e2e.spec.js#answers the key
        missing before the apply, and the store as its load carried it once the job is applied and
        run
---

# Data jobs

## Verification Boundary

This suite calls the composed local HTTP handler over the prepared database. It checks data jobs through request contracts and the enforcing security boundary.

## 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

Local handler execution does not establish deployed routing, queue delivery or browser behavior. It also supplies no latest result until a qualification run records one.

## Real Dependencies and Test Doubles

The database and imported Commerce persistence services are real. Fixtures create the records owned by this run. Signed local security contexts and the composed handler exercise the request boundary.

## Must Not Be Doubled

Keep the composed handler, permission enforcement, request validation and database writes real when claiming this local API coverage. Scripted financial, queue or carrier outcomes must remain visibly separate from deployed integration evidence.
