From 5b4ee1949fc116434c5d902f08f4d524d8b939e6 Mon Sep 17 00:00:00 2001 From: Jesse Mazzella Date: Tue, 26 Mar 2024 16:52:33 -0700 Subject: [PATCH] fix(#7623): Resize ConductorAxis properly (#7624) * fix: resize conductor properly * refactor: more computed properties, unregister listener * fix: beforeUnmounted hook * test(visual): add time conductor visual test for fixed mode * fix: initialize to `null` * feat: extend the base `screenshot` function to mask elements which will always create variance in an Open MCT screenshot * docs: add types for fixtures * fix: remove unneeded await * chore: add sinon timers types package back * docs: remove unused docs * doc: remove unused docs * test: add visual realtime url, update imports * feat: provide wrapped page.screenshot fixture that applies defaults * test: add basic timeConductor snapshot tests * chore: update eslint config * lint: remove unused disable directives * test: remove redundant navigation * fix: remove listeners * fix: maybe stabilize unit tests * docs: remove * fix: provide sourcemaps in unit tests * test: add regression snapshot test for time conductor axis * lint: remove unused imports * feat(e2e): add fixture to manually tick the clock and use it * test: reactivate test now that we don't use deploysentinel :( * test: update snapshots * test: add test for clockOptions and tick fixtures * test: add afterEach stub and fixme * test: try and stabilize fault management flake * lint: defy the word gods * chore: ignore `*-darwin.png` screenshots * chore: remove darwin screenshot binaries * docs: markdownlint * docs: remove MacOS specific instructions from snapshot testing * fix: remove a11y --- .eslintrc.cjs | 18 +- .gitignore | 3 + e2e/README.md | 45 +- e2e/avpFixtures.js | 62 ++- e2e/baseFixtures.js | 53 ++- e2e/constants.js | 29 +- e2e/helper/notebookUtils.js | 1 - e2e/playwright-visual-a11y.config.js | 1 - e2e/pluginFixtures.js | 2 - e2e/tests/framework/baseFixtures.e2e.spec.js | 29 +- .../imagery/exampleImagery.e2e.spec.js | 2 +- .../numericData.e2e.spec.js | 1 - .../plugins/notebook/notebook.e2e.spec.js | 1 - .../autoscale-canvas-panned-chrome-darwin | Bin 18966 -> 0 bytes .../autoscale-canvas-panned-chrome-darwin.png | Bin 19194 -> 0 bytes .../autoscale-canvas-prepan-chrome-darwin | Bin 21738 -> 0 bytes .../autoscale-canvas-prepan-chrome-darwin.png | Bin 19575 -> 0 bytes .../timeConductor/timeConductor.e2e.spec.js | 2 +- .../memory/navigation.memory.perf.spec.js | 1 - e2e/tests/visual-a11y/a11y.visual.spec.js | 5 +- .../components/about.visual.spec.js | 4 +- .../components/header.visual.spec.js | 4 +- .../components/inspector.visual.spec.js | 4 +- .../components/timeConductor.visual.spec.js | 116 +++++ ...me-conductor-axis-resized-chrome-linux.png | Bin 0 -> 33614 bytes ...time-conductor-fixed-time-chrome-linux.png | Bin 0 -> 34297 bytes .../time-conductor-realtime-chrome-linux.png | Bin 0 -> 29757 bytes .../components/tree.visual.spec.js | 4 +- .../controlledClock.visual.spec.js | 6 +- .../visual-a11y/defaultPlugins.visual.spec.js | 4 +- .../visual-a11y/displayLayout.visual.spec.js | 21 +- .../faultManagement.visual.spec.js | 6 + e2e/tests/visual-a11y/imagery.visual.spec.js | 4 +- e2e/tests/visual-a11y/ladTable.visual.spec.js | 4 +- e2e/tests/visual-a11y/notebook.visual.spec.js | 4 +- .../visual-a11y/notification.visual.spec.js | 4 +- e2e/tests/visual-a11y/planning.visual.spec.js | 12 +- e2e/tests/visual-a11y/search.visual.spec.js | 4 +- .../visual-a11y/telemetryViews.visual.spec.js | 4 +- karma.conf.cjs | 40 +- package-lock.json | 409 +++++++++--------- package.json | 5 +- .../src/DeviceClassifierSpec.js | 1 - .../URLIndicatorPlugin/URLIndicatorSpec.js | 2 +- src/plugins/charts/bar/pluginSpec.js | 4 +- src/plugins/charts/scatter/pluginSpec.js | 2 +- .../ImportFromJSONActionSpec.js | 2 +- src/plugins/localStorage/pluginSpec.js | 1 - src/plugins/summaryWidget/src/Rule.js | 1 - .../summaryWidget/src/input/ColorPalette.js | 1 - .../summaryWidget/src/input/IconPalette.js | 1 - src/plugins/timeConductor/ConductorAxis.vue | 113 +++-- src/ui/components/List/ListItem.vue | 1 - src/utils/testing.js | 23 +- 54 files changed, 672 insertions(+), 394 deletions(-) delete mode 100644 e2e/tests/functional/plugins/plot/autoscale.e2e.spec.js-snapshots/autoscale-canvas-panned-chrome-darwin delete mode 100644 e2e/tests/functional/plugins/plot/autoscale.e2e.spec.js-snapshots/autoscale-canvas-panned-chrome-darwin.png delete mode 100644 e2e/tests/functional/plugins/plot/autoscale.e2e.spec.js-snapshots/autoscale-canvas-prepan-chrome-darwin delete mode 100644 e2e/tests/functional/plugins/plot/autoscale.e2e.spec.js-snapshots/autoscale-canvas-prepan-chrome-darwin.png create mode 100644 e2e/tests/visual-a11y/components/timeConductor.visual.spec.js create mode 100644 e2e/tests/visual-a11y/components/timeConductor.visual.spec.js-snapshots/time-conductor-axis-resized-chrome-linux.png create mode 100644 e2e/tests/visual-a11y/components/timeConductor.visual.spec.js-snapshots/time-conductor-fixed-time-chrome-linux.png create mode 100644 e2e/tests/visual-a11y/components/timeConductor.visual.spec.js-snapshots/time-conductor-realtime-chrome-linux.png diff --git a/.eslintrc.cjs b/.eslintrc.cjs index e29c587925..6df907f782 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,10 +1,13 @@ const LEGACY_FILES = ['example/**']; -module.exports = { +/** @type {import('eslint').Linter.Config} */ +const config = { env: { browser: true, - es6: true, + es2024: true, jasmine: true, - amd: true + node: true, + worker: true, + serviceworker: true }, globals: { _: 'readonly' @@ -23,10 +26,11 @@ module.exports = { parser: '@babel/eslint-parser', requireConfigFile: false, allowImportExportEverywhere: true, - ecmaVersion: 2015, + ecmaVersion: 'latest', ecmaFeatures: { impliedStrict: true - } + }, + sourceType: 'module' }, rules: { 'simple-import-sort/imports': 'warn', @@ -152,7 +156,7 @@ module.exports = { cases: { pascalCase: true }, - ignore: ['^.*\\.js$'] + ignore: ['^.*\\.(js|cjs|mjs)$'] } ], 'vue/first-attribute-linebreak': 'error', @@ -179,3 +183,5 @@ module.exports = { } ] }; + +module.exports = config; diff --git a/.gitignore b/.gitignore index 65d8b17a02..d7627cd833 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,6 @@ index.html.bak .nyc_output coverage codecov + +# Don't commit MacOS screenshots +*-darwin.png diff --git a/e2e/README.md b/e2e/README.md index 65e4a9333b..ed9096b607 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -76,28 +76,30 @@ To read about how to write a good visual test, please see [How to write a great `npm run test:e2e:visual` commands will run all of the visual tests against a local instance of Open MCT. If no `PERCY_TOKEN` API key is found in the terminal or command line environment variables, no visual comparisons will be made. - - `npm run test:e2e:visual:ci` will run against every commit and PR. - - `npm run test:e2e:visual:full` will run every night with additional comparisons made for Larger Displays and with the `snow` theme. +- `npm run test:e2e:visual:ci` will run against every commit and PR. +- `npm run test:e2e:visual:full` will run every night with additional comparisons made for Larger Displays and with the `snow` theme. + #### Percy.io To make this possible, we're leveraging a 3rd party service, [Percy](https://percy.io/). This service maintains a copy of all changes, users, scm-metadata, and baselines to verify that the application looks and feels the same _unless approved by a Open MCT developer_. To request a Percy API token, please reach out to the Open MCT Dev team on GitHub. For more information, please see the official [Percy documentation](https://docs.percy.io/docs/visual-testing-basics). -At present, we are using percy with two configuration files: `./e2e/.percy.nightly.yml` and `./e2e/.percy.ci.yml`. This is mainly to reduce the number of snapshots. +At present, we are using percy with two configuration files: `./e2e/.percy.nightly.yml` and `./e2e/.percy.ci.yml`. This is mainly to reduce the number of snapshots. ### Advanced: Snapshot Testing (Not Recommended) While snapshot testing offers a precise way to detect changes in your application without relying on third-party services like Percy.io, we've found that it doesn't offer any advantages over visual testing in our use-cases. Therefore, snapshot testing is **not recommended** for further implementation. #### CI vs Manual Checks + Snapshot tests can be reliably executed in Continuous Integration (CI) environments but lack the manual oversight provided by visual testing platforms like Percy.io. This means they may miss issues that a human reviewer could catch during manual checks. #### Example + A single visual test assertion in Percy.io can be executed across 10 different browser and resolution combinations without additional setup, providing comprehensive testing with minimal configuration. In contrast, a snapshot test is restricted to a single OS and browser resolution, requiring more effort to achieve the same level of coverage. - #### Further Reading -For those interested in the mechanics of snapshot testing with Playwright, you can refer to the [Playwright Snapshots Documentation](https://playwright.dev/docs/test-snapshots). However, keep in mind that we do not recommend using this approach. +For those interested in the mechanics of snapshot testing with Playwright, you can refer to the [Playwright Snapshots Documentation](https://playwright.dev/docs/test-snapshots). However, keep in mind that we do not recommend using this approach. #### Open MCT's implementation @@ -118,14 +120,6 @@ When the `@snapshot` tests fail, they will need to be evaluated to determine if To compare a snapshot, run a test and open the html report with the 'Expected' vs 'Actual' screenshot. If the actual screenshot is preferred, then the source-controlled 'Expected' snapshots will need to be updated with the following scripts. -MacOS - -``` -npm run test:e2e:updatesnapshots -``` - -Linux/CI - ```sh // Replace {X.X.X} with the current Playwright version // from our package.json or circleCI configuration file @@ -335,9 +329,11 @@ We have a Mission-need to support iPad and mobile devices. To run our test suite In general, our test suite is not designed to run against mobile devices as the mobile experience is a focused version of the application. Core functionality is missing (chiefly the 'Create' button). To bypass the object creation, we leverage the `storageState` properties for starting the mobile tests with localstorage. For now, the mobile tests will exist in the /tests/mobile/ suites and be executed with the + ```sh npm run test:e2e:mobile ``` + command. #### **Skipping or executing tests based on browser, os, and/os browser version:** @@ -377,6 +373,7 @@ In general, strive to test only through the UI as a user would. As stated in the By adhering to this principle, we can create tests that are both robust and reflective of actual user experiences. #### How to make tests robust to function in other contexts (VISTA, COUCHDB, YAMCS, VIPER, etc.) + 1. Leverage the use of `appActions.js` methods such as `createDomainObjectWithDefaults()`. This ensures that your tests will create unique instances of objects for your test to interact with. 1. Do not assert on the order or structure of objects available unless you created them yourself. These tests may be used against a persistent datastore like couchdb with many objects in the tree. 1. Do not search for your created objects. Open MCT does not performance uniqueness checks so it's possible that your tests will break when run twice. @@ -384,6 +381,7 @@ By adhering to this principle, we can create tests that are both robust and refl 1. Leverage `await page.goto('./', { waitUntil: 'domcontentloaded' });` instead of `{ waitUntil: 'networkidle' }`. Tests run against deployments with websockets often have issues with the networkidle detection. #### How to make tests faster and more resilient + 1. Avoid app interaction when possible. The best way of doing this is to navigate directly by URL: ```js @@ -396,10 +394,11 @@ By adhering to this principle, we can create tests that are both robust and refl 1. Leverage `await page.goto('./', { waitUntil: 'domcontentloaded' });` - Initial navigation should _almost_ always use the `{ waitUntil: 'domcontentloaded' }` option. - 1. Avoid repeated setup to test a single assertion. Write longer tests with multiple soft assertions. + 1. Avoid repeated setup to test a single assertion. Write longer tests with multiple soft assertions. This ensures that your changes will be picked up with large refactors. ##### Utilizing LocalStorage + 1. In order to save test runtime in the case of tests that require a decent amount of initial setup (such as in the case of testing complex displays), you may use [Playwright's `storageState` feature](https://playwright.dev/docs/api/class-browsercontext#browser-context-storage-state) to generate and load localStorage states. 1. To generate a localStorage state to be used in a test: - Add an e2e test to our generateLocalStorageData suite which sets the initial state (creating/configuring objects, etc.), saving it in the `test-data` folder: @@ -420,7 +419,6 @@ By adhering to this principle, we can create tests that are both robust and refl }); ``` - ### How to write a great test - Avoid using css locators to find elements to the page. Use modern web accessible locators like `getByRole` @@ -436,7 +434,7 @@ By adhering to this principle, we can create tests that are both robust and refl await notesInput.fill(testNotes); ``` - #### How to Write a Great Visual Test +#### How to Write a Great Visual Test 1. **Look for the Unknown Unknowns**: Avoid asserting on specific differences in the visual diff. Visual tests are most effective for identifying unknown unknowns. @@ -445,23 +443,27 @@ By adhering to this principle, we can create tests that are both robust and refl 3. **Expect the Unexpected**: Use functional expect statements only to verify assumptions about the state between steps. A great visual test doesn't fail during the test itself, but rather when changes are reviewed in Percy.io. 4. **Control Variability**: Account for variations inherent in working with time-based telemetry and clocks. - - Utilize `percyCSS` to ignore time-based elements. For more details, consult our [percyCSS file](./.percy.ci.yml). - - Use Open MCT's fixed-time mode unless explicitly testing realtime clock - - Employ the `createExampleTelemetryObject` appAction to source telemetry and specify a `name` to avoid autogenerated names. - - Avoid creating objects with a time component like timers and clocks. + +- Utilize `percyCSS` to ignore time-based elements. For more details, consult our [percyCSS file](./.percy.ci.yml). +- Use Open MCT's fixed-time mode unless explicitly testing realtime clock +- Employ the `createExampleTelemetryObject` appAction to source telemetry and specify a `name` to avoid autogenerated names. +- Avoid creating objects with a time component like timers and clocks. 5. **Hide the Tree and Inspector**: Generally, your test will not require comparisons involving the tree and inspector. These aspects are covered in component-specific tests (explained below). To exclude them from the comparison by default, navigate to the root of the main view with the tree and inspector hidden: - `await page.goto('./#/browse/mine?hideTree=true&hideInspector=true')` 6. **Component-Specific Tests**: If you wish to focus on a particular component, use the `/visual-a11y/component/` folder and limit the scope of the comparison to that component. For instance: + ```js await percySnapshot(page, `Tree Pane w/ single level expanded (theme: ${theme})`, { scope: treePane }); ``` + - Note: The `scope` variable can be any valid CSS selector. 7. **Write many `percySnapshot` commands in a single test**: In line with our approach to longer functional tests, we recommend that many test percySnapshots are taken in a single test. For instance: + ```js // await percySnapshot(page, `Before object expanded (theme: ${theme})`); @@ -511,6 +513,7 @@ test.describe('foo test suite', () => { }); }); ``` + More info and options for `overrideClock` can be found in [baseFixtures.js](baseFixtures.js) - Working with multiple pages @@ -539,7 +542,6 @@ const key = getFirstKeyFromOpenMctJson(jsonData); expect(jsonData.openmct[key]).toHaveProperty('name', 'e2e folder'); ``` - ### Reporting Test Reporting is done through official Playwright reporters and the CI Systems which execute them. @@ -615,6 +617,7 @@ A single e2e test in Open MCT is extended to run: ### Writing Tests Playwright provides 3 supported methods of debugging and authoring tests: + - A 'watch mode' for running tests locally and debugging on the fly - A 'debug mode' for debugging tests and writing assertions against tests - A 'VSCode plugin' for debugging tests within the VSCode IDE. diff --git a/e2e/avpFixtures.js b/e2e/avpFixtures.js index 7328781eec..68c0f0df3d 100644 --- a/e2e/avpFixtures.js +++ b/e2e/avpFixtures.js @@ -36,27 +36,67 @@ import AxeBuilder from '@axe-core/playwright'; import fs from 'fs'; import path from 'path'; +import { fileURLToPath } from 'url'; import { expect, test } from './pluginFixtures.js'; - // Constants for repeated values -const TEST_RESULTS_DIR = './test-results'; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const TEST_RESULTS_DIR = path.join(__dirname, './test-results'); + +const extendedTest = test.extend({ + /** + * Overrides the default screenshot function to apply default options that should apply to all + * screenshots taken in the AVP tests. + * + * @param {import('@playwright/test').PlaywrightTestArgs} args - The Playwright test arguments. + * @param {Function} use - The function to use the page object. + * Defaults: + * - Disables animations + * - Masks the clock indicator + * - Masks the time conductor last update time in realtime mode + * - Masks the time conductor start bounds in fixed mode + * - Masks the time conductor end bounds in fixed mode + */ + page: async ({ page }, use) => { + const playwrightScreenshot = page.screenshot; + + /** + * Override the screenshot function to always mask a given set of locators which will always + * show variance across screenshots. Defaults may be overridden by passing in options to the + * screenshot function. + * @param {import('@playwright/test').PageScreenshotOptions} options - The options for the screenshot. + * @returns {Promise} Returns the screenshot as a buffer. + */ + page.screenshot = async function (options = {}) { + const mask = [ + this.getByLabel('Clock Indicator'), // Mask the clock indicator + this.getByLabel('Last update'), // Mask the time conductor last update time in realtime mode + this.getByLabel('Start bounds'), // Mask the time conductor start bounds in fixed mode + this.getByLabel('End bounds') // Mask the time conductor end bounds in fixed mode + ]; + + const result = await playwrightScreenshot.call(this, { + animations: 'disabled', + mask, + ...options // Pass through or override any options + }); + return result; + }; + + await use(page); + } +}); /** * Scans for accessibility violations on a page and writes a report to disk if violations are found. * Automatically asserts that no violations should be present. * - * @typedef {Object} GenerateReportOptions - * @property {string} [reportName] - The name for the report file. - * * @param {import('playwright').Page} page - The page object from Playwright. * @param {string} testCaseName - The name of the test case. - * @param {GenerateReportOptions} [options={}] - The options for the report generation. - * - * @returns {Promise} Returns the accessibility scan results if violations are found, - * otherwise returns null. + * @param {{ reportName?: string }} [options={}] - The options for the report generation. + * @returns {Promise} Returns the accessibility scan results if violations are found, otherwise returns null. */ -/* eslint-disable no-undef */ + export async function scanForA11yViolations(page, testCaseName, options = {}) { const builder = new AxeBuilder({ page }); builder.withTags(['wcag2aa']); @@ -93,4 +133,4 @@ export async function scanForA11yViolations(page, testCaseName, options = {}) { } } -export { expect, test }; +export { expect, extendedTest as test }; diff --git a/e2e/baseFixtures.js b/e2e/baseFixtures.js index e912e90da5..681ab4319d 100644 --- a/e2e/baseFixtures.js +++ b/e2e/baseFixtures.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ /***************************************************************************** * Open MCT, Copyright (c) 2014-2024, United States Government * as represented by the Administrator of the National Aeronautics and Space @@ -111,6 +110,40 @@ const extendedTest = test.extend({ scope: 'test' } ], + /** + * Exposes a function to manually tick the clock. This is useful when overriding the clock to not + * tick (`shouldAdvanceTime: false`) for visual tests, as events such as re-renders and router params + * updates are clock-driven and must be manually ticked. + * + * Usage: + * ```js + * test.describe('Manual Clock Tick', () => { + * test.use({ + * clockOptions: { + * now: MISSION_TIME, // Set to the desired time + * shouldAdvanceTime: false // Clock overridden to no longer tick + * } + * }); + * test('Visual - Manual Clock Tick', async ({ page, tick }) => { + * // Tick the clock 2 seconds in the future + * await tick(2000); + * }); + * }); + * ``` + * + * @param {Object} param0 + * @param {import('@playwright/test').Page} param0.page + * @param {import('@playwright/test').Use} param0.use + */ + tick: async ({ page }, use) => { + // eslint-disable-next-line func-style + const tick = async (milliseconds) => { + await page.evaluate((_milliseconds) => { + window.__clock.tick(_milliseconds); + }, milliseconds); + }; + await use(tick); + }, /** * Extends the base context class to add codecoverage shim. * @see {@link https://github.com/mxschmitt/playwright-test-coverage Github Project} @@ -154,17 +187,13 @@ const extendedTest = test.extend({ // function in the generatorWorker context. This is necessary // to ensure that example telemetry data is generated for the new clock time. if (clockOptions?.now !== undefined) { - page.on( - 'worker', - (worker) => { - if (worker.url().includes('generatorWorker')) { - worker.evaluate((time) => { - self.Date.now = () => time; - }); - } - }, - clockOptions.now - ); + page.on('worker', (worker) => { + if (worker.url().includes('generatorWorker')) { + worker.evaluate((time) => { + self.Date.now = () => time; + }, clockOptions.now); + } + }); } // Capture any console errors during test execution diff --git a/e2e/constants.js b/e2e/constants.js index cd513b1217..d6fac901be 100644 --- a/e2e/constants.js +++ b/e2e/constants.js @@ -1,4 +1,3 @@ -/* eslint-disable prettier/prettier */ /** * Constants which may be used across all e2e tests. */ @@ -8,12 +7,30 @@ * - Used for overriding the browser clock in tests. */ export const MISSION_TIME = 1732413600000; // Saturday, November 23, 2024 6:00:00 PM GMT-08:00 (Thanksgiving Dinner Time) +// Subtracting 30 minutes from MISSION_TIME +export const MISSION_TIME_FIXED_START = 1732413600000 - 1800000; // 1732411800000 +// Adding 1 minute to MISSION_TIME +export const MISSION_TIME_FIXED_END = 1732413600000 + 60000; // 1732413660000 /** * URL Constants - * - This is the URL that the browser will be directed to when running visual tests. This URL - * - hides the tree and inspector to prevent visual noise - * - sets the time bounds to a fixed range + * These constants are used for initial navigation in visual tests, in either fixed or realtime mode. + * They navigate to the 'My Items' folder at MISSION_TIME. + * They set the following url parameters: + * - tc.mode - The time conductor mode ('fixed' or 'local') + * - tc.startBound - The time conductor start bound (when in fixed mode) + * - tc.endBound - The time conductor end bound (when in fixed mode) + * - tc.startDelta - The time conductor start delta (when in realtime mode) + * - tc.endDelta - The time conductor end delta (when in realtime mode) + * - tc.timeSystem - The time conductor time system ('utc') + * - view - The view to display ('grid') + * - hideInspector - Whether to hide the inspector (true) + * - hideTree - Whether to hide the tree (true) + * @typedef {string} VisualUrl */ -export const VISUAL_URL = - './#/browse/mine?tc.mode=fixed&tc.startBound=1693592063607&tc.endBound=1693593893607&tc.timeSystem=utc&view=grid&hideInspector=true&hideTree=true'; + +/** @type {VisualUrl} */ +export const VISUAL_FIXED_URL = `./#/browse/mine?tc.mode=fixed&tc.startBound=${MISSION_TIME_FIXED_START}&tc.endBound=${MISSION_TIME_FIXED_END}&tc.timeSystem=utc&view=grid&hideInspector=true&hideTree=true`; +/** @type {VisualUrl} */ +export const VISUAL_REALTIME_URL = + './#/browse/mine?tc.mode=local&tc.timeSystem=utc&view=grid&tc.startDelta=1800000&tc.endDelta=30000&hideTree=true&hideInspector=true'; diff --git a/e2e/helper/notebookUtils.js b/e2e/helper/notebookUtils.js index de7177af22..f4c885532f 100644 --- a/e2e/helper/notebookUtils.js +++ b/e2e/helper/notebookUtils.js @@ -68,7 +68,6 @@ async function commitEntry(page) { * @param {import('@playwright/test').Page} page */ async function startAndAddRestrictedNotebookObject(page) { - // eslint-disable-next-line no-undef await page.addInitScript({ path: fileURLToPath(new URL('./addInitRestrictedNotebook.js', import.meta.url)) }); diff --git a/e2e/playwright-visual-a11y.config.js b/e2e/playwright-visual-a11y.config.js index e0f6810f98..5a80cffedc 100644 --- a/e2e/playwright-visual-a11y.config.js +++ b/e2e/playwright-visual-a11y.config.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ // playwright.config.js // @ts-check diff --git a/e2e/pluginFixtures.js b/e2e/pluginFixtures.js index 83ceeb05fc..ea46a19b31 100644 --- a/e2e/pluginFixtures.js +++ b/e2e/pluginFixtures.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ /***************************************************************************** * Open MCT, Copyright (c) 2014-2024, United States Government * as represented by the Administrator of the National Aeronautics and Space @@ -123,7 +122,6 @@ const extendedTest = test.extend({ theme: [theme, { option: true }], // eslint-disable-next-line no-shadow page: async ({ page, theme }, use, testInfo) => { - // eslint-disable-next-line playwright/no-conditional-in-test if (theme === 'snow') { //inject snow theme await page.addInitScript({ diff --git a/e2e/tests/framework/baseFixtures.e2e.spec.js b/e2e/tests/framework/baseFixtures.e2e.spec.js index 9edf08f42b..133f5f5604 100644 --- a/e2e/tests/framework/baseFixtures.e2e.spec.js +++ b/e2e/tests/framework/baseFixtures.e2e.spec.js @@ -26,11 +26,12 @@ relates to how we've extended it (i.e. ./e2e/baseFixtures.js) and assumptions ma (`npm start` and ./e2e/webpack-dev-middleware.js) */ -import { test } from '../../baseFixtures.js'; +import { expect, test } from '../../baseFixtures.js'; +import { MISSION_TIME } from '../../constants.js'; test.describe('baseFixtures tests', () => { //Skip this test for now https://github.com/nasa/openmct/issues/6785 - test.fixme('Verify that tests fail if console.error is thrown', async ({ page }) => { + test('Verify that tests fail if console.error is thrown', async ({ page }) => { test.fail(); //Go to baseURL await page.goto('./', { waitUntil: 'domcontentloaded' }); @@ -52,3 +53,27 @@ test.describe('baseFixtures tests', () => { ]); }); }); + +test.describe('baseFixtures tests @clock', () => { + test.use({ + clockOptions: { + now: MISSION_TIME, + shouldAdvanceTime: false + } + }); + + test.beforeEach(async ({ page }) => { + await page.goto('./', { waitUntil: 'domcontentloaded' }); + }); + + test('Can use clockOptions and tick fixtures to control the clock', async ({ page, tick }) => { + let time = await page.evaluate(() => new Date().getTime()); + expect(time).toBe(MISSION_TIME); + await tick(1000); + time = await page.evaluate(() => new Date().getTime()); + expect(time).toBe(MISSION_TIME + 1000 * 1); + await tick(1000); + time = await page.evaluate(() => new Date().getTime()); + expect(time).toBe(MISSION_TIME + 1000 * 2); + }); +}); diff --git a/e2e/tests/functional/plugins/imagery/exampleImagery.e2e.spec.js b/e2e/tests/functional/plugins/imagery/exampleImagery.e2e.spec.js index 95e31acdd1..9a7df4136c 100644 --- a/e2e/tests/functional/plugins/imagery/exampleImagery.e2e.spec.js +++ b/e2e/tests/functional/plugins/imagery/exampleImagery.e2e.spec.js @@ -24,7 +24,7 @@ This test suite is dedicated to tests which verify the basic operations surrounding imagery, but only assume that example imagery is present. */ -/* globals process */ + import { createDomainObjectWithDefaults, setRealTimeMode } from '../../../../appActions.js'; import { waitForAnimations } from '../../../../baseFixtures.js'; import { expect, test } from '../../../../pluginFixtures.js'; diff --git a/e2e/tests/functional/plugins/inspectorDataVisualization/numericData.e2e.spec.js b/e2e/tests/functional/plugins/inspectorDataVisualization/numericData.e2e.spec.js index 7166112b05..d8ff8df76e 100644 --- a/e2e/tests/functional/plugins/inspectorDataVisualization/numericData.e2e.spec.js +++ b/e2e/tests/functional/plugins/inspectorDataVisualization/numericData.e2e.spec.js @@ -27,7 +27,6 @@ import { expect, test } from '../../../../pluginFixtures.js'; test.describe('Testing numeric data with inspector data visualization (i.e., data pivoting)', () => { test.beforeEach(async ({ page }) => { - // eslint-disable-next-line no-undef await page.addInitScript({ path: fileURLToPath( new URL('../../../../helper/addInitDataVisualization.js', import.meta.url) diff --git a/e2e/tests/functional/plugins/notebook/notebook.e2e.spec.js b/e2e/tests/functional/plugins/notebook/notebook.e2e.spec.js index e412392b6d..fb41968d33 100644 --- a/e2e/tests/functional/plugins/notebook/notebook.e2e.spec.js +++ b/e2e/tests/functional/plugins/notebook/notebook.e2e.spec.js @@ -277,7 +277,6 @@ test.describe('Notebook entry tests', () => { // Create Notebook with URL Whitelist let notebookObject; test.beforeEach(async ({ page }) => { - // eslint-disable-next-line no-undef await page.addInitScript({ path: fileURLToPath(new URL('../../../../helper/addInitNotebookWithUrls.js', import.meta.url)) }); diff --git a/e2e/tests/functional/plugins/plot/autoscale.e2e.spec.js-snapshots/autoscale-canvas-panned-chrome-darwin b/e2e/tests/functional/plugins/plot/autoscale.e2e.spec.js-snapshots/autoscale-canvas-panned-chrome-darwin deleted file mode 100644 index 072218f3f39c3f7bd766e73257bb07357913246e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18966 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 diff --git a/e2e/tests/functional/plugins/plot/autoscale.e2e.spec.js-snapshots/autoscale-canvas-prepan-chrome-darwin b/e2e/tests/functional/plugins/plot/autoscale.e2e.spec.js-snapshots/autoscale-canvas-prepan-chrome-darwin deleted file mode 100644 index b6c7ba2fcf5d930fb0ce6985f575b713b066dfad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21738 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 diff --git a/e2e/tests/functional/plugins/plot/autoscale.e2e.spec.js-snapshots/autoscale-canvas-prepan-chrome-darwin.png b/e2e/tests/functional/plugins/plot/autoscale.e2e.spec.js-snapshots/autoscale-canvas-prepan-chrome-darwin.png deleted file mode 100644 index 148089b4bd1708838ee3cb9fe67a7242847927b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19575 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 JNB8=j{|Dz=e&PTC diff --git a/e2e/tests/functional/plugins/timeConductor/timeConductor.e2e.spec.js b/e2e/tests/functional/plugins/timeConductor/timeConductor.e2e.spec.js index 37dd7d1986..8d3822852f 100644 --- a/e2e/tests/functional/plugins/timeConductor/timeConductor.e2e.spec.js +++ b/e2e/tests/functional/plugins/timeConductor/timeConductor.e2e.spec.js @@ -48,7 +48,7 @@ test.describe('Time conductor operations', () => { await setTimeConductorBounds(page, startDate); // Bring up the time conductor popup - const timeConductorMode = await page.locator('.c-compact-tc'); + const timeConductorMode = page.locator('.c-compact-tc'); await timeConductorMode.click(); const startDateLocator = page.locator('input[type="text"]').first(); const endDateLocator = page.locator('input[type="text"]').nth(2); diff --git a/e2e/tests/performance/memory/navigation.memory.perf.spec.js b/e2e/tests/performance/memory/navigation.memory.perf.spec.js index 17074fd8e0..cb74b6a11a 100644 --- a/e2e/tests/performance/memory/navigation.memory.perf.spec.js +++ b/e2e/tests/performance/memory/navigation.memory.perf.spec.js @@ -299,7 +299,6 @@ test.describe('Navigation memory leak is not detected in', () => { // for detecting memory leaks. await page.evaluate(() => { window.gcPromise = new Promise((resolve) => { - // eslint-disable-next-line no-undef window.fr = new FinalizationRegistry(resolve); window.fr.register( window.openmct.layout.$refs.browseObject.$refs.objectViewWrapper.firstChild, diff --git a/e2e/tests/visual-a11y/a11y.visual.spec.js b/e2e/tests/visual-a11y/a11y.visual.spec.js index 51969ff958..d981b3a8a8 100644 --- a/e2e/tests/visual-a11y/a11y.visual.spec.js +++ b/e2e/tests/visual-a11y/a11y.visual.spec.js @@ -21,14 +21,13 @@ *****************************************************************************/ import { test } from '../../avpFixtures.js'; -import { VISUAL_URL } from '../../constants.js'; +import { VISUAL_FIXED_URL } from '../../constants.js'; test.describe('a11y - Default', () => { test.beforeEach(async ({ page }) => { - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); }); test('main view', async ({ page }, testInfo) => { - await page.goto('./'); //Skipping for https://github.com/nasa/openmct/issues/7421 //await scanForA11yViolations(page, testInfo.title); }); diff --git a/e2e/tests/visual-a11y/components/about.visual.spec.js b/e2e/tests/visual-a11y/components/about.visual.spec.js index 70ed07b86f..0701ee21b7 100644 --- a/e2e/tests/visual-a11y/components/about.visual.spec.js +++ b/e2e/tests/visual-a11y/components/about.visual.spec.js @@ -27,12 +27,12 @@ Tests the branding associated with the default deployment. At least the about mo import percySnapshot from '@percy/playwright'; import { expect, scanForA11yViolations, test } from '../../../avpFixtures.js'; -import { VISUAL_URL } from '../../../constants.js'; +import { VISUAL_FIXED_URL } from '../../../constants.js'; test.describe('Visual - Branding @a11y', () => { test.beforeEach(async ({ page }) => { //Go to baseURL and Hide Tree - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); }); test('Visual - About Modal', async ({ page, theme }) => { diff --git a/e2e/tests/visual-a11y/components/header.visual.spec.js b/e2e/tests/visual-a11y/components/header.visual.spec.js index f9af410dcd..0c3d44c8a8 100644 --- a/e2e/tests/visual-a11y/components/header.visual.spec.js +++ b/e2e/tests/visual-a11y/components/header.visual.spec.js @@ -28,7 +28,7 @@ import percySnapshot from '@percy/playwright'; import { fileURLToPath } from 'url'; import { expect, test } from '../../../avpFixtures.js'; -import { VISUAL_URL } from '../../../constants.js'; +import { VISUAL_FIXED_URL } from '../../../constants.js'; //Declare the component scope of the visual test for Percy const header = '.l-shell__head'; @@ -36,7 +36,7 @@ const header = '.l-shell__head'; test.describe('Visual - Header @a11y', () => { test.beforeEach(async ({ page }) => { //Go to baseURL and Hide Tree - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); // Wait for status bar to load await expect( page.getByRole('status', { diff --git a/e2e/tests/visual-a11y/components/inspector.visual.spec.js b/e2e/tests/visual-a11y/components/inspector.visual.spec.js index edd64aec74..efe9d65cab 100644 --- a/e2e/tests/visual-a11y/components/inspector.visual.spec.js +++ b/e2e/tests/visual-a11y/components/inspector.visual.spec.js @@ -23,14 +23,14 @@ import percySnapshot from '@percy/playwright'; import { test } from '../../../avpFixtures.js'; -import { MISSION_TIME, VISUAL_URL } from '../../../constants.js'; +import { MISSION_TIME, VISUAL_FIXED_URL } from '../../../constants.js'; //Declare the scope of the visual test const inspectorPane = '.l-shell__pane-inspector'; test.describe('Visual - Inspector @ally @clock', () => { test.beforeEach(async ({ page }) => { - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); }); test.use({ storageState: './e2e/test-data/overlay_plot_with_delay_storage.json', diff --git a/e2e/tests/visual-a11y/components/timeConductor.visual.spec.js b/e2e/tests/visual-a11y/components/timeConductor.visual.spec.js new file mode 100644 index 0000000000..eef1114e40 --- /dev/null +++ b/e2e/tests/visual-a11y/components/timeConductor.visual.spec.js @@ -0,0 +1,116 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2014-2024, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ + +/* + Tests the visual appearance of the Time Conductor component +*/ + +import { expect, test } from '../../../avpFixtures.js'; +import { + MISSION_TIME, + MISSION_TIME_FIXED_END, + MISSION_TIME_FIXED_START, + VISUAL_REALTIME_URL +} from '../../../constants.js'; + +test.describe('Visual - Time Conductor', () => { + test.use({ + clockOptions: { + now: MISSION_TIME, + shouldAdvanceTime: false + } + }); + test.beforeEach(async ({ page }) => { + await page.goto('./', { waitUntil: 'domcontentloaded' }); + }); + + // FIXME: checking for a11y violations times out. Might have something to do with the frozen clock. + // test.afterEach(async ({ page }, testInfo) => { + // await scanForA11yViolations(page, testInfo.title); + // }); + + test('Visual - Time Conductor (Fixed time) @clock @snapshot', async ({ page }) => { + // Navigate to a specific view that uses the Time Conductor in Fixed Time mode with inspect and browse panes collapsed + await page.goto( + `./#/browse/mine?tc.mode=fixed&tc.startBound=${MISSION_TIME_FIXED_START}&tc.endBound=${MISSION_TIME_FIXED_END}&tc.timeSystem=utc&view=grid&hideInspector=true&hideTree=true`, + { + waitUntil: 'domcontentloaded' + } + ); + + // Take a snapshot for comparison + const snapshot = await page.screenshot({ + mask: [] + }); + expect(snapshot).toMatchSnapshot('time-conductor-fixed-time.png'); + }); + + test('Visual - Time Conductor (Realtime) @clock @snapshot', async ({ page }) => { + // Navigate to a specific view that uses the Time Conductor in Fixed Time mode with inspect and browse panes collapsed + await page.goto(VISUAL_REALTIME_URL, { + waitUntil: 'domcontentloaded' + }); + + const mask = []; + + // Take a snapshot for comparison + const snapshot = await page.screenshot({ + mask + }); + expect(snapshot).toMatchSnapshot('time-conductor-realtime.png'); + }); + test( + 'Visual - Time Conductor Axis Resized @clock @snapshot', + { annotation: [{ type: 'issue', description: 'https://github.com/nasa/openmct/issues/7623' }] }, + async ({ page, tick }) => { + const VISUAL_REALTIME_WITH_PANES = VISUAL_REALTIME_URL.replace( + 'hideTree=true', + 'hideTree=false' + ).replace('hideInspector=true', 'hideInspector=false'); + // Navigate to a specific view that uses the Time Conductor in Fixed Time mode with inspect + await page.goto(VISUAL_REALTIME_WITH_PANES, { + waitUntil: 'domcontentloaded' + }); + + // Set the time conductor to fixed time mode + await page.getByLabel('Time Conductor Mode').click(); + await page.getByLabel('Time Conductor Mode Menu').click(); + await page.getByLabel('Fixed Timespan').click(); + await page.getByLabel('Submit time bounds').click(); + + // Collapse the inspect and browse panes to trigger a resize of the conductor axis + await page.getByLabel('Collapse Inspect Pane').click(); + await page.getByLabel('Collapse Browse Pane').click(); + + // manually tick the clock to trigger the resize / re-render + await tick(1000 * 2); + + const mask = []; + + // Take a snapshot for comparison + const snapshot = await page.screenshot({ + mask + }); + expect(snapshot).toMatchSnapshot('time-conductor-axis-resized.png'); + } + ); +}); diff --git a/e2e/tests/visual-a11y/components/timeConductor.visual.spec.js-snapshots/time-conductor-axis-resized-chrome-linux.png b/e2e/tests/visual-a11y/components/timeConductor.visual.spec.js-snapshots/time-conductor-axis-resized-chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..b86cc7eade7308660709b6893a76fc09068068c1 GIT binary patch literal 33614 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 literal 0 HcmV?d00001 diff --git a/e2e/tests/visual-a11y/components/timeConductor.visual.spec.js-snapshots/time-conductor-realtime-chrome-linux.png b/e2e/tests/visual-a11y/components/timeConductor.visual.spec.js-snapshots/time-conductor-realtime-chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..b7b480324d2a786234d4a288c1f69cad8cd39f14 GIT binary patch literal 29757 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“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 { test('Tree pane in various states', async ({ page, theme, openmctConfig }) => { const { myItemsFolderName } = openmctConfig; - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); //Open Tree await page.getByRole('button', { name: 'Browse' }).click(); diff --git a/e2e/tests/visual-a11y/controlledClock.visual.spec.js b/e2e/tests/visual-a11y/controlledClock.visual.spec.js index 6e25b2e980..ad832b841e 100644 --- a/e2e/tests/visual-a11y/controlledClock.visual.spec.js +++ b/e2e/tests/visual-a11y/controlledClock.visual.spec.js @@ -27,12 +27,12 @@ clockOptions plugin fixture. import percySnapshot from '@percy/playwright'; -import { MISSION_TIME, VISUAL_URL } from '../../constants.js'; +import { MISSION_TIME, VISUAL_FIXED_URL } from '../../constants.js'; import { expect, test } from '../../pluginFixtures.js'; test.describe('Visual - Controlled Clock @clock', () => { test.beforeEach(async ({ page }) => { - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); }); test.use({ storageState: './e2e/test-data/overlay_plot_with_delay_storage.json', @@ -43,7 +43,7 @@ test.describe('Visual - Controlled Clock @clock', () => { }); test('Overlay Plot Loading Indicator @localStorage', async ({ page, theme }) => { - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); await page .getByRole('gridcell', { hasText: 'Overlay Plot with 5s Delay Overlay Plot' }) .click(); diff --git a/e2e/tests/visual-a11y/defaultPlugins.visual.spec.js b/e2e/tests/visual-a11y/defaultPlugins.visual.spec.js index cd54fcf0a8..ee90b6cc13 100644 --- a/e2e/tests/visual-a11y/defaultPlugins.visual.spec.js +++ b/e2e/tests/visual-a11y/defaultPlugins.visual.spec.js @@ -30,11 +30,11 @@ import percySnapshot from '@percy/playwright'; import { createDomainObjectWithDefaults } from '../../appActions.js'; import { expect, scanForA11yViolations, test } from '../../avpFixtures.js'; -import { VISUAL_URL } from '../../constants.js'; +import { VISUAL_FIXED_URL } from '../../constants.js'; test.describe('Visual - Default @a11y', () => { test.beforeEach(async ({ page }) => { - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); }); test('Visual - Default Dashboard', async ({ page, theme }) => { diff --git a/e2e/tests/visual-a11y/displayLayout.visual.spec.js b/e2e/tests/visual-a11y/displayLayout.visual.spec.js index 91d875c655..f9cf123d4b 100644 --- a/e2e/tests/visual-a11y/displayLayout.visual.spec.js +++ b/e2e/tests/visual-a11y/displayLayout.visual.spec.js @@ -23,12 +23,18 @@ import percySnapshot from '@percy/playwright'; import { createDomainObjectWithDefaults } from '../../appActions.js'; -import { VISUAL_URL } from '../../constants.js'; +import { MISSION_TIME, VISUAL_FIXED_URL } from '../../constants.js'; import { test } from '../../pluginFixtures.js'; -test.describe('Visual - Display Layout', () => { - test.beforeEach(async ({ page, theme }) => { - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); +test.describe('Visual - Display Layout @clock', () => { + test.use({ + clockOptions: { + now: MISSION_TIME, + shouldAdvanceTime: true + } + }); + test.beforeEach(async ({ page }) => { + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); const parentLayout = await createDomainObjectWithDefaults(page, { type: 'Display Layout', @@ -59,12 +65,15 @@ test.describe('Visual - Display Layout', () => { await page.goto(parentLayout.url, { waitUntil: 'domcontentloaded' }); await page.getByRole('button', { name: 'Edit Object' }).click(); - //Move the Child Right Layout to the Right. It should be on top of the Left Layout at this point. + // Select the child right layout await page .getByLabel('Child Right Layout Layout', { exact: true }) .getByLabel('Move Sub-object Frame') .click(); - await page.getByLabel('Move Sub-object Frame').nth(3).click(); //I'm not sure why this step is necessary + // FIXME: Click to select the parent object (layout) + await page.getByLabel('Move Sub-object Frame').nth(3).click(); + + // Move the second layout element to the right await page.getByLabel('X:').click(); await page.getByLabel('X:').fill('35'); }); diff --git a/e2e/tests/visual-a11y/faultManagement.visual.spec.js b/e2e/tests/visual-a11y/faultManagement.visual.spec.js index f3f5be314c..9034c38de9 100644 --- a/e2e/tests/visual-a11y/faultManagement.visual.spec.js +++ b/e2e/tests/visual-a11y/faultManagement.visual.spec.js @@ -84,6 +84,12 @@ test.describe('Fault Management Visual Tests', () => { await shelveFault(page, 1); await changeViewTo(page, 'shelved'); + /* cspell:disable-next-line */ + // Since fault management is heavily dependent on events (bleh), we need to wait for the correct + // element counts + await expect(page.getByLabel('Select fault:')).toHaveCount(1); + await expect(page.getByLabel('Disposition Actions')).toHaveCount(1); + await percySnapshot(page, `Shelved faults appear in the shelved view (theme: '${theme}')`); await openFaultRowMenu(page, 1); diff --git a/e2e/tests/visual-a11y/imagery.visual.spec.js b/e2e/tests/visual-a11y/imagery.visual.spec.js index 251a2e3c71..d46df5435b 100644 --- a/e2e/tests/visual-a11y/imagery.visual.spec.js +++ b/e2e/tests/visual-a11y/imagery.visual.spec.js @@ -24,7 +24,7 @@ import percySnapshot from '@percy/playwright'; import { createDomainObjectWithDefaults, setRealTimeMode } from '../../appActions.js'; import { waitForAnimations } from '../../baseFixtures.js'; -import { VISUAL_URL } from '../../constants.js'; +import { VISUAL_FIXED_URL } from '../../constants.js'; import { expect, test } from '../../pluginFixtures.js'; test.describe('Visual - Example Imagery', () => { @@ -32,7 +32,7 @@ test.describe('Visual - Example Imagery', () => { let parentLayout; test.beforeEach(async ({ page }) => { - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); parentLayout = await createDomainObjectWithDefaults(page, { type: 'Display Layout', diff --git a/e2e/tests/visual-a11y/ladTable.visual.spec.js b/e2e/tests/visual-a11y/ladTable.visual.spec.js index 9d3769500b..075d98f307 100644 --- a/e2e/tests/visual-a11y/ladTable.visual.spec.js +++ b/e2e/tests/visual-a11y/ladTable.visual.spec.js @@ -23,14 +23,14 @@ import percySnapshot from '@percy/playwright'; import { createDomainObjectWithDefaults } from '../../appActions.js'; -import { VISUAL_URL } from '../../constants.js'; +import { VISUAL_FIXED_URL } from '../../constants.js'; import { expect, test } from '../../pluginFixtures.js'; test.describe('Visual - LAD Table', () => { let ladTable; test.beforeEach(async ({ page }) => { - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); // Create LAD Table ladTable = await createDomainObjectWithDefaults(page, { diff --git a/e2e/tests/visual-a11y/notebook.visual.spec.js b/e2e/tests/visual-a11y/notebook.visual.spec.js index d04f29ccaf..b42ea15258 100644 --- a/e2e/tests/visual-a11y/notebook.visual.spec.js +++ b/e2e/tests/visual-a11y/notebook.visual.spec.js @@ -24,7 +24,7 @@ import percySnapshot from '@percy/playwright'; import { createDomainObjectWithDefaults, expandTreePaneItemByName } from '../../appActions.js'; import { expect, test } from '../../avpFixtures.js'; -import { VISUAL_URL } from '../../constants.js'; +import { VISUAL_FIXED_URL } from '../../constants.js'; import { enterTextEntry, startAndAddRestrictedNotebookObject } from '../../helper/notebookUtils.js'; test.describe('Visual - Restricted Notebook @a11y', () => { @@ -80,7 +80,7 @@ test.describe('Visual - Notebook Snapshot @a11y', () => { test.describe('Visual - Notebook @a11y', () => { let notebook; test.beforeEach(async ({ page }) => { - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); notebook = await createDomainObjectWithDefaults(page, { type: 'Notebook', name: 'Test Notebook' diff --git a/e2e/tests/visual-a11y/notification.visual.spec.js b/e2e/tests/visual-a11y/notification.visual.spec.js index cea1ec2709..cb3fe8282e 100644 --- a/e2e/tests/visual-a11y/notification.visual.spec.js +++ b/e2e/tests/visual-a11y/notification.visual.spec.js @@ -28,11 +28,11 @@ import percySnapshot from '@percy/playwright'; import { createNotification } from '../../appActions.js'; import { expect, scanForA11yViolations, test } from '../../avpFixtures.js'; -import { VISUAL_URL } from '../../constants.js'; +import { VISUAL_FIXED_URL } from '../../constants.js'; test.describe('Visual - Notifications @a11y', () => { test.beforeEach(async ({ page }) => { - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); }); test('Alert Levels and Notification List Modal', async ({ page, theme }) => { diff --git a/e2e/tests/visual-a11y/planning.visual.spec.js b/e2e/tests/visual-a11y/planning.visual.spec.js index c7c62f50ed..fbd9151a6e 100644 --- a/e2e/tests/visual-a11y/planning.visual.spec.js +++ b/e2e/tests/visual-a11y/planning.visual.spec.js @@ -25,7 +25,7 @@ import fs from 'fs'; import { createDomainObjectWithDefaults, createPlanFromJSON } from '../../appActions.js'; import { test } from '../../avpFixtures.js'; -import { VISUAL_URL } from '../../constants.js'; +import { VISUAL_FIXED_URL } from '../../constants.js'; import { createTimelistWithPlanAndSetActivityInProgress, getFirstActivity, @@ -64,7 +64,7 @@ test.describe('Visual - Timelist progress bar @clock', () => { test.describe('Visual - Planning', () => { test.beforeEach(async ({ page }) => { - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); }); test('Plan View', async ({ page, theme }) => { @@ -83,7 +83,7 @@ test.describe('Visual - Planning', () => { }); const newPage = await newContext.newPage(); - await newPage.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await newPage.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); const plan = await createPlanFromJSON(newPage, { name: 'Plan Visual Test', json: examplePlanSmall2 @@ -100,7 +100,7 @@ test.describe('Visual - Planning', () => { name: 'Plan Visual Test (Draft)', json: examplePlanSmall2 }); - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); await setDraftStatusForPlan(page, plan); await setBoundsToSpanAllActivities(page, examplePlanSmall2, plan.url); @@ -110,7 +110,7 @@ test.describe('Visual - Planning', () => { test.describe('Visual - Gantt Chart', () => { test.beforeEach(async ({ page }) => { - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); }); test('Gantt Chart View', async ({ page, theme }) => { const ganttChart = await createDomainObjectWithDefaults(page, { @@ -153,7 +153,7 @@ test.describe('Visual - Gantt Chart', () => { await setDraftStatusForPlan(page, plan); - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); await setBoundsToSpanAllActivities(page, examplePlanSmall2, ganttChart.url); await percySnapshot(page, `Gantt Chart View w/ draft status (theme: ${theme})`); diff --git a/e2e/tests/visual-a11y/search.visual.spec.js b/e2e/tests/visual-a11y/search.visual.spec.js index c3c3e6e70b..b6a4966e45 100644 --- a/e2e/tests/visual-a11y/search.visual.spec.js +++ b/e2e/tests/visual-a11y/search.visual.spec.js @@ -28,13 +28,13 @@ import percySnapshot from '@percy/playwright'; import { createDomainObjectWithDefaults } from '../../appActions.js'; import { expect, scanForA11yViolations, test } from '../../avpFixtures.js'; -import { VISUAL_URL } from '../../constants.js'; +import { VISUAL_FIXED_URL } from '../../constants.js'; test.describe('Grand Search @a11y', () => { let conditionWidget; let displayLayout; test.beforeEach(async ({ page }) => { - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); displayLayout = await createDomainObjectWithDefaults(page, { type: 'Display Layout', diff --git a/e2e/tests/visual-a11y/telemetryViews.visual.spec.js b/e2e/tests/visual-a11y/telemetryViews.visual.spec.js index acb6262804..05386e5f79 100644 --- a/e2e/tests/visual-a11y/telemetryViews.visual.spec.js +++ b/e2e/tests/visual-a11y/telemetryViews.visual.spec.js @@ -23,14 +23,14 @@ import percySnapshot from '@percy/playwright'; import { createDomainObjectWithDefaults } from '../../appActions.js'; -import { VISUAL_URL } from '../../constants.js'; +import { VISUAL_FIXED_URL } from '../../constants.js'; import { expect, test } from '../../pluginFixtures.js'; test.describe('Visual - Telemetry Views', () => { let telemetry; test.beforeEach(async ({ page }) => { - await page.goto(VISUAL_URL, { waitUntil: 'domcontentloaded' }); + await page.goto(VISUAL_FIXED_URL, { waitUntil: 'domcontentloaded' }); // Create SWG inside of LAD Table telemetry = await createDomainObjectWithDefaults(page, { diff --git a/karma.conf.cjs b/karma.conf.cjs index 33e11e3eda..af5e1befaf 100644 --- a/karma.conf.cjs +++ b/karma.conf.cjs @@ -20,26 +20,32 @@ * at runtime from the About dialog for additional information. *****************************************************************************/ -/*global module,process*/ +// eslint-disable-next-line func-style +const loadWebpackConfig = async () => { + if (process.env.KARMA_DEBUG) { + return { + config: (await import('./.webpack/webpack.dev.js')).default, + browsers: ['ChromeDebugging'], + singleRun: false + }; + } else { + return { + config: (await import('./.webpack/webpack.coverage.js')).default, + browsers: ['ChromeHeadless'], + singleRun: true + }; + } +}; module.exports = async (config) => { - let webpackConfig; - let browsers; - let singleRun; - - if (process.env.KARMA_DEBUG) { - webpackConfig = (await import('./.webpack/webpack.dev.js')).default; - browsers = ['ChromeDebugging']; - singleRun = false; - } else { - webpackConfig = (await import('./.webpack/webpack.coverage.js')).default; - browsers = ['ChromeHeadless']; - singleRun = true; - } + const { config: webpackConfig, browsers, singleRun } = await loadWebpackConfig(); + // Adjust webpack config for Karma delete webpackConfig.output; - // karma doesn't support webpack entry - delete webpackConfig.entry; + delete webpackConfig.entry; // Karma doesn't support webpack entry + + // Ensure source maps are enabled for better debugging + webpackConfig.devtool = 'inline-source-map'; config.set({ basePath: '', @@ -106,7 +112,7 @@ module.exports = async (config) => { }, webpack: webpackConfig, webpackMiddleware: { - stats: 'errors-warnings' + stats: 'detailed' // Changed to 'detailed' for more debugging info }, concurrency: 1, singleRun, diff --git a/package-lock.json b/package-lock.json index 1674cff5b7..5f68e908d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "@types/eventemitter3": "1.2.0", "@types/jasmine": "5.1.2", "@types/lodash": "4.17.0", + "@types/sinonjs__fake-timers": "8.1.5", "@vue/compiler-sfc": "3.4.3", "babel-loader": "9.1.0", "babel-plugin-istanbul": "6.1.1", @@ -1904,6 +1905,12 @@ "@types/node": "*" } }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", + "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", + "dev": true + }, "node_modules/@types/sockjs": { "version": "0.3.36", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", @@ -1932,207 +1939,6 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -9255,6 +9061,207 @@ } } }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/prettier-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/prettier-eslint/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/prettier-eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/prettier-eslint/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prettier-eslint/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prettier-eslint/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/prettier-eslint/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prettier-eslint/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/prettier-eslint/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", diff --git a/package.json b/package.json index b2236a7524..d8eae3bb41 100644 --- a/package.json +++ b/package.json @@ -12,12 +12,13 @@ "@percy/playwright": "1.0.4", "@playwright/test": "1.42.1", "@types/d3-axis": "3.0.6", - "@types/d3-shape": "3.0.0", "@types/d3-scale": "4.0.8", "@types/d3-selection": "3.0.10", + "@types/d3-shape": "3.0.0", "@types/eventemitter3": "1.2.0", "@types/jasmine": "5.1.2", "@types/lodash": "4.17.0", + "@types/sinonjs__fake-timers": "8.1.5", "@vue/compiler-sfc": "3.4.3", "babel-loader": "9.1.0", "babel-plugin-istanbul": "6.1.1", @@ -27,9 +28,9 @@ "cspell": "7.3.8", "css-loader": "6.10.0", "d3-axis": "3.0.0", - "d3-shape": "3.0.0", "d3-scale": "4.0.2", "d3-selection": "3.0.0", + "d3-shape": "3.0.0", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-compat": "4.2.0", diff --git a/src/plugins/DeviceClassifier/src/DeviceClassifierSpec.js b/src/plugins/DeviceClassifier/src/DeviceClassifierSpec.js index 65341a0d50..16992f7fdc 100644 --- a/src/plugins/DeviceClassifier/src/DeviceClassifierSpec.js +++ b/src/plugins/DeviceClassifier/src/DeviceClassifierSpec.js @@ -61,7 +61,6 @@ describe('DeviceClassifier', function () { mockAgent[m].and.returnValue(true); }); - // eslint-disable-next-line no-new DeviceClassifier(mockAgent, mockDocument); }); diff --git a/src/plugins/URLIndicatorPlugin/URLIndicatorSpec.js b/src/plugins/URLIndicatorPlugin/URLIndicatorSpec.js index 7c435ee544..c924089d48 100644 --- a/src/plugins/URLIndicatorPlugin/URLIndicatorSpec.js +++ b/src/plugins/URLIndicatorPlugin/URLIndicatorSpec.js @@ -28,7 +28,7 @@ describe('The URLIndicator', function () { let openmct; let indicatorElement; let pluginOptions; - let urlIndicator; // eslint-disable-line + let urlIndicator; let fetchSpy; beforeEach(function () { diff --git a/src/plugins/charts/bar/pluginSpec.js b/src/plugins/charts/bar/pluginSpec.js index e25a3e3023..e8b809bcfd 100644 --- a/src/plugins/charts/bar/pluginSpec.js +++ b/src/plugins/charts/bar/pluginSpec.js @@ -125,7 +125,7 @@ describe('the plugin', function () { describe('The bar graph view', () => { let barGraphObject; - // eslint-disable-next-line no-unused-vars + let mockComposition; beforeEach(async () => { @@ -222,7 +222,7 @@ describe('the plugin', function () { describe('The spectral plot view for telemetry objects with array values', () => { let barGraphObject; - // eslint-disable-next-line no-unused-vars + let mockComposition; beforeEach(async () => { diff --git a/src/plugins/charts/scatter/pluginSpec.js b/src/plugins/charts/scatter/pluginSpec.js index ffa7e46cc4..18cdd93b81 100644 --- a/src/plugins/charts/scatter/pluginSpec.js +++ b/src/plugins/charts/scatter/pluginSpec.js @@ -117,7 +117,7 @@ describe('the plugin', function () { describe('The scatter plot view', () => { let testDomainObject; let scatterPlotObject; - // eslint-disable-next-line no-unused-vars + let mockComposition; beforeEach(async () => { diff --git a/src/plugins/importFromJSONAction/ImportFromJSONActionSpec.js b/src/plugins/importFromJSONAction/ImportFromJSONActionSpec.js index b1d582cb49..db6e77d4f0 100644 --- a/src/plugins/importFromJSONAction/ImportFromJSONActionSpec.js +++ b/src/plugins/importFromJSONAction/ImportFromJSONActionSpec.js @@ -134,7 +134,7 @@ describe('The import JSON action', function () { const pollutedResponse = { selectFile: { name: 'imported object', - // eslint-disable-next-line prettier/prettier + body: '{"openmct":{"c28d230d-e909-4a3e-9840-d9ef469dda70":{"identifier":{"key":"c28d230d-e909-4a3e-9840-d9ef469dda70","namespace":""},"name":"Unnamed Overlay Plot","type":"telemetry.plot.overlay","composition":[],"configuration":{"series":[]},"modified":1695837546833,"location":"mine","created":1695837546833,"persisted":1695837546833,"__proto__":{"toString":"foobar"}}},"rootId":"c28d230d-e909-4a3e-9840-d9ef469dda70"}' } }; diff --git a/src/plugins/localStorage/pluginSpec.js b/src/plugins/localStorage/pluginSpec.js index 9ad22924d4..cae2151236 100644 --- a/src/plugins/localStorage/pluginSpec.js +++ b/src/plugins/localStorage/pluginSpec.js @@ -1,4 +1,3 @@ -/* eslint-disable no-invalid-this */ /***************************************************************************** * Open MCT, Copyright (c) 2014-2024, United States Government * as represented by the Administrator of the National Aeronautics and Space diff --git a/src/plugins/summaryWidget/src/Rule.js b/src/plugins/summaryWidget/src/Rule.js index dc10d7f646..2e3a1c5e0a 100644 --- a/src/plugins/summaryWidget/src/Rule.js +++ b/src/plugins/summaryWidget/src/Rule.js @@ -161,7 +161,6 @@ export default function Rule( */ function onDragStart(event) { document.querySelectorAll('.t-drag-indicator').forEach((indicator) => { - // eslint-disable-next-line no-invalid-this const ruleHeader = self.domElement.querySelectorAll('.widget-rule-header')[0].cloneNode(true); indicator.textContent = ''; indicator.appendChild(ruleHeader); diff --git a/src/plugins/summaryWidget/src/input/ColorPalette.js b/src/plugins/summaryWidget/src/input/ColorPalette.js index 882956aefe..2463876769 100644 --- a/src/plugins/summaryWidget/src/input/ColorPalette.js +++ b/src/plugins/summaryWidget/src/input/ColorPalette.js @@ -106,7 +106,6 @@ export default function ColorPalette(cssClass, container, colors) { domElement.querySelector('.c-palette').classList.add('c-palette--color'); domElement.querySelectorAll('.c-palette__item').forEach((item) => { - // eslint-disable-next-line no-invalid-this item.style.backgroundColor = item.dataset.item; }); diff --git a/src/plugins/summaryWidget/src/input/IconPalette.js b/src/plugins/summaryWidget/src/input/IconPalette.js index 717a5fc74a..147b20fdf8 100644 --- a/src/plugins/summaryWidget/src/input/IconPalette.js +++ b/src/plugins/summaryWidget/src/input/IconPalette.js @@ -51,7 +51,6 @@ export default function IconPalette(cssClass, container, icons) { domElement.querySelector('.c-palette').classList.add('c-palette--icon'); domElement.querySelectorAll('.c-palette-item').forEach((item) => { - // eslint-disable-next-line no-invalid-this item.classList.add(item.dataset.item); }); diff --git a/src/plugins/timeConductor/ConductorAxis.vue b/src/plugins/timeConductor/ConductorAxis.vue index 49d6d61f70..bc824d08a1 100644 --- a/src/plugins/timeConductor/ConductorAxis.vue +++ b/src/plugins/timeConductor/ConductorAxis.vue @@ -20,7 +20,12 @@ at runtime from the About dialog for additional information. --> @@ -29,7 +34,9 @@ import { axisTop } from 'd3-axis'; import { scaleLinear, scaleUtc } from 'd3-scale'; import { select } from 'd3-selection'; +import { onMounted, ref } from 'vue'; +import { useResizeObserver } from '../../../src/ui/composables/resize.js'; import { TIME_CONTEXT_EVENTS } from '../../api/time/constants.js'; import utcMultiTimeFormat from './utcMultiTimeFormat.js'; @@ -55,20 +62,69 @@ export default { } }, emits: ['pan-axis', 'end-pan', 'zoom-axis', 'end-zoom'], + setup() { + const axisHolder = ref(null); + const { size: containerSize, startObserving } = useResizeObserver(); + + onMounted(() => { + startObserving(axisHolder.value); + }); + + return { + axisHolder, + containerSize + }; + }, data() { return { inPanMode: false, dragStartX: undefined, dragX: undefined, - zoomStyle: {} + zoomStyle: {}, + rect: null }; }, computed: { inZoomMode() { return !this.inPanMode; + }, + left() { + return this.rect.left; + }, + panBounds() { + const bounds = this.openmct.time.getBounds(); + const deltaTime = bounds.end - bounds.start; + const deltaX = this.dragX - this.dragStartX; + const percX = deltaX / this.width; + const panStart = bounds.start - percX * deltaTime; + + return { + start: parseInt(panStart, 10), + end: parseInt(panStart + deltaTime, 10) + }; + }, + zoomRange() { + const leftBound = this.left; + const rightBound = this.left + this.width; + const zoomStart = this.dragX < leftBound ? leftBound : Math.min(this.dragX, this.dragStartX); + const zoomEnd = this.dragX > rightBound ? rightBound : Math.max(this.dragX, this.dragStartX); + + return { + start: zoomStart, + end: zoomEnd + }; + }, + isChangingViewBounds() { + return this.dragStartX && this.dragX && this.dragStartX !== this.dragX; } }, watch: { + containerSize: { + handler() { + this.resize(); + }, + deep: true + }, viewBounds: { handler() { this.setScale(); @@ -77,7 +133,7 @@ export default { } }, mounted() { - let vis = select(this.$refs.axisHolder).append('svg:svg'); + const vis = select(this.axisHolder).append('svg:svg'); this.xAxis = axisTop(); this.dragging = false; @@ -93,15 +149,14 @@ export default { this.openmct.time.on(TIME_CONTEXT_EVENTS.timeSystemChanged, this.setViewFromTimeSystem); }, beforeUnmount() { - clearInterval(this.resizeTimer); + // Remove the listeners in case the component is unmounted while dragging + document.removeEventListener('mousemove', this.drag); + document.removeEventListener('mouseup', this.dragEnd); }, methods: { setAxisDimensions() { - const axisHolder = this.$refs.axisHolder; - const rect = axisHolder.getBoundingClientRect(); - - this.left = Math.round(rect.left); - this.width = axisHolder.clientWidth; + this.rect = this.axisHolder.getBoundingClientRect(); + this.width = this.axisHolder.clientWidth; }, setScale() { if (!this.width) { @@ -204,26 +259,14 @@ export default { this.dragX = undefined; }, pan() { - const panBounds = this.getPanBounds(); + const panBounds = this.panBounds; this.$emit('pan-axis', panBounds); }, endPan() { - const panBounds = this.isChangingViewBounds() ? this.getPanBounds() : undefined; + const panBounds = this.isChangingViewBounds ? this.panBounds : undefined; this.$emit('end-pan', panBounds); this.inPanMode = false; }, - getPanBounds() { - const bounds = this.openmct.time.getBounds(); - const deltaTime = bounds.end - bounds.start; - const deltaX = this.dragX - this.dragStartX; - const percX = deltaX / this.width; - const panStart = bounds.start - percX * deltaTime; - - return { - start: parseInt(panStart, 10), - end: parseInt(panStart + deltaTime, 10) - }; - }, startZoom() { const x = this.scaleToBounds(this.dragStartX); @@ -237,7 +280,7 @@ export default { }); }, zoom() { - const zoomRange = this.getZoomRange(); + const zoomRange = this.zoomRange; this.zoomStyle = { left: `${zoomRange.start - this.left}px`, @@ -251,8 +294,8 @@ export default { }, endZoom() { let zoomBounds; - if (this.isChangingViewBounds()) { - const zoomRange = this.getZoomRange(); + if (this.isChangingViewBounds) { + const zoomRange = this.zoomRange; zoomBounds = { start: this.scaleToBounds(zoomRange.start), end: this.scaleToBounds(zoomRange.end) @@ -262,19 +305,6 @@ export default { this.zoomStyle = {}; this.$emit('end-zoom', zoomBounds); }, - getZoomRange() { - const leftBound = this.left; - const rightBound = this.left + this.width; - - const zoomStart = this.dragX < leftBound ? leftBound : Math.min(this.dragX, this.dragStartX); - - const zoomEnd = this.dragX > rightBound ? rightBound : Math.max(this.dragX, this.dragStartX); - - return { - start: zoomStart, - end: zoomEnd - }; - }, scaleToBounds(value) { const bounds = this.openmct.time.getBounds(); const timeDelta = bounds.end - bounds.start; @@ -283,11 +313,8 @@ export default { return parseInt(bounds.start + offset, 10); }, - isChangingViewBounds() { - return this.dragStartX && this.dragX && this.dragStartX !== this.dragX; - }, resize() { - if (this.$refs.axisHolder.clientWidth !== this.width) { + if (this.axisHolder.clientWidth !== this.width) { this.setAxisDimensions(); this.setScale(); } diff --git a/src/ui/components/List/ListItem.vue b/src/ui/components/List/ListItem.vue index 55bb69d6ff..a1335b2c95 100644 --- a/src/ui/components/List/ListItem.vue +++ b/src/ui/components/List/ListItem.vue @@ -53,7 +53,6 @@ export default { formattedItemValues() { let values = []; this.itemProperties.forEach((property) => { - // eslint-disable-next-line you-dont-need-lodash-underscore/get let value = _.get(this.item, property.key); if (property.format) { value = property.format(value, this.item, property.key, this.openmct); diff --git a/src/utils/testing.js b/src/utils/testing.js index 037e239f54..5bc40949f0 100644 --- a/src/utils/testing.js +++ b/src/utils/testing.js @@ -83,29 +83,26 @@ export function clearBuiltinSpies() { } export function resetApplicationState(openmct) { - let promise; - clearBuiltinSpies(); - if (openmct !== undefined) { + if (openmct) { openmct.destroy(); } if (window.location.hash !== '#' && window.location.hash !== '') { - promise = new Promise((resolve, reject) => { - window.addEventListener('hashchange', cleanup); - window.location.hash = '#'; - - function cleanup() { - window.removeEventListener('hashchange', cleanup); + window.location.hash = '#'; + // Optionally wait for hashchange if necessary + return new Promise((resolve) => { + // eslint-disable-next-line func-style + const onHashChange = () => { + window.removeEventListener('hashchange', onHashChange); resolve(); - } + }; + window.addEventListener('hashchange', onHashChange); }); } else { - promise = Promise.resolve(); + return Promise.resolve(); } - - return promise; } // required: key