Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
188 lines
8.1 KiB
Markdown
188 lines
8.1 KiB
Markdown
# PRD — Workflow E2E: Ticket Created → Add Comment
|
|
|
|
- Slug: `workflow-e2e-ticket-comment`
|
|
- Date: `2026-01-01`
|
|
- Status: Draft
|
|
|
|
## Summary
|
|
|
|
Add a Playwright integration test that validates a **very basic workflow runs end-to-end** with the v2 workflow runtime + worker:
|
|
|
|
1. A user creates a **new workflow** in Automation Hub / Designer.
|
|
2. The workflow is **triggered by the `TICKET_CREATED` event**.
|
|
3. The workflow runs one action: **`tickets.add_comment`** with body `hello from workflow`.
|
|
4. The test creates a new ticket to trigger the event.
|
|
5. The test asserts:
|
|
- A comment is added to the created ticket.
|
|
- A workflow run record exists and completes successfully.
|
|
|
|
This is intended as a “canary” test proving the workflow engine is wired correctly (UI → persistence → event ingestion → worker execution → business side effect).
|
|
|
|
## Problem
|
|
|
|
We currently lack an automated, end-to-end regression test proving:
|
|
- workflow definitions created in the UI can be activated,
|
|
- runtime events are emitted on real application actions (ticket creation),
|
|
- the worker consumes events and executes workflow logic,
|
|
- the workflow produces a real side effect (ticket comment).
|
|
|
|
Without this, workflow/runtime regressions are easy to introduce and hard to diagnose.
|
|
|
|
## Goals
|
|
|
|
1. Verify the workflow worker/runtime processes a real `TICKET_CREATED` event.
|
|
2. Verify the runtime executes `tickets.add_comment` correctly.
|
|
3. Verify the user-auth/tenant scoping is correct (comment created under the tenant that created the ticket).
|
|
4. Make the test deterministic and debuggable (clear assertions + DB verification).
|
|
|
|
## Non-goals
|
|
|
|
- Exhaustive coverage of designer capabilities.
|
|
- Testing workflow waits, retries, or complex branching.
|
|
- Validating event catalog simulation flows.
|
|
|
|
## Users and Primary Flows
|
|
|
|
### Persona
|
|
- Internal Admin user configuring workflows.
|
|
|
|
### Primary flow (under test)
|
|
1. Navigate to Automation Hub → Workflows/Designer.
|
|
2. Create a new workflow.
|
|
3. Select trigger event: `TICKET_CREATED`.
|
|
4. Add action step: “Add Ticket Comment”.
|
|
5. Publish/activate workflow.
|
|
6. Create a new ticket.
|
|
7. Observe the workflow run and comment side effect.
|
|
|
|
## UX / UI Notes
|
|
|
|
The test will need stable selectors for:
|
|
- Automation Hub navigation (top-row tabs: Workflows, Designer, Runs, Event Catalog)
|
|
- “Create workflow” affordance
|
|
- Trigger event picker (select `TICKET_CREATED`)
|
|
- Action library selection (select `tickets.add_comment`)
|
|
- Input mapping UI (map `ticket_id` from trigger payload, set `body`)
|
|
- Publish/activate workflow
|
|
- Ticket creation UI (fill required fields)
|
|
- Ticket detail page comment timeline/list
|
|
|
|
If selectors are missing or unstable, add `data-automation-id` attributes to critical controls rather than relying on text-only locators.
|
|
|
|
## Requirements
|
|
|
|
### Functional Requirements
|
|
|
|
1. The test can create a new workflow in the designer and persist it.
|
|
2. The workflow can be activated/published and becomes eligible to run.
|
|
3. Creating a ticket publishes `TICKET_CREATED` with a payload that includes `ticketId`.
|
|
4. The worker consumes the event and starts a workflow run.
|
|
5. The workflow executes `tickets.add_comment` and writes a comment to the `comments` table for that ticket.
|
|
6. The UI shows the “hello from workflow” comment on the ticket.
|
|
|
|
## Implementation Outline
|
|
|
|
### Playwright test skeleton
|
|
|
|
- Test location: `ee/server/src/__tests__/integration/workflow-ticket-created-add-comment.playwright.test.ts`
|
|
- Follow the established helpers/patterns:
|
|
- `applyPlaywrightAuthEnvDefaults()`
|
|
- `createTestDbConnection()`
|
|
- `createTenantAndLogin(db, page, ...)`
|
|
- `resolvePlaywrightBaseUrl()`
|
|
- Use DB-backed polling helpers in the test to wait for:
|
|
- the workflow comment row to appear in `comments`
|
|
- the corresponding `workflow_runs` row to reach a terminal success status
|
|
|
|
### Worker/runtime dependency
|
|
|
|
The Playwright run must include a live workflow worker connected to the same DB/Redis as the dev server:
|
|
- Preferred: start/stop a dockerized worker from Playwright global setup/teardown (mirrors existing MinIO setup).
|
|
- Alternative: start a host process in parallel with `npm run dev`.
|
|
|
|
### Non-functional Requirements
|
|
|
|
1. **Determinism:** The test avoids race conditions by waiting on a DB-backed condition (comment row / workflow run state), not only UI timing.
|
|
2. **Debuggability:** On failure, capture:
|
|
- screenshot/video (Playwright defaults)
|
|
- workflow id + run id (from DB query)
|
|
- worker logs location/command to tail
|
|
3. **Isolation:** The test runs against a dedicated Playwright database and does not rely on pre-existing workflows.
|
|
|
|
## Data / API / Integrations
|
|
|
|
### Relevant tables (expected)
|
|
- `workflow_definitions`, `workflow_definition_versions`
|
|
- `workflow_runtime_events`
|
|
- `workflow_runs`, `workflow_action_invocations`
|
|
- `tickets`, `comments`
|
|
|
|
### Key runtime entities
|
|
- Trigger event type: `TICKET_CREATED`
|
|
- Action: `tickets.add_comment` (v1)
|
|
|
|
## Security / Permissions
|
|
|
|
- Test tenant must have sufficient permissions to:
|
|
- manage workflows (create/publish/activate)
|
|
- create tickets
|
|
- update tickets (add comments) via workflow action execution context
|
|
|
|
## Observability
|
|
|
|
Test assertions should include DB queries proving:
|
|
- event record exists in `workflow_runtime_events` for `TICKET_CREATED`
|
|
- run record exists in `workflow_runs` and transitions to a terminal success state
|
|
- comment row exists in `comments` with `note = "hello from workflow"`
|
|
|
|
## Rollout / Migration
|
|
|
|
None. This is a test + minor infra wiring (starting the worker for Playwright).
|
|
|
|
## Test Environment Setup (Local)
|
|
|
|
This plan assumes a **repeatable Playwright dependency stack** is available:
|
|
- Postgres (reachable from host at `PLAYWRIGHT_DB_HOST:PLAYWRIGHT_DB_PORT`)
|
|
- Redis (reachable from host at `REDIS_HOST:REDIS_PORT`)
|
|
- Workflow worker connected to the same Postgres + Redis
|
|
|
|
To avoid conflicts with other worktrees, use the `alga-test-env-setup` port detection + secrets generation:
|
|
|
|
1. Detect a free port set (example env number 2):
|
|
- `python3 /Users/roberisaacs/.codex/skills/alga-test-env-setup/scripts/detect_ports.py --env-num 2`
|
|
2. Generate dedicated secrets (recommended: keep separate from developer secrets):
|
|
- `python3 /Users/roberisaacs/.codex/skills/alga-test-env-setup/scripts/generate_secrets.py --secrets-dir ./secrets-playwright --force`
|
|
3. Start dependency containers using the detected ports (implementation choice):
|
|
- Option A: create a dedicated `docker-compose.playwright-deps.yml` (postgres + redis + worker) and start/stop it from Playwright global setup/teardown.
|
|
- Option B: reuse an existing e2e compose (e.g. `docker-compose.e2e-with-worker.yaml`) but parameterize ports via env.
|
|
|
|
Playwright must be pointed at these ports via env vars:
|
|
- `PLAYWRIGHT_DB_HOST`, `PLAYWRIGHT_DB_PORT`, `PLAYWRIGHT_DB_NAME`
|
|
- `PLAYWRIGHT_DB_ADMIN_PASSWORD` and `PLAYWRIGHT_DB_APP_PASSWORD` (can point at `/run/secrets/<name>`; bootstrap resolves to `./secrets/<name>`)
|
|
- `REDIS_HOST`, `REDIS_PORT` (+ `REDIS_PASSWORD` if required)
|
|
|
|
## Open Questions
|
|
|
|
1. What is the canonical Automation Hub route path for:
|
|
- workflows list
|
|
- designer “new workflow” mode
|
|
2. What are the stable `data-automation-id` selectors for:
|
|
- event trigger picker
|
|
- adding an action from the action library
|
|
- mapping trigger payload → action inputs
|
|
3. What is the authoritative terminal success status in `workflow_runs.status` (e.g., `SUCCEEDED` vs `COMPLETED`)?
|
|
4. How should the Playwright environment start the workflow worker?
|
|
- Option A: start a host process via `npm --workspace=services/workflow-worker run dev`
|
|
- Option B: start a Docker container (compose) like the existing MinIO setup does
|
|
- Decision criteria: reliability + ease of local debugging + CI friendliness
|
|
|
|
## Acceptance Criteria (Definition of Done)
|
|
|
|
- A Playwright test exists that:
|
|
- creates a workflow (trigger `TICKET_CREATED`, action `tickets.add_comment` with body `hello from workflow`)
|
|
- creates a ticket
|
|
- verifies the comment appears on the ticket
|
|
- verifies a workflow run completed successfully
|
|
- The test starts required dependencies (at least Postgres, Redis, workflow worker) in a repeatable way.
|
|
- Running the test locally produces a deterministic pass on a clean environment.
|