---
id: TST-PFM-DJE-108
title: Configuration data jobs
kind: api-lifecycle
product_area: platform
module: data-job-engine
revision: 1
status: draft
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  macroservice-libraries: 54536a441935c6e09fdb7f96f0bec71c52ba4e03
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
repository: services-crm
files:
  - modules/data-jobs/tests/e2e/configuration-data-jobs.e2e.spec.js
implements:
  - ATS-PFM-DJE-001-01
  - ATS-PFM-DJE-001-08
  - ATS-PFM-DJE-010-06
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 5
isolation: >-
  Suite-owned fixture records, job identifiers and workspace contexts; teardown removes the fixture
  data.
evidence:
  - 'services-crm:modules/data-jobs/tests/e2e/configuration-data-jobs.e2e.spec.js'
assertion_inventory:
  - a configuration type’s data jobs API (end to end)
  - 'the whole life of a job, at each configuration collection’s own path'
  - 'serves all of it under /contact_types/{tenantId}/data_jobs'
  - >-
    serves all of it under /contact_roles/{tenantId}/data_jobs, the snake_case path of the
    collection
  - 'serves all of it under /organization_types/{tenantId}/data_jobs'
  - 'serves all of it under /address_types/{tenantId}/data_jobs'
  - 'serves all of it under /phone_number_types/{tenantId}/data_jobs'
  - 'serves all of it under /regions/{tenantId}/data_jobs, which the regions function serves'
  - 'answers the collection’s list the jobs of that collection, and no job of another'
  - who may import a collection from a file
  - 'refuses an unsigned call with 401, because importing a file is nobody’s by default'
  - refuses a context that does not cover the tenant in the path with 403
  - refuses a caller who may change one contact type but holds no bulk key with 403
  - refuses a caller who holds the bulk key but may not change a contact type with 403
  - 'a job of another object type, named at a collection’s path'
  - >-
    is read at its own collection’s path, so what follows is the object type and not a missing job
    (premise)
  - is not found by the status read at the contact-types path
  - is not found by the results page at the contact-types path
  - 'is not found by the apply at the contact-types path, so it cannot be started from there'
  - 'is not found by the cancel at the contact-types path, and is still queued afterwards'
  - a delete of contact types applied through the contacts path
  - 'validates the delete at its own path, so what follows is a job of contact types (premise)'
  - >-
    is refused by the apply at the contacts path as not found, a job of another object type, with
    404
  - leaves the job validated and the contact type in place after that refusal
  - 'is applied at its own contact-types path, and the type is deleted'
  - the kebab-case path the contact-role submission used to be at
  - 'is served by nothing, because the collection is /contact_roles and nothing calls the old one'
  - a bulk delete and a bulk status change of contact types
  - >-
    accepts the delete at the collection’s own path with the interactive body and answers where to
    read it (premise)
  - >-
    answers the validation: two it would delete, one it is blocked on because a contact holds it,
    and who holds it
  - asks to be confirmed with the words the engine counted
  - 'refuses an apply that carries no phrase with 409, naming the words to type'
  - 'refuses an apply that carries the wrong number with 409, naming the words to type'
  - deletes the two unused types and leaves the one in use
  - 'says of the one it left that it is in use, with a message naming the count and no field'
  - refuses the delete to a caller holding the bulk key and not the delete key with 403
  - refuses the delete to a caller holding the delete key and not the bulk key with 403
  - >-
    refuses the status change to a caller holding the bulk key and the delete key and not the update
    key with 403
  - refuses a body that names another object type at this path with 400
  - 'validates the status change of two types, applies it with the digest, and deactivates both'
registration_note: Registration describes existing source; the suite is not executed by this documentation job.
---

# Configuration data jobs

## Verification Boundary

The suite checks requests through the local production dispatcher and signed caller evaluation. The structured assertion inventory records the checks present at the pinned revision.

## What This Suite Proves

The existing checks exercise configuration data jobs. The specification bindings identify the narrower outcomes supported by those assertions.

## What It Does Not Prove

Local execution does not establish deployed queue, storage or service behavior. Independent test cases do not establish a complete cross-feature process.

## Real Dependencies and Test Doubles

The owning service exercises production persistence and domain behavior against real Postgres. The fixture supplies caller contexts; queue delivery, storage and external calls are doubled where the file installs a test port.

## Must Not Be Doubled

The database effects, security context and production operation under examination remain real. Their outcomes cannot be replaced with canned success responses.
