Hermes 284313f908
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
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

8.1 KiB

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.