---
id: TST-ACC-TRX-330
title: Query schedules suite
kind: browser-lifecycle
product_area: accounting
module: transactions
revision: 1
status: draft
source_sha:
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
repository: react-console
files:
  - e2e/mock/query-schedules.mock.spec.ts
implements: []
implements_parts: []
environment: mock
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 5
isolation: A browser context and suite-controlled mocked responses.
provenance: test
source: 'react-console:e2e/mock/query-schedules.mock.spec.ts'
evidence:
  - provenance: test
    source: 'react-console:e2e/mock/query-schedules.mock.spec.ts'
    assertion_titles:
      - exporting query results
      - 'exports a CSV with field names as headings, and the file downloads'
      - >-
        exports an Excel workbook with field labels and descriptions, and
        remembers the choice
      - scheduling a query
      - >-
        a query that is not saved is saved first, then scheduled with a time
        zone, a user, an external address, a template and a message
      - >-
        a date parameter is the report's execution date, and the others start
        from the values the query last ran with
      - 'opened without a run, a parameter starts from its default'
      - a saved query with changes on screen is saved before its schedule opens
      - >-
        Create Template opens the e-mail editor on the standard wording and
        chooses the new template
      - managing schedules
      - >-
        the old Schedules address opens the Queries page's Schedules tab,
        keeping its query string
      - >-
        the old New Schedule and Edit Schedule addresses open the dialog over
        the query and over the schedule
      - >-
        edits a schedule in the dialog over the Schedules tab, and over its own
        page
      - closing the editor with unsaved changes asks first
      - >-
        duplicates a schedule as a paused copy, pauses and resumes it, and
        deletes it
      - Run Now confirms who receives it and the new run tops the history
      - >-
        an expanded failed run says what went wrong and whether it will be tried
        again
      - >-
        a saved query with schedules says how many beside its title and lists
        them
      - without the schedule permissions
      - Query Explorer offers no Schedule and no schedules indicator
      - >-
        with schedules of their own but not every schedule, there is no Created
        by Me switch and no Take Ownership
      - a manager sees Created by Me and may take a schedule over
      - with no schedule permission a schedule can be read but not changed
    imports:
      - 'import { expect, test, type Page, type Request } from "@playwright/test"'
      - 'import { tenantPath } from "@/lib/routes"'
      - 'import { mockUrl, routes, urlPattern } from "../support/routes"'
    test_double_declarations:
      - ' * MOCK: query exports and scheduled deliveries, end to end in mock mode (`playwright.mock.config.ts`).'
      - ' * The routes are mock mode''s (`app/api/queries/**`), which answer the same shapes the live client maps Platform''s into,'
      - 'import { mockUrl, routes, urlPattern } from "../support/routes"'
      - 'const AS_CUSTOMER = { mockIdentity: "customer" }'
      - const PERMISSIONS_KEY = "rhythm.mock.permissions"
      - >-
        /** The next request the screen makes to a mock route, and the JSON body
        it sent. */
      - '  await page.goto(mockUrl(routes.querySchedules(AS_CUSTOMER)))'
      - '  await page.goto(mockUrl(routes.query(GEORGIA, AS_CUSTOMER)))'
      - '    await page.goto(mockUrl(routes.query(GEORGIA, AS_CUSTOMER)))'
      - '    await page.goto(mockUrl(routes.query(GEORGIA, AS_CUSTOMER)))'
      - '    await page.goto(mockUrl(routes.newQuery({ type: "contacts", ...AS_CUSTOMER })))'
      - '    await page.goto(mockUrl(routes.query(DATE_AND_TEXT, AS_CUSTOMER)))'
      - '    await page.goto(mockUrl(routes.query(DATE_AND_TEXT, AS_CUSTOMER)))'
      - '    await page.goto(mockUrl(routes.query(GEORGIA, AS_CUSTOMER)))'
      - '    await expect(page).toHaveURL(urlPattern(mockUrl(routes.query(GEORGIA))))'
      - '    await page.goto(mockUrl(routes.query(GEORGIA, AS_CUSTOMER)))'
      - '    await page.goto(mockUrl(tenantPath("queries.schedules", undefined, { ...AS_CUSTOMER, status: "paused" })))'
      - '    await page.goto(mockUrl(routes.newQuerySchedule({ savedQueryId: GEORGIA, ...AS_CUSTOMER })))'
      - '    await expect(page).toHaveURL(urlPattern(mockUrl(routes.query(GEORGIA))))'
      - '    await page.goto(mockUrl(routes.editQuerySchedule("sch_1", AS_CUSTOMER)))'
---

# Query schedules suite

## Verification Boundary

The suite exercises console screens and their requests in a browser with controlled responses. Registration records the existing executable file; it does not report a run or establish product approval.

## What This Suite Proves

The executable assertions exercise this module, but no capability or feature scenario binding is established for this file. Its individual assertion titles remain in the evidence register for subsequent mapping.

## What It Does Not Prove

Controlled browser responses do not establish service authorization, database bounds, processor behavior or financial persistence. An unbound feature chain remains proposed, and this registration carries no execution result.

## Real Dependencies and Test Doubles

The real browser and console components run against suite-controlled data or responses. The evidence register identifies the mock setup; those returned values are assumptions of the screen test.

## Must Not Be Doubled

The screen components, their validation and their outgoing request construction are the verification boundary and must remain real. Service financial integrity needs an additional suite with real persistence.
