From 0e9774bee4818a4fd58f19d8bd8419d7109883e0 Mon Sep 17 00:00:00 2001 From: Anders Rognstad Date: Mon, 30 Sep 2024 08:44:47 +0200 Subject: [PATCH] Use mws in tests and local api mocks --- README.md | 7 - mock/flexjar/mockFlexjar.ts | 11 - mock/mockEndepunkter.ts | 32 - mock/mockUnleash.ts | 20 - .../mockModiacontextholder.ts | 62 - mock/personoversikt/mockPersonoversikt.ts | 25 - mock/persontildeling/mockPersontildeling.ts | 11 - mock/syfoperson/mockSyfoperson.ts | 22 - mock/syfoveileder/mockSyfoveileder.ts | 23 - package-lock.json | 1058 +++++++++++++++-- package.json | 7 +- public/mockServiceWorker.js | 284 +++++ src/decorator/decoratorConfig.ts | 2 +- src/index.tsx | 18 +- src/mocks/browser.ts | 4 + {mock => src/mocks}/data/aktivEnhetMock.ts | 0 {mock => src/mocks}/data/personInfoMock.ts | 0 .../mocks}/data/personoversiktEnhetMock.ts | 2 +- {mock => src/mocks}/data/veilederMock.ts | 0 {mock => src/mocks}/data/veiledereMock.ts | 0 {mock => src/mocks}/ereg/mockEreg.ts | 19 +- src/mocks/flexjar/mockFlexjar.ts | 7 + src/mocks/handlers.ts | 28 + src/mocks/mockUnleash.ts | 14 + {mock => src/mocks}/mockUtils.ts | 0 .../mockModiacontextholder.ts | 52 + .../personoversikt/mockPersonoversikt.ts | 17 + .../persontildeling/mockPersontildeling.ts | 7 + src/mocks/syfoperson/mockSyfoperson.ts | 14 + src/mocks/syfoveileder/mockSyfoveileder.ts | 14 + .../mocks}/syfoveileder/veilederMock.ts | 0 src/types.d.ts | 18 - test/components/FristColumnTest.tsx | 2 +- test/components/HendelseTypeFilter.test.tsx | 6 +- test/components/NewOversiktTableTest.tsx | 2 +- test/components/flexjar/FlexjarTest.tsx | 6 +- test/containers/OversiktContainer.test.tsx | 6 +- test/query/personoversiktHooks.test.tsx | 4 +- test/query/personregisterHooks.test.tsx | 4 +- test/query/veiledereQueryHooks.test.tsx | 6 +- test/setup.ts | 18 +- test/stubs/nockDefaults.ts | 1 - test/stubs/stubAktivVeileder.ts | 19 +- test/stubs/stubFlexjar.ts | 23 +- test/stubs/stubModiaContext.ts | 19 +- test/stubs/stubPersonoversikt.ts | 19 +- test/stubs/stubPersonregister.ts | 17 +- test/stubs/stubVeiledere.ts | 20 +- test/testQueryClient.ts | 6 +- test/utils/hendelseFilteringUtilsTest.ts | 2 +- webpack.dev.ts | 8 +- 51 files changed, 1556 insertions(+), 410 deletions(-) delete mode 100644 mock/flexjar/mockFlexjar.ts delete mode 100644 mock/mockEndepunkter.ts delete mode 100644 mock/mockUnleash.ts delete mode 100644 mock/modiacontextholder/mockModiacontextholder.ts delete mode 100644 mock/personoversikt/mockPersonoversikt.ts delete mode 100644 mock/persontildeling/mockPersontildeling.ts delete mode 100644 mock/syfoperson/mockSyfoperson.ts delete mode 100644 mock/syfoveileder/mockSyfoveileder.ts create mode 100644 public/mockServiceWorker.js create mode 100644 src/mocks/browser.ts rename {mock => src/mocks}/data/aktivEnhetMock.ts (100%) rename {mock => src/mocks}/data/personInfoMock.ts (100%) rename {mock => src/mocks}/data/personoversiktEnhetMock.ts (99%) rename {mock => src/mocks}/data/veilederMock.ts (100%) rename {mock => src/mocks}/data/veiledereMock.ts (100%) rename {mock => src/mocks}/ereg/mockEreg.ts (63%) create mode 100644 src/mocks/flexjar/mockFlexjar.ts create mode 100644 src/mocks/handlers.ts create mode 100644 src/mocks/mockUnleash.ts rename {mock => src/mocks}/mockUtils.ts (100%) create mode 100644 src/mocks/modiacontextholder/mockModiacontextholder.ts create mode 100644 src/mocks/personoversikt/mockPersonoversikt.ts create mode 100644 src/mocks/persontildeling/mockPersontildeling.ts create mode 100644 src/mocks/syfoperson/mockSyfoperson.ts create mode 100644 src/mocks/syfoveileder/mockSyfoveileder.ts rename {mock => src/mocks}/syfoveileder/veilederMock.ts (100%) delete mode 100644 src/types.d.ts delete mode 100644 test/stubs/nockDefaults.ts diff --git a/README.md b/README.md index 1d3018ea..8d23906b 100644 --- a/README.md +++ b/README.md @@ -21,13 +21,6 @@ Du må ha Node v18 og npm v9 installert. - Kjør prettier og lint med `npm run prettier-lint`, de kan også kjøres hver for seg - Appen finner du [her](http://localhost:8080/minoversikt) -## Mocha tester i IntelliJ - -IDEA genererer run configs for å kjøre testene. Det er viktig å kjøre med samme oppsett som `npm run test` gjør, definert i `package.json`. -Oppdater Mocha-template i run-configs, og legg til Extra Mocha options: - -- `--require dotenv/config --require ts-node/register --require ignore-styles --require jsdom-global/register` - ## Logge på i Q1-miljø Se denne siden for [testdata](https://confluence.adeo.no/pages/viewpage.action?pageId=228580060) (NAV-intern lenke). diff --git a/mock/flexjar/mockFlexjar.ts b/mock/flexjar/mockFlexjar.ts deleted file mode 100644 index 9c09df44..00000000 --- a/mock/flexjar/mockFlexjar.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { FLEXJAR_ROOT } from '../../src/apiConstants'; -import express from 'express'; - -export const mockFlexjar = (server: any) => { - server.post( - `${FLEXJAR_ROOT}/feedback/azure`, - (req: express.Request, res: express.Response) => { - res.sendStatus(200); - } - ); -}; diff --git a/mock/mockEndepunkter.ts b/mock/mockEndepunkter.ts deleted file mode 100644 index 3f93a8f5..00000000 --- a/mock/mockEndepunkter.ts +++ /dev/null @@ -1,32 +0,0 @@ -import express from 'express'; -import { mockModiacontextholder } from './modiacontextholder/mockModiacontextholder'; -import { mockSyfoperson } from './syfoperson/mockSyfoperson'; -import { mockSyfoveileder } from './syfoveileder/mockSyfoveileder'; -import { mockPersonoversikt } from './personoversikt/mockPersonoversikt'; -import { mockPersontildeling } from './persontildeling/mockPersontildeling'; -import { mockUnleash } from './mockUnleash'; -import { mockEreg } from './ereg/mockEreg'; -import { generatePersons } from './mockUtils'; -import { mockFlexjar } from './flexjar/mockFlexjar'; - -const generatedPersons = generatePersons(50); - -const mockEndepunkter = (server: express.Application) => { - server.use(express.json() as any); - server.use(express.urlencoded() as any); - - [ - mockModiacontextholder, - mockEreg, - mockFlexjar, - mockPersonoversikt, - mockPersontildeling, - mockSyfoperson, - mockSyfoveileder, - mockUnleash, - ].forEach((func) => { - func(server, generatedPersons); - }); -}; - -export default mockEndepunkter; diff --git a/mock/mockUnleash.ts b/mock/mockUnleash.ts deleted file mode 100644 index a93e398f..00000000 --- a/mock/mockUnleash.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { ToggleNames } from '../src/data/unleash/types/unleash_types'; -import express from 'express'; -import { UNLEASH_ROOT } from '../src/apiConstants'; - -export const mockUnleash = (server: express.Application) => { - server.get( - `${UNLEASH_ROOT}/toggles`, - (req: express.Request, res: express.Response) => { - res.setHeader('Content-Type', 'application/json'); - res.send(JSON.stringify(unleashMock)); - } - ); -}; - -export const unleashMock = Object.values(ToggleNames).reduce( - (accumulator, toggleName) => { - return { ...accumulator, [toggleName]: true }; - }, - {} -); diff --git a/mock/modiacontextholder/mockModiacontextholder.ts b/mock/modiacontextholder/mockModiacontextholder.ts deleted file mode 100644 index 25ace156..00000000 --- a/mock/modiacontextholder/mockModiacontextholder.ts +++ /dev/null @@ -1,62 +0,0 @@ -import express from 'express'; -import { MODIACONTEXTHOLDER_ROOT } from '../../src/apiConstants'; - -const saksbehandler = { - ident: 'Z999999', - navn: 'Vetle Veileder', - fornavn: 'Vetle', - etternavn: 'Veileder', - enheter: [ - { - enhetId: '0315', - navn: 'NAV Grünerløkka', - }, - { - enhetId: '0316', - navn: 'NAV Gamle Oslo', - }, - ], -}; - -const aktivBruker = { - aktivBruker: null, - aktivEnhet: null, -}; - -const aktivEnhet = { - aktivBruker: null, - aktivEnhet: '0316', -}; - -export const mockModiacontextholder = (server: express.Application) => { - server.get( - `${MODIACONTEXTHOLDER_ROOT}/decorator`, - (req: express.Request, res: express.Response) => { - res.setHeader('Content-Type', 'application/json'); - res.send(JSON.stringify(saksbehandler)); - } - ); - - server.get( - `${MODIACONTEXTHOLDER_ROOT}/context/aktivbruker`, - (req: express.Request, res: express.Response) => { - res.setHeader('Content-Type', 'application/json'); - res.send(JSON.stringify(aktivBruker)); - } - ); - - server.get( - `${MODIACONTEXTHOLDER_ROOT}/context/aktivenhet`, - (req: express.Request, res: express.Response) => { - res.setHeader('Content-Type', 'application/json'); - res.send(JSON.stringify(aktivEnhet)); - } - ); - - server.post( - `${MODIACONTEXTHOLDER_ROOT}/context`, - (req: express.Request, res: express.Response) => { - res.send().status(204); - } - ); -}; diff --git a/mock/personoversikt/mockPersonoversikt.ts b/mock/personoversikt/mockPersonoversikt.ts deleted file mode 100644 index f694ca22..00000000 --- a/mock/personoversikt/mockPersonoversikt.ts +++ /dev/null @@ -1,25 +0,0 @@ -import express from 'express'; -import { PERSONOVERSIKT_ROOT } from '../../src/apiConstants'; -import { personoversiktEnhetMock } from '../data/personoversiktEnhetMock'; -import { - generatePersonoversiktEnhetFromPersons, - MockPerson, -} from '../mockUtils'; - -const personoversiktEnhet = (generatedPersons: MockPerson[]) => [ - ...personoversiktEnhetMock, - ...generatePersonoversiktEnhetFromPersons(generatedPersons), -]; - -export const mockPersonoversikt = ( - server: express.Application, - generatedPersons: MockPerson[] -) => { - server.get( - `${PERSONOVERSIKT_ROOT}/enhet/:id`, - (req: express.Request, res: express.Response) => { - res.setHeader('Content-Type', 'application/json'); - res.send(JSON.stringify(personoversiktEnhet(generatedPersons))); - } - ); -}; diff --git a/mock/persontildeling/mockPersontildeling.ts b/mock/persontildeling/mockPersontildeling.ts deleted file mode 100644 index 4435d7d7..00000000 --- a/mock/persontildeling/mockPersontildeling.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PERSONTILDELING_ROOT } from '../../src/apiConstants'; -import express from 'express'; - -export const mockPersontildeling = (server: express.Application) => { - server.post( - `${PERSONTILDELING_ROOT}/registrer`, - (req: express.Request, res: express.Response) => { - res.send(); - } - ); -}; diff --git a/mock/syfoperson/mockSyfoperson.ts b/mock/syfoperson/mockSyfoperson.ts deleted file mode 100644 index 4b81ec00..00000000 --- a/mock/syfoperson/mockSyfoperson.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { SYFOPERSON_ROOT } from '../../src/apiConstants'; -import express from 'express'; -import { personInfoMock } from '../data/personInfoMock'; -import { MockPerson } from '../mockUtils'; - -const personInfo = (generatedPersons: MockPerson[]) => [ - ...personInfoMock, - ...generatedPersons, -]; - -export const mockSyfoperson = ( - server: express.Application, - generatedPersons: MockPerson[] -) => { - server.post( - `${SYFOPERSON_ROOT}/person/info`, - (req: express.Request, res: express.Response) => { - res.setHeader('Content-Type', 'application/json'); - res.send(JSON.stringify(personInfo(generatedPersons))); - } - ); -}; diff --git a/mock/syfoveileder/mockSyfoveileder.ts b/mock/syfoveileder/mockSyfoveileder.ts deleted file mode 100644 index 1692c018..00000000 --- a/mock/syfoveileder/mockSyfoveileder.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { SYFOVEILEDER_ROOT } from '../../src/apiConstants'; -import express from 'express'; -import { veiledereMock } from '../data/veiledereMock'; -import { veilederMock } from '../data/veilederMock'; - -export const mockSyfoveileder = (server: express.Application) => { - server.get( - `${SYFOVEILEDER_ROOT}/veiledere/self`, - (req: express.Request, res: express.Response) => { - res.setHeader('Content-Type', 'application/json'); - res.send(JSON.stringify(veilederMock)); - } - ); - - server.get( - `${SYFOVEILEDER_ROOT}/veiledere`, - (req: express.Request, res: express.Response) => { - res.setHeader('Content-Type', 'application/json'); - const paramName = req.query.paramName; - res.send(JSON.stringify(veiledereMock)); - } - ); -}; diff --git a/package-lock.json b/package-lock.json index 87c6c479..65ef5fee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -125,7 +125,7 @@ "less-loader": "11.1.0", "lint-staged": "13.2.1", "mini-css-extract-plugin": "2.9.0", - "nock": "13.5.4", + "msw": "2.4.9", "npm-run-all": "4.1.5", "postcss-loader": "6.2.1", "prettier": "2.2.1", @@ -2230,6 +2230,57 @@ "node": ">=6.9.0" } }, + "node_modules/@bundled-es-modules/cookie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", + "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cookie": "^0.5.0" + } + }, + "node_modules/@bundled-es-modules/cookie/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@bundled-es-modules/statuses": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", + "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", + "dev": true, + "license": "ISC", + "dependencies": { + "statuses": "^2.0.1" + } + }, + "node_modules/@bundled-es-modules/statuses/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", + "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -3086,6 +3137,154 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@inquirer/confirm": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz", + "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", + "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.5.5", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/@inquirer/type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", + "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", + "dev": true, + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@inquirer/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@inquirer/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@inquirer/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.6.tgz", + "integrity": "sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -3230,6 +3429,24 @@ "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==", "dev": true }, + "node_modules/@mswjs/interceptors": { + "version": "0.35.9", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.9.tgz", + "integrity": "sha512-SSnyl/4ni/2ViHKkiZb8eajA/eN1DNFaHjhGiLUdZvDz6PKF4COSf/17xqSz64nOo2Ia29SA6B2KNCsyCbVmaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@navikt/aksel-icons": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@navikt/aksel-icons/-/aksel-icons-7.0.0.tgz", @@ -3408,6 +3625,31 @@ "node": ">=10" } }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, "node_modules/@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", @@ -4331,6 +4573,13 @@ "@types/redis": "^2.8.0" } }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/dotenv-webpack": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/@types/dotenv-webpack/-/dotenv-webpack-7.0.7.tgz", @@ -4498,6 +4747,16 @@ "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "17.0.31", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.31.tgz", @@ -4659,6 +4918,13 @@ "@types/node": "*" } }, + "node_modules/@types/statuses": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", + "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/styled-components": { "version": "5.1.26", "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz", @@ -4675,10 +4941,11 @@ "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" }, "node_modules/@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==", - "dev": true + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/webpack": { "version": "5.28.5", @@ -4700,6 +4967,13 @@ "node": ">=6" } }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/ws": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", @@ -6649,6 +6923,31 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -9405,6 +9704,16 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", @@ -9630,6 +9939,16 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/graphql": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -9735,6 +10054,13 @@ "he": "bin/he" } }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/helmet": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/helmet/-/helmet-4.6.0.tgz", @@ -10421,6 +10747,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -10887,12 +11220,6 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -11792,6 +12119,146 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/msw": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.4.9.tgz", + "integrity": "sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^3.0.0", + "@mswjs/interceptors": "^0.35.8", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "chalk": "^4.1.2", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.2", + "path-to-regexp": "^6.3.0", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.9.0", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/msw/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/msw/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/msw/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/msw/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/msw/node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/msw/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/msw/node_modules/type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/multicast-dns": { "version": "7.2.4", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", @@ -11813,6 +12280,16 @@ "node": ">=0.10.0" } }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -12104,20 +12581,6 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, - "node_modules/nock": { - "version": "13.5.4", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.4.tgz", - "integrity": "sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "json-stringify-safe": "^5.0.1", - "propagate": "^2.0.0" - }, - "engines": { - "node": ">= 10.13" - } - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -12565,6 +13028,13 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, "node_modules/p-any": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-any/-/p-any-3.0.0.tgz", @@ -13976,15 +14446,6 @@ "react-is": "^16.8.1" } }, - "node_modules/propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/protobufjs": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", @@ -14933,6 +15394,16 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -15787,6 +16258,13 @@ "dev": true, "license": "MIT" }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -15806,13 +16284,14 @@ } }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" @@ -16913,6 +17392,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -18013,6 +18499,16 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -18026,6 +18522,35 @@ "node": ">= 6" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -18040,7 +18565,20 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "engines": { - "node": ">=10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -19526,6 +20064,50 @@ "to-fast-properties": "^2.0.0" } }, + "@bundled-es-modules/cookie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", + "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", + "dev": true, + "requires": { + "cookie": "^0.5.0" + }, + "dependencies": { + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + } + } + }, + "@bundled-es-modules/statuses": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", + "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", + "dev": true, + "requires": { + "statuses": "^2.0.1" + }, + "dependencies": { + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", + "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", + "dev": true, + "requires": { + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" + } + }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -20019,6 +20601,112 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@inquirer/confirm": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz", + "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==", + "dev": true, + "requires": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3" + } + }, + "@inquirer/core": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", + "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", + "dev": true, + "requires": { + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.5.5", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "dependencies": { + "@inquirer/type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", + "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", + "dev": true, + "requires": { + "mute-stream": "^1.0.0" + } + }, + "@types/node": { + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", + "dev": true, + "requires": { + "undici-types": "~6.19.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "@inquirer/figures": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.6.tgz", + "integrity": "sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==", + "dev": true + }, + "@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "dev": true, + "requires": { + "mute-stream": "^1.0.0" + } + }, "@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -20122,6 +20810,20 @@ "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==", "dev": true }, + "@mswjs/interceptors": { + "version": "0.35.9", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.9.tgz", + "integrity": "sha512-SSnyl/4ni/2ViHKkiZb8eajA/eN1DNFaHjhGiLUdZvDz6PKF4COSf/17xqSz64nOo2Ia29SA6B2KNCsyCbVmaQ==", + "dev": true, + "requires": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + } + }, "@navikt/aksel-icons": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@navikt/aksel-icons/-/aksel-icons-7.0.0.tgz", @@ -20255,6 +20957,28 @@ } } }, + "@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true + }, + "@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "requires": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true + }, "@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", @@ -20836,6 +21560,12 @@ "@types/redis": "^2.8.0" } }, + "@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true + }, "@types/dotenv-webpack": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/@types/dotenv-webpack/-/dotenv-webpack-7.0.7.tgz", @@ -21002,6 +21732,15 @@ "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, + "@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/node": { "version": "17.0.31", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.31.tgz", @@ -21164,6 +21903,12 @@ "@types/node": "*" } }, + "@types/statuses": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", + "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", + "dev": true + }, "@types/styled-components": { "version": "5.1.26", "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz", @@ -21182,9 +21927,9 @@ } }, "@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true }, "@types/webpack": { @@ -21206,6 +21951,12 @@ } } }, + "@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true + }, "@types/ws": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", @@ -22603,6 +23354,23 @@ } } }, + "cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -24644,6 +25412,12 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", @@ -24806,6 +25580,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "graphql": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "dev": true + }, "gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -24872,6 +25652,12 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true + }, "helmet": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/helmet/-/helmet-4.6.0.tgz", @@ -25346,6 +26132,12 @@ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true }, + "is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -25684,12 +26476,6 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -26355,6 +27141,94 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "msw": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.4.9.tgz", + "integrity": "sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg==", + "dev": true, + "requires": { + "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^3.0.0", + "@mswjs/interceptors": "^0.35.8", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "chalk": "^4.1.2", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.2", + "path-to-regexp": "^6.3.0", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.9.0", + "yargs": "^17.7.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "dev": true + } + } + }, "multicast-dns": { "version": "7.2.4", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", @@ -26370,6 +27244,12 @@ "resolved": "https://registry.npmjs.org/murmurhash3js/-/murmurhash3js-3.0.1.tgz", "integrity": "sha1-Ppg+W0fCoG9DpxMXTn5DXKBEuZg=" }, + "mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true + }, "mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -26563,17 +27443,6 @@ } } }, - "nock": { - "version": "13.5.4", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.4.tgz", - "integrity": "sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "json-stringify-safe": "^5.0.1", - "propagate": "^2.0.0" - } - }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -26898,6 +27767,12 @@ } } }, + "outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true + }, "p-any": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-any/-/p-any-3.0.0.tgz", @@ -27806,12 +28681,6 @@ "react-is": "^16.8.1" } }, - "propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", - "dev": true - }, "protobufjs": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", @@ -28500,6 +29369,12 @@ "strip-ansi": "^6.0.1" } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -29181,6 +30056,12 @@ "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true }, + "strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -29197,13 +30078,13 @@ "dev": true }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "dependencies": { "emoji-regex": { @@ -29966,6 +30847,12 @@ "which-boxed-primitive": "^1.0.2" } }, + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -30685,6 +31572,12 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -30695,6 +31588,27 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -30706,6 +31620,12 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" }, + "yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true + }, "zone.js": { "version": "0.14.10", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz", diff --git a/package.json b/package.json index 43cbd0b0..578aff29 100644 --- a/package.json +++ b/package.json @@ -138,7 +138,7 @@ "less-loader": "11.1.0", "lint-staged": "13.2.1", "mini-css-extract-plugin": "2.9.0", - "nock": "13.5.4", + "msw": "2.4.9", "npm-run-all": "4.1.5", "postcss-loader": "6.2.1", "prettier": "2.2.1", @@ -159,5 +159,10 @@ "lint-staged": { "*.{js,ts,tsx}": "npm run lint:fix", "*.{js,ts,tsx,css,less,md}": "npm run prettier --write" + }, + "msw": { + "workerDirectory": [ + "public" + ] } } diff --git a/public/mockServiceWorker.js b/public/mockServiceWorker.js new file mode 100644 index 00000000..2ca1e5b9 --- /dev/null +++ b/public/mockServiceWorker.js @@ -0,0 +1,284 @@ +/* eslint-disable */ +/* tslint:disable */ + +/** + * Mock Service Worker. + * @see https://github.com/mswjs/msw + * - Please do NOT modify this file. + * - Please do NOT serve this file on production. + */ + +const PACKAGE_VERSION = '2.4.9'; +const INTEGRITY_CHECKSUM = '26357c79639bfa20d64c0efca2a87423'; +const IS_MOCKED_RESPONSE = Symbol('isMockedResponse'); +const activeClientIds = new Set(); + +self.addEventListener('install', function () { + self.skipWaiting(); +}); + +self.addEventListener('activate', function (event) { + event.waitUntil(self.clients.claim()); +}); + +self.addEventListener('message', async function (event) { + const clientId = event.source.id; + + if (!clientId || !self.clients) { + return; + } + + const client = await self.clients.get(clientId); + + if (!client) { + return; + } + + const allClients = await self.clients.matchAll({ + type: 'window', + }); + + switch (event.data) { + case 'KEEPALIVE_REQUEST': { + sendToClient(client, { + type: 'KEEPALIVE_RESPONSE', + }); + break; + } + + case 'INTEGRITY_CHECK_REQUEST': { + sendToClient(client, { + type: 'INTEGRITY_CHECK_RESPONSE', + payload: { + packageVersion: PACKAGE_VERSION, + checksum: INTEGRITY_CHECKSUM, + }, + }); + break; + } + + case 'MOCK_ACTIVATE': { + activeClientIds.add(clientId); + + sendToClient(client, { + type: 'MOCKING_ENABLED', + payload: true, + }); + break; + } + + case 'MOCK_DEACTIVATE': { + activeClientIds.delete(clientId); + break; + } + + case 'CLIENT_CLOSED': { + activeClientIds.delete(clientId); + + const remainingClients = allClients.filter((client) => { + return client.id !== clientId; + }); + + // Unregister itself when there are no more clients + if (remainingClients.length === 0) { + self.registration.unregister(); + } + + break; + } + } +}); + +self.addEventListener('fetch', function (event) { + const { request } = event; + + // Bypass navigation requests. + if (request.mode === 'navigate') { + return; + } + + // Opening the DevTools triggers the "only-if-cached" request + // that cannot be handled by the worker. Bypass such requests. + if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { + return; + } + + // Bypass all requests when there are no active clients. + // Prevents the self-unregistered worked from handling requests + // after it's been deleted (still remains active until the next reload). + if (activeClientIds.size === 0) { + return; + } + + // Generate unique request ID. + const requestId = crypto.randomUUID(); + event.respondWith(handleRequest(event, requestId)); +}); + +async function handleRequest(event, requestId) { + const client = await resolveMainClient(event); + const response = await getResponse(event, client, requestId); + + // Send back the response clone for the "response:*" life-cycle events. + // Ensure MSW is active and ready to handle the message, otherwise + // this message will pend indefinitely. + if (client && activeClientIds.has(client.id)) { + (async function () { + const responseClone = response.clone(); + + sendToClient( + client, + { + type: 'RESPONSE', + payload: { + requestId, + isMockedResponse: IS_MOCKED_RESPONSE in response, + type: responseClone.type, + status: responseClone.status, + statusText: responseClone.statusText, + body: responseClone.body, + headers: Object.fromEntries(responseClone.headers.entries()), + }, + }, + [responseClone.body] + ); + })(); + } + + return response; +} + +// Resolve the main client for the given event. +// Client that issues a request doesn't necessarily equal the client +// that registered the worker. It's with the latter the worker should +// communicate with during the response resolving phase. +async function resolveMainClient(event) { + const client = await self.clients.get(event.clientId); + + if (client?.frameType === 'top-level') { + return client; + } + + const allClients = await self.clients.matchAll({ + type: 'window', + }); + + return allClients + .filter((client) => { + // Get only those clients that are currently visible. + return client.visibilityState === 'visible'; + }) + .find((client) => { + // Find the client ID that's recorded in the + // set of clients that have registered the worker. + return activeClientIds.has(client.id); + }); +} + +async function getResponse(event, client, requestId) { + const { request } = event; + + // Clone the request because it might've been already used + // (i.e. its body has been read and sent to the client). + const requestClone = request.clone(); + + function passthrough() { + const headers = Object.fromEntries(requestClone.headers.entries()); + + // Remove internal MSW request header so the passthrough request + // complies with any potential CORS preflight checks on the server. + // Some servers forbid unknown request headers. + delete headers['x-msw-intention']; + + return fetch(requestClone, { headers }); + } + + // Bypass mocking when the client is not active. + if (!client) { + return passthrough(); + } + + // Bypass initial page load requests (i.e. static assets). + // The absence of the immediate/parent client in the map of the active clients + // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet + // and is not ready to handle requests. + if (!activeClientIds.has(client.id)) { + return passthrough(); + } + + // Notify the client that a request has been intercepted. + const requestBuffer = await request.arrayBuffer(); + const clientMessage = await sendToClient( + client, + { + type: 'REQUEST', + payload: { + id: requestId, + url: request.url, + mode: request.mode, + method: request.method, + headers: Object.fromEntries(request.headers.entries()), + cache: request.cache, + credentials: request.credentials, + destination: request.destination, + integrity: request.integrity, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy, + body: requestBuffer, + keepalive: request.keepalive, + }, + }, + [requestBuffer] + ); + + switch (clientMessage.type) { + case 'MOCK_RESPONSE': { + return respondWithMock(clientMessage.data); + } + + case 'PASSTHROUGH': { + return passthrough(); + } + } + + return passthrough(); +} + +function sendToClient(client, message, transferrables = []) { + return new Promise((resolve, reject) => { + const channel = new MessageChannel(); + + channel.port1.onmessage = (event) => { + if (event.data && event.data.error) { + return reject(event.data.error); + } + + resolve(event.data); + }; + + client.postMessage( + message, + [channel.port2].concat(transferrables.filter(Boolean)) + ); + }); +} + +async function respondWithMock(response) { + // Setting response status code to 0 is a no-op. + // However, when responding with a "Response.error()", the produced Response + // instance will have status code set to 0. Since it's not possible to create + // a Response instance with status code 0, handle that use-case separately. + if (response.status === 0) { + return Response.error(); + } + + const mockedResponse = new Response(response.body, response); + + Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { + value: true, + enumerable: true, + }); + + return mockedResponse; +} diff --git a/src/decorator/decoratorConfig.ts b/src/decorator/decoratorConfig.ts index b018caea..79f6754b 100644 --- a/src/decorator/decoratorConfig.ts +++ b/src/decorator/decoratorConfig.ts @@ -36,7 +36,7 @@ const getEnvironment = (): Environment => { } else if (isDev()) { return 'q2'; } else { - return 'local'; + return 'mock'; } }; diff --git a/src/index.tsx b/src/index.tsx index 39c3642b..681c9252 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -15,6 +15,7 @@ import { minutesToMillis } from '@/utils/timeUtils'; import { isClientError } from '@/api/errors'; import ErrorBoundary from '@/components/error/ErrorBoundary'; import { initFaro } from '@/faro'; +import { isLocal } from '@/utils/miljoUtil'; const queryClient = new QueryClient({ defaultOptions: { @@ -62,4 +63,19 @@ const container = document.getElementById('maincontent') || new DocumentFragment(); const root = createRoot(container); -root.render(); +function renderApp() { + root.render(); +} + +async function setupMocking() { + const { worker } = await import('./mocks/browser'); + return worker.start({ + onUnhandledRequest: 'bypass', + }); +} + +if (isLocal()) { + setupMocking().then(() => renderApp()); +} else { + renderApp(); +} diff --git a/src/mocks/browser.ts b/src/mocks/browser.ts new file mode 100644 index 00000000..6fa49208 --- /dev/null +++ b/src/mocks/browser.ts @@ -0,0 +1,4 @@ +import { setupWorker } from 'msw/browser'; +import handlers from '@/mocks/handlers'; + +export const worker = setupWorker(...handlers); diff --git a/mock/data/aktivEnhetMock.ts b/src/mocks/data/aktivEnhetMock.ts similarity index 100% rename from mock/data/aktivEnhetMock.ts rename to src/mocks/data/aktivEnhetMock.ts diff --git a/mock/data/personInfoMock.ts b/src/mocks/data/personInfoMock.ts similarity index 100% rename from mock/data/personInfoMock.ts rename to src/mocks/data/personInfoMock.ts diff --git a/mock/data/personoversiktEnhetMock.ts b/src/mocks/data/personoversiktEnhetMock.ts similarity index 99% rename from mock/data/personoversiktEnhetMock.ts rename to src/mocks/data/personoversiktEnhetMock.ts index 95c95ec7..185d8e4c 100644 --- a/mock/data/personoversiktEnhetMock.ts +++ b/src/mocks/data/personoversiktEnhetMock.ts @@ -5,7 +5,7 @@ import { OppfolgingsoppgaveDTO, PersonOversiktStatusDTO, PersonOversiktUbehandletStatusDTO, -} from '../../src/api/types/personoversiktTypes'; +} from '../../api/types/personoversiktTypes'; import { veilederMock } from './veilederMock'; import dayjs from 'dayjs'; diff --git a/mock/data/veilederMock.ts b/src/mocks/data/veilederMock.ts similarity index 100% rename from mock/data/veilederMock.ts rename to src/mocks/data/veilederMock.ts diff --git a/mock/data/veiledereMock.ts b/src/mocks/data/veiledereMock.ts similarity index 100% rename from mock/data/veiledereMock.ts rename to src/mocks/data/veiledereMock.ts diff --git a/mock/ereg/mockEreg.ts b/src/mocks/ereg/mockEreg.ts similarity index 63% rename from mock/ereg/mockEreg.ts rename to src/mocks/ereg/mockEreg.ts index 0e988f75..507f56fa 100644 --- a/mock/ereg/mockEreg.ts +++ b/src/mocks/ereg/mockEreg.ts @@ -1,5 +1,5 @@ -import express from 'express'; import { EregOrganisasjonResponseDTO } from '@/data/virksomhet/EregVirksomhetsnavn'; +import { http, HttpResponse } from 'msw'; interface EregMockData { [key: string]: EregOrganisasjonResponseDTO; @@ -35,13 +35,10 @@ const eregResponses: EregMockData = { }, }; -export const mockEreg = (server: express.Application) => { - server.get( - '/ereg/api/v1/organisasjon/:orgnr', - (req: express.Request, res: express.Response) => { - const eregResponse = eregResponses[req.params.orgnr as string]; - res.setHeader('Content-Type', 'application/json'); - res.send(JSON.stringify(eregResponse)); - } - ); -}; +export const mockEreg = http.get<{ orgnr: string }>( + '/ereg/api/v1/organisasjon/:orgnr', + ({ params }) => { + const eregResponse = eregResponses[params.orgnr]; + return HttpResponse.json(eregResponse); + } +); diff --git a/src/mocks/flexjar/mockFlexjar.ts b/src/mocks/flexjar/mockFlexjar.ts new file mode 100644 index 00000000..97ec3081 --- /dev/null +++ b/src/mocks/flexjar/mockFlexjar.ts @@ -0,0 +1,7 @@ +import { http, HttpResponse } from 'msw'; +import { FLEXJAR_ROOT } from '@/apiConstants'; + +export const mockFlexjar = http.post( + `${FLEXJAR_ROOT}/feedback/azure`, + () => new HttpResponse(null, { status: 200 }) +); diff --git a/src/mocks/handlers.ts b/src/mocks/handlers.ts new file mode 100644 index 00000000..d5cef4da --- /dev/null +++ b/src/mocks/handlers.ts @@ -0,0 +1,28 @@ +import { http, HttpHandler, HttpResponse } from 'msw'; +import { generatePersons } from './mockUtils'; +import { mockUnleash } from '@/mocks/mockUnleash'; +import { mockSyfoveileder } from '@/mocks/syfoveileder/mockSyfoveileder'; +import { mockSyfoperson } from '@/mocks/syfoperson/mockSyfoperson'; +import { mockPersontildeling } from '@/mocks/persontildeling/mockPersontildeling'; +import { mockPersonoversikt } from '@/mocks/personoversikt/mockPersonoversikt'; +import { mockModiacontextholder } from '@/mocks/modiacontextholder/mockModiacontextholder'; +import { mockFlexjar } from '@/mocks/flexjar/mockFlexjar'; +import { mockEreg } from '@/mocks/ereg/mockEreg'; + +const generatedPersons = generatePersons(50); + +const handlers: HttpHandler[] = [ + http.post('https://amplitude.nav.no/collect', () => + HttpResponse.text('mocked amplitude') + ), + mockFlexjar, + mockUnleash, + mockEreg, + ...mockSyfoveileder, + mockSyfoperson(generatedPersons), + mockPersontildeling, + mockPersonoversikt(generatedPersons), + ...mockModiacontextholder, +]; + +export default handlers; diff --git a/src/mocks/mockUnleash.ts b/src/mocks/mockUnleash.ts new file mode 100644 index 00000000..0b1f7716 --- /dev/null +++ b/src/mocks/mockUnleash.ts @@ -0,0 +1,14 @@ +import { ToggleNames } from '@/data/unleash/types/unleash_types'; +import { UNLEASH_ROOT } from '@/apiConstants'; +import { http, HttpResponse } from 'msw'; + +export const mockUnleash = http.get(`${UNLEASH_ROOT}/toggles`, () => + HttpResponse.json(unleashMock) +); + +export const unleashMock = Object.values(ToggleNames).reduce( + (accumulator, toggleName) => { + return { ...accumulator, [toggleName]: true }; + }, + {} +); diff --git a/mock/mockUtils.ts b/src/mocks/mockUtils.ts similarity index 100% rename from mock/mockUtils.ts rename to src/mocks/mockUtils.ts diff --git a/src/mocks/modiacontextholder/mockModiacontextholder.ts b/src/mocks/modiacontextholder/mockModiacontextholder.ts new file mode 100644 index 00000000..a3d34878 --- /dev/null +++ b/src/mocks/modiacontextholder/mockModiacontextholder.ts @@ -0,0 +1,52 @@ +import { MODIACONTEXTHOLDER_ROOT } from '@/apiConstants'; +import { http, HttpResponse } from 'msw'; + +const saksbehandler = { + ident: 'Z999999', + navn: 'Vetle Veileder', + fornavn: 'Vetle', + etternavn: 'Veileder', + enheter: [ + { + enhetId: '0315', + navn: 'NAV Grünerløkka', + }, + { + enhetId: '0316', + navn: 'NAV Gamle Oslo', + }, + ], +}; + +const aktivBruker = { + aktivBruker: null, + aktivEnhet: null, +}; + +const aktivEnhet = { + aktivBruker: null, + aktivEnhet: '0316', +}; + +export const mockModiacontextholder = [ + http.get(`${MODIACONTEXTHOLDER_ROOT}/decorator`, () => + HttpResponse.json(saksbehandler) + ), + + http.get(`${MODIACONTEXTHOLDER_ROOT}/context/aktivbruker`, () => + HttpResponse.json(aktivBruker) + ), + + http.get(`${MODIACONTEXTHOLDER_ROOT}/context/aktivenhet`, () => + HttpResponse.json(aktivEnhet) + ), + + http.get(`${MODIACONTEXTHOLDER_ROOT}/context/v2/aktivenhet`, () => + HttpResponse.json(aktivEnhet) + ), + + http.post( + `${MODIACONTEXTHOLDER_ROOT}/context`, + () => new HttpResponse(null, { status: 204 }) + ), +]; diff --git a/src/mocks/personoversikt/mockPersonoversikt.ts b/src/mocks/personoversikt/mockPersonoversikt.ts new file mode 100644 index 00000000..f47988b5 --- /dev/null +++ b/src/mocks/personoversikt/mockPersonoversikt.ts @@ -0,0 +1,17 @@ +import { PERSONOVERSIKT_ROOT } from '@/apiConstants'; +import { personoversiktEnhetMock } from '../data/personoversiktEnhetMock'; +import { + generatePersonoversiktEnhetFromPersons, + MockPerson, +} from '../mockUtils'; +import { http, HttpResponse } from 'msw'; + +const personoversiktEnhet = (generatedPersons: MockPerson[]) => [ + ...personoversiktEnhetMock, + ...generatePersonoversiktEnhetFromPersons(generatedPersons), +]; + +export const mockPersonoversikt = (generatedPersons: MockPerson[]) => + http.get(`${PERSONOVERSIKT_ROOT}/enhet/:id`, () => + HttpResponse.json(personoversiktEnhet(generatedPersons)) + ); diff --git a/src/mocks/persontildeling/mockPersontildeling.ts b/src/mocks/persontildeling/mockPersontildeling.ts new file mode 100644 index 00000000..cb0ad06d --- /dev/null +++ b/src/mocks/persontildeling/mockPersontildeling.ts @@ -0,0 +1,7 @@ +import { PERSONTILDELING_ROOT } from '@/apiConstants'; +import { http, HttpResponse } from 'msw'; + +export const mockPersontildeling = http.post( + `${PERSONTILDELING_ROOT}/registrer`, + () => HttpResponse.text('OK') +); diff --git a/src/mocks/syfoperson/mockSyfoperson.ts b/src/mocks/syfoperson/mockSyfoperson.ts new file mode 100644 index 00000000..b84daf3a --- /dev/null +++ b/src/mocks/syfoperson/mockSyfoperson.ts @@ -0,0 +1,14 @@ +import { SYFOPERSON_ROOT } from '@/apiConstants'; +import { personInfoMock } from '../data/personInfoMock'; +import { MockPerson } from '../mockUtils'; +import { http, HttpResponse } from 'msw'; + +const personInfo = (generatedPersons: MockPerson[]) => [ + ...personInfoMock, + ...generatedPersons, +]; + +export const mockSyfoperson = (generatedPersons: MockPerson[]) => + http.post(`${SYFOPERSON_ROOT}/person/info`, () => + HttpResponse.json(personInfo(generatedPersons)) + ); diff --git a/src/mocks/syfoveileder/mockSyfoveileder.ts b/src/mocks/syfoveileder/mockSyfoveileder.ts new file mode 100644 index 00000000..432b1fc5 --- /dev/null +++ b/src/mocks/syfoveileder/mockSyfoveileder.ts @@ -0,0 +1,14 @@ +import { SYFOVEILEDER_ROOT } from '@/apiConstants'; +import { veiledereMock } from '../data/veiledereMock'; +import { veilederMock } from '../data/veilederMock'; +import { http, HttpResponse } from 'msw'; + +export const mockSyfoveileder = [ + http.get(`${SYFOVEILEDER_ROOT}/veiledere/self`, () => + HttpResponse.json(veilederMock) + ), + + http.get(`${SYFOVEILEDER_ROOT}/veiledere`, () => + HttpResponse.json(veiledereMock) + ), +]; diff --git a/mock/syfoveileder/veilederMock.ts b/src/mocks/syfoveileder/veilederMock.ts similarity index 100% rename from mock/syfoveileder/veilederMock.ts rename to src/mocks/syfoveileder/veilederMock.ts diff --git a/src/types.d.ts b/src/types.d.ts deleted file mode 100644 index 6b5a80a5..00000000 --- a/src/types.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -declare let config: { - config: { - dataSources: { - veileder: string; - enheter: string; - }; - initiellEnhet: string; - toggles: { - visEnhetVelger: boolean; - visVeileder: boolean; - visSokefelt: boolean; - toggleSendEventVedEnEnhet: boolean; - }; - applicationName: string; - handlePersonsokSubmit(nyttFnr: string): void; - handleChangeEnhet(data: string): void; - }; -}; diff --git a/test/components/FristColumnTest.tsx b/test/components/FristColumnTest.tsx index b316729d..bdc4e153 100644 --- a/test/components/FristColumnTest.tsx +++ b/test/components/FristColumnTest.tsx @@ -7,7 +7,7 @@ import { describe, expect, it } from 'vitest'; import { AktivitetskravStatus } from '@/api/types/personoversiktTypes'; import { toReadableDate } from '@/utils/dateUtils'; import { addWeeks } from 'date-fns'; -import { getOppfolgingsoppgave } from '../../mock/data/personoversiktEnhetMock'; +import { getOppfolgingsoppgave } from '@/mocks/data/personoversiktEnhetMock'; const defaultPersonData: PersonData = { navn: testdata.navn1, diff --git a/test/components/HendelseTypeFilter.test.tsx b/test/components/HendelseTypeFilter.test.tsx index b7ae07de..3d7a1479 100644 --- a/test/components/HendelseTypeFilter.test.tsx +++ b/test/components/HendelseTypeFilter.test.tsx @@ -7,10 +7,10 @@ import { NotificationProvider } from '@/context/notification/NotificationContext import { AktivEnhetContext } from '@/context/aktivEnhet/AktivEnhetContext'; import { veiledereQueryKeys } from '@/data/veiledereQueryHooks'; import { unleashQueryKeys } from '@/data/unleash/unleashQueryHooks'; -import { veilederMock } from '../../mock/syfoveileder/veilederMock'; +import { veilederMock } from '@/mocks/syfoveileder/veilederMock'; import { testQueryClient } from '../testQueryClient'; -import { aktivEnhetMock } from '../../mock/data/aktivEnhetMock'; -import { unleashMock } from '../../mock/mockUnleash'; +import { aktivEnhetMock } from '@/mocks/data/aktivEnhetMock'; +import { unleashMock } from '@/mocks/mockUnleash'; import { TabTypeContext } from '@/context/tab/TabTypeContext'; import { OverviewTabType } from '@/konstanter'; diff --git a/test/components/NewOversiktTableTest.tsx b/test/components/NewOversiktTableTest.tsx index 10d770e0..00691ba2 100644 --- a/test/components/NewOversiktTableTest.tsx +++ b/test/components/NewOversiktTableTest.tsx @@ -20,7 +20,7 @@ import { Oppfolgingsgrunn, } from '@/api/types/personoversiktTypes'; import { toLastnameFirstnameFormat } from '@/utils/stringUtil'; -import { aktivEnhetMock } from '../../mock/data/aktivEnhetMock'; +import { aktivEnhetMock } from '@/mocks/data/aktivEnhetMock'; import dayjs from 'dayjs'; let queryClient = testQueryClient(); diff --git a/test/components/flexjar/FlexjarTest.tsx b/test/components/flexjar/FlexjarTest.tsx index bf9bb725..e69287c3 100644 --- a/test/components/flexjar/FlexjarTest.tsx +++ b/test/components/flexjar/FlexjarTest.tsx @@ -1,5 +1,4 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import nock from 'nock'; import { fireEvent, render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; @@ -8,11 +7,11 @@ import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { defaultErrorTexts } from '@/api/errors'; import { FlexjarFeedbackDTO } from '@/data/flexjar/useFlexjarFeedback'; import { StoreKey } from '@/hooks/useLocalStorageState'; -import { aktivEnhetMock } from '../../../mock/data/aktivEnhetMock'; +import { aktivEnhetMock } from '@/mocks/data/aktivEnhetMock'; import { AktivEnhetContext } from '@/context/aktivEnhet/AktivEnhetContext'; import { testQueryClient } from '../../testQueryClient'; import { veiledereQueryKeys } from '@/data/veiledereQueryHooks'; -import { veilederMock } from '../../../mock/syfoveileder/veilederMock'; +import { veilederMock } from '@/mocks/syfoveileder/veilederMock'; import { stubFlexjarApiError, stubFlexjarApiOk } from '../../stubs/stubFlexjar'; let queryClient: QueryClient; @@ -48,7 +47,6 @@ describe('Flexjar', () => { ); }); afterEach(() => { - nock.cleanAll(); localStorage.setItem(StoreKey.FLEXJAR_ARENABRUK_FEEDBACK_DATE, ''); }); diff --git a/test/containers/OversiktContainer.test.tsx b/test/containers/OversiktContainer.test.tsx index c61eae4d..05284c53 100644 --- a/test/containers/OversiktContainer.test.tsx +++ b/test/containers/OversiktContainer.test.tsx @@ -10,7 +10,7 @@ import { stubPersonregister } from '../stubs/stubPersonregister'; import { stubAktivVeileder } from '../stubs/stubAktivVeileder'; import { stubModiaContext } from '../stubs/stubModiaContext'; import { stubVeiledere } from '../stubs/stubVeiledere'; -import { aktivEnhetMock } from '../../mock/data/aktivEnhetMock'; +import { aktivEnhetMock } from '@/mocks/data/aktivEnhetMock'; import { FetchVeiledereFailed, Notification, @@ -20,10 +20,9 @@ import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { enhetOversiktRoutePath } from '@/routers/AppRouter'; import { getQueryClientWithMockdata } from '../testQueryClient'; import { unleashQueryKeys } from '@/data/unleash/unleashQueryHooks'; -import { unleashMock } from '../../mock/mockUnleash'; +import { unleashMock } from '@/mocks/mockUnleash'; import { StoreKey } from '@/hooks/useLocalStorageState'; import { addWeeks } from '@/utils/dateUtils'; -import nock from 'nock'; let queryClient: QueryClient; @@ -67,7 +66,6 @@ describe('OversiktContainer', () => { afterEach(() => { localStorage.setItem(StoreKey.FLEXJAR_ARENABRUK_FEEDBACK_DATE, ''); - nock.cleanAll(); }); it('Skal vise notifikasjon ved feilende apikall', async () => { diff --git a/test/query/personoversiktHooks.test.tsx b/test/query/personoversiktHooks.test.tsx index a616c74d..e7332736 100644 --- a/test/query/personoversiktHooks.test.tsx +++ b/test/query/personoversiktHooks.test.tsx @@ -1,12 +1,12 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import React, { ReactNode } from 'react'; import { stubModiaContext } from '../stubs/stubModiaContext'; -import { personoversiktEnhetMock } from '../../mock/data/personoversiktEnhetMock'; +import { personoversiktEnhetMock } from '@/mocks/data/personoversiktEnhetMock'; import { stubPersonoversikt } from '../stubs/stubPersonoversikt'; import { usePersonoversiktQuery } from '@/data/personoversiktHooks'; import { PersonOversiktStatusDTO } from '@/api/types/personoversiktTypes'; import { AktivEnhetContext } from '@/context/aktivEnhet/AktivEnhetContext'; -import { aktivEnhetMock } from '../../mock/data/aktivEnhetMock'; +import { aktivEnhetMock } from '@/mocks/data/aktivEnhetMock'; import { NotificationProvider } from '@/context/notification/NotificationContext'; import { describe, expect, it } from 'vitest'; import { renderHook, waitFor } from '@testing-library/react'; diff --git a/test/query/personregisterHooks.test.tsx b/test/query/personregisterHooks.test.tsx index d0063525..8f49c796 100644 --- a/test/query/personregisterHooks.test.tsx +++ b/test/query/personregisterHooks.test.tsx @@ -1,13 +1,13 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import React, { ReactNode } from 'react'; import { stubModiaContext } from '../stubs/stubModiaContext'; -import { personoversiktEnhetMock } from '../../mock/data/personoversiktEnhetMock'; +import { personoversiktEnhetMock } from '@/mocks/data/personoversiktEnhetMock'; import { stubPersonoversikt } from '../stubs/stubPersonoversikt'; import { stubPersonregister } from '../stubs/stubPersonregister'; import { usePersonregisterQuery } from '@/data/personregisterHooks'; import { PersonregisterData } from '@/api/types/personregisterTypes'; import { AktivEnhetContext } from '@/context/aktivEnhet/AktivEnhetContext'; -import { aktivEnhetMock } from '../../mock/data/aktivEnhetMock'; +import { aktivEnhetMock } from '@/mocks/data/aktivEnhetMock'; import { NotificationProvider } from '@/context/notification/NotificationContext'; import { describe, expect, it } from 'vitest'; import { renderHook, waitFor } from '@testing-library/react'; diff --git a/test/query/veiledereQueryHooks.test.tsx b/test/query/veiledereQueryHooks.test.tsx index b950caf5..61272a5a 100644 --- a/test/query/veiledereQueryHooks.test.tsx +++ b/test/query/veiledereQueryHooks.test.tsx @@ -8,10 +8,10 @@ import { } from '@/data/veiledereQueryHooks'; import { VeilederDTO } from '@/api/types/veiledereTypes'; import { stubAktivVeileder } from '../stubs/stubAktivVeileder'; -import { veiledereMock } from '../../mock/data/veiledereMock'; -import { veilederMock } from '../../mock/data/veilederMock'; +import { veiledereMock } from '@/mocks/data/veiledereMock'; +import { veilederMock } from '@/mocks/data/veilederMock'; import { AktivEnhetContext } from '@/context/aktivEnhet/AktivEnhetContext'; -import { aktivEnhetMock } from '../../mock/data/aktivEnhetMock'; +import { aktivEnhetMock } from '@/mocks/data/aktivEnhetMock'; import { NotificationProvider } from '@/context/notification/NotificationContext'; import { describe, expect, it } from 'vitest'; import { renderHook, waitFor } from '@testing-library/react'; diff --git a/test/setup.ts b/test/setup.ts index a2012ce9..578776e6 100644 --- a/test/setup.ts +++ b/test/setup.ts @@ -1,8 +1,20 @@ -import { vi } from 'vitest'; - -vi.stubGlobal('XMLHttpRequest', vi.fn()); +import { afterAll, afterEach, beforeAll, vi } from 'vitest'; +import { setupServer } from 'msw/node'; +import { mockUnleash } from '@/mocks/mockUnleash'; +import { mockSyfoveileder } from '@/mocks/syfoveileder/mockSyfoveileder'; vi.mock('@amplitude/analytics-browser', () => ({ track: vi.fn(), init: vi.fn(), })); + +export const mockServer = setupServer(mockUnleash, ...mockSyfoveileder); + +// Start server before all tests +beforeAll(() => mockServer.listen({ onUnhandledRequest: 'warn' })); + +// Close server after all tests +afterAll(() => mockServer.close()); + +// Reset handlers after each test `important for test isolation` +afterEach(() => mockServer.resetHandlers()); diff --git a/test/stubs/nockDefaults.ts b/test/stubs/nockDefaults.ts deleted file mode 100644 index 389cc98c..00000000 --- a/test/stubs/nockDefaults.ts +++ /dev/null @@ -1 +0,0 @@ -export const nockBasePath = 'http://localhost:80'; diff --git a/test/stubs/stubAktivVeileder.ts b/test/stubs/stubAktivVeileder.ts index 3f21acf8..e4e96174 100644 --- a/test/stubs/stubAktivVeileder.ts +++ b/test/stubs/stubAktivVeileder.ts @@ -1,15 +1,12 @@ -import nock from 'nock'; import { SYFOVEILEDER_ROOT } from '@/apiConstants'; -import { veilederMock } from '../../mock/data/veilederMock'; -import axios from 'axios'; -import { nockBasePath } from './nockDefaults'; +import { veilederMock } from '@/mocks/data/veilederMock'; +import { mockServer } from '../setup'; +import { http, HttpResponse } from 'msw'; export const stubAktivVeileder = () => { - axios.defaults.adapter = 'http'; - - nock(nockBasePath) - .get(`${SYFOVEILEDER_ROOT}/veiledere/self`) - .reply(200, { - ...veilederMock, - }); + mockServer.use( + http.get(`*${SYFOVEILEDER_ROOT}/veiledere/self`, () => + HttpResponse.json(veilederMock) + ) + ); }; diff --git a/test/stubs/stubFlexjar.ts b/test/stubs/stubFlexjar.ts index b99e04fc..890e0f41 100644 --- a/test/stubs/stubFlexjar.ts +++ b/test/stubs/stubFlexjar.ts @@ -1,16 +1,21 @@ -import nock from 'nock'; import { FLEXJAR_ROOT } from '@/apiConstants'; -import axios from 'axios'; -import { nockBasePath } from './nockDefaults'; +import { mockServer } from '../setup'; +import { http, HttpResponse } from 'msw'; export const stubFlexjarApiOk = () => { - axios.defaults.adapter = 'http'; - - nock(nockBasePath).post(`${FLEXJAR_ROOT}/feedback/azure`).reply(200); + mockServer.use( + http.post( + `*${FLEXJAR_ROOT}/feedback/azure`, + () => new HttpResponse(null, { status: 200 }) + ) + ); }; export const stubFlexjarApiError = () => { - axios.defaults.adapter = 'http'; - - nock(nockBasePath).post(`${FLEXJAR_ROOT}/feedback/azure`).reply(500); + mockServer.use( + http.post( + `*${FLEXJAR_ROOT}/feedback/azure`, + () => new HttpResponse(null, { status: 500 }) + ) + ); }; diff --git a/test/stubs/stubModiaContext.ts b/test/stubs/stubModiaContext.ts index 82f0265a..cbaac63c 100644 --- a/test/stubs/stubModiaContext.ts +++ b/test/stubs/stubModiaContext.ts @@ -1,15 +1,12 @@ -import nock from 'nock'; import { MODIACONTEXTHOLDER_ROOT } from '@/apiConstants'; -import { aktivEnhetMock } from '../../mock/data/aktivEnhetMock'; -import axios from 'axios'; -import { nockBasePath } from './nockDefaults'; +import { aktivEnhetMock } from '@/mocks/data/aktivEnhetMock'; +import { mockServer } from '../setup'; +import { http, HttpResponse } from 'msw'; export const stubModiaContext = () => { - axios.defaults.adapter = 'http'; - - nock(nockBasePath) - .get(`${MODIACONTEXTHOLDER_ROOT}/context/aktivenhet`) - .reply(200, { - ...aktivEnhetMock, - }); + mockServer.use( + http.get(`*${MODIACONTEXTHOLDER_ROOT}/context/aktivenhet`, () => + HttpResponse.json(aktivEnhetMock) + ) + ); }; diff --git a/test/stubs/stubPersonoversikt.ts b/test/stubs/stubPersonoversikt.ts index 8556c192..2b8ab240 100644 --- a/test/stubs/stubPersonoversikt.ts +++ b/test/stubs/stubPersonoversikt.ts @@ -1,14 +1,13 @@ -import nock from 'nock'; import { PERSONOVERSIKT_ROOT } from '@/apiConstants'; -import { aktivEnhetMock } from '../../mock/data/aktivEnhetMock'; -import { personoversiktEnhetMock } from '../../mock/data/personoversiktEnhetMock'; -import axios from 'axios'; -import { nockBasePath } from './nockDefaults'; +import { aktivEnhetMock } from '@/mocks/data/aktivEnhetMock'; +import { personoversiktEnhetMock } from '@/mocks/data/personoversiktEnhetMock'; +import { mockServer } from '../setup'; +import { http, HttpResponse } from 'msw'; export const stubPersonoversikt = () => { - axios.defaults.adapter = 'http'; - - nock(nockBasePath) - .get(`${PERSONOVERSIKT_ROOT}/enhet/${aktivEnhetMock.aktivEnhet}`) - .reply(200, () => [...personoversiktEnhetMock]); + mockServer.use( + http.get(`*${PERSONOVERSIKT_ROOT}/enhet/${aktivEnhetMock.aktivEnhet}`, () => + HttpResponse.json([...personoversiktEnhetMock]) + ) + ); }; diff --git a/test/stubs/stubPersonregister.ts b/test/stubs/stubPersonregister.ts index 599b2f55..202e17b1 100644 --- a/test/stubs/stubPersonregister.ts +++ b/test/stubs/stubPersonregister.ts @@ -1,13 +1,12 @@ -import nock from 'nock'; import { SYFOPERSON_ROOT } from '@/apiConstants'; -import { personInfoMock } from '../../mock/data/personInfoMock'; -import axios from 'axios'; -import { nockBasePath } from './nockDefaults'; +import { personInfoMock } from '@/mocks/data/personInfoMock'; +import { mockServer } from '../setup'; +import { http, HttpResponse } from 'msw'; export const stubPersonregister = () => { - axios.defaults.adapter = 'http'; - - nock(nockBasePath) - .post(`${SYFOPERSON_ROOT}/person/info`) - .reply(200, () => [...personInfoMock]); + mockServer.use( + http.post(`*${SYFOPERSON_ROOT}/person/info`, () => + HttpResponse.json([...personInfoMock]) + ) + ); }; diff --git a/test/stubs/stubVeiledere.ts b/test/stubs/stubVeiledere.ts index 32814d9f..8662264b 100644 --- a/test/stubs/stubVeiledere.ts +++ b/test/stubs/stubVeiledere.ts @@ -1,14 +1,14 @@ -import nock from 'nock'; import { SYFOVEILEDER_ROOT } from '@/apiConstants'; -import { aktivEnhetMock } from '../../mock/data/aktivEnhetMock'; -import { veiledereMock } from '../../mock/data/veiledereMock'; -import axios from 'axios'; -import { nockBasePath } from './nockDefaults'; +import { aktivEnhetMock } from '@/mocks/data/aktivEnhetMock'; +import { veiledereMock } from '@/mocks/data/veiledereMock'; +import { mockServer } from '../setup'; +import { http, HttpResponse } from 'msw'; export const stubVeiledere = () => { - axios.defaults.adapter = 'http'; - - nock(nockBasePath) - .get(`${SYFOVEILEDER_ROOT}/veiledere?enhetNr=${aktivEnhetMock.aktivEnhet}`) - .reply(200, () => [...veiledereMock]); + mockServer.use( + http.get( + `*${SYFOVEILEDER_ROOT}/veiledere?enhetNr=${aktivEnhetMock.aktivEnhet}`, + () => HttpResponse.json([...veiledereMock]) + ) + ); }; diff --git a/test/testQueryClient.ts b/test/testQueryClient.ts index cbddcfed..14a3df4e 100644 --- a/test/testQueryClient.ts +++ b/test/testQueryClient.ts @@ -1,9 +1,9 @@ import { QueryClient } from '@tanstack/react-query'; import { unleashQueryKeys } from '@/data/unleash/unleashQueryHooks'; -import { aktivEnhetMock } from '../mock/data/aktivEnhetMock'; -import { unleashMock } from '../mock/mockUnleash'; +import { aktivEnhetMock } from '@/mocks/data/aktivEnhetMock'; +import { unleashMock } from '@/mocks/mockUnleash'; import { personoversiktQueryKeys } from '@/data/personoversiktHooks'; -import { personoversiktEnhetMock } from '../mock/data/personoversiktEnhetMock'; +import { personoversiktEnhetMock } from '@/mocks/data/personoversiktEnhetMock'; export const testQueryClient = () => new QueryClient({ diff --git a/test/utils/hendelseFilteringUtilsTest.ts b/test/utils/hendelseFilteringUtilsTest.ts index 9d6e30a8..2575f603 100644 --- a/test/utils/hendelseFilteringUtilsTest.ts +++ b/test/utils/hendelseFilteringUtilsTest.ts @@ -13,7 +13,7 @@ import { import { testdata } from '../data/fellesTestdata'; import { HendelseTypeFilters } from '@/context/filters/filterContextState'; import { addWeeks, subWeeks } from 'date-fns'; -import { getOppfolgingsoppgave } from '../../mock/data/personoversiktEnhetMock'; +import { getOppfolgingsoppgave } from '@/mocks/data/personoversiktEnhetMock'; import { AktivitetskravStatus } from '@/api/types/personoversiktTypes'; export const createPersonDataWithName = (name: string): PersonData => { diff --git a/webpack.dev.ts b/webpack.dev.ts index 127f0a48..8fcf856c 100644 --- a/webpack.dev.ts +++ b/webpack.dev.ts @@ -5,16 +5,13 @@ import * as Webpack from 'webpack'; import * as WebpackDevServer from 'webpack-dev-server'; import common from './webpack.common'; -import mockEndepunkter from './mock/mockEndepunkter'; import * as Session from './server/session'; const devConfig: Webpack.Configuration = { mode: 'development', devtool: 'eval-source-map', devServer: { - static: { - directory: path.join(__dirname, 'dist'), - }, + static: './public', port: 8080, setupMiddlewares: ( middlewares: WebpackDevServer.Middleware[], @@ -35,9 +32,6 @@ const setupDev = async (devServer: WebpackDevServer) => { await Session.setupSession(app); - mockEndepunkter(app); - app.use('/static', express.static(path.resolve(__dirname, 'dist'))); - app.use('*', (req: express.Request, res: express.Response) => { const filename = path.join(compiler.outputPath, 'index.html'); compiler.outputFileSystem?.readFile(filename, (err: any, result: any) => {