cypress-tests/.suite-fix/STATUS.md
Started: 2026-06-19 (overnight run)
Branch: test/cypress-real-dnd-drag-fix
Server: http://localhost:8082 (must stay up)
.skip + // QUARANTINED: reason) and report.⬜ todo · 🔄 in progress · ✅ pass · 🟡 partial · ⛔ quarantined · ❌ blocked
| # | Spec | Status | Notes |
|---|---|---|---|
| 1 | components/buttonHappyPath | 🟡 | UN-SKIPPED — 2 pass / 0 fail / 6 pending, exit 0. The cold-first-drag THROW is now recovered in dragAndDropWidget (commands.js cy.on('fail') trap → re-arm + re-drive). Body modernized (inline rename+blur, Label/Additional Actions literals, inspector-tree verify). Quarantined tests: position (moveComponent grid-coord — shared), properties tail (verifyAndModifyToggleFx loading-state fx field — shared commonWidget.js), styles (texts stale + color-picker flake), preview, csa. |
| 2 | components/componentDuplicationHappypath | ⛔ | 4 it.skip (exit 0). FIXED & KEPT: tooltip-input-field data-cy restored via FRONTEND fix (SingleLineCodeEditor.jsx + Code.jsx: trim paramLabel before truthiness so showLabel:false fields fall back to cyLabel, not "-input-field"; WidgetTooltip.jsx data-cy="widget-tooltip"); modernized addBasicData (Label+Tooltip-field+Background); texts/button.js "Background color"→"Background"; toast "Component cloned successfully". REMAINING (real product bug, not spec): right-panel Duplicate AND Ctrl+D clone produce DEFAULT config (clone drops live property/style edits — confirmed via inspector); copy-paste needs system clipboard (headless empty). Frontend clone-snapshot fix needed to un-quarantine. |
| 3 | components/componentsBasicHappypath | ⛔ | describe.skip (exit 0, ~42 pending). ALL 40 tests fail at first drag: dragAndDropWidget("Toggle Switch",300,300) never creates draggable-widget-toggleswitch1 (it.only repro x3 fresh runs, ~2m38s each incl. drag-retry exhaustion). Search id correct (widget-list-box-toggle-switch, WidgetBox.jsx:48); panel opens + search resolves, but real-dnd drop produces no component. beforeEach: modifyCanvasSize 1200x900 + resizeQueryPanel(0), NO cy.viewport (other working specs set viewport 1800). Needs drag-cmd/canvas-position work (forbidden to touch dragAndDropWidget). |
| 4 | components/csa | ⛔ | describe.skip (exit 0, 12 pending). All CSA tests fail (Tabs/Form/Dropdown/Textarea confirmed) — multi-drag + selectEvent("Control Component") + selectCSA flake on 2nd in-test drag after popover ("No dragIntercepted"), SAME blocker quarantined in text/number/password CSA. FIXED & KEPT: beforeEach [data-tooltip-content="Hide query panel"] (gone) → resizeQueryPanel(0) + import — spec now runs to tests instead of dying in hook. |
| 5 | components/datePickerHappyPath | 🟡 | REGENERATED for DatePickerV2 (commit 09845a64cc). 4 pass / 0 fail / 3 pending, exit 0, stable 3 runs. Old spec tested the DEPRECATED legacy datepicker via closeAccordions(["General","Properties","Devices"]) — widget is now DatePickerV2 (no widget-accordion-general). Passing: exposed vars+fns, default value+disable+visibility, events (On select→Show Alert), styles (border radius). Quarantined (.skip + reason): V2 calendar day/time pick (need live V2 popper selectors), custom-validation msg (V2 error div has NO data-cy — product gap, DatepickerInput.jsx:106), preview (depends on calendar). Also: docs/docs/widgets/datepicker.md is STALE (describes legacy). |
| 6 | components/listViewHappyPath | 🟡 | REGENERATED (commit 6f8d55b048). 3 pass / 0 fail / 3 pending, exit 0, stable 2 runs. Root cause: container sub-canvases reuse data-cy=real-canvas (Container.jsx:262) so shared forceClickOnCanvas matched 4 els — scoped to unique #real-canvas spec-locally; replaced legacy rename/fx-default. Pass: properties, styles, Record-clicked event. Quarantined: box-shadow colour (selectColourFromColourPicker ends with real-canvas click → 4-el ambiguity, SHARED), nested {{listItem.*}} binding (in-container 2nd-drag flake + flat inspector), tooltip (List View tooltip field has showLabel:false → data-cy="-input-field"). |
| 7 | components/modalHappyPath | 🟡 | REGENERATED for ModalV2 (commit 6f8d55b048). 4 pass / 0 fail / 2 pending, exit 0, stable 2 runs. Modal→ModalV2: launch button is <name>-launch-button (RenderWidget.jsx:329, NOT draggable-widget- prefixed); header/body/footer slots replace modal-title; re-open inspector after each modal open (setSelectedComponentAsModal swaps context, ModalV2.jsx:132). Pass: default trigger open/close, properties, trigger visibility/disable, On open event. Quarantined: styles (per-accordion swatches all displayName "Background" → selector collision, modalV2.js:213), csa (suite-wide post-popover drag flake). Files: modalHappyPath.cy.js + modal.js. |
| 8 | components/numberInputHappyPath | 🟡 | REWRITTEN (commit b11622060d). 5 pass / 0 fail / 1 pending, exit 0 (4 runs to green). Full rewrite vs 2-tab inspector: default/edit, field props (disable aria-disabled, visibility), events (On enter pressed), min/max validation feedback, styles (border-radius on -actionable-section, BaseInput.jsx:209). Quarantined: CSA (post-popover drag flake). NOTE stale shared constant noEventHandlerMessage=no-items-banner → should be no-event-handler-message (worked around spec-locally). |
| 9 | components/passwordInputHappyPath | 🟡 | REWRITTEN (commit b11622060d). 5 pass / 0 fail / 3 pending, exit 0. Full rewrite (mirrors numberInput): exposed vars+fns, field props, min/max length validation, On enter pressed event, styles. Quarantined: canvas event-trigger toast (testIsolation:false leaks prior passwordinput2 position:fixed overlap → Enter keydown misroutes), preview, CSA (drag flake). data-cy all existed (BaseInput/PasswordInput). |
| 10 | components/tableRegression | 🟡 | MIGRATED to NewTable (commit b11622060d). 2 pass / 0 fail / 10 pending, exit 0, stable 2 runs. NewTable data-cy schema: search <name>-search-input-field, cells <name>-<col>-row-<i> (no -cell-), headers <col>-column-header, footer footer-number-of-records, pagination-section, filter select-column-dropdown-<i>/select-operation-dropdown-<i>/filter-value-input-<i>; default = 10-row demo data. Pass: components/labels (+sort), filters (contains/AND/not-contains). Quarantined 10: deeper NewTable rewrites (column options/datatypes, action-button column, styles classes), flat→tree inspector, download dropdown, server-side pagination. SHARED: clearAndTypeOnCodeMirror can't set multi-line/brace table data (commands.js); duplicate draggable-widget data-cy on Table (wrapper+inner table). |
| 11 | components/textHappyPath | 🟡 | exposed-values ✅ (1 pass, exit 0). Rewrote it to working openAndVerifyNode/verifyNodes/verifyNodeData (spec imported nonexistent verifyValue/verifyfunctions). text default = "Hello The👋" (dev user firstName="The", text.js:305). CSA ⛔ QUARANTINED: wiring fully fixed (selectEvent opens right Inspector via config handle; selectCSA rewritten for OptionCombobox popover — see SHARED FIX 8; "Set visibility" label vs stale "Visibility") but 2nd in-test drag flakes "No dragIntercepted" after popover even with cy.realDragInit(). Same reason all other CSA tests are .skip. |
| 12 | multipage/multipageHappypath | 🟡 | REGENERATED for the new Pages UI. 2 pass / 0 fail / 1 pending, exit 0, stable 2 runs. Pages UI migrated LEFT sidebar → RightSideBar Page settings (right-sidebar-page-settings-button → AddEditPagePopup popover; pages-name-<cy>, #add-new-page). Rewrote selectors/multipage.js + multipage util for the popover flow. Pass: add page, hide/home/delete/disable/page-events. Quarantined test 1 (legacy ~40-element inventory of the removed left-sidebar UX — needs a new element spec). Popover page-name/handle/home/hide controls have NO data-cy (text-scoped). |
| 13 | newSuits/appTitle | 🟡 | Title asserts FIXED (dashboard/editor/preview), verified vs whiteLabelling.js+useAppData.js. Fixes: releaseApp is exported fn not cy cmd (import+call); workspace slug≠workspaceId UUID → assert not.include /apps/; preview of UNRELEASED app has NO "Preview - " prefix (useAppData passes no preview flag) → `${appName} |
| 14 | newSuits/componentsBasics/button | ✅ | 2 pass / 1 pending (CSA .skip). Stable over 3 runs. Inspector + events fixes below |
| 15 | newSuits/componentsBasics/checkbox | ✅ | 1 pass / 2 pending (events+CSA pre-existing .skip). Only needed testIsolation:false + cy.hideTooltip() |
| 16 | newSuits/componentsBasics/numberInput | ✅ | 1 pass / 2 pending (events+CSA pre-existing .skip). Only needed testIsolation:false + cy.hideTooltip() |
| 17 | newSuits/componentsBasics/textInput | ✅ | 1 pass / 2 pending (events+CSA pre-existing .skip). Only needed testIsolation:false + cy.hideTooltip() |
| 18 | newSuits/globalSetingsHappyPath | 🟡 | FIXED — 1 pass / 0 fail / 0 pending, exit 0, stable 2 runs. Un-skipped. Root cause: canvas color picker data-cy="color-picker-canvas" was a DEAD prop — ColorSwatches/BaseColorSwatches key the trigger off cyLabel (${cyLabel}-picker, BaseColorSwatches.jsx:139), which was undefined. FRONTEND FIX (data-cy only, no behavior change): added cyLabel="canvas-bg-color" to ColorSwatches (CanvasSettings.jsx:146) → renders canvas-bg-color-picker matching the existing helper. Flow now covers: header title, max-width/bg labels, canvas bg color applied to real-canvas, preview navbar, maintenance toggle+confirm. QUARANTINED tails: hide-header toggle (PRODUCT REMOVAL — HideHeaderToggle.jsx imported by nothing, never mounts, GlobalSettings/index.jsx:34), release+launch maintenance check (EE env release-util rewrite, same as appTitle). |
| 19 | newSuits/inspectorHappypath | 🟡 | REWRITTEN for 2-layer tree+detail inspector. 2 pass / 0 fail / 1 pending, exit 0. inspector.js: ADDED backward-compatible helpers openSubNode/backFromDetail/openSubNodeAndVerify (no existing signatures changed → green importers unaffected). FRONTEND: TreeViewHeader.jsx data-cy="inspector-detail-header-back" (breadcrumb had no selector). Pass: globals values via subnode detail panel, dynamic items (set-variable event → variables subnode + component exposed values + copy-path). Quarantined: delete-component (PRODUCT REMOVAL — Delete Component has enableInspectorTreeView:false, no affordance renders). |
| 20 | newSuits/queries/chainingOfQueries | 🟡 | FIXED — test 1 green (3 consecutive runs), test 2 pre-existing .skip. (a) PG datasource payload aligned with postgresHappyPath → 201 (the "500" was payload drift, NOT an env block). (b) chainQuery uses OptionCombobox first-visible-input + role=option. (c) action Radix Select opened via KEYBOARD {downarrow} in queries.js selectRunQueryEvent (popover scroll-lock swallows trigger clicks; autoOpenActionSelect prop fights them) — gated on data-state. Files: chainingOfQueries.cy.js + queries.js. |
| 21 | component-new/image | ⛔ | All 3 tests QUARANTINED. Spec is hard-wired to a REMOTE fixture app (appbuilder-v3-lts-eetestsystem.tooljet.com/applications/image-app-automation) that no longer exists → redirects to /error/invalid-link (404 app-authentication-config + 403 session). Blocked by missing EXTERNAL test data, not selector drift. Also removed {baseUrl:null} (broke the @cypress/code-coverage after-all hook). Spec now clean: 3 pending, exit 0. |
cy.dragAndDropWidget reliably THREW [cypress-real-dnd] No Input.dragIntercepted
on a spec's first drag and re-cold after every apiCreateApp+openApp navigation in
beforeEach. Root: cy.realDragAndDrop→cy.task("cdpRealDrag"); on a cold pipeline
the plugin's Input.setInterceptDrags arm is absorbed by Cypress's settling CDP
traffic. The plugin's warmup (cached cdpPromise) runs ONCE per spec run, NOT per
navigation, so both its internal attempts can miss and the TASK REJECTS — an
un-catchable command-queue failure that killed beforeEach (the count-based retry
never ran).
FIX (test-side only, commands.js dragAndDropWidget — node_modules untouched):
(1) re-arm cy.realDragInit() before the run AND before EACH drag (per-navigation
warmup the plugin doesn't do); (2) drive each attempt under a scoped, single-shot
cy.on('fail') trap (installFailTrap): on a cold-intercept throw it re-arms +
re-drives the FULL attempt (open→search→drag→count-poll) and returns false to
swallow the failure; any other error or exhausted budget (4) re-throws honestly;
(3) the count-based confirmDropOrRetry still handles the SILENT miss.
VALIDATED: buttonHappyPath un-skipped → 2 pass / 0 fail / 6 pending, exit 0 (and
run time dropped 6m→1m — no more retry-exhaustion). ZERO dragIntercepted throws in
any run. Green regression newSuits/componentsBasics/button.cy.js still 2/0/1 — no
regression. componentsBasicHappypath re-quarantined for a DIFFERENT blocker (NOT
the throw): beforeEach modifyCanvasSize(1200,900) shrinks #real-canvas to a
~2%-wide sliver because the Max-canvas-width field gained a %/px unit
(CanvasSettings.jsx:78) the shared modifyCanvasSize doesn't set → drop at (300,300)
lands off-canvas (silent miss) → needs shared modifyCanvasSize + body-util rewrite.
The real-dnd drag was creating NO component (probe: draggable-widget-button1: no).
Chain of causes, all now handled in commands.js dragAndDropWidget:
useGridStore.getGhostDragPosition() (appCanvasUtils), NOT react-dnd coords. useGridStore is NOT on window, so the old (and my first) manual ghost injection was a silent no-op.Input.setInterceptDrags lazily) → react-dnd fires but no component. Warms up after first attempt.isDragging effect (DragLayer.jsx) async-flips the sidebar — racing any panel open/close.
FIX: retry full open→search→drag until a new [data-cy^=draggable-widget-] appears (max 3); self-healing ensureComponentsPanelOpen (presence-based, re-click until search box rendered); 1200ms settle. VALIDATED: 1st drag now creates the widget. ✅commands.js dragAndDropWidget) — FULLY REWORKED. cypress-real-dnd + (a) self-healing ensureComponentsPanelOpen (presence of widget-search-box-search-bar = panel open; re-click toggle until open), (b) source selector requires .draggable-box[draggable="true"]:has(widget-list-box-X) + assert exists (react-dnd connector timing), (c) cy.realDragInit() before drag (arms CDP intercept; else "No dragIntercepted" throw), (d) retry full open→search→drag up to 3× until a new [data-cy^=draggable-widget-] appears (cold-intercept first-drag silent miss), (e) 1200ms settle. Position comes from useGridStore.getGhostDragPosition() which is NOT on window — don't try to inject it.add-event-handler (popover trigger) → add-event-menu → event-trigger-option-<value> (pick by visible label, case-insensitive) → event-handler-card → popover-card → action-selection is a RocketSelect (role=option items). Intercept changed from PUT "events" → cy.intercept(/\/events(\/|\?|$)/) (real API is POST /events + PATCH /events/:id). chooseRocketOption helper added. NOTE: changeEventType still uses OLD event-handler/event-selection — fix when a spec needs it.cy.get(".tooltip-inner").invoke("hide") with cy.hideTooltip() (guarded). 13 files have the raw pattern.openNode timeout 1000→15000ms. Tree node types: queries/components/globals/variables/page/constants. inspector-<type>-expand-button exists at level 1.commonWidgetSelector.sidebarinspector was [data-cy='left-sidebar-inspector'], which is on the OUTER sidebar wrapper div (LeftSidebar.jsx:236), NOT the clickable Inspector button. The button is a SidebarItem whose data-cy is generated from its tip: left-sidebar-${generateCypressDataCy("Inspector")}-button = left-sidebar-inspector-button (SidebarItem.jsx:49). Clicking the wrapper div is a no-op, so the panel never opened and inspector-components-expand-button was never found. FIX: sidebarinspector now points at [data-cy='left-sidebar-inspector-button'] (constants/selectors/common.js:400). Shared — used by ~15 specs; the change is strictly more correct (clicks the real button). button.cy.js test1 now passes.widgetConfigHandle (-config-handle) is STALE. Current canvas config handle (ConfigHandle.jsx) exposes per-component buttons: <name>-inspect-button (opens LEFT state inspector for that component), <name>-properties-styles-button (opens RIGHT Inspector: setRightSidebarOpen(true) + CONFIGURATION tab, ConfigHandle.jsx:277-288), <name>-delete-component-button. To open a component's right Events/Properties panel: hover draggable-widget-<name> then click <name>-properties-styles-button. The drag leaves the widget selected but the RIGHT inspector can be collapsed — relying on it is flaky, open it explicitly.buttonStylesEditorSideBar common.js) — #inspector-tab-styles (react-bootstrap id) is STALE. Inspector tabs are now custom ToolJetUI <Tabs id="inspector"> (Tabs.jsx) — each tab a button[role="tab"] with only a .tab-label, no id/data-cy. Two tabs (Properties, Styles — Inspector.jsx:594-599); Styles is #inspector .nav-link:eq(1).accordion() common.js) — AccordionItem.js:38 builds widget-accordion-${title.toLowerCase().replace(/\s+/g,'-')}; multi-word titles need spaces→hyphens (e.g. "Additional actions" → widget-accordion-additional-actions). Helper now replaces spaces.buttonCloseEditorSideBar common.js) — inspector-close-icon → inspector-close-button (Inspector.jsx:707). NOTE side effect: editAndVerifyWidgetName (commonWidget.js:103) now actually CLOSES the right inspector — callers must reopen it (openEditorSidebar) before touching accordions.selectColourFromColourPicker commonWidget.js) — popover now opens on a Theme/Color-picker ToggleGroup (ee ColorSwatches.jsx:99-118). Default may be "Theme" swatches (no react-color SketchPicker → no rc-editable-input). FIX: after opening the swatch, click [data-cy="togglr-button-color"] (ToggleGroupItem.jsx:13, togglr-button-${value}) to reveal the editable hex/rgba inputs. ALSO the large SketchPicker popover overlaps the NEXT swatch — dismiss it (click canvas topRight) at the end of each call or the following swatch click is "covered".draggable-widget-${component.name} (RenderWidget.jsx:95,308). draggableWidget() lowercases via cyParamName, so specs renaming to a capitalized fake.widgetName (e.g. "Jamey") never match draggable-widget-jamey. Rename to a lowercased name.action-options-component-selection-field, action-options-action-selection-field) now wrap a Rocket Combobox (shared.jsx OptionCombobox → ComboboxInput + portalled role="option" listbox), NOT a react-select with one typeable input. Old .find("input").type(...) threw cy.type() can only be called on a single element (InputGroup nests >1 input). New pickComboboxOption(fieldSelector,label) helper: click field → type into .first():visible input to filter → click exact role="option". Also: CSA action display names come from the widget config actions[].displayName (e.g. Text = "Set visibility"/"Set text"/"Clear"/"Set loading"/"Set disable") — specs carrying old bare labels like "Visibility" must use the real label.event-handler-card is the Radix popover trigger; gate the "open the popover" re-click on data-state !== "open" and FORCE the click (open Radix popover sets body{pointer-events:none} scroll-lock, which blocks a normal click). (b) A new handler is created with actionId:'show-alert' already set (EventManager.jsx:441), so re-picking "Show Alert" fires NO PATCH /events — the post-action cy.wait("@events") must be skipped for the default action or it hangs 30s. Now skipped when action matches /^show alert$/i. (c) addSupportCSAData now ensures the popover-card is open (reopen last event-handler-card if the <field>-input-field is absent) before typing — RocketSelect action pick can momentarily re-render/close the popover.npx cypress run --browser chrome --headless --spec "<path>" --config baseUrl=http://localhost:8082
Backend API is on :3000, UI on :8082. 409 on POST /api/apps = duplicate app name (test data pollution) → just re-run.
events.js selectEvent/addMultiEventsWithAlert: event flow rewritten to popover model. Old event-handler row + event-selection dropdown → new add-event-handler (popover trigger) → event-trigger-option-<value> → event-handler-card → action-selection. Blast radius: 12 specs. Validating via button.cy.js.inspector.js openNode/openAndVerifyNode/verifyNodeData: button.cy.js "exposed values on inspector" test failing (attempts 1-2). Uses [data-cy="inspector-<node>-expand-button/-label/-value"]. Blast radius: 8 specs. Need exact failure from run.changeEventType (events.js) still uses old [data-cy="event-handler"] — fix pending validation of selectEvent hypothesis.| Spec | Final | P/F/Pend | Blocker (one-line) |
|---|---|---|---|
| globalSetingsHappyPath | ⛔ quarantined | 0/0/1 | canvas color picker data-cy drift (color-picker-canvas vs helper canvas-bg-color-picker) + old release flow. FIXED header label. |
| queries/chainingOfQueries | ⛔ quarantined | 0/0/2 | server 500 on postgres apiCreateDataSource (env). FIXED dsName→dataSourceName + query-selection-field combobox. |
| componentsBasicHappypath | ⛔ describe.skip | 0/0/~42 | first drag ("Toggle Switch") creates no widget (repro x3); drag-cmd/canvas-position (forbidden to touch). |
| csa | ⛔ describe.skip | 0/0/12 | CSA multi-drag/popover "No dragIntercepted" flake (suite-wide). FIXED beforeEach "Hide query panel"→resizeQueryPanel(0). |
| datePickerHappyPath | ⛔ describe.skip | 0/0/3 | widget-accordion-general not found in editAndVerifyWidgetName→closeAccordions (legacy inspector). |
| listViewHappyPath | ⛔ describe.skip | 0/0/3 | beforeEach cy.click() 2/4 elements (canvas/panel selector multi-match). |
| modalHappyPath | ⛔ describe.skip | 0/0/4 | draggable-widget-modal1-launch-button not found (ModalV2 trigger render/timing) + CSA. |
| tableRegression | ⛔ describe.skip | 0/0/12 | beforeEach resizeWidget [class="bottom-right"] matches 2 els (commands.js:375) + old inspector. |
| multipage/multipageHappypath | ⛔ describe.skip | 0/0/3 | Pages UI fully migrated LEFT→RightSideBar PageSettingsTab; all multipageSelector stale. |
[data-cy="label-global settings"] → .global-settings-header-title (GlobalSettingsHeader.jsx:8).apiAddQueryToApp param dsName→dataSourceName (apiCommands.js:131); query-selection-field → OptionCombobox first-visible-input + role=option (SHARED FIX 8).[data-tooltip-content="Hide query panel"] (gone) → resizeQueryPanel(0) + import.cy.get(".tooltip-inner").invoke("hide") → cy.hideTooltip().fake.widgetName (SHARED FIX 13) in datePicker (x2), listView, modal.