Files
Comfy-Org-ComfyUI-Manager/tests/playwright/TEST_SCENARIOS.md
T
Dr.Lt.Data 857e2ca5a5 v4: Remove share destinations that no longer accept workflows (#3500)
Four of the six share destinations of the legacy UI are gone: the
comfyworkflows.com domain registration has expired, the Copus API
answers 410 "ComfyUI direct publishing is no longer supported", the
OpenArt workflow API and pages return 404 or redirect to the home page,
and esheep.com no longer resolves. Manager still offered them, and the
ComfyWorkflows flow would hand the share key, the workflow and the
installed snapshot to whoever answers at that domain next.

- Remove ComfyWorkflows, Copus, OpenArt and eSheep from the share
  chooser, the Share setting, the Workflow Gallery menu and the share
  dialog, with their server routes, the two dialog modules and what the
  Copus theme added to the chooser
- Treat a saved Share setting that names a removed site as All, and do
  not open a removed site saved as the last visited Workflow Gallery
- Sharing to YouML and to Matrix is unchanged; the share request no
  longer carries cw_auth or is_nsfw, which only ComfyWorkflows used
- Update README, CHANGELOG and the Playwright scenario notes
2026-11-12 21:47:35 +09:00

11 KiB

Legacy UI Playwright E2E — Test Scenarios

Scenario list based on the actual API call flow of the Legacy UI (runtime-verified).

URL Convention

ComfyUI's api.fetchApi() automatically prepends the /api prefix to every path.

  • JS call: fetchApi('/v2/manager/db_mode') → actual request: GET /api/v2/manager/db_mode
  • When intercepted by Playwright route, the URL is captured in the /api/v2/... form.

Install Flow (Runtime-verified)

[Install button click]
  → GET /api/v2/customnode/versions/{id}     ← list available versions
  → Version-selection dialog (<select multiple> + "Select"/"Cancel")
  → "Select" click
  → POST /api/v2/manager/queue/batch         ← actual install request
       body: {"install":[{...nodeData, selected_version:"latest"}], "batch_id":"uuid"}
  → WebSocket push: cm-queue-status
       {status:"in_progress", done_count, total_count}
       {status:"batch-done", nodepack_result:{"hash":"success"}}
       {status:"all-done"}

1. API calls at Manager Menu initialization

File: legacy-ui-manager-menu.spec.ts (existing + enhanced)

5 API calls made concurrently when the Manager Menu opens (runtime-verified):

# Scenario Assertion Endpoint
1-1 DB mode loading Dropdown value shown GET /api/v2/manager/db_mode
1-2 Channel list loading Dropdown options shown GET /api/v2/manager/channel_url_list
1-3 Update policy loading Dropdown value shown GET /api/v2/manager/policy/update
1-4 Notice loading Right panel text is non-empty GET /api/v2/manager/notice
1-5 DB mode change round-trip POST → GET verification POST /api/v2/manager/db_mode
1-6 Policy change round-trip POST → GET verification POST /api/v2/manager/policy/update
1-7 Channel change round-trip POST → GET verification POST /api/v2/manager/channel_url_list

2. Custom Nodes Manager — list retrieval

File: legacy-ui-custom-nodes.spec.ts (existing + enhanced)

2 API calls made when the Custom Nodes Manager opens (runtime-verified):

# Scenario UI action Assertion Endpoint
2-1 List loading (cache) Open Custom Nodes Manager Grid rows > 0 GET /api/v2/customnode/getlist?mode=cache&skip_update=true
2-2 Mapping loading (concurrent with list) Request observed GET /api/v2/customnode/getmappings?mode=cache
2-3 Installed filter Filter → "Installed" rows ≤ All Client-side filter
2-4 Not Installed filter Filter → "Not Installed" rows > 0 Client-side filter
2-5 Import Failed filter Filter → "Import Failed" Filter works Client-side filter
2-6 Check Update "Check Update" button Filter flips to "Update", API re-called GET /api/v2/customnode/getlist?mode=cache (no skip_update)
2-7 Check Missing "Check Missing" button Filter flips to "Missing" GET /api/v2/customnode/getmappings?mode=cache
2-8 Alternatives filter Filter → "Alternatives of A1111" Data loads GET /api/customnode/alternatives?mode=cache

3. Full node install lifecycle

File: legacy-ui-node-lifecycle.spec.ts (new)

Install flow: Install button → versions API → version-selection dialog → Select → queue/batch → WebSocket status push

# Scenario UI action Assertion Endpoint
3-1 Install — version query "Not Installed" → "Install" click Version-list dialog appears GET /api/v2/customnode/versions/{id}
3-2 Install — select version + send batch Pick version in <select> → "Select" click queue/batch called with install key in body POST /api/v2/manager/queue/batch
3-3 Install — WebSocket status Install runs cm-queue-status messages: in_progress → batch-done → all-done WebSocket
3-4 Uninstall "Installed" → "Uninstall" click → confirm dialog "OK" uninstall key in batch body POST /api/v2/manager/queue/batch
3-5 Disable "Installed" → "Disable" click disable key in batch body POST /api/v2/manager/queue/batch
3-6 Enable "Disabled" → "Enable" click → pick version install key + skip_post_install:true in batch body GET disabled_versions/{id} → POST queue/batch
3-7 Update "Installed" → "Try update" click update key in batch body POST /api/v2/manager/queue/batch
3-8 Fix import-fail node → "Try fix" click fix key in batch body (skip if none) POST /api/v2/manager/queue/batch

4. Version management

File: legacy-ui-node-versions.spec.ts (new)

# Scenario UI action Assertion Endpoint
4-1 Installed node version list "Installed" → "Switch Ver" click Version list shown in <select multiple> dialog GET /api/v2/customnode/versions/{id}
4-2 Disabled node version list "Disabled" → "Enable" click disabled_versions call observed GET /api/v2/customnode/disabled_versions/{id}

5. Batch operations + stop

File: legacy-ui-batch-operations.spec.ts (new)

# Scenario UI action Assertion Endpoint
5-1 Update All Manager Menu → "Update All" click update_all key in batch body POST /api/v2/manager/queue/batch
5-2 Update ComfyUI Manager Menu → "Update ComfyUI" click update_comfyui key in batch body POST /api/v2/manager/queue/batch
5-3 Stop (Manager Menu) "Restart" toggle → "Stop" click queue/reset invoked POST /api/v2/manager/queue/reset
5-4 Stop (Custom Nodes Manager) "Stop" button click queue/reset invoked POST /api/v2/manager/queue/reset

Note: queue/abort_current is not called directly from JS (server-only). Stop uses queue/reset.

6. Git URL / PIP install

File: legacy-ui-install-methods.spec.ts (new)

# Scenario UI action Assertion Endpoint
6-1 Git URL install "Install via Git URL" → enter URL → confirm 200 or 403 POST /api/v2/customnode/install/git_url
6-2 Git URL cancel "Install via Git URL" → cancel No API call —
6-3 PIP package install "Install PIP packages" → enter package name 200 or 403 POST /api/v2/customnode/install/pip

7. Import failure details

File: legacy-ui-custom-nodes.spec.ts (enhanced)

# Scenario UI action Assertion Endpoint
7-1 Import failure details "Import Failed" filter → "IMPORT FAILED ↗" click Error dialog appears POST /api/v2/customnode/import_fail_info

Note: skipped when no import-failed nodes are present.

8. Model management

File: legacy-ui-model-manager.spec.ts (existing + enhanced)

# Scenario UI action Assertion Endpoint
8-1 Model list loading Open Model Manager Grid rows > 0 GET /api/v2/externalmodel/getlist?mode=cache
8-2 Model search Enter query Grid filtered Client-side filter
8-3 Model install Row's "Install" click install_model key in batch body POST /api/v2/manager/queue/batch

9. Full snapshot lifecycle

File: legacy-ui-snapshot.spec.ts (existing + enhanced)

# Scenario UI action Assertion Endpoint
9-1 Snapshot list Open Snapshot Manager Table rows shown GET /api/v2/snapshot/getlist
9-2 Snapshot save "Save snapshot" click "Current snapshot saved" message POST /api/v2/snapshot/save
9-3 Snapshot restore "Restore" click 200 or 403, RESTART button shown POST /api/v2/snapshot/restore?target=X
9-4 Snapshot remove "Remove" click Row removed from list POST /api/v2/snapshot/remove?target=X

10. Dialog navigation

File: legacy-ui-navigation.spec.ts (existing)

# Scenario Assertion
10-1 Manager → Custom Nodes → close → re-open Manager Dialog transitions cleanly
10-2 Manager → Model Manager → close → re-open Dialog transitions cleanly
10-3 API call while dialog is open Server responds normally
10-4 Legacy UI enabled check is_legacy_manager_ui: true

File composition summary

File New/Enhanced Scenarios Target Endpoints
legacy-ui-manager-menu.spec.ts enhanced 7 db_mode, channel_url_list, policy/update, notice
legacy-ui-custom-nodes.spec.ts enhanced 9 getlist, getmappings, alternatives, import_fail_info
legacy-ui-node-lifecycle.spec.ts new 8 versions/{id}, disabled_versions/{id}, queue/batch (install/uninstall/update/fix/disable/enable)
legacy-ui-node-versions.spec.ts new 2 versions/{id}, disabled_versions/{id}
legacy-ui-batch-operations.spec.ts new 4 queue/batch (update_all, update_comfyui), queue/reset
legacy-ui-install-methods.spec.ts new 3 install/git_url, install/pip
legacy-ui-model-manager.spec.ts enhanced 3 externalmodel/getlist, queue/batch (install_model)
legacy-ui-snapshot.spec.ts enhanced 4 snapshot/getlist, save, restore, remove
legacy-ui-navigation.spec.ts existing 4 is_legacy_manager_ui, version

Total: 44 scenarios

Legacy-only endpoint coverage

Endpoint Scenarios
GET /api/v2/customnode/getlist 2-1, 2-6
GET /api/v2/customnode/getmappings 2-2, 2-7
GET /api/customnode/alternatives 2-8
GET /api/v2/customnode/versions/{id} 3-1, 4-1
GET /api/v2/customnode/disabled_versions/{id} 3-6, 4-2
POST /api/v2/customnode/import_fail_info 7-1
POST /api/v2/customnode/install/git_url 6-1
POST /api/v2/customnode/install/pip 6-3
GET /api/v2/externalmodel/getlist 8-1
POST /api/v2/manager/queue/batch 3-2, 3-4~3-8, 5-1, 5-2, 8-3
POST /api/v2/manager/queue/reset 5-3, 5-4
GET /api/v2/manager/notice 1-4
GET /api/v2/snapshot/getlist 9-1
POST /api/v2/snapshot/save 9-2
POST /api/v2/snapshot/restore 9-3
POST /api/v2/snapshot/remove 9-4

Exclusions

  • share_option — per user instruction
  • External-service auth/integration (4 endpoints) — external services are unreachable from E2E
  • Individual queue endpoints (6) — unused by JS; delegated internally through queue/batch
  • queue/abort_current — unused by JS (Stop uses queue/reset)
  • /manager/notice (v1) — superseded by v2

API call verification method

Capture the actual API call sequence via Playwright page.route('**/*') interception. Verify job progress/completion via the cm-queue-status WebSocket event.