From 2063556e5a1a2ac8eb379a5405cec86c66e44672 Mon Sep 17 00:00:00 2001 From: Tim Gross Date: Tue, 24 Mar 2026 15:57:34 -0400 Subject: [PATCH] UI: remove Percy snapshot testing Percy hasn't contributed anything useful in the entire time we've used it and just causes a lot of false-positive failures. Access control to the service has been painful (particularly following the org migration, where it simply doesn't work for some members of the team), and there's no one maintaining the integration. Let's rip it out. --- .github/workflows/test-ui.yml | 32 +- pnpm-lock.yaml | 530 ------------------ ui/.percy.yml | 15 - ui/app/controllers/jobs/index.js | 2 +- ui/config/environment.js | 10 - ui/mirage/faker.js | 6 +- ui/package.json | 10 +- ui/tests/acceptance/access-control-test.js | 4 +- ui/tests/acceptance/actions-test.js | 28 - .../acceptance/application-errors-test.js | 4 - ui/tests/acceptance/clients-list-test.js | 5 - .../dynamic-host-volume-detail-test.js | 6 +- ui/tests/acceptance/evaluations-test.js | 7 - ui/tests/acceptance/exec-test.js | 4 - ui/tests/acceptance/job-definition-test.js | 4 - ui/tests/acceptance/job-detail-test.js | 48 +- ui/tests/acceptance/job-run-test.js | 4 - ui/tests/acceptance/job-status-panel-test.js | 57 -- ui/tests/acceptance/job-versions-test.js | 201 +++---- ui/tests/acceptance/jobs-list-test.js | 20 - ui/tests/acceptance/keyboard-test.js | 2 - ui/tests/acceptance/namespaces-test.js | 3 - ui/tests/acceptance/policies-test.js | 3 - ui/tests/acceptance/roles-test.js | 6 - ui/tests/acceptance/sentinel-policies-test.js | 6 - ui/tests/acceptance/servers-list-test.js | 2 - ui/tests/acceptance/storage-list-test.js | 5 - ui/tests/acceptance/task-logs-test.js | 8 - ui/tests/acceptance/token-test.js | 20 - ui/tests/acceptance/topology-test.js | 3 - ui/tests/acceptance/variables-test.js | 17 - .../integration/components/job-editor-test.js | 4 - .../components/job-status-panel-test.js | 9 - .../components/variable-form-test.js | 4 - 34 files changed, 111 insertions(+), 978 deletions(-) delete mode 100644 ui/.percy.yml diff --git a/.github/workflows/test-ui.yml b/.github/workflows/test-ui.yml index 5e059229a80..5a60a570d76 100644 --- a/.github/workflows/test-ui.yml +++ b/.github/workflows/test-ui.yml @@ -1,3 +1,4 @@ + name: test-ui on: pull_request: @@ -50,22 +51,8 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/actions/setup-js - uses: browser-actions/setup-chrome@4f8e94349a351df0f048634f25fec36c3c91eded # v2.1.1 - - name: Retrieve Vault-hosted Secrets - if: endsWith(github.repository, '-enterprise') - id: vault - uses: hashicorp/vault-action@4c06c5ccf5c0761b6029f56cfb1dcf5565918a3b # v3.4.0 - with: - url: ${{ vars.CI_VAULT_URL }} - method: ${{ vars.CI_VAULT_METHOD }} - path: ${{ vars.CI_VAULT_PATH }} - jwtGithubAudience: ${{ vars.CI_VAULT_AUD }} - secrets: |- - kv/data/teams/nomad/ui PERCY_TOKEN ; - name: ember exam id: ember_exam - env: - PERCY_TOKEN: ${{ env.PERCY_TOKEN || secrets.PERCY_TOKEN }} - PERCY_PARALLEL_NONCE: ${{ needs.pre-test.outputs.nonce }} run: | pnpm exam:parallel --split=${{ matrix.split }} --partition=${{ matrix.partition }} --json-report=test-results/test-results.json continue-on-error: true @@ -101,17 +88,6 @@ jobs: steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/actions/setup-js - - name: Retrieve Vault-hosted Secrets - if: endsWith(github.repository, '-enterprise') - id: vault - uses: hashicorp/vault-action@4c06c5ccf5c0761b6029f56cfb1dcf5565918a3b # v3.4.0 - with: - url: ${{ vars.CI_VAULT_URL }} - method: ${{ vars.CI_VAULT_METHOD }} - path: ${{ vars.CI_VAULT_PATH }} - jwtGithubAudience: ${{ vars.CI_VAULT_AUD }} - secrets: |- - kv/data/teams/nomad/ui PERCY_TOKEN ; - name: Download all test results if: github.event_name == 'push' && github.ref == 'refs/heads/main' uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 @@ -130,12 +106,6 @@ jobs: path: ui/combined-test-results.json retention-days: 90 - - name: finalize - env: - PERCY_TOKEN: ${{ env.PERCY_TOKEN || secrets.PERCY_TOKEN }} - PERCY_PARALLEL_NONCE: ${{ needs.pre-test.outputs.nonce }} - run: pnpm percy build:finalize - handle-failure: needs: - pre-test diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 817cd7933e5..44e5bfb6e21 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,12 +64,6 @@ importers: '@hashicorp/design-system-tokens': specifier: ^2.3.0 version: 2.3.0 - '@percy/cli': - specifier: ^1.30.0 - version: 1.31.0(typescript@5.9.2) - '@percy/ember': - specifier: ^4.2.0 - version: 4.2.0 anser: specifier: ^2.1.1 version: 2.3.2 @@ -1480,79 +1474,6 @@ packages: resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} - '@percy/cli-app@1.31.0': - resolution: {integrity: sha512-NU4zSDNXbwL/AG58eFT5YPd8McZSY2vTV1MEnKNTixiSAM+KXX5oZ4ehrRV3bod+jIOsgl3x7WZJOwW9n+T1mQ==} - engines: {node: '>=14'} - - '@percy/cli-build@1.31.0': - resolution: {integrity: sha512-p+ml01nFlcHayQwNHrwC+DALUuSmz4I8839AoTAgnxqswEHwqPK9VR0Dtk1h+u8buviZ1meCtSETZLxClOYC5w==} - engines: {node: '>=14'} - - '@percy/cli-command@1.31.0': - resolution: {integrity: sha512-6NfDQLFV/56bI0RwVqe9rWvJ5IXrln84ZIPwT5NPsMYlLsu90hiS1360KcYllBTziZQUpBDT/uIpGxl+mFO/gA==} - engines: {node: '>=14'} - hasBin: true - - '@percy/cli-config@1.31.0': - resolution: {integrity: sha512-VjUvrlIvo46Vtdm7wfgOyLFHvY2QISUO8utQXfQZYXhPWN31laURKpQrSMkAkhpjlJ47/QNmRYvjjg5swRy7cw==} - engines: {node: '>=14'} - - '@percy/cli-exec@1.31.0': - resolution: {integrity: sha512-GI8YRYTGwM1WnFHVlQap9Lw+w7PzgryTay61R4yD7HcZInotehaSoGgQMB4jqMBlLYqVABaqsA2ZHaOmLMaeVA==} - engines: {node: '>=14'} - - '@percy/cli-snapshot@1.31.0': - resolution: {integrity: sha512-HNpNLgX9ZaYU6DUR9ekH5al8SJ+sVKG5kqvnR2k/61+aEzcCrTFDXY5sJcby69mRNVy5mdVRqLKmDxc+sHdI+Q==} - engines: {node: '>=14'} - - '@percy/cli-upload@1.31.0': - resolution: {integrity: sha512-dTnE4i2T1IQeAPLMkiFjWqfuaC4p3U/gJTjCU5xFpVAGs8Sw4WECXc7kZ1pe6o4IYUuGoM7bdqnVyLaUHbxp8Q==} - engines: {node: '>=14'} - - '@percy/cli@1.31.0': - resolution: {integrity: sha512-Ftztj3PLvdMnBylyXIsfEKbHsKRRMpKuk4pFi4MizCFrbM3O6D8raHmff6GaVkE95tMnkF+7gX0BlPzjnbzG8w==} - engines: {node: '>=14'} - hasBin: true - - '@percy/client@1.31.0': - resolution: {integrity: sha512-ACC2zSLOr+c/huLXYFFTrcF2B0c9EIK4gWg1yacIHeaI8ulkX+34UHeCwkWjDM4tcN5cANQ0y+EQv+QuCcWcYA==} - engines: {node: '>=14'} - - '@percy/config@1.31.0': - resolution: {integrity: sha512-PPsITaULaxYLyraSEZs1x9VKDhWunh0JfX/LSKh48BFE1ABWOxIUrqWP9KmCV2XelNAiLEm2ErkCMeS0vjTBxg==} - engines: {node: '>=14'} - - '@percy/core@1.31.0': - resolution: {integrity: sha512-7grj0KMnWeHAQkT7EGOIztEwnQJ2U0Ejvd+Agz0UoWYMXtPnn4QapSeVjqVAr7s7y4PtDVT9kwZ55Kzuq+hzTg==} - engines: {node: '>=14'} - - '@percy/dom@1.31.0': - resolution: {integrity: sha512-eEzzYQGVTZoq0ENrDX9Ih1G3JSYaqLpci++bb1J9kgulkSLXVi0JE8cKftcajo/8QrTrSs9OQCJa2+M1X2te8Q==} - - '@percy/ember@4.2.0': - resolution: {integrity: sha512-D/WckDD2tQetdn8uq46nQA1rOVgov8jsZG4uN7snAq6SrOpxNxacONg37QPwczmICBc7o/NlipCAUteukmtKzg==} - engines: {node: '>= 14'} - - '@percy/env@1.31.0': - resolution: {integrity: sha512-KRKYhDLlMwyLvKQNw1bx8XeXArLig6WyuCTIdwQkLwh4fZllEmSqPDnCUSk0Cu5rpcq0ItVOcZ4vy0R3KcmLBA==} - engines: {node: '>=14'} - - '@percy/logger@1.31.0': - resolution: {integrity: sha512-OZHybJzTFFeG44uh02SXHCVbMpyE4KnGHr2rFG1T6/RLfmy0WPBOYz2yvCKDPKjuTkYBd4zBacTgokK0onAoJw==} - engines: {node: '>=14'} - - '@percy/monitoring@1.31.0': - resolution: {integrity: sha512-myysetAc2Kz0LsLy1JGHHB7DCsiodeW1u/b71M7kiwWYBWw840hiBEgoUDvJkgJ2Tig3oLoyI4aTqyvTExNu+A==} - engines: {node: '>=14'} - - '@percy/sdk-utils@1.31.0': - resolution: {integrity: sha512-hlzEq75BmQUwzu9oOVNWCRmT8l1PZ/KTDdBF01swArevffOV4cF4QtOQAA+jpDT4SIur66X9AmciLnMLmLzYkA==} - engines: {node: '>=14'} - - '@percy/webdriver-utils@1.31.0': - resolution: {integrity: sha512-e7k/rpkd9mhZWbUdgMU9wSj5exWWAmSLnVVLPPXn//SujSvt0koDkvCkXNMbE3aOSNC7yB48w3LE4hh0TK5slQ==} - engines: {node: '>=14'} - '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} @@ -1585,9 +1506,6 @@ packages: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} @@ -1688,9 +1606,6 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -1860,10 +1775,6 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - ajv-errors@1.0.1: resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} peerDependencies: @@ -2032,10 +1943,6 @@ packages: resolution: {integrity: sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==} engines: {node: '>=4'} - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -2371,10 +2278,6 @@ packages: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} - basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} - engines: {node: '>=10.0.0'} - better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -2655,9 +2558,6 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -3179,15 +3079,6 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} - cosmiconfig@8.3.6: - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - create-ecdh@4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} @@ -3378,10 +3269,6 @@ packages: dag-map@2.0.2: resolution: {integrity: sha512-xnsprIzYuDeiyu5zSKwilV/ajRHxnoMlAhEREfyfTgTSViMVY2fGP1ZcHJbtwup26oCkofySU/m6oKJ3HrkW7w==} - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} - data-urls@2.0.0: resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} engines: {node: '>=10'} @@ -3467,10 +3354,6 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} @@ -4353,11 +4236,6 @@ packages: resolution: {integrity: sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ==} engines: {node: '>=8'} - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - fake-xml-http-request@2.1.2: resolution: {integrity: sha512-HaFMBi7r+oEC9iJNpc3bvcW7Z7iLmM26hPDmlb0mFwyANSsOQAtJxbdWsXITKOzZUyMYK0zYCv3h5yDj9TsiXg==} @@ -4404,9 +4282,6 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - figgy-pudding@3.5.2: resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} deprecated: This module is no longer supported. @@ -4692,10 +4567,6 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-uri@6.0.5: - resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} - engines: {node: '>= 14'} - git-hooks-list@1.0.3: resolution: {integrity: sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==} @@ -4887,10 +4758,6 @@ packages: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - http-proxy@1.18.1: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} @@ -4902,10 +4769,6 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - https@1.0.0: resolution: {integrity: sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==} @@ -4949,11 +4812,6 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - image-size@1.2.1: - resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} - engines: {node: '>=16.x'} - hasBin: true - immutable@5.1.3: resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==} @@ -5018,10 +4876,6 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - ip-regex@4.3.0: resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} engines: {node: '>=8'} @@ -5290,13 +5144,6 @@ packages: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} - hasBin: true - - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - jsdom@16.7.0: resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} engines: {node: '>=10'} @@ -5391,9 +5238,6 @@ packages: line-column@1.0.2: resolution: {integrity: sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww==} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - linkify-it@3.0.3: resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} @@ -5843,10 +5687,6 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -6084,20 +5924,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - pac-proxy-agent@7.2.0: - resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} - engines: {node: '>= 14'} - - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} - pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} - parallel-transform@1.2.0: resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} @@ -6113,10 +5942,6 @@ packages: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - parse-ms@1.0.1: resolution: {integrity: sha512-LpH1Cf5EYuVjkBvCDBYvkUPh+iv2bk3FHflxHkpCYT0/FZ1d3N3uJaLiHr4yGuMcFUhv6eAivitTvWZI4B/chg==} engines: {node: '>=0.10.0'} @@ -6189,9 +6014,6 @@ packages: path-to-regexp@1.9.0: resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} - path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} @@ -6204,9 +6026,6 @@ packages: resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} engines: {node: '>= 0.10'} - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -6417,9 +6236,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - queue@6.0.2: - resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} - quick-temp@0.1.8: resolution: {integrity: sha512-YsmIFfD9j2zaFwJkzI6eMG7y0lQP7YeWzgtFgNl38pGWZBSXJooZbOWwkcRot7Vt0Fg9L23pX0tqWU3VvLDsiA==} @@ -6886,10 +6702,6 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} @@ -6904,14 +6716,6 @@ packages: resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} engines: {node: '>=10.2.0'} - socks-proxy-agent@8.0.5: - resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} - engines: {node: '>= 14'} - - socks@2.8.6: - resolution: {integrity: sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - sort-object-keys@1.1.3: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} @@ -7165,12 +6969,6 @@ packages: resolution: {integrity: sha512-vngT2JmkSapgq0z7uIoYtB9kWOOzMihAAYq/D3Pjm/ODOGMgS4r++B+OZ09U4hWR6EaOdy9eqQ7/8ygbH3wehA==} engines: {node: 8.* || >= 10.*} - systeminformation@5.31.1: - resolution: {integrity: sha512-6pRwxoGeV/roJYpsfcP6tN9mep6pPeCtXbUOCdVa0nme05Brwcwdge/fVNhIZn2wuUitAKZm4IYa7QjnRIa9zA==} - engines: {node: '>=8.0.0'} - os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] - hasBin: true - tabbable@5.3.3: resolution: {integrity: sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==} @@ -7755,18 +7553,6 @@ packages: utf-8-validate: optional: true - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - xdg-basedir@4.0.0: resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} engines: {node: '>=8'} @@ -7832,9 +7618,6 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -9465,171 +9248,6 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.1 optional: true - '@percy/cli-app@1.31.0(typescript@5.9.2)': - dependencies: - '@percy/cli-command': 1.31.0(typescript@5.9.2) - '@percy/cli-exec': 1.31.0(typescript@5.9.2) - transitivePeerDependencies: - - bufferutil - - supports-color - - typescript - - utf-8-validate - - '@percy/cli-build@1.31.0(typescript@5.9.2)': - dependencies: - '@percy/cli-command': 1.31.0(typescript@5.9.2) - transitivePeerDependencies: - - bufferutil - - supports-color - - typescript - - utf-8-validate - - '@percy/cli-command@1.31.0(typescript@5.9.2)': - dependencies: - '@percy/config': 1.31.0(typescript@5.9.2) - '@percy/core': 1.31.0(typescript@5.9.2) - '@percy/logger': 1.31.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - typescript - - utf-8-validate - - '@percy/cli-config@1.31.0(typescript@5.9.2)': - dependencies: - '@percy/cli-command': 1.31.0(typescript@5.9.2) - transitivePeerDependencies: - - bufferutil - - supports-color - - typescript - - utf-8-validate - - '@percy/cli-exec@1.31.0(typescript@5.9.2)': - dependencies: - '@percy/cli-command': 1.31.0(typescript@5.9.2) - '@percy/logger': 1.31.0 - cross-spawn: 7.0.5 - which: 2.0.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - typescript - - utf-8-validate - - '@percy/cli-snapshot@1.31.0(typescript@5.9.2)': - dependencies: - '@percy/cli-command': 1.31.0(typescript@5.9.2) - yaml: 2.8.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - typescript - - utf-8-validate - - '@percy/cli-upload@1.31.0(typescript@5.9.2)': - dependencies: - '@percy/cli-command': 1.31.0(typescript@5.9.2) - fast-glob: 3.3.3 - image-size: 1.2.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - typescript - - utf-8-validate - - '@percy/cli@1.31.0(typescript@5.9.2)': - dependencies: - '@percy/cli-app': 1.31.0(typescript@5.9.2) - '@percy/cli-build': 1.31.0(typescript@5.9.2) - '@percy/cli-command': 1.31.0(typescript@5.9.2) - '@percy/cli-config': 1.31.0(typescript@5.9.2) - '@percy/cli-exec': 1.31.0(typescript@5.9.2) - '@percy/cli-snapshot': 1.31.0(typescript@5.9.2) - '@percy/cli-upload': 1.31.0(typescript@5.9.2) - '@percy/client': 1.31.0 - '@percy/logger': 1.31.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - typescript - - utf-8-validate - - '@percy/client@1.31.0': - dependencies: - '@percy/env': 1.31.0 - '@percy/logger': 1.31.0 - pac-proxy-agent: 7.2.0 - pako: 2.1.0 - transitivePeerDependencies: - - supports-color - - '@percy/config@1.31.0(typescript@5.9.2)': - dependencies: - '@percy/logger': 1.31.0 - ajv: 8.18.0 - cosmiconfig: 8.3.6(typescript@5.9.2) - yaml: 2.8.0 - transitivePeerDependencies: - - typescript - - '@percy/core@1.31.0(typescript@5.9.2)': - dependencies: - '@percy/client': 1.31.0 - '@percy/config': 1.31.0(typescript@5.9.2) - '@percy/dom': 1.31.0 - '@percy/logger': 1.31.0 - '@percy/monitoring': 1.31.0(typescript@5.9.2) - '@percy/webdriver-utils': 1.31.0(typescript@5.9.2) - content-disposition: 0.5.4 - cross-spawn: 7.0.5 - extract-zip: 2.0.1 - fast-glob: 3.3.3 - micromatch: 4.0.8 - mime-types: 2.1.35 - pako: 2.1.0 - path-to-regexp: 6.3.0 - rimraf: 3.0.2 - ws: 8.18.3 - yaml: 2.8.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - typescript - - utf-8-validate - - '@percy/dom@1.31.0': {} - - '@percy/ember@4.2.0': - dependencies: - '@percy/sdk-utils': 1.31.0 - ember-cli-babel: 7.26.11 - transitivePeerDependencies: - - supports-color - - '@percy/env@1.31.0': - dependencies: - '@percy/logger': 1.31.0 - - '@percy/logger@1.31.0': {} - - '@percy/monitoring@1.31.0(typescript@5.9.2)': - dependencies: - '@percy/config': 1.31.0(typescript@5.9.2) - '@percy/logger': 1.31.0 - '@percy/sdk-utils': 1.31.0 - systeminformation: 5.31.1 - transitivePeerDependencies: - - typescript - - '@percy/sdk-utils@1.31.0': {} - - '@percy/webdriver-utils@1.31.0(typescript@5.9.2)': - dependencies: - '@percy/config': 1.31.0(typescript@5.9.2) - '@percy/sdk-utils': 1.31.0 - transitivePeerDependencies: - - typescript - '@popperjs/core@2.11.8': {} '@ro0gr/ceibo@2.2.0': {} @@ -9665,8 +9283,6 @@ snapshots: '@tootallnate/once@1.1.2': {} - '@tootallnate/quickjs-emscripten@0.23.0': {} - '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.8 @@ -9789,11 +9405,6 @@ snapshots: '@types/trusted-types@2.0.7': optional: true - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 24.0.14 - optional: true - '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -10011,8 +9622,6 @@ snapshots: transitivePeerDependencies: - supports-color - agent-base@7.1.4: {} - ajv-errors@1.0.1(ajv@6.12.6): dependencies: ajv: 6.12.6 @@ -10172,10 +9781,6 @@ snapshots: ast-types@0.13.3: {} - ast-types@0.13.4: - dependencies: - tslib: 2.8.1 - astral-regex@2.0.0: {} async-disk-cache@1.3.5: @@ -10793,8 +10398,6 @@ snapshots: dependencies: safe-buffer: 5.1.2 - basic-ftp@5.0.5: {} - better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 @@ -11451,8 +11054,6 @@ snapshots: dependencies: node-int64: 0.4.0 - buffer-crc32@0.2.13: {} - buffer-from@1.1.2: {} buffer-xor@1.0.3: {} @@ -11850,15 +11451,6 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@8.3.6(typescript@5.9.2): - dependencies: - import-fresh: 3.3.1 - js-yaml: 4.1.1 - parse-json: 5.2.0 - path-type: 4.0.0 - optionalDependencies: - typescript: 5.9.2 - create-ecdh@4.0.4: dependencies: bn.js: 5.2.3 @@ -12101,8 +11693,6 @@ snapshots: dag-map@2.0.2: {} - data-uri-to-buffer@6.0.2: {} - data-urls@2.0.0: dependencies: abab: 2.0.6 @@ -12187,12 +11777,6 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - degenerator@5.0.1: - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - delaunator@5.0.1: dependencies: robust-predicates: 3.0.2 @@ -14049,16 +13633,6 @@ snapshots: extract-stack@2.0.0: {} - extract-zip@2.0.1: - dependencies: - debug: 4.4.1 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - fake-xml-http-request@2.1.2: {} faker@4.1.0: {} @@ -14122,10 +13696,6 @@ snapshots: dependencies: bser: 2.1.1 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - figgy-pudding@3.5.2: {} figures@2.0.0: @@ -14505,14 +14075,6 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-uri@6.0.5: - dependencies: - basic-ftp: 5.0.5 - data-uri-to-buffer: 6.0.2 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - git-hooks-list@1.0.3: {} git-repo-info@2.1.1: {} @@ -14760,13 +14322,6 @@ snapshots: transitivePeerDependencies: - supports-color - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 @@ -14784,13 +14339,6 @@ snapshots: transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - https@1.0.0: {} human-signals@1.1.1: {} @@ -14819,10 +14367,6 @@ snapshots: ignore@5.3.2: {} - image-size@1.2.1: - dependencies: - queue: 6.0.2 - immutable@5.1.3: {} import-fresh@3.3.1: @@ -14905,11 +14449,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - ip-regex@4.3.0: {} ipaddr.js@1.9.1: {} @@ -15147,12 +14686,6 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.1: - dependencies: - argparse: 2.0.1 - - jsbn@1.1.0: {} - jsdom@16.7.0: dependencies: abab: 2.0.6 @@ -15265,8 +14798,6 @@ snapshots: isarray: 1.0.0 isobject: 2.1.0 - lines-and-columns@1.2.4: {} - linkify-it@3.0.3: dependencies: uc.micro: 1.0.6 @@ -15727,8 +15258,6 @@ snapshots: neo-async@2.6.2: {} - netmask@2.0.2: {} - nice-try@1.0.5: {} nise@4.1.0: @@ -16002,28 +15531,8 @@ snapshots: p-try@2.2.0: {} - pac-proxy-agent@7.2.0: - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.4 - debug: 4.4.1 - get-uri: 6.0.5 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - - pac-resolver@7.0.1: - dependencies: - degenerator: 5.0.1 - netmask: 2.0.2 - pako@1.0.11: {} - pako@2.1.0: {} - parallel-transform@1.2.0: dependencies: cyclist: 1.0.2 @@ -16047,13 +15556,6 @@ snapshots: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - parse-ms@1.0.1: {} parse-passwd@1.0.0: {} @@ -16102,8 +15604,6 @@ snapshots: dependencies: isarray: 0.0.1 - path-to-regexp@6.3.0: {} - path-type@3.0.0: dependencies: pify: 3.0.0 @@ -16119,8 +15619,6 @@ snapshots: sha.js: 2.4.12 to-buffer: 1.2.2 - pend@1.2.0: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -16308,10 +15806,6 @@ snapshots: queue-microtask@1.2.3: {} - queue@6.0.2: - dependencies: - inherits: 2.0.4 - quick-temp@0.1.8: dependencies: mktemp: 0.4.0 @@ -16868,8 +16362,6 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - smart-buffer@4.2.0: {} - snake-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -16905,19 +16397,6 @@ snapshots: - supports-color - utf-8-validate - socks-proxy-agent@8.0.5: - dependencies: - agent-base: 7.1.4 - debug: 4.4.1 - socks: 2.8.6 - transitivePeerDependencies: - - supports-color - - socks@2.8.6: - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - sort-object-keys@1.1.3: {} sort-package-json@1.57.0: @@ -17197,8 +16676,6 @@ snapshots: transitivePeerDependencies: - supports-color - systeminformation@5.31.1: {} - tabbable@5.3.3: {} table@6.9.0: @@ -17946,8 +17423,6 @@ snapshots: ws@8.17.1: {} - ws@8.18.3: {} - xdg-basedir@4.0.0: {} xml-name-validator@3.0.0: {} @@ -18003,9 +17478,4 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - yocto-queue@0.1.0: {} diff --git a/ui/.percy.yml b/ui/.percy.yml deleted file mode 100644 index 4c5da91ec68..00000000000 --- a/ui/.percy.yml +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) HashiCorp, Inc. -# SPDX-License-Identifier: BUSL-1.1 - -version: 1 -snapshot: - # Hide high-variability data from Percy snapshots; helps make sure that randomized data doesn't cause a visual diff. - percy-css: | - .topo-viz { - display: none; - } - .related-evaluations path, - .related-evaluations circle, - .dashboard-metric { - visibility: hidden; - } \ No newline at end of file diff --git a/ui/app/controllers/jobs/index.js b/ui/app/controllers/jobs/index.js index ec1aa057b4a..c451cd62002 100644 --- a/ui/app/controllers/jobs/index.js +++ b/ui/app/controllers/jobs/index.js @@ -691,7 +691,7 @@ export default class JobsIndexController extends Controller { 'NodePool is not empty', '(dc1 in Datacenters) or (dc2 in Datacenters)', ]; - // In test/Percy environments, pick deterministically so snapshots are stable. + // In test environments, pick deterministically so snapshots are stable. // In production, keep it random so users discover different filter syntax. if (Ember.testing) { const filter = this.filter || ''; diff --git a/ui/config/environment.js b/ui/config/environment.js index 47e43f2b411..e3b0a40dd9d 100644 --- a/ui/config/environment.js +++ b/ui/config/environment.js @@ -11,12 +11,6 @@ if (process.env.USE_MIRAGE) { USE_MIRAGE = process.env.USE_MIRAGE == 'true'; } -let USE_PERCY = true; - -if (process.env.USE_PERCY) { - USE_PERCY = process.env.USE_PERCY == 'true'; -} - module.exports = function (environment) { let ENV = { modulePrefix: 'nomad-ui', @@ -43,10 +37,6 @@ module.exports = function (environment) { mirageWithTokens: true, mirageWithRegions: true, }, - - percy: { - enabled: USE_PERCY, - }, }; if (environment === 'development') { diff --git a/ui/mirage/faker.js b/ui/mirage/faker.js index 54450c878d8..33da364a8b1 100644 --- a/ui/mirage/faker.js +++ b/ui/mirage/faker.js @@ -8,11 +8,7 @@ import config from 'nomad-ui/config/environment'; const searchIncludesSeed = window.location.search.includes('faker-seed'); -if ( - config.environment !== 'test' || - config.percy.enabled || - searchIncludesSeed -) { +if (config.environment !== 'test' || searchIncludesSeed) { if (searchIncludesSeed) { const params = new URLSearchParams(window.location.search); const seed = parseInt(params.get('faker-seed')); diff --git a/ui/package.json b/ui/package.json index 2ecb3489b86..bcf291aead7 100644 --- a/ui/package.json +++ b/ui/package.json @@ -10,8 +10,8 @@ }, "scripts": { "build": "ember build --environment=production", - "exam": "percy exec -- ember exam --split=4 --parallel", - "exam:parallel": "percy exec --parallel -- ember exam", + "exam": "ember exam --split=4 --parallel", + "exam:parallel": "ember exam --parallel", "lint": "npm-run-all --aggregate-output --continue-on-error --parallel \"lint:!(fix)\"", "lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix", "lint:hbs": "ember-template-lint .", @@ -20,12 +20,10 @@ "lint:js:fix": "eslint . --fix", "local:exam": "ember exam --server --load-balance --parallel=4", "local:test": "ember test --server", - "percy": "percy", "precommit": "lint-staged", - "seedless-test": "USE_PERCY=false ember test", "start": "ember server", "test": "npm-run-all lint test:*", - "test:ember": "percy exec -- ember test" + "test:ember": "ember test" }, "husky": { "hooks": { @@ -54,8 +52,6 @@ "@glint/template": "^1.5.2", "@hashicorp/design-system-components": "4.13.0", "@hashicorp/design-system-tokens": "^2.3.0", - "@percy/cli": "^1.30.0", - "@percy/ember": "^4.2.0", "anser": "^2.1.1", "babel-eslint": "^10.1.0", "base64-js": "^1.3.1", diff --git a/ui/tests/acceptance/access-control-test.js b/ui/tests/acceptance/access-control-test.js index 7554bc685c1..4cfc89888a9 100644 --- a/ui/tests/acceptance/access-control-test.js +++ b/ui/tests/acceptance/access-control-test.js @@ -11,7 +11,7 @@ import Administration from 'nomad-ui/tests/pages/administration'; import Tokens from 'nomad-ui/tests/pages/settings/tokens'; import { allScenarios } from '../../mirage/scenarios/default'; import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; -import percySnapshot from '@percy/ember'; + import faker from 'nomad-ui/mirage/faker'; // Several related tests within Access Control are contained in the Tokens, Roles, @@ -98,7 +98,7 @@ module('Acceptance | access control', function (hooks) { await Administration.visit(); assert.dom('[data-test-sentinel-policies-card]').exists(); - await percySnapshot(assert); + await click('[data-test-sentinel-policies-card] a'); assert.equal(currentURL(), '/administration/sentinel-policies'); }); diff --git a/ui/tests/acceptance/actions-test.js b/ui/tests/acceptance/actions-test.js index e2941c538b8..51db0800457 100644 --- a/ui/tests/acceptance/actions-test.js +++ b/ui/tests/acceptance/actions-test.js @@ -8,7 +8,6 @@ import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import Tokens from 'nomad-ui/tests/pages/settings/tokens'; import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; -import percySnapshot from '@percy/ember'; import Actions from 'nomad-ui/tests/pages/jobs/job/actions'; import { triggerEvent, visit, click } from '@ember/test-helpers'; import faker from 'nomad-ui/mirage/faker'; @@ -203,12 +202,6 @@ module('Acceptance | actions', function (hooks) { "The first action's dropdown subcontent exists" ); - await percySnapshot(assert, { - percyCSS: ` - .allocation-row td { display: none; } - `, - }); - // run on a random alloc await Actions.titleActions.multiAllocActions[0].subActions[0].click(); @@ -275,8 +268,6 @@ module('Acceptance | actions', function (hooks) { 3, 'Running on an orphan alloc results in 1 further action instance' ); - - await percySnapshot('Actions flyout with multiple instances'); }); test('Running actions from a task row', async function (assert) { @@ -376,29 +367,10 @@ module('Acceptance | actions', function (hooks) { Actions.flyout.actions.isPresent, 'Flyout has actions dropdown on task page' ); - await percySnapshot(assert, { - percyCSS: ` - g.tick { visibility: hidden; } - .recent-events-table td { - display: none; - } - .inline-definitions { visibility: hidden; } - `, - }); // Clear finished actions and take a snapshot await click('button[data-test-clear-finished-actions]'); - await percySnapshot('Cleared actions/flyout open state', { - percyCSS: ` - g.tick { visibility: hidden; } - .recent-events-table td { - display: none; - } - .inline-definitions { visibility: hidden; } - `, - }); - // Close flyout; global button is no longer present await Actions.flyout.close(); assert.notOk( diff --git a/ui/tests/acceptance/application-errors-test.js b/ui/tests/acceptance/application-errors-test.js index b7a29b8f50b..b92b6444994 100644 --- a/ui/tests/acceptance/application-errors-test.js +++ b/ui/tests/acceptance/application-errors-test.js @@ -11,7 +11,6 @@ import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; import ClientsList from 'nomad-ui/tests/pages/clients/list'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; import Job from 'nomad-ui/tests/pages/jobs/detail'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; module('Acceptance | application errors ', function (hooks) { @@ -32,7 +31,6 @@ module('Acceptance | application errors ', function (hooks) { server.pretender.get('/v1/nodes', () => [500, {}, null]); await ClientsList.visit(); await a11yAudit(assert); - await percySnapshot(assert); }); test('transitioning away from an error page resets the global error', async function (assert) { @@ -58,7 +56,6 @@ module('Acceptance | application errors ', function (hooks) { assert.ok(Job.error.isPresent, 'Error message is shown'); assert.equal(Job.error.title, 'Not Authorized', 'Error message is for 403'); - await percySnapshot(assert); await Job.error.seekHelp(); assert.equal( @@ -84,7 +81,6 @@ module('Acceptance | application errors ', function (hooks) { 'No Cluster Leader', 'The error is specifically for the lack of a cluster leader' ); - await percySnapshot(assert); }); test('error pages include links to the jobs, clients and auth pages', async function (assert) { diff --git a/ui/tests/acceptance/clients-list-test.js b/ui/tests/acceptance/clients-list-test.js index ddbdcde6efa..0726557c82a 100644 --- a/ui/tests/acceptance/clients-list-test.js +++ b/ui/tests/acceptance/clients-list-test.js @@ -11,7 +11,6 @@ import { setupMirage } from 'ember-cli-mirage/test-support'; import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; import pageSizeSelect from './behaviors/page-size-select'; import ClientsList from 'nomad-ui/tests/pages/clients/list'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; module('Acceptance | clients list', function (hooks) { @@ -42,8 +41,6 @@ module('Acceptance | clients list', function (hooks) { await ClientsList.visit(); - await percySnapshot(assert); - assert.equal(ClientsList.nodes.length, ClientsList.pageSize); assert.ok(ClientsList.hasPagination, 'Pagination found on the page'); @@ -237,8 +234,6 @@ module('Acceptance | clients list', function (hooks) { await ClientsList.visit(); - await percySnapshot(assert); - assert.ok(ClientsList.isEmpty); assert.equal(ClientsList.empty.headline, 'No Clients'); }); diff --git a/ui/tests/acceptance/dynamic-host-volume-detail-test.js b/ui/tests/acceptance/dynamic-host-volume-detail-test.js index 42d4615200e..c1380de191d 100644 --- a/ui/tests/acceptance/dynamic-host-volume-detail-test.js +++ b/ui/tests/acceptance/dynamic-host-volume-detail-test.js @@ -13,7 +13,6 @@ import moment from 'moment'; import { formatBytes, formatHertz } from 'nomad-ui/utils/units'; import VolumeDetail from 'nomad-ui/tests/pages/storage/dynamic-host-volumes/detail'; import Layout from 'nomad-ui/tests/pages/layout'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; const assignAlloc = (volume, alloc) => { @@ -74,7 +73,7 @@ module('Acceptance | dynamic host volume detail', function (hooks) { test('/storage/volumes/:id should list all allocations the volume is attached to', async function (assert) { // Use fixed timestamps so both absolute dates and relative times are - // deterministic across Percy snapshot runs. + // deterministic across test runs. const pinned = new Date('2025-06-15T12:00:00Z'); const pinnedNs = pinned.getTime() * 1e6; // nanoseconds @@ -95,7 +94,7 @@ module('Acceptance | dynamic host volume detail', function (hooks) { allocations.forEach((alloc) => assignAlloc(volume, alloc)); // Freeze moment's time reference so relative times ("9 hours ago") are - // deterministic across Percy snapshot runs. + // deterministic across test runs. const originalMomentNow = moment.now; moment.now = () => pinned.getTime(); @@ -112,7 +111,6 @@ module('Acceptance | dynamic host volume detail', function (hooks) { VolumeDetail.allocations.objectAt(idx).id ); }); - await percySnapshot(assert); } finally { moment.now = originalMomentNow; } diff --git a/ui/tests/acceptance/evaluations-test.js b/ui/tests/acceptance/evaluations-test.js index 0f1a2c508e1..2f3e7b446a1 100644 --- a/ui/tests/acceptance/evaluations-test.js +++ b/ui/tests/acceptance/evaluations-test.js @@ -21,7 +21,6 @@ import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; import { selectChoose } from 'ember-power-select/test-support'; import { clickTrigger } from 'ember-power-select/test-support/helpers'; import { generateAcceptanceTestEvalMock } from '../../mirage/utils'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; const getStandardRes = () => [ @@ -133,8 +132,6 @@ module('Acceptance | evaluations list', function (hooks) { await visit('/evaluations'); assert.expect(2); - await percySnapshot(assert); - assert .dom('[data-test-empty-evaluations-list]') .exists('We display empty table message.'); @@ -163,8 +160,6 @@ module('Acceptance | evaluations list', function (hooks) { await visit('/evaluations'); - await percySnapshot(assert); - assert .dom('[data-test-eval-table]') .exists('Evaluations table should render'); @@ -702,8 +697,6 @@ module('Acceptance | evaluations list', function (hooks) { const evalId = '5fb1b8cd'; await click(`[data-test-evaluation='${evalId}']`); - await percySnapshot(assert); - assert .dom('[data-test-eval-detail-is-open]') .exists( diff --git a/ui/tests/acceptance/exec-test.js b/ui/tests/acceptance/exec-test.js index af7428deab3..9d1c032c166 100644 --- a/ui/tests/acceptance/exec-test.js +++ b/ui/tests/acceptance/exec-test.js @@ -12,7 +12,6 @@ import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; import Service from '@ember/service'; import Exec from 'nomad-ui/tests/pages/exec'; import KEYS from 'nomad-ui/utils/keys'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; module('Acceptance | exec', function (hooks) { @@ -105,8 +104,6 @@ module('Acceptance | exec', function (hooks) { assert.notOk(Exec.taskGroups[0].tasks[0].isActive); assert.ok(Exec.taskGroups[0].chevron.isDown); - await percySnapshot(assert); - await Exec.taskGroups[0].click(); assert.equal(Exec.taskGroups[0].tasks.length, 0); }); @@ -305,7 +302,6 @@ module('Acceptance | exec', function (hooks) { const terminalTextRendered = assert.async(); setTimeout(async () => { - await percySnapshot(assert); terminalTextRendered(); }, 1000); }); diff --git a/ui/tests/acceptance/job-definition-test.js b/ui/tests/acceptance/job-definition-test.js index bf0281b4ae0..1c6e41a4e87 100644 --- a/ui/tests/acceptance/job-definition-test.js +++ b/ui/tests/acceptance/job-definition-test.js @@ -4,7 +4,6 @@ */ import { click, currentURL } from '@ember/test-helpers'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; @@ -90,7 +89,6 @@ module('Acceptance | job definition', function (hooks) { const formattedJobDefinition = JSON.parse(jobSubmission).Source; await Definition.edit(); - await percySnapshot(assert); assert.equal( Definition.editor.editor.contents, @@ -117,7 +115,6 @@ module('Acceptance | job definition', function (hooks) { test('when the job for the definition is not found, an error message is shown, but the URL persists', async function (assert) { assert.expect(4); await Definition.visit({ id: 'not-a-real-job' }); - await percySnapshot(assert); assert.equal( server.pretender.handledRequests @@ -170,7 +167,6 @@ module('Acceptance | job definition | full specification', function (hooks) { server.get('/job/:id/submission', () => specification_response); await Definition.visit({ id: job.id }); - await percySnapshot(assert); assert .dom('[data-test-select="job-spec"]') diff --git a/ui/tests/acceptance/job-detail-test.js b/ui/tests/acceptance/job-detail-test.js index a1cbf1f7eb9..f28dc48529f 100644 --- a/ui/tests/acceptance/job-detail-test.js +++ b/ui/tests/acceptance/job-detail-test.js @@ -15,7 +15,6 @@ import moduleForJob, { moduleForJobWithClientStatus, } from 'nomad-ui/tests/helpers/module-for-job'; import JobDetail from 'nomad-ui/tests/pages/jobs/detail'; -import percySnapshot from '@percy/ember'; import { createRestartableJobs } from 'nomad-ui/mirage/scenarios/default'; import faker from 'nomad-ui/mirage/faker'; @@ -405,33 +404,28 @@ module('Acceptance | ui block', function (hooks) { assert .dom('[data-test-job-links] a') .exists({ count: 2 }, 'Job links exists when defined in HCL'); - await percySnapshot(assert, { - percyCSS: ` - .allocation-row td { display: none; } - `, - }); }); +}); - test('job sanitizes input', async function (assert) { - server.create('node-pool'); - server.create('node'); - server.create('job', { - id: 'xss-job', - ui: { - Description: '

Safe text

', - }, - }); +test('job sanitizes input', async function (assert) { + server.create('node-pool'); + server.create('node'); + server.create('job', { + id: 'xss-job', + ui: { + Description: '

Safe text

', + }, + }); - await JobDetail.visit({ id: 'xss-job' }); + await JobDetail.visit({ id: 'xss-job' }); - assert - .dom('[data-test-job-description]') - .hasText('Safe text', 'Description should only contain safe text'); + assert + .dom('[data-test-job-description]') + .hasText('Safe text', 'Description should only contain safe text'); - assert - .dom('[data-test-job-description] script') - .doesNotExist('Should not render script tags'); - }); + assert + .dom('[data-test-job-description] script') + .doesNotExist('Should not render script tags'); }); module('Acceptance | job detail (with namespaces)', function (hooks) { @@ -772,8 +766,6 @@ module('Acceptance | job detail (with namespaces)', function (hooks) { assert .dom('.flash-message.alert-critical') .exists('A toast error message pops up.'); - - await percySnapshot(assert); }); test('handles when a job is remotely purged, from a job subnav page', async function (assert) { @@ -843,18 +835,12 @@ module('Job Start/Stop/Revert/Edit and Resubmit', function (hooks) { assert.notOk(JobDetail.stop.isPresent); assert.notOk(JobDetail.revert.isPresent); assert.notOk(JobDetail.editAndResubmit.isPresent); - await percySnapshot('Start Job depends on the job being stopped'); await JobDetail.visit({ id: revertableJob.id }); assert.notOk(JobDetail.start.isPresent); - await percySnapshot('Revertable Job depends on having stable job versions'); - await JobDetail.visit({ id: nonRevertableJob.id }); assert.notOk(JobDetail.start.isPresent); - await percySnapshot( - 'Non-revertable Job depends on having no stable job versions' - ); }); test('A revertable job depends on having stable job versions', async function (assert) { diff --git a/ui/tests/acceptance/job-run-test.js b/ui/tests/acceptance/job-run-test.js index 59df29fafd4..cab4164e587 100644 --- a/ui/tests/acceptance/job-run-test.js +++ b/ui/tests/acceptance/job-run-test.js @@ -21,7 +21,6 @@ import { setupMirage } from 'ember-cli-mirage/test-support'; import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; import setupCodeMirror from 'nomad-ui/tests/helpers/codemirror'; import JobRun from 'nomad-ui/tests/pages/jobs/run'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; const newJobName = 'new-job'; @@ -496,7 +495,6 @@ module('Acceptance | job run', function (hooks) { assert .dom('[data-test-template-list]') .exists('A list of templates is visible'); - await percySnapshot(assert); await click('[data-test-edit-template="nomad/job-templates/foo"]'); assert.equal( currentRouteName(), @@ -629,8 +627,6 @@ module('Acceptance | job run', function (hooks) { .dom('[data-test-template-card]') .exists({ count: NUMBER_OF_DEFAULT_TEMPLATES }); - await percySnapshot(assert); - await click('[data-test-template-card="Hello world"]'); await click('[data-test-apply]'); diff --git a/ui/tests/acceptance/job-status-panel-test.js b/ui/tests/acceptance/job-status-panel-test.js index 1c359ff092c..03a72dbeb9d 100644 --- a/ui/tests/acceptance/job-status-panel-test.js +++ b/ui/tests/acceptance/job-status-panel-test.js @@ -19,7 +19,6 @@ import { import { setupMirage } from 'ember-cli-mirage/test-support'; import faker from 'nomad-ui/mirage/faker'; -import percySnapshot from '@percy/ember'; import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; // TODO: Mirage is not type-friendly / assigns "server" as a global. Try to work around this shortcoming. @@ -46,11 +45,6 @@ module('Acceptance | job status panel', function (hooks) { await visit(`/jobs/${job.id}`); assert.dom('.job-status-panel').exists(); await a11yAudit(assert); - await percySnapshot(assert, { - percyCSS: ` - .allocation-row td { display: none; } - `, - }); assert .dom('[data-test-status-mode="current"]') @@ -178,11 +172,6 @@ module('Acceptance | job status panel', function (hooks) { { count: failedAllocCount }, `All ${failedAllocCount} failed allocations are represented in the status panel` ); - await percySnapshot(assert, { - percyCSS: ` - .allocation-row td { display: none; } - `, - }); }); test('After running/pending allocations are covered, fill in allocs by jobVersion, descending', async function (assert) { @@ -257,11 +246,6 @@ module('Acceptance | job status panel', function (hooks) { assert .dom('.job-status-panel .versions > ul > li > a[data-version="4"]') .doesNotExist(); - await percySnapshot(assert, { - percyCSS: ` - .allocation-row td { display: none; } - `, - }); }); test('After running/pending allocations are covered, fill in allocs by jobVersion, descending (batch)', async function (assert) { @@ -344,12 +328,6 @@ module('Acceptance | job status panel', function (hooks) { assert .dom('.ungrouped-allocs .represented-allocation.failed') .doesNotExist(); - - await percySnapshot(assert, { - percyCSS: ` - .allocation-row td { display: none; } - `, - }); }); test('Status Panel groups allocations when they get past a threshold', async function (assert) { @@ -432,12 +410,6 @@ module('Acceptance | job status panel', function (hooks) { `+${groupAllocCount - desiredUngroupedAllocCount}`, 'Summary block has the correct number of grouped allocs' ); - - await percySnapshot(assert, { - percyCSS: ` - .allocation-row td { display: none; } - `, - }); }); test('Status Panel groups allocations when they get past a threshold, multiple statuses', async function (assert) { @@ -529,15 +501,6 @@ module('Acceptance | job status panel', function (hooks) { '5', 'Summary block has the correct number of grouped unplaced allocs' ); - await percySnapshot( - 'Status Panel groups allocations when they get past a threshold, multiple statuses (full width)', - { - percyCSS: ` - .allocation-row td { display: none; } - .inline-chart { visibility: hidden; } - `, - } - ); // Simulate a window resize event; will recompute how many of each ought to be grouped. @@ -545,16 +508,6 @@ module('Acceptance | job status panel', function (hooks) { find('.page-body').style.width = '1100px'; await triggerEvent(window, 'resize'); - await percySnapshot( - 'Status Panel groups allocations when they get past a threshold, multiple statuses (1100px)', - { - percyCSS: ` - .allocation-row td { display: none; } - .inline-chart { visibility: hidden; } - `, - } - ); - assert .dom('.ungrouped-allocs .represented-allocation.running') .exists({ count: 7 }, '7 running allocations are represented ungrouped'); @@ -589,16 +542,6 @@ module('Acceptance | job status panel', function (hooks) { find('.page-body').style.width = '800px'; await triggerEvent(window, 'resize'); - await percySnapshot( - 'Status Panel groups allocations when they get past a threshold, multiple statuses (500px)', - { - percyCSS: ` - .allocation-row td { display: none; } - .inline-chart { visibility: hidden; } - `, - } - ); - assert .dom('.ungrouped-allocs .represented-allocation.running') .exists({ count: 4 }, '4 running allocations are represented ungrouped'); diff --git a/ui/tests/acceptance/job-versions-test.js b/ui/tests/acceptance/job-versions-test.js index eaf04e01476..1c08b06c0c5 100644 --- a/ui/tests/acceptance/job-versions-test.js +++ b/ui/tests/acceptance/job-versions-test.js @@ -13,7 +13,6 @@ import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; import Versions from 'nomad-ui/tests/pages/jobs/job/versions'; import Layout from 'nomad-ui/tests/pages/layout'; import moment from 'moment'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; let job; let namespace; @@ -208,121 +207,93 @@ module('Acceptance | job versions', function (hooks) { assert .dom('[data-test-tagged-version="false"] .tag-description') .hasText('', 'Tag description is empty'); - - await percySnapshot(assert, { - percyCSS: ` - .timeline-note { - display: none; - } - .submit-date { - visibility: hidden; - } - `, - }); - }); - - test('existing version tags can be edited', async function (assert) { - // Clicking the tag button puts it into edit mode - assert - .dom('[data-test-tagged-version="true"] .boxed-section-foot') - .doesNotHaveClass('editing'); - await click('[data-test-tagged-version="true"] .tag-button-primary'); - assert - .dom('[data-test-tagged-version="true"] .boxed-section-foot') - .hasClass('editing'); - - // equivalent of backspacing existing - document.querySelector('[data-test-tag-name-input]').value = ''; - document.querySelector('[data-test-tag-description-input]').value = ''; - - await typeIn( - '[data-test-tagged-version="true"] [data-test-tag-name-input]', - 'new-tag' - ); - await typeIn( - '[data-test-tagged-version="true"] [data-test-tag-description-input]', - 'new-description' - ); - - // Clicking the save button commits the changes - await click( - '[data-test-tagged-version="true"] [data-test-tag-save-button]' - ); - assert - .dom('[data-test-tagged-version="true"] .tag-button-primary') - .hasText('new-tag'); - assert - .dom('[data-test-tagged-version="true"] .tag-description') - .hasText('new-description'); - - assert - .dom('.flash-message.alert.alert-success') - .exists('Shows a success toast notification on edit.'); - - // Tag can subsequently be deleted - await click('[data-test-tagged-version="true"] .tag-button-primary'); - await click( - '[data-test-tagged-version="true"] [data-test-tag-delete-button]' - ); - assert.dom('[data-test-tagged-version="true"]').doesNotExist(); }); +}); - test('new version tags can be created', async function (assert) { - // Clicking the tag button puts it into edit mode - assert - .dom('[data-test-tagged-version="false"] .boxed-section-foot') - .doesNotHaveClass('editing'); - await click('[data-test-tagged-version="false"] .tag-button-secondary'); - assert - .dom('[data-test-tagged-version="false"] .boxed-section-foot') - .hasClass('editing'); - - assert - .dom('[data-test-tagged-version="false"] [data-test-tag-delete-button]') - .doesNotExist(); - - // Clicking the save button commits the changes - await click( - '[data-test-tagged-version="false"] [data-test-tag-save-button]' - ); - - assert - .dom('.flash-message.alert.alert-critical') - .exists('Shows an error toast notification without a tag name.'); - - await typeIn( - '[data-test-tagged-version="false"] [data-test-tag-name-input]', - 'new-tag' - ); - await typeIn( - '[data-test-tagged-version="false"] [data-test-tag-description-input]', - 'new-description' - ); - - // Clicking the save button commits the changes - await click( - '[data-test-tagged-version="false"] [data-test-tag-save-button]' - ); - - assert - .dom('[data-test-tagged-version="false"]') - .doesNotExist('Both versions now have tags'); +test('existing version tags can be edited', async function (assert) { + // Clicking the tag button puts it into edit mode + assert + .dom('[data-test-tagged-version="true"] .boxed-section-foot') + .doesNotHaveClass('editing'); + await click('[data-test-tagged-version="true"] .tag-button-primary'); + assert + .dom('[data-test-tagged-version="true"] .boxed-section-foot') + .hasClass('editing'); + + // equivalent of backspacing existing + document.querySelector('[data-test-tag-name-input]').value = ''; + document.querySelector('[data-test-tag-description-input]').value = ''; + + await typeIn( + '[data-test-tagged-version="true"] [data-test-tag-name-input]', + 'new-tag' + ); + await typeIn( + '[data-test-tagged-version="true"] [data-test-tag-description-input]', + 'new-description' + ); + + // Clicking the save button commits the changes + await click('[data-test-tagged-version="true"] [data-test-tag-save-button]'); + assert + .dom('[data-test-tagged-version="true"] .tag-button-primary') + .hasText('new-tag'); + assert + .dom('[data-test-tagged-version="true"] .tag-description') + .hasText('new-description'); + + assert + .dom('.flash-message.alert.alert-success') + .exists('Shows a success toast notification on edit.'); + + // Tag can subsequently be deleted + await click('[data-test-tagged-version="true"] .tag-button-primary'); + await click( + '[data-test-tagged-version="true"] [data-test-tag-delete-button]' + ); + assert.dom('[data-test-tagged-version="true"]').doesNotExist(); +}); - assert - .dom('.flash-message.alert.alert-success') - .exists('Shows a success toast notification on edit.'); - - await percySnapshot(assert, { - percyCSS: ` - .timeline-note { - display: none; - } - .submit-date { - visibility: hidden; - } - `, - }); - }); +test('new version tags can be created', async function (assert) { + // Clicking the tag button puts it into edit mode + assert + .dom('[data-test-tagged-version="false"] .boxed-section-foot') + .doesNotHaveClass('editing'); + await click('[data-test-tagged-version="false"] .tag-button-secondary'); + assert + .dom('[data-test-tagged-version="false"] .boxed-section-foot') + .hasClass('editing'); + + assert + .dom('[data-test-tagged-version="false"] [data-test-tag-delete-button]') + .doesNotExist(); + + // Clicking the save button commits the changes + await click('[data-test-tagged-version="false"] [data-test-tag-save-button]'); + + assert + .dom('.flash-message.alert.alert-critical') + .exists('Shows an error toast notification without a tag name.'); + + await typeIn( + '[data-test-tagged-version="false"] [data-test-tag-name-input]', + 'new-tag' + ); + await typeIn( + '[data-test-tagged-version="false"] [data-test-tag-description-input]', + 'new-description' + ); + + // Clicking the save button commits the changes + await click('[data-test-tagged-version="false"] [data-test-tag-save-button]'); + + assert + .dom('[data-test-tagged-version="false"]') + .doesNotExist('Both versions now have tags'); + + assert + .dom('.flash-message.alert.alert-success') + .exists('Shows a success toast notification on edit.'); }); // Module for Clone and Edit @@ -429,8 +400,6 @@ module('Acceptance | job versions (clone and edit)', function (hooks) { `/jobs/${job.id}@${namespace.id}/definition?isEditing=true&version=98&view=job-spec`, 'Taken to the definition page in edit mode' ); - - await percySnapshot(assert); }); test('Clone as new version when version is 0', async function (assert) { @@ -458,8 +427,6 @@ module('Acceptance | job versions (clone and edit)', function (hooks) { ); assert.dom('[data-test-json-warning]').exists(); - - await percySnapshot(assert); }); test('Clone as a new job', async function (assert) { diff --git a/ui/tests/acceptance/jobs-list-test.js b/ui/tests/acceptance/jobs-list-test.js index f5ed2ce495a..4331628a038 100644 --- a/ui/tests/acceptance/jobs-list-test.js +++ b/ui/tests/acceptance/jobs-list-test.js @@ -18,7 +18,6 @@ import { setupMirage } from 'ember-cli-mirage/test-support'; import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; import pageSizeSelect from './behaviors/page-size-select'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; let managementToken, clientToken; @@ -58,8 +57,6 @@ module('Acceptance | jobs list', function (hooks) { await JobsList.visit(); - await percySnapshot(assert); - const sortedJobs = server.db.jobs .sortBy('id') .sortBy('modifyIndex') @@ -145,8 +142,6 @@ module('Acceptance | jobs list', function (hooks) { faker.seed(1); await JobsList.visit(); - await percySnapshot(assert); - assert.ok(JobsList.isEmpty, 'There is an empty message'); assert.equal( JobsList.emptyState.headline, @@ -245,7 +240,6 @@ module('Acceptance | jobs list', function (hooks) { await JobsList.visit(); assert.equal(JobsList.error.title, 'Not Authorized'); - await percySnapshot(assert); await JobsList.error.seekHelp(); assert.equal(currentURL(), '/settings/tokens'); @@ -285,8 +279,6 @@ module('Acceptance | jobs list', function (hooks) { .dom('.flash-message.alert-critical') .exists('A toast error message pops up.'); - await percySnapshot(assert); - await click('[data-test-pause-fetching]'); assert .dom('.flash-message.alert-critical') @@ -600,7 +592,6 @@ module('Acceptance | jobs list', function (hooks) { .exists({ count: 10 }, 'All children are shown'); }, duelingQueryUpdateTime); - await percySnapshot(assert); localStorage.removeItem('nomadPageSize'); }); @@ -753,8 +744,6 @@ module('Acceptance | jobs list', function (hooks) { assert .dom('[data-test-job-row="ancient-system-job"] [data-test-job-status]') .hasText('Failed', 'System job with no allocs is failed'); - - await percySnapshot(assert); }); test('Jobs with schedule blocks indicate when a task is paused', async function (assert) { @@ -797,12 +786,10 @@ module('Acceptance | jobs list', function (hooks) { assert .dom('[data-test-paused-task-indicator]') .exists({ count: 1 }, 'Paused task indicator is shown'); - await percySnapshot(assert); await click('[data-test-job-row="time-based-job"]'); await click(`[data-test-allocation="${allocID}"]`); await click(`[data-test-task-row="${task.name}"]`); assert.dom('.time-based-alert').exists(); - await percySnapshot('Task detail with time-based alert'); }); module('Pagination', function () { @@ -813,7 +800,6 @@ module('Acceptance | jobs list', function (hooks) { assert.dom('[data-test-pager="previous"]').doesNotExist(); assert.dom('[data-test-pager="next"]').doesNotExist(); assert.dom('[data-test-pager="last"]').doesNotExist(); - await percySnapshot(assert); }); test('when there are fewer jobs than your page size setting', async function (assert) { localStorage.setItem('nomadPageSize', '10'); @@ -823,7 +809,6 @@ module('Acceptance | jobs list', function (hooks) { assert.dom('[data-test-pager="previous"]').isDisabled(); assert.dom('[data-test-pager="next"]').isDisabled(); assert.dom('[data-test-pager="last"]').isDisabled(); - await percySnapshot(assert); localStorage.removeItem('nomadPageSize'); }); test('when you have plenty of jobs', async function (assert) { @@ -849,7 +834,6 @@ module('Acceptance | jobs list', function (hooks) { assert.dom('[data-test-pager="previous"]').isNotDisabled(); assert.dom('[data-test-pager="next"]').isDisabled(); assert.dom('[data-test-pager="last"]').isDisabled(); - await percySnapshot(assert); localStorage.removeItem('nomadPageSize'); }); }); @@ -1578,14 +1562,12 @@ module('Acceptance | jobs list', function (hooks) { 'No jobs match your current filter selection: type == foo' ); assert.dom('[data-test-filter-correction]').exists(); - await percySnapshot(assert); await JobsList.search.fillIn('foo != bar'); assert .dom('[data-test-empty-jobs-list]') .includesText('Did you mistype a key?'); assert.dom('[data-test-filter-suggestion]').exists(); - await percySnapshot('Filter suggestion for unknown key'); await JobsList.search.fillIn('Name == surelyDoesntExist'); assert @@ -1594,7 +1576,6 @@ module('Acceptance | jobs list', function (hooks) { 'No jobs match your current filter selection: Name == surelyDoesntExist' ); assert.dom('[data-test-filter-random-suggestion]').exists(); - await percySnapshot('Filter no results with random suggestion'); localStorage.removeItem('nomadPageSize'); }); @@ -1767,7 +1748,6 @@ module('Acceptance | jobs list', function (hooks) { ''; // clear await typeIn('[data-test-namespace-filter-searchbox]', 'n'); assert.dom('[data-test-dropdown-option]').exists({ count: 4 }); - await percySnapshot(assert); }); test('Namespace filter only shows up if the server has more than one namespace', async function (assert) { localStorage.setItem('nomadPageSize', '10'); diff --git a/ui/tests/acceptance/keyboard-test.js b/ui/tests/acceptance/keyboard-test.js index 598691dc516..c828bfb69c0 100644 --- a/ui/tests/acceptance/keyboard-test.js +++ b/ui/tests/acceptance/keyboard-test.js @@ -16,7 +16,6 @@ import { } from '@ember/test-helpers'; import { setupMirage } from 'ember-cli-mirage/test-support'; import Layout from 'nomad-ui/tests/pages/layout'; -import percySnapshot from '@percy/ember'; import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; import faker from 'nomad-ui/mirage/faker'; @@ -32,7 +31,6 @@ module('Acceptance | keyboard', function (hooks) { assert.notOk(Layout.keyboard.modalShown); await triggerEvent('.page-layout', 'keydown', { key: '?' }); assert.ok(Layout.keyboard.modalShown); - await percySnapshot(assert); await a11yAudit(assert); await triggerEvent('.page-layout', 'keydown', { key: 'Escape' }); assert.notOk(Layout.keyboard.modalShown); diff --git a/ui/tests/acceptance/namespaces-test.js b/ui/tests/acceptance/namespaces-test.js index eb37d9cc849..a47fb5a124e 100644 --- a/ui/tests/acceptance/namespaces-test.js +++ b/ui/tests/acceptance/namespaces-test.js @@ -15,7 +15,6 @@ import { import { setupApplicationTest } from 'ember-qunit'; import { allScenarios } from '../../mirage/scenarios/default'; import { setupMirage } from 'ember-cli-mirage/test-support'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; @@ -38,7 +37,6 @@ module('Acceptance | namespaces', function (hooks) { .dom('[data-test-namespace-row]') .exists({ count: server.db.namespaces.length }); await a11yAudit(assert); - await percySnapshot(assert); // Reset Token window.localStorage.nomadTokenSecret = null; }); @@ -83,7 +81,6 @@ module('Acceptance | namespaces', function (hooks) { assert.ok(newNs, 'Namespace is in the list'); await click(newNs); assert.equal(currentURL(), '/administration/namespaces/My-New-Namespace'); - await percySnapshot(assert); // Reset Token window.localStorage.nomadTokenSecret = null; }); diff --git a/ui/tests/acceptance/policies-test.js b/ui/tests/acceptance/policies-test.js index 7241fdbea78..8b2a24535e5 100644 --- a/ui/tests/acceptance/policies-test.js +++ b/ui/tests/acceptance/policies-test.js @@ -15,7 +15,6 @@ import { import { setupApplicationTest } from 'ember-qunit'; import { allScenarios } from '../../mirage/scenarios/default'; import { setupMirage } from 'ember-cli-mirage/test-support'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; @@ -38,7 +37,6 @@ module('Acceptance | policies', function (hooks) { .dom('[data-test-policy-row]') .exists({ count: server.db.policies.length }); await a11yAudit(assert); - await percySnapshot(assert); // Reset Token window.localStorage.nomadTokenSecret = null; }); @@ -130,7 +128,6 @@ module('Acceptance | policies', function (hooks) { assert.ok(newPolicy, 'Policy is in the list'); await click(newPolicy); assert.equal(currentURL(), '/administration/policies/My-Fun-Policy'); - await percySnapshot(assert); // Reset Token window.localStorage.nomadTokenSecret = null; }); diff --git a/ui/tests/acceptance/roles-test.js b/ui/tests/acceptance/roles-test.js index 08bd99e7f04..fd2d51b3d1f 100644 --- a/ui/tests/acceptance/roles-test.js +++ b/ui/tests/acceptance/roles-test.js @@ -11,7 +11,6 @@ import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; import { allScenarios } from '../../mirage/scenarios/default'; import Tokens from 'nomad-ui/tests/pages/settings/tokens'; import Administration from 'nomad-ui/tests/pages/administration'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; module('Acceptance | roles', function (hooks) { @@ -46,8 +45,6 @@ module('Acceptance | roles', function (hooks) { assert .dom('[data-test-role-row]') .exists({ count: server.db.roles.length }); - - await percySnapshot(assert); }); test('Roles index: deletion', async function (assert) { @@ -104,7 +101,6 @@ module('Acceptance | roles', function (hooks) { `/administration/roles/${role.name}`, 'remain on page after save' ); - await percySnapshot(assert); // Go back to the roles index await Administration.visitRoles(); @@ -243,8 +239,6 @@ module('Acceptance | roles', function (hooks) { .dom('[data-test-role-token-row]:last-child [data-test-token-name]') .hasText(`Example Token for ${role.name}`); - await percySnapshot(assert); - await Administration.visitTokens(); assert .dom('[data-test-token-name="Example Token for reader"]') diff --git a/ui/tests/acceptance/sentinel-policies-test.js b/ui/tests/acceptance/sentinel-policies-test.js index 2f5b379d2c8..92a85f3ca79 100644 --- a/ui/tests/acceptance/sentinel-policies-test.js +++ b/ui/tests/acceptance/sentinel-policies-test.js @@ -11,7 +11,6 @@ import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; import { allScenarios } from '../../mirage/scenarios/default'; import Tokens from 'nomad-ui/tests/pages/settings/tokens'; import Administration from 'nomad-ui/tests/pages/administration'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; module('Acceptance | sentinel policies', function (hooks) { @@ -45,8 +44,6 @@ module('Acceptance | sentinel policies', function (hooks) { assert .dom('[data-test-sentinel-policy-row]') .exists({ count: server.db.sentinelPolicies.length }); - - await percySnapshot(assert); }); test('Sentinel Policies index: deletion', async function (assert) { @@ -197,7 +194,6 @@ module('Acceptance | sentinel policies', function (hooks) { assert.expect(5); await click('[data-test-create-sentinel-policy-from-template]'); assert.equal(currentURL(), '/administration/sentinel-policies/gallery'); - await percySnapshot(assert); const template = find('[data-test-template-card="no-friday-deploys"]'); await click(template); assert.ok( @@ -215,8 +211,6 @@ module('Acceptance | sentinel policies', function (hooks) { 'New Policy page has query param' ); - await percySnapshot('New sentinel policy from template'); - assert.dom('[data-test-policy-name-input]').hasValue('no-friday-deploys'); assert .dom('[data-test-policy-description]') diff --git a/ui/tests/acceptance/servers-list-test.js b/ui/tests/acceptance/servers-list-test.js index 8c78902428a..f8c4c9117dd 100644 --- a/ui/tests/acceptance/servers-list-test.js +++ b/ui/tests/acceptance/servers-list-test.js @@ -12,7 +12,6 @@ import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; import { findLeader } from '../../mirage/config'; import ServersList from 'nomad-ui/tests/pages/servers/list'; import formatHost from 'nomad-ui/utils/format-host'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; const minimumSetup = () => { @@ -55,7 +54,6 @@ module('Acceptance | servers list', function (hooks) { const sortedAgents = server.db.agents.sort(agentSort(leader)).reverse(); await ServersList.visit(); - await percySnapshot(assert); assert.equal( ServersList.servers.length, diff --git a/ui/tests/acceptance/storage-list-test.js b/ui/tests/acceptance/storage-list-test.js index a5d929b25d5..46f5bd35abe 100644 --- a/ui/tests/acceptance/storage-list-test.js +++ b/ui/tests/acceptance/storage-list-test.js @@ -10,7 +10,6 @@ import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; import StorageList from 'nomad-ui/tests/pages/storage/list'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; const assignWriteAlloc = (volume, alloc) => { @@ -61,8 +60,6 @@ module('Acceptance | storage list', function (hooks) { await StorageList.visit(); - await percySnapshot(assert); - const sortedVolumes = server.db.csiVolumes.sortBy('id'); assert.equal(StorageList.csiVolumes.length, StorageList.pageSize); @@ -129,8 +126,6 @@ module('Acceptance | storage list', function (hooks) { test('when there are no csi volumes, there is an empty message', async function (assert) { await StorageList.visit(); - await percySnapshot(assert); - assert.ok(StorageList.csiIsEmpty); assert.equal(StorageList.csiEmptyState, 'No CSI Volumes found'); }); diff --git a/ui/tests/acceptance/task-logs-test.js b/ui/tests/acceptance/task-logs-test.js index 0312e0cfa7f..9ab22350183 100644 --- a/ui/tests/acceptance/task-logs-test.js +++ b/ui/tests/acceptance/task-logs-test.js @@ -16,7 +16,6 @@ import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; import TaskLogs from 'nomad-ui/tests/pages/allocations/task/logs'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; let allocation; @@ -46,7 +45,6 @@ module('Acceptance | task logs', function (hooks) { test('it passes an accessibility audit', async function (assert) { await TaskLogs.visit({ id: allocation.id, name: task.name }); await a11yAudit(assert); - await percySnapshot(assert); }); test('/allocation/:id/:task_name/logs should have a log component', async function (assert) { @@ -167,12 +165,6 @@ module('Acceptance | task logs', function (hooks) { assert .dom('.task-context-sidebar h1.title') .includesText(task.state, 'Task state is correctly displayed'); - await percySnapshot(assert, { - percyCSS: ` - .allocation-row td { display: none; } - .task-events table td:nth-child(1) { color: transparent; } - `, - }); await click('.sidebar button.close'); assert.notOk(TaskLogs.sidebarIsPresent, 'Sidebar is not present'); diff --git a/ui/tests/acceptance/token-test.js b/ui/tests/acceptance/token-test.js index 456e21f45c6..7377945f9c5 100644 --- a/ui/tests/acceptance/token-test.js +++ b/ui/tests/acceptance/token-test.js @@ -22,7 +22,6 @@ import JobDetail from 'nomad-ui/tests/pages/jobs/detail'; import ClientDetail from 'nomad-ui/tests/pages/clients/detail'; import Layout from 'nomad-ui/tests/pages/layout'; import Administration from 'nomad-ui/tests/pages/administration'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; import moment from 'moment'; import { run } from '@ember/runloop'; @@ -152,8 +151,6 @@ module('Acceptance | tokens', function (hooks) { await Tokens.visit(); await Tokens.secret(secretId).submit(); - await percySnapshot(assert); - assert.ok(Tokens.successMessage, 'Token success message is shown'); assert.notOk(Tokens.errorMessage, 'Token error message is not shown'); assert.ok(Tokens.managementMessage, 'Token management message is shown'); @@ -345,10 +342,6 @@ module('Acceptance | tokens', function (hooks) { .doesNotExist('No notification yet for a token with 10m5s left'); notificationNotRendered(); setTimeout(async () => { - await percySnapshot(assert, { - percyCSS: '[data-test-expiration-timestamp] { display: none; }', - }); - assert .dom('.flash-message.alert-warning') .exists('Notification is rendered at the 10m mark'); @@ -394,8 +387,6 @@ module('Acceptance | tokens', function (hooks) { assert.dom(managerButton).exists(); await click(managerButton); - await percySnapshot(assert); - assert.ok(currentURL().startsWith('/settings/tokens')); assert.dom('[data-test-token-name]').includesText('Token: Manager'); }); @@ -456,7 +447,6 @@ module('Acceptance | tokens', function (hooks) { 'Redirected with failure state' ); - await percySnapshot(assert); assert.ok(Tokens.ssoErrorMessage); }); @@ -742,7 +732,6 @@ module('Acceptance | tokens', function (hooks) { { count: existingTokens.length }, 'One fewer token after deletion' ); - await percySnapshot(assert); window.localStorage.nomadTokenSecret = null; }); @@ -780,7 +769,6 @@ module('Acceptance | tokens', function (hooks) { assert .dom('[data-test-policy-token-row]:last-child [data-test-token-name]') .hasText(`Example Token for ${testPolicy.name}`); - await percySnapshot(assert); window.localStorage.nomadTokenSecret = null; }); @@ -947,8 +935,6 @@ module('Acceptance | tokens', function (hooks) { assert.dom(policyBlocks[1]).hasText('client-reader'); assert.dom(policyBlocks[2]).hasText('job-reader'); - await percySnapshot(assert); - await Tokens.clear(); // User with 2 roles, each containing 1 policy, and one of the policies is also directly on their token @@ -1029,8 +1015,6 @@ module('Acceptance | tokens', function (hooks) { assert .dom('[data-test-token-row]') .exists({ count: server.db.tokens.length }); - - await percySnapshot(assert); }); test('Tokens index, management token handling', async function (assert) { @@ -1327,8 +1311,6 @@ module('Acceptance | tokens', function (hooks) { await click('[data-test-token-save]'); assert.dom('.flash-message.alert-success').exists(); - await percySnapshot(assert); - await Administration.visitTokens(); // Policies cell for our clay token should read "No Policies" const clayToken = server.db.tokens.findBy((t) => t.id === 'cl4y-t0k3n'); @@ -1409,7 +1391,6 @@ module('Acceptance | tokens', function (hooks) { assert .dom('[data-test-token-expiration-time-input]') .exists('HTML datetime-local picker exists'); - await percySnapshot(assert); // select a date/time for 100 minutes into the future in GMT const soon = new Date(); soon.setMinutes(soon.getMinutes() + 100); @@ -1523,7 +1504,6 @@ module('Tokens and Regions', function (hooks) { 'america', 'Global token is saved in the authoritative region, regardless of active UI region' ); - await percySnapshot(assert); }); test('A token can be created in a non-authoritative region', async function (assert) { diff --git a/ui/tests/acceptance/topology-test.js b/ui/tests/acceptance/topology-test.js index 792107fa24e..6440d9ff450 100644 --- a/ui/tests/acceptance/topology-test.js +++ b/ui/tests/acceptance/topology-test.js @@ -18,7 +18,6 @@ import { formatScheduledHertz, } from 'nomad-ui/utils/units'; import queryString from 'query-string'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; const sumResources = (list, dimension) => @@ -51,8 +50,6 @@ module('Acceptance | topology', function (hooks) { await Topology.visit(); - await percySnapshot(assert); - assert.equal(Topology.infoPanelTitle, 'Cluster Details'); assert.notOk(Topology.filteredNodesWarning.isPresent); diff --git a/ui/tests/acceptance/variables-test.js b/ui/tests/acceptance/variables-test.js index af1b420d9fa..24c4d30c24e 100644 --- a/ui/tests/acceptance/variables-test.js +++ b/ui/tests/acceptance/variables-test.js @@ -19,7 +19,6 @@ import { module, test } from 'qunit'; import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit'; import { allScenarios } from '../../mirage/scenarios/default'; import cleanWhitespace from '../utils/clean-whitespace'; -import percySnapshot from '@percy/ember'; import faker from 'nomad-ui/mirage/faker'; import Variables from 'nomad-ui/tests/pages/variables'; @@ -59,7 +58,6 @@ module('Acceptance | variables', function (hooks) { await Variables.visit(); assert.equal(currentURL(), '/variables'); assert.ok(Layout.gutter.variables.isVisible); - await percySnapshot(assert); }); test('it correctly traverses to and deletes a variable', async function (assert) { @@ -104,8 +102,6 @@ module('Acceptance | variables', function (hooks) { assert.ok(fooLink, 'foo0 file is present'); - await percySnapshot(assert); - await click(fooLink); assert.ok( currentURL().includes('/variables/var/a/b/c/foo0'), @@ -114,8 +110,6 @@ module('Acceptance | variables', function (hooks) { const deleteButton = find('[data-test-delete-button] button'); assert.dom(deleteButton).exists('delete button is present'); - await percySnapshot('deeply nested variable'); - await click(deleteButton); assert .dom('[data-test-confirmation-message]') @@ -216,8 +210,6 @@ module('Acceptance | variables', function (hooks) { 'Related Entities box is job-oriented' ); - await percySnapshot('related entities box for job variable'); - let relatedJobLink = find('.related-entities a'); await click(relatedJobLink); assert @@ -252,8 +244,6 @@ module('Acceptance | variables', function (hooks) { 'Related Entities box is group-oriented' ); - await percySnapshot('related entities box for group variable'); - let relatedGroupLink = find('.related-entities a'); await click(relatedGroupLink); assert @@ -290,8 +280,6 @@ module('Acceptance | variables', function (hooks) { 'Related Entities box is task-oriented' ); - await percySnapshot('related entities box for task variable'); - let relatedTaskLink = find('.related-entities a'); await click(relatedTaskLink); // Gotta go the long way and click into the alloc/then task from here; but we know this one by virtue of stable test env. @@ -370,8 +358,6 @@ module('Acceptance | variables', function (hooks) { await typeIn('[data-test-var-key]', 'myKey'); await typeIn('[data-test-var-value]', 'superSecret'); - await percySnapshot(assert); - await click('button[type="submit"]'); assert.dom('.flash-message.alert-success').exists(); @@ -594,8 +580,6 @@ module('Acceptance | variables', function (hooks) { 'Clicking the button navigates you to editing view.' ); - await percySnapshot(assert); - assert.dom('[data-test-path-input]').isDisabled('Path cannot be edited'); document.querySelector('[data-test-var-key]').value = ''; // clear current input @@ -1030,7 +1014,6 @@ module('Acceptance | variables', function (hooks) { assert.dom('[data-test-no-auto-vars-message]').exists(); assert.dom('[data-test-create-variable-button]').exists(); - await percySnapshot(assert); window.localStorage.nomadTokenSecret = null; // Reset Token }); diff --git a/ui/tests/integration/components/job-editor-test.js b/ui/tests/integration/components/job-editor-test.js index 0da27ea2929..bfad70e1744 100644 --- a/ui/tests/integration/components/job-editor-test.js +++ b/ui/tests/integration/components/job-editor-test.js @@ -15,7 +15,6 @@ import jobEditor from 'nomad-ui/tests/pages/components/job-editor'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; import setupCodeMirror from 'nomad-ui/tests/helpers/codemirror'; import { componentA11yAudit } from 'nomad-ui/tests/helpers/a11y-audit'; -import percySnapshot from '@percy/ember'; const Editor = create(jobEditor()); @@ -319,8 +318,6 @@ module('Integration | Component | job-editor', function (hooks) { ); await componentA11yAudit(this.element, assert); - - await percySnapshot(assert); }); test('When the scheduler dry-run has warnings, the warnings are shown to the user', async function (assert) { @@ -333,7 +330,6 @@ module('Integration | Component | job-editor', function (hooks) { Editor.warningMessage.isPresent, 'The scheduler dry-run warning block is shown to the user' ); - await percySnapshot(assert); }); test('when the scheduler dry-run has no warnings, a success message is shown to the user', async function (assert) { diff --git a/ui/tests/integration/components/job-status-panel-test.js b/ui/tests/integration/components/job-status-panel-test.js index 66207ca05d0..685d336857c 100644 --- a/ui/tests/integration/components/job-status-panel-test.js +++ b/ui/tests/integration/components/job-status-panel-test.js @@ -10,7 +10,6 @@ import hbs from 'htmlbars-inline-precompile'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; import { componentA11yAudit } from 'nomad-ui/tests/helpers/a11y-audit'; -import percySnapshot from '@percy/ember'; module( 'Integration | Component | job status panel | active deployment', @@ -322,10 +321,6 @@ module( '25 Running 0 Complete' ); - await percySnapshot( - "Job Status Panel: 'New' and 'Previous' allocations, initial deploying state" - ); - // Try setting a few of the old allocs to complete and make sure number ticks down await Promise.all( this.get('job.allocations') @@ -374,10 +369,6 @@ module( '20 Running 5 Complete' ); - await percySnapshot( - "Job Status Panel: 'New' and 'Previous' allocations, some old marked complete" - ); - await componentA11yAudit( this.element, assert, diff --git a/ui/tests/integration/components/variable-form-test.js b/ui/tests/integration/components/variable-form-test.js index 890cb2bbcf5..f864aef755f 100644 --- a/ui/tests/integration/components/variable-form-test.js +++ b/ui/tests/integration/components/variable-form-test.js @@ -11,7 +11,6 @@ import { click, typeIn, find, findAll, render } from '@ember/test-helpers'; import { setupMirage } from 'ember-cli-mirage/test-support'; import setupCodeMirror from 'nomad-ui/tests/helpers/codemirror'; import { codeFillable, code } from 'nomad-ui/tests/pages/helpers/codemirror'; -import percySnapshot from '@percy/ember'; import { clickToggle, clickOption } from 'nomad-ui/tests/helpers/helios'; import faker from 'nomad-ui/mirage/faker'; @@ -142,7 +141,6 @@ module('Integration | Component | variable-form', function (hooks) { secondRow.classList.contains('hds-form-masked-input--is-masked'), 'Rows that are not clicked remain obscured' ); - await percySnapshot(assert); }); }); @@ -450,8 +448,6 @@ module('Integration | Component | variable-form', function (hooks) { hbs`` ); - await percySnapshot(assert); - const keyValuesAsJSON = keyValues.reduce((acc, { key, value }) => { acc[key] = value; return acc;