diff --git a/packages/pn-commons/package.json b/packages/pn-commons/package.json index fc091ce8ee..75b4fcdf67 100644 --- a/packages/pn-commons/package.json +++ b/packages/pn-commons/package.json @@ -28,7 +28,6 @@ "build": "tsc -p tsconfig.prod.json", "test": "tsc --noEmit && vitest --run", "test:fast": "vitest --run", - "test:a11y": "vitest --run --config ./vite.config.a11y.ts", "test:all": "vitest --run --config ./vite.config.all.ts", "test:coverage": "tsc --noEmit && vitest run --coverage", "lint": "eslint . -c .eslintrc.js --ext .ts,.tsx --fix", @@ -62,6 +61,7 @@ "@testing-library/user-event": "^14.5.1", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/css-mediaquery": "^0.1.1", + "@types/jest": "^29.5.12", "@typescript-eslint/eslint-plugin": "^6.7.3", "@typescript-eslint/parser": "^6.7.3", "@vitejs/plugin-react": "^4.2.1", diff --git a/packages/pn-commons/src/components/Notifications/__test__/NewNotificationBadge.a11y.test.tsx b/packages/pn-commons/src/components/Notifications/__test__/NewNotificationBadge.a11y.test.tsx deleted file mode 100644 index 961ea63e66..0000000000 --- a/packages/pn-commons/src/components/Notifications/__test__/NewNotificationBadge.a11y.test.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { axe } from 'jest-axe'; - -import { NotificationStatus } from '@pagopa-pn/pn-commons'; - -import { render } from '../../../test-utils'; -import NewNotificationBadge from '../NewNotificationBadge'; - -describe('NewNotificationBadge component - accessibility tests', () => { - it('is accessible', async () => { - const notificationStatus = NotificationStatus.ACCEPTED; - const { container } = render(); - const results = await axe(container); - expect(results).toHaveNoViolations(); - }); -}); diff --git a/packages/pn-commons/src/components/SideMenu/__test__/SideMenu.a11y.test.tsx b/packages/pn-commons/src/components/SideMenu/__test__/SideMenu.a11y.test.tsx deleted file mode 100644 index 0c8c93f5d2..0000000000 --- a/packages/pn-commons/src/components/SideMenu/__test__/SideMenu.a11y.test.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { axe, toHaveNoViolations } from 'jest-axe'; - -import { sideMenuItems } from '../../../__mocks__/SideMenu.mock'; -import { render } from '../../../test-utils'; -import SideMenu from '../SideMenu'; - -expect.extend(toHaveNoViolations); - -describe('SideMenu - accessibility tests', () => { - it('sidemenu accesibility', async () => { - const { container } = render(); - const results = await axe(container); - expect(results).toHaveNoViolations(); - }); -}); diff --git a/packages/pn-commons/vite.config.a11y.ts b/packages/pn-commons/vite.config.a11y.ts deleted file mode 100644 index 74413cc01d..0000000000 --- a/packages/pn-commons/vite.config.a11y.ts +++ /dev/null @@ -1,18 +0,0 @@ -/// -import { defineConfig } from 'vite'; - -import react from '@vitejs/plugin-react'; - -// https://vitejs.dev/config/ -export default defineConfig(() => { - return { - plugins: [react()], - test: { - globals: true, - setupFiles: './src/setupTests.ts', - environment: 'jsdom', - include: ['**/*.a11y.test.ts', '**/*.a11y.test.tsx'], - reporters: ['default'], - } - }; -}); diff --git a/packages/pn-commons/vite.config.mts b/packages/pn-commons/vite.config.mts index 5177cb9fba..ad5ae7ed7a 100644 --- a/packages/pn-commons/vite.config.mts +++ b/packages/pn-commons/vite.config.mts @@ -12,13 +12,12 @@ const vitestConfig = defineVitestConfig({ globals: true, setupFiles: './src/setupTests.ts', environment: 'jsdom', - exclude: [...configDefaults.exclude, '**/*.a11y.test.ts', '**/*.a11y.test.tsx'], + exclude: configDefaults.exclude, reporters: ['vitest-sonar-reporter', 'default'], outputFile: 'test-report.xml', coverage: { provider: 'v8', reporter: ['lcov'], - exclude: ['**/*.a11y.test.ts', '**/*.a11y.test.tsx'], reportOnFailure: true, }, }, diff --git a/packages/pn-pa-webapp/package.json b/packages/pn-pa-webapp/package.json index 7fa3bd11b4..2cf749df57 100644 --- a/packages/pn-pa-webapp/package.json +++ b/packages/pn-pa-webapp/package.json @@ -41,7 +41,6 @@ "preview": "vite preview", "test": "tsc && vitest --run", "test:fast": "vitest --run", - "test:a11y": "vitest --run --config ./vite.config.a11y.ts", "test:all": "vitest --run --config ./vite.config.all.ts", "test:coverage": "tsc && vitest run --coverage", "lint": "eslint . -c .eslintrc.js --ext .ts,.tsx --fix", @@ -69,7 +68,7 @@ "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.5.1", "@trivago/prettier-plugin-sort-imports": "^4.3.0", - "@types/jest-axe": "^3.5.3", + "@types/jest": "^29.5.12", "@types/mixpanel-browser": "^2.38.0", "@typescript-eslint/eslint-plugin": "^6.7.3", "@typescript-eslint/parser": "^6.7.3", @@ -84,7 +83,6 @@ "eslint-plugin-react": "^7.27.1", "eslint-plugin-react-hooks": "^4.3.0", "eslint-plugin-sonarjs": "^0.10.0", - "jest-axe": "^6.0.0", "jsdom": "^24.0.0", "prettier": "^2.4.1", "sonarqube-scanner": "^3.3.0", diff --git a/packages/pn-pa-webapp/src/__test__/App.a11y.test.tsx b/packages/pn-pa-webapp/src/__test__/App.a11y.test.tsx deleted file mode 100644 index cfcd821b1b..0000000000 --- a/packages/pn-pa-webapp/src/__test__/App.a11y.test.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import MockAdapter from 'axios-mock-adapter'; -import { vi } from 'vitest'; - -import { ThemeProvider } from '@emotion/react'; -import { theme } from '@pagopa/mui-italia'; - -import App from '../App'; -import { currentStatusDTO } from '../__mocks__/AppStatus.mock'; -import { userResponse } from '../__mocks__/Auth.mock'; -import { apiClient } from '../api/apiClients'; -import { GET_CONSENTS } from '../api/consents/consents.routes'; -import { ConsentType } from '../models/consents'; -import { RenderResult, act, axe, render } from './test-utils'; - -// mock imports -vi.mock('react-i18next', () => ({ - // this mock makes sure any components using the translation hook can use it without a warning being shown - Trans: (props: { i18nKey: string }) => props.i18nKey, - useTranslation: () => ({ - t: (str: string) => str, - i18n: { language: 'it' }, - }), -})); - -vi.mock('../pages/Dashboard.page', () => () =>
Generic Page
); - -const unmockedFetch = global.fetch; - -const Component = () => ( - - - -); - -const reduxInitialState = { - userState: { - user: userResponse, - fetchedTos: false, - fetchedPrivacy: false, - tosConsent: { - accepted: false, - isFirstAccept: false, - currentVersion: 'mocked-version-1', - }, - privacyConsent: { - accepted: false, - isFirstAccept: false, - currentVersion: 'mocked-version-1', - }, - }, -}; - -describe('App - accessbility tests', () => { - let mock: MockAdapter; - - beforeAll(() => { - mock = new MockAdapter(apiClient); - // FooterPreLogin (mui-italia) component calls an api to fetch selfcare products list. - // this causes an error, so we mock to avoid it - global.fetch = () => - Promise.resolve({ - json: () => Promise.resolve([]), - }) as Promise; - }); - - afterEach(() => { - mock.reset(); - }); - - afterAll(() => { - mock.restore(); - global.fetch = unmockedFetch; - }); - - it('Test if automatic accessibility tests passes - user not logged in', async () => { - const { container } = render(); - const result = await axe(container); - expect(result).toHaveNoViolations(); - }); - - it('Test if automatic accessibility tests passes - user logged in', async () => { - mock.onGet(GET_CONSENTS(ConsentType.DATAPRIVACY)).reply(200, { - recipientId: userResponse.uid, - consentType: ConsentType.DATAPRIVACY, - accepted: true, - }); - mock.onGet(GET_CONSENTS(ConsentType.TOS)).reply(200, { - recipientId: userResponse.uid, - consentType: ConsentType.TOS, - accepted: true, - }); - mock.onGet('downtime/v1/status').reply(200, currentStatusDTO); - let result: RenderResult | undefined; - await act(async () => { - result = render(, { preloadedState: reduxInitialState }); - }); - if (result) { - const results = await axe(result.container); - expect(results).toHaveNoViolations(); - } - }, 15000); - - it('Test if automatic accessibility tests passes - errors on API call', async () => { - mock.onGet(GET_CONSENTS(ConsentType.DATAPRIVACY)).reply(200, { - recipientId: userResponse.uid, - consentType: ConsentType.DATAPRIVACY, - accepted: true, - }); - mock.onGet(GET_CONSENTS(ConsentType.TOS)).reply(500); - mock.onGet('downtime/v1/status').reply(200, currentStatusDTO); - let result: RenderResult | undefined; - await act(async () => { - result = render(, { preloadedState: reduxInitialState }); - }); - if (result) { - const results = await axe(result.container); - expect(results).toHaveNoViolations(); - } - }, 15000); -}); diff --git a/packages/pn-pa-webapp/src/__test__/test-utils.tsx b/packages/pn-pa-webapp/src/__test__/test-utils.tsx index 9fc43503ec..c461c4b367 100644 --- a/packages/pn-pa-webapp/src/__test__/test-utils.tsx +++ b/packages/pn-pa-webapp/src/__test__/test-utils.tsx @@ -1,4 +1,3 @@ -import { configureAxe, toHaveNoViolations } from 'jest-axe'; import { ReactElement, ReactNode } from 'react'; import { Provider } from 'react-redux'; import { BrowserRouter } from 'react-router-dom'; @@ -37,12 +36,6 @@ const customRender = ( }); }; -const axe = configureAxe({ - rules: { - region: { enabled: false }, - }, -}); - // utility functions /** * Generate a random string with specified length @@ -57,10 +50,7 @@ function randomString(length: number) { return result; } -expect.extend(toHaveNoViolations); - export * from '@testing-library/react'; export { customRender as render, testStore }; -export { axe }; // utility functions export { randomString }; diff --git a/packages/pn-pa-webapp/src/components/Notifications/__test__/DesktopNotifications.a11y.test.tsx b/packages/pn-pa-webapp/src/components/Notifications/__test__/DesktopNotifications.a11y.test.tsx deleted file mode 100644 index d470e7c628..0000000000 --- a/packages/pn-pa-webapp/src/components/Notifications/__test__/DesktopNotifications.a11y.test.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import { vi } from 'vitest'; - -import { formatToTimezoneString, tenYearsAgo, today } from '@pagopa-pn/pn-commons'; - -import { notificationsToFe } from '../../../__mocks__/Notifications.mock'; -import { RenderResult, act, axe, render } from '../../../__test__/test-utils'; -import DesktopNotifications from '../DesktopNotifications'; - -vi.mock('react-i18next', () => ({ - // this mock makes sure any components using the translate hook can use it without a warning being shown - useTranslation: () => ({ - t: (str: string) => str, - i18n: { language: 'it' }, - }), -})); - -describe('DesktopNotifications Component - accessibility tests', () => { - it('does not have basic accessibility issues', async () => { - let result: RenderResult | undefined; - await act(async () => { - result = render( - {}} - onApiKeys={() => {}} - /> - ); - }); - if (result) { - const res = await axe(result.container); - expect(res).toHaveNoViolations(); - } else { - fail('render() returned undefined!'); - } - }, 15000); - - it('does not have basic accessibility issues (empty notifications)', async () => { - let result: RenderResult | undefined; - await act(async () => { - result = render( - {}} onApiKeys={() => {}} /> - ); - }); - if (result) { - const res = await axe(result.container); - expect(res).toHaveNoViolations(); - } else { - fail('render() returned undefined!'); - } - }, 15000); - - it('does not have basic accessibility issues (empty notifications after filter)', async () => { - let result: RenderResult | undefined; - await act(async () => { - result = render( - {}} onApiKeys={() => {}} />, - { - preloadedState: { - dashboardState: { - filters: { - startDate: formatToTimezoneString(tenYearsAgo), - endDate: formatToTimezoneString(today), - iunMatch: 'ABCD-EFGH-ILMN-123456-A-1', - }, - }, - }, - } - ); - }); - // the rerendering must be done to take the useRef updates - result!.rerender( - {}} onApiKeys={() => {}} /> - ); - if (result) { - const res = await axe(result.container); - expect(res).toHaveNoViolations(); - } else { - fail('render() returned undefined!'); - } - }, 15000); -}); diff --git a/packages/pn-pa-webapp/src/components/Notifications/__test__/FilterNotifications.a11y.test.tsx b/packages/pn-pa-webapp/src/components/Notifications/__test__/FilterNotifications.a11y.test.tsx deleted file mode 100644 index 5f2e4e40a4..0000000000 --- a/packages/pn-pa-webapp/src/components/Notifications/__test__/FilterNotifications.a11y.test.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { vi } from 'vitest'; - -import { createMatchMedia } from '@pagopa-pn/pn-commons/src/test-utils'; - -import { - RenderResult, - act, - axe, - fireEvent, - render, - screen, - waitFor, -} from '../../../__test__/test-utils'; -import FilterNotifications from '../FilterNotifications'; - -vi.mock('react-i18next', () => ({ - // this mock makes sure any components using the translate hook can use it without a warning being shown - useTranslation: () => ({ - t: (str: string) => str, - i18n: { language: 'it' }, - }), -})); - -describe('Filter Notifications Table Component - accessibility tests', () => { - const original = window.matchMedia; - - afterAll(() => { - window.matchMedia = original; - }); - - it('does not have basic accessibility issues - desktop', async () => { - let result: RenderResult | undefined; - - await act(async () => { - result = render(); - }); - - if (result) { - const results = await axe(result.container); - expect(results).toHaveNoViolations(); - } - }, 15000); - - it('does not have basic accessibility issues - mobile', async () => { - window.matchMedia = createMatchMedia(800); - let result: RenderResult | undefined; - - await act(async () => { - result = render(); - }); - - const button = result!.getByTestId('dialogToggleButton'); - fireEvent.click(button); - - const dialogForm = await waitFor(() => screen.getByTestId('filter-form')); - expect(dialogForm).toBeInTheDocument(); - - if (dialogForm) { - const results = await axe(dialogForm); - expect(results).toHaveNoViolations(); - } - }, 15000); -}); diff --git a/packages/pn-pa-webapp/src/components/Notifications/__test__/MobileNotifications.a11y.test.tsx b/packages/pn-pa-webapp/src/components/Notifications/__test__/MobileNotifications.a11y.test.tsx deleted file mode 100644 index 488c0a76f5..0000000000 --- a/packages/pn-pa-webapp/src/components/Notifications/__test__/MobileNotifications.a11y.test.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import { vi } from 'vitest'; - -import { formatToTimezoneString, tenYearsAgo, today } from '@pagopa-pn/pn-commons'; - -import { notificationsToFe } from '../../../__mocks__/Notifications.mock'; -import { RenderResult, act, axe, render } from '../../../__test__/test-utils'; -import MobileNotifications from '../MobileNotifications'; - -vi.mock('react-i18next', () => ({ - // this mock makes sure any components using the translate hook can use it without a warning being shown - useTranslation: () => ({ - t: (str: string) => str, - i18n: { language: 'it' }, - }), -})); - -describe('MobileNotifications Component - accessibility tests', () => { - it('does not have basic accessibility issues', async () => { - let result: RenderResult | undefined; - await act(async () => { - result = render( - {}} - onApiKeys={() => {}} - /> - ); - }); - if (result) { - const res = await axe(result.container); - expect(res).toHaveNoViolations(); - } else { - fail('render() returned undefined!'); - } - }, 15000); - - it('does not have basic accessibility issues (empty notifications)', async () => { - let result: RenderResult | undefined; - await act(async () => { - result = render( - {}} onApiKeys={() => {}} /> - ); - }); - if (result) { - const res = await axe(result.container); - expect(res).toHaveNoViolations(); - } else { - fail('render() returned undefined!'); - } - }, 15000); - - it('does not have basic accessibility issues (empty notifications after filter)', async () => { - let result: RenderResult | undefined; - await act(async () => { - result = render( - {}} onApiKeys={() => {}} />, - { - preloadedState: { - dashboardState: { - filters: { - startDate: formatToTimezoneString(tenYearsAgo), - endDate: formatToTimezoneString(today), - iunMatch: 'ABCD-EFGH-ILMN-123456-A-1', - }, - }, - }, - } - ); - }); - // the rerendering must be done to take the useRef updates - result!.rerender( - {}} onApiKeys={() => {}} /> - ); - if (result) { - const res = await axe(result.container); - expect(res).toHaveNoViolations(); - } else { - fail('render() returned undefined!'); - } - }, 15000); -}); diff --git a/packages/pn-pa-webapp/src/pages/__test__/ApiKeys.page.a11y.test.tsx b/packages/pn-pa-webapp/src/pages/__test__/ApiKeys.page.a11y.test.tsx deleted file mode 100644 index 7977dbb79f..0000000000 --- a/packages/pn-pa-webapp/src/pages/__test__/ApiKeys.page.a11y.test.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import MockAdapter from 'axios-mock-adapter'; -import { vi } from 'vitest'; - -import { AppResponseMessage, ResponseEventDispatcher } from '@pagopa-pn/pn-commons'; - -import { mockApiKeysDTO, mockGroups } from '../../__mocks__/ApiKeys.mock'; -import { RenderResult, act, axe, render } from '../../__test__/test-utils'; -import { apiClient } from '../../api/apiClients'; -import { APIKEY_LIST } from '../../api/apiKeys/apiKeys.routes'; -import { GET_USER_GROUPS } from '../../api/notifications/notifications.routes'; -import ApiKeys from '../ApiKeys.page'; - -vi.mock('react-i18next', () => ({ - // this mock makes sure any components using the translate hook can use it without a warning being shown - useTranslation: () => ({ - t: (str: string) => str, - }), -})); - -const reduxInitialState = { - apiKeysState: { - loading: false, - apiKeys: { items: [], total: 0 }, - pagination: { - size: 10, - page: 0, - nextPagesKey: [], - }, - }, -}; - -describe('ApiKeys Page - accessibility tests', () => { - let mock: MockAdapter; - let result: RenderResult | undefined; - - beforeAll(() => { - mock = new MockAdapter(apiClient); - }); - - afterEach(() => { - result = undefined; - mock.reset(); - }); - - afterAll(() => { - mock.restore(); - }); - - it('empty list', async () => { - mock.onGet(APIKEY_LIST({ limit: 10 })).reply(200, []); - mock.onGet(GET_USER_GROUPS()).reply(200, mockGroups); - await act(async () => { - result = render(, { preloadedState: reduxInitialState }); - }); - const results = await axe(result!.container); - expect(results).toHaveNoViolations(); - }, 15000); - - it('no empty list', async () => { - mock.onGet(APIKEY_LIST({ limit: 10 })).reply(200, mockApiKeysDTO); - mock.onGet(GET_USER_GROUPS()).reply(200, mockGroups); - await act(async () => { - result = render(, { preloadedState: reduxInitialState }); - }); - const results = await axe(result!.container); - expect(results).toHaveNoViolations(); - }, 15000); - - it('api return error', async () => { - mock.onGet(APIKEY_LIST({ limit: 10 })).reply(500); - mock.onGet(GET_USER_GROUPS()).reply(200, mockGroups); - await act(async () => { - result = render( - <> - - - - - ); - }); - const results = await axe(result!.container); - expect(results).toHaveNoViolations(); - }, 15000); -}); diff --git a/packages/pn-pa-webapp/src/pages/__test__/Dashboard.page.a11y.test.tsx b/packages/pn-pa-webapp/src/pages/__test__/Dashboard.page.a11y.test.tsx deleted file mode 100644 index 5063625dda..0000000000 --- a/packages/pn-pa-webapp/src/pages/__test__/Dashboard.page.a11y.test.tsx +++ /dev/null @@ -1,107 +0,0 @@ -import MockAdapter from 'axios-mock-adapter'; -import { vi } from 'vitest'; - -import { - AppResponseMessage, - ResponseEventDispatcher, - formatToTimezoneString, - tenYearsAgo, - today, -} from '@pagopa-pn/pn-commons'; - -import { emptyNotificationsFromBe, notificationsDTO } from '../../__mocks__/Notifications.mock'; -import { RenderResult, act, axe, render } from '../../__test__/test-utils'; -import { apiClient } from '../../api/apiClients'; -import { NOTIFICATIONS_LIST } from '../../api/notifications/notifications.routes'; -import Dashboard from '../Dashboard.page'; - -vi.mock('react-i18next', () => ({ - // this mock makes sure any components using the translate hook can use it without a warning being shown - useTranslation: () => ({ - t: (str: string) => str, - i18n: { language: 'it' }, - }), -})); - -describe('Dashboard Page - accessibility tests', () => { - let mock: MockAdapter; - let result: RenderResult | undefined; - - beforeAll(() => { - mock = new MockAdapter(apiClient); - }); - - afterEach(() => { - mock.reset(); - }); - - afterAll(() => { - mock.restore(); - }); - - it('does not have basic accessibility issues rendering the page - no notifications', async () => { - mock - .onGet( - NOTIFICATIONS_LIST({ - startDate: formatToTimezoneString(tenYearsAgo), - endDate: formatToTimezoneString(today), - size: 10, - }) - ) - .reply(200, emptyNotificationsFromBe); - - await act(async () => { - result = render(); - }); - if (result) { - const results = await axe(result.container); - expect(results).toHaveNoViolations(); - } - }, 15000); - - it('does not have basic accessibility issues rendering the page', async () => { - mock - .onGet( - NOTIFICATIONS_LIST({ - startDate: formatToTimezoneString(tenYearsAgo), - endDate: formatToTimezoneString(today), - size: 10, - }) - ) - .reply(200, notificationsDTO); - - await act(async () => { - result = render(); - }); - if (result) { - const results = await axe(result.container); - expect(results).toHaveNoViolations(); - } - }, 15000); - - it('does not have basic accessibility issues rendering the page - errors on api', async () => { - mock - .onGet( - NOTIFICATIONS_LIST({ - startDate: formatToTimezoneString(tenYearsAgo), - endDate: formatToTimezoneString(today), - size: 10, - }) - ) - .reply(500); - - await act(async () => { - result = render( - <> - - - - - ); - }); - if (result) { - const results = await axe(result.container); - expect(results).toHaveNoViolations(); - } - }, 15000); -}); diff --git a/packages/pn-pa-webapp/src/pages/__test__/NotificationDetail.page.a11y.test.tsx b/packages/pn-pa-webapp/src/pages/__test__/NotificationDetail.page.a11y.test.tsx deleted file mode 100644 index 76ebb00486..0000000000 --- a/packages/pn-pa-webapp/src/pages/__test__/NotificationDetail.page.a11y.test.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import MockAdapter from 'axios-mock-adapter'; -import { vi } from 'vitest'; - -import { - AppResponseMessage, - DOWNTIME_HISTORY, - ResponseEventDispatcher, -} from '@pagopa-pn/pn-commons'; - -import { downtimesDTO } from '../../__mocks__/AppStatus.mock'; -import { - notificationDTO, - notificationDTOMultiRecipient, -} from '../../__mocks__/NotificationDetail.mock'; -import { RenderResult, act, axe, render } from '../../__test__/test-utils'; -import { apiClient } from '../../api/apiClients'; -import { NOTIFICATION_DETAIL } from '../../api/notifications/notifications.routes'; -import NotificationDetail from '../NotificationDetail.page'; - -vi.mock('react-i18next', () => ({ - // this mock makes sure any components using the translate hook can use it without a warning being shown - useTranslation: () => ({ - t: (str: string) => str, - }), -})); - -describe('NotificationDetail Page - accessibility tests', () => { - let mock: MockAdapter; - let result: RenderResult | undefined; - - beforeAll(() => { - mock = new MockAdapter(apiClient); - }); - - afterEach(() => { - result = undefined; - mock.reset(); - }); - - afterAll(() => { - mock.restore(); - }); - - it('one recipient - does not have basic accessibility issues rendering the page', async () => { - mock.onGet(NOTIFICATION_DETAIL(notificationDTO.iun)).reply(200, notificationDTO); - // we use regexp to not set the query parameters - mock.onGet(new RegExp(DOWNTIME_HISTORY({ startDate: '' }))).reply(200, downtimesDTO); - await act(async () => { - result = render(); - }); - if (result) { - const results = await axe(result.container); - expect(results).toHaveNoViolations(); - } - }, 15000); - - it('one recipient - does not have basic accessibility issues rendering the page when API call returns error', async () => { - mock.onGet(NOTIFICATION_DETAIL(notificationDTO.iun)).reply(500); - // we use regexp to not set the query parameters - mock.onGet(new RegExp(DOWNTIME_HISTORY({ startDate: '' }))).reply(200, downtimesDTO); - await act(async () => { - result = render( - <> - - - - - ); - }); - if (result) { - const results = await axe(result.container); - expect(results).toHaveNoViolations(); - } - }, 15000); - - it('multi recipient - does not have basic accessibility issues rendering the page', async () => { - mock.onGet(NOTIFICATION_DETAIL(notificationDTOMultiRecipient.iun)).reply(200, notificationDTO); - // we use regexp to not set the query parameters - mock.onGet(new RegExp(DOWNTIME_HISTORY({ startDate: '' }))).reply(200, downtimesDTO); - await act(async () => { - result = render(); - }); - if (result) { - const results = await axe(result.container); - expect(results).toHaveNoViolations(); - } - }, 15000); -}); diff --git a/packages/pn-pa-webapp/vite.config.a11y.ts b/packages/pn-pa-webapp/vite.config.a11y.ts deleted file mode 100644 index 74413cc01d..0000000000 --- a/packages/pn-pa-webapp/vite.config.a11y.ts +++ /dev/null @@ -1,18 +0,0 @@ -/// -import { defineConfig } from 'vite'; - -import react from '@vitejs/plugin-react'; - -// https://vitejs.dev/config/ -export default defineConfig(() => { - return { - plugins: [react()], - test: { - globals: true, - setupFiles: './src/setupTests.ts', - environment: 'jsdom', - include: ['**/*.a11y.test.ts', '**/*.a11y.test.tsx'], - reporters: ['default'], - } - }; -}); diff --git a/packages/pn-pa-webapp/vite.config.mts b/packages/pn-pa-webapp/vite.config.mts index 8d7a5f4a71..c2bdc7754b 100644 --- a/packages/pn-pa-webapp/vite.config.mts +++ b/packages/pn-pa-webapp/vite.config.mts @@ -9,13 +9,13 @@ const vitestConfig = defineVitestConfig({ globals: true, setupFiles: './src/setupTests.ts', environment: 'jsdom', - exclude: [...configDefaults.exclude, '**/*.a11y.test.ts', '**/*.a11y.test.tsx'], + exclude: configDefaults.exclude, reporters: ['vitest-sonar-reporter', 'default'], outputFile: 'test-report.xml', coverage: { provider: 'v8', reporter: ['lcov'], - exclude: ['**/*.a11y.test.ts', '**/*.a11y.test.tsx', 'src/models/**'], + exclude: ['src/models/**'], reportOnFailure: true, }, }, diff --git a/packages/pn-personafisica-webapp/vite.config.a11y.ts b/packages/pn-personafisica-webapp/vite.config.a11y.ts index 74413cc01d..9866859847 100644 --- a/packages/pn-personafisica-webapp/vite.config.a11y.ts +++ b/packages/pn-personafisica-webapp/vite.config.a11y.ts @@ -13,6 +13,6 @@ export default defineConfig(() => { environment: 'jsdom', include: ['**/*.a11y.test.ts', '**/*.a11y.test.tsx'], reporters: ['default'], - } + }, }; }); diff --git a/packages/pn-personagiuridica-webapp/vite.config.a11y.ts b/packages/pn-personagiuridica-webapp/vite.config.a11y.ts index 74413cc01d..9866859847 100644 --- a/packages/pn-personagiuridica-webapp/vite.config.a11y.ts +++ b/packages/pn-personagiuridica-webapp/vite.config.a11y.ts @@ -13,6 +13,6 @@ export default defineConfig(() => { environment: 'jsdom', include: ['**/*.a11y.test.ts', '**/*.a11y.test.tsx'], reporters: ['default'], - } + }, }; }); diff --git a/yarn.lock b/yarn.lock index 44539bfe50..fd7b39843d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,6 +22,14 @@ dependencies: "@babel/highlight" "^7.16.7" +"@babel/code-frame@^7.12.13": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== + dependencies: + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" + "@babel/code-frame@^7.22.13": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" @@ -536,6 +544,16 @@ chalk "^2.4.2" js-tokens "^4.0.0" +"@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/parser@^7.1.0": version "7.17.3" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz" @@ -1822,6 +1840,13 @@ resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + "@jest/schemas@^29.4.3", "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -1829,6 +1854,18 @@ dependencies: "@sinclair/typebox" "^0.27.8" +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" @@ -2815,26 +2852,37 @@ "@types/react" "*" hoist-non-react-statics "^3.3.0" +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== -"@types/jest-axe@^3.5.3": - version "3.5.7" - resolved "https://registry.yarnpkg.com/@types/jest-axe/-/jest-axe-3.5.7.tgz#12abeb00936a71e71760ee00c574f63e68d5d873" - integrity sha512-eFIaZbh4t7Odys8dSQBJLMbM3cubzaJLl+g5yZwBMF6nqOpXQCvwPQPDHk0tfVepeDodcLy87bopvHb5bWrNAQ== +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: - "@types/jest" "*" - axe-core "^3.5.5" + "@types/istanbul-lib-coverage" "*" -"@types/jest@*": - version "27.4.0" - resolved "https://registry.npmjs.org/@types/jest/-/jest-27.4.0.tgz" - integrity sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ== +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.5.12": + version "29.5.12" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== dependencies: - jest-diff "^27.0.0" - pretty-format "^27.0.0" + expect "^29.0.0" + pretty-format "^29.0.0" "@types/json-schema@^7.0.12": version "7.0.13" @@ -2846,6 +2894,11 @@ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + "@types/lodash@^4.14.172": version "4.14.178" resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz" @@ -2871,6 +2924,13 @@ resolved "https://registry.npmjs.org/@types/mixpanel-browser/-/mixpanel-browser-2.38.0.tgz" integrity sha512-TR8rvsILnqXA7oiiGOxuMGXwvDeCoQDonXJB5UR+TYvEAFpiK8ReFj5LhZT+Xhm3NpI9aPoju30jB2ssorSUww== +"@types/node@*": + version "20.12.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" + integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== + dependencies: + undici-types "~5.26.4" + "@types/node@^17.0.8": version "17.0.45" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" @@ -2952,11 +3012,28 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + "@types/use-sync-external-store@^0.0.3": version "0.0.3" resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + dependencies: + "@types/yargs-parser" "*" + "@typescript-eslint/eslint-plugin@^6.7.3": version "6.7.5" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.5.tgz#f4024b9f63593d0c2b5bd6e4ca027e6f30934d4f" @@ -3478,14 +3555,9 @@ available-typed-arrays@^1.0.5: axe-core@4.4.1: version "4.4.1" - resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.1.tgz#7dbdc25989298f9ad006645cd396782443757413" integrity sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw== -axe-core@^3.5.5: - version "3.5.6" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-3.5.6.tgz#e762a90d7f6dbd244ceacb4e72760ff8aad521b5" - integrity sha512-LEUDjgmdJoA3LqklSTwKYqkjcZ4HKc4ddIYGSAiSkr46NTjzg2L9RNB+lekO9P7Dlpa87+hBtzc2Fzn/+GUWMQ== - axios-mock-adapter@^1.22.0: version "1.22.0" resolved "https://registry.yarnpkg.com/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz#0f3e6be0fc9b55baab06f2d49c0b71157e7c053d" @@ -3821,7 +3893,7 @@ ci-info@^2.0.0: resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.6.1: +ci-info@^3.2.0, ci-info@^3.6.1: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== @@ -4380,7 +4452,7 @@ detect-indent@^5.0.0: diff-sequences@^27.5.1: version "27.5.1" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== diff-sequences@^29.6.3: @@ -4630,6 +4702,11 @@ escape-string-regexp@^1.0.5: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" @@ -4911,6 +4988,17 @@ execa@^8.0.1: signal-exit "^4.1.0" strip-final-newline "^3.0.0" +expect@^29.0.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + external-editor@^3.0.3: version "3.1.0" resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" @@ -5428,6 +5516,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + graphemer@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" @@ -6179,18 +6272,18 @@ javascript-natural-sort@0.7.1: integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== jest-axe@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/jest-axe/-/jest-axe-6.0.0.tgz" - integrity sha512-gAh/2zoWii4Rbhe6IUIo5TTiseGJDCitFnDFwBNpIuaOciyQgVZue6jtd4W7oMoKHewKoRSuIol7t/MuGx+mqg== + version "6.0.1" + resolved "https://registry.yarnpkg.com/jest-axe/-/jest-axe-6.0.1.tgz#54a8b7dc09afd6190b21f38b51b8bddc2d923834" + integrity sha512-+KcRAdZeKXBbtHTmMkokRq5/hXHaVFpX+WS2o3uvhkmF3szdr4+TYAz+QuOTeM0B1d4YPoNmQWhGzSzxHJNZrA== dependencies: axe-core "4.4.1" chalk "4.1.0" jest-matcher-utils "27.0.2" lodash.merge "4.6.2" -jest-diff@^27.0.0, jest-diff@^27.0.2: +jest-diff@^27.0.2: version "27.5.1" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== dependencies: chalk "^4.0.0" @@ -6198,14 +6291,29 @@ jest-diff@^27.0.0, jest-diff@^27.0.2: jest-get-type "^27.5.1" pretty-format "^27.5.1" +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + jest-get-type@^27.0.1, jest-get-type@^27.5.1: version "27.5.1" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + jest-matcher-utils@27.0.2: version "27.0.2" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.2.tgz" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.0.2.tgz#f14c060605a95a466cdc759acc546c6f4cbfc4f0" integrity sha512-Qczi5xnTNjkhcIB0Yy75Txt+Ez51xdhOxsukN7awzq2auZQGPHcQrJ623PZj0ECDEMOk2soxWx05EXdXGd1CbA== dependencies: chalk "^4.0.0" @@ -6213,6 +6321,31 @@ jest-matcher-utils@27.0.2: jest-get-type "^27.0.1" pretty-format "^27.0.2" +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-sonar-reporter@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz#faa54a7d2af7198767ee246a82b78c576789cf08" @@ -6220,6 +6353,18 @@ jest-sonar-reporter@^2.0.0: dependencies: xml "^1.0.1" +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" @@ -6317,6 +6462,13 @@ json-stringify-safe@^5.0.1: resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" @@ -6555,7 +6707,7 @@ lodash.ismatch@^4.4.0: lodash.merge@4.6.2: version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: @@ -7858,7 +8010,7 @@ pretty-format@29.4.3: ansi-styles "^5.0.0" react-is "^18.0.0" -pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: +pretty-format@^27.0.2, pretty-format@^27.5.1: version "27.5.1" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== @@ -7867,7 +8019,7 @@ pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^29.7.0: +pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== @@ -8730,6 +8882,13 @@ ssri@^10.0.0, ssri@^10.0.1: dependencies: minipass "^7.0.3" +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + stackback@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" @@ -9113,7 +9272,17 @@ ts-api-utils@^1.0.1: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== -tsconfig-paths@^3.12.0, tsconfig-paths@^4.1.2: +tsconfig-paths@^3.12.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tsconfig-paths@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz#4819f861eef82e6da52fb4af1e8c930a39ed979a" integrity sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw== @@ -9235,6 +9404,11 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz"