mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-27 18:24:11 +00:00
## Summary Major refactoring of browser tests to improve reliability, maintainability, and type safety. ## Changes ### Test Infrastructure Decomposition - Decomposed `ComfyPage.ts` (~1000 lines) into focused helpers: - `CanvasHelper`, `DebugHelper`, `SubgraphHelper`, `NodeOperationsHelper` - `SettingsHelper`, `WorkflowHelper`, `ClipboardHelper`, `KeyboardHelper` - Created `ContextMenu` page object, `BaseDialog` base class, and `BottomPanel` page object - Extracted `DefaultGraphPositions` constants ### Locator Stability - Added `data-testid` attributes to Vue components (sidebar, dialogs, node library) - Created centralized `selectors.ts` with test ID constants - Replaced fragile CSS selectors (`.nth()`, `:nth-child()`) with `getByTestId`/`getByRole` ### Performance & Reliability - Removed `setTimeout` anti-patterns (replaced with `waitForFunction`) - Replaced `waitForTimeout` with retrying assertions - Replaced hardcoded coordinates with computed `NodeReference` positions - Enforced LF line endings for all text files ### Type Safety - Enabled `no-explicit-any` lint rule for browser_tests via oxlint - Purged `as any` casts from browser_tests - Added Window type augmentation for standardized window access - Added proper type annotations throughout ### Bug Fixes - Restored `ExtensionManager` API contract - Removed test-only settings from production schema - Fixed flaky selectors and missing test setup ## Testing - All browser tests pass - Typecheck passes <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Tests** * Overhauled browser E2E test infrastructure with many new helpers/fixtures, updated test APIs, and CI test container image bumped for consistency. * **Chores** * Standardized line endings and applied stricter lint rules for browser tests; workspace dependency version updated. * **Documentation** * Updated Playwright and TypeScript testing guidance and test-run commands. * **UI** * Added stable data-testids to multiple components to improve testability. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Amp <amp@ampcode.com> Co-authored-by: GitHub Action <action@github.com> Co-authored-by: github-actions <github-actions@github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
127 lines
4.0 KiB
JSON
127 lines
4.0 KiB
JSON
{
|
|
"$schema": "./node_modules/oxlint/configuration_schema.json",
|
|
"ignorePatterns": [
|
|
".i18nrc.cjs",
|
|
".nx/*",
|
|
"**/vite.config.*.timestamp*",
|
|
"**/vitest.config.*.timestamp*",
|
|
"components.d.ts",
|
|
"coverage/*",
|
|
"dist/*",
|
|
"packages/registry-types/src/comfyRegistryTypes.ts",
|
|
"playwright-report/*",
|
|
"src/extensions/core/*",
|
|
"src/scripts/*",
|
|
"src/types/generatedManagerTypes.ts",
|
|
"src/types/vue-shim.d.ts",
|
|
"test-results/*",
|
|
"vitest.setup.ts"
|
|
],
|
|
"plugins": [
|
|
"eslint",
|
|
"import",
|
|
"oxc",
|
|
"typescript",
|
|
"unicorn",
|
|
"vitest",
|
|
"vue"
|
|
],
|
|
"rules": {
|
|
"no-async-promise-executor": "off",
|
|
"no-console": [
|
|
"error",
|
|
{
|
|
"allow": ["warn", "error"]
|
|
}
|
|
],
|
|
"no-control-regex": "off",
|
|
"no-eval": "off",
|
|
"no-redeclare": "error",
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"paths": [
|
|
{
|
|
"name": "primevue/calendar",
|
|
"message": "Calendar is deprecated in PrimeVue 4+. Use DatePicker instead: import DatePicker from 'primevue/datepicker'"
|
|
},
|
|
{
|
|
"name": "primevue/dropdown",
|
|
"message": "Dropdown is deprecated in PrimeVue 4+. Use Select instead: import Select from 'primevue/select'"
|
|
},
|
|
{
|
|
"name": "primevue/inputswitch",
|
|
"message": "InputSwitch is deprecated in PrimeVue 4+. Use ToggleSwitch instead: import ToggleSwitch from 'primevue/toggleswitch'"
|
|
},
|
|
{
|
|
"name": "primevue/overlaypanel",
|
|
"message": "OverlayPanel is deprecated in PrimeVue 4+. Use Popover instead: import Popover from 'primevue/popover'"
|
|
},
|
|
{
|
|
"name": "primevue/sidebar",
|
|
"message": "Sidebar is deprecated in PrimeVue 4+. Use Drawer instead: import Drawer from 'primevue/drawer'"
|
|
},
|
|
{
|
|
"name": "@/i18n--to-enable",
|
|
"importNames": ["st", "t", "te", "d"],
|
|
"message": "Don't import `@/i18n` directly, prefer `useI18n()`"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"no-self-assign": "allow",
|
|
"no-unused-expressions": "off",
|
|
"no-unused-private-class-members": "off",
|
|
"no-useless-rename": "off",
|
|
"import/default": "error",
|
|
"import/export": "error",
|
|
"import/namespace": "error",
|
|
"import/no-duplicates": "error",
|
|
"import/consistent-type-specifier-style": ["error", "prefer-top-level"],
|
|
"jest/expect-expect": "off",
|
|
"jest/no-conditional-expect": "off",
|
|
"jest/no-disabled-tests": "off",
|
|
"jest/no-standalone-expect": "off",
|
|
"jest/valid-title": "off",
|
|
"typescript/no-this-alias": "off",
|
|
"typescript/no-unnecessary-parameter-property-assignment": "off",
|
|
"typescript/no-unsafe-declaration-merging": "off",
|
|
"typescript/no-unused-vars": "off",
|
|
"unicorn/no-empty-file": "off",
|
|
"unicorn/no-new-array": "off",
|
|
"unicorn/no-single-promise-in-promise-methods": "off",
|
|
"unicorn/no-useless-fallback-in-spread": "off",
|
|
"unicorn/no-useless-spread": "off",
|
|
"typescript/await-thenable": "off",
|
|
"typescript/no-base-to-string": "off",
|
|
"typescript/no-duplicate-type-constituents": "off",
|
|
"typescript/no-for-in-array": "off",
|
|
"typescript/no-meaningless-void-operator": "off",
|
|
"typescript/no-redundant-type-constituents": "off",
|
|
"typescript/restrict-template-expressions": "off",
|
|
"typescript/unbound-method": "off",
|
|
"typescript/no-floating-promises": "error",
|
|
"vue/no-import-compiler-macros": "error",
|
|
"vue/no-dupe-keys": "error"
|
|
},
|
|
"overrides": [
|
|
{
|
|
"files": ["**/*.{stories,test,spec}.ts", "**/*.stories.vue"],
|
|
"rules": {
|
|
"no-console": "allow"
|
|
}
|
|
},
|
|
{
|
|
"files": ["browser_tests/**/*.ts"],
|
|
"rules": {
|
|
"typescript/no-explicit-any": "error",
|
|
"no-async-promise-executor": "error",
|
|
"no-control-regex": "error",
|
|
"no-useless-rename": "error",
|
|
"no-unused-private-class-members": "error",
|
|
"unicorn/no-empty-file": "error"
|
|
}
|
|
}
|
|
]
|
|
}
|