diff --git a/docs/development-guide/09-mocking-data.md b/docs/development-guide/09-mocking-data.md index 882cca3bdcc..b12b902ae99 100644 --- a/docs/development-guide/09-mocking-data.md +++ b/docs/development-guide/09-mocking-data.md @@ -52,10 +52,10 @@ To enable the MSW, open the Local Dev Tools and check the "Mock Service Worker" import { rest } from "msw"; const handlers = [ - rest.get("*/profile", (req, res, ctx) => { + http.get("*/profile", () => { // const profile = profileFactory.build({ restricted: true }); - return res(ctx.json(profile)); + return HttpResponse.json((profile)); }), // ... other handlers ]; diff --git a/package.json b/package.json index 7a34162fe1a..7a52c671374 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "resolutions": { "@babel/traverse": "^7.23.3", "minimist": "^1.2.3", - "yargs-parser": "^18.1.3", + "yargs-parser": "^21.1.1", "kind-of": "^6.0.3", "node-fetch": "^2.6.7", "ua-parser-js": "^0.7.33", diff --git a/packages/manager/.changeset/pr-10285-tech-stories-1710440384447.md b/packages/manager/.changeset/pr-10285-tech-stories-1710440384447.md new file mode 100644 index 00000000000..044db07c8a5 --- /dev/null +++ b/packages/manager/.changeset/pr-10285-tech-stories-1710440384447.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Tech Stories +--- + +Upgrade MSW to 2.2.3 ([#10285](https://github.com/linode/manager/pull/10285)) diff --git a/packages/manager/package.json b/packages/manager/package.json index 5b59d08dabd..69ab219151a 100644 --- a/packages/manager/package.json +++ b/packages/manager/package.json @@ -193,7 +193,7 @@ "junit2json": "^3.1.4", "lint-staged": "^13.2.2", "mocha-junit-reporter": "^2.2.1", - "msw": "~1.3.2", + "msw": "^2.2.3", "prettier": "~2.2.1", "react-test-renderer": "16.14.0", "redux-mock-store": "^1.5.3", diff --git a/packages/manager/public/mockServiceWorker.js b/packages/manager/public/mockServiceWorker.js index a3dbcdd184b..792e45b19da 100644 --- a/packages/manager/public/mockServiceWorker.js +++ b/packages/manager/public/mockServiceWorker.js @@ -2,13 +2,14 @@ /* tslint:disable */ /** - * Mock Service Worker (1.3.2). + * Mock Service Worker (2.2.3). * @see https://github.com/mswjs/msw * - Please do NOT modify this file. * - Please do NOT serve this file on production. */ -const INTEGRITY_CHECKSUM = '3d6b9f06410d179a7f7404d4bf4c3c70' +const INTEGRITY_CHECKSUM = '223d191a56023cd36aa88c802961b911' +const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() self.addEventListener('install', function () { @@ -86,18 +87,12 @@ self.addEventListener('message', async function (event) { self.addEventListener('fetch', function (event) { const { request } = event - const accept = request.headers.get('accept') || '' // Bypass launch darkly if (request.url.includes("launchdarkly.com")) { return } - // Bypass server-sent events. - if (accept.includes('text/event-stream')) { - return - } - // Bypass navigation requests. if (request.mode === 'navigate') { return @@ -117,29 +112,8 @@ self.addEventListener('fetch', function (event) { } // Generate unique request ID. - const requestId = Math.random().toString(16).slice(2) - - event.respondWith( - handleRequest(event, requestId).catch((error) => { - if (error.name === 'NetworkError') { - console.warn( - '[MSW] Successfully emulated a network error for the "%s %s" request.', - request.method, - request.url, - ) - return - } - - // At this point, any exception indicates an issue with the original request/response. - console.error( - `\ -[MSW] Caught an exception from the "%s %s" request (%s). This is probably not a problem with Mock Service Worker. There is likely an additional logging output above.`, - request.method, - request.url, - `${error.name}: ${error.message}`, - ) - }), - ) + const requestId = crypto.randomUUID() + event.respondWith(handleRequest(event, requestId)) }) async function handleRequest(event, requestId) { @@ -151,21 +125,24 @@ async function handleRequest(event, requestId) { // this message will pend indefinitely. if (client && activeClientIds.has(client.id)) { ;(async function () { - const clonedResponse = response.clone() - sendToClient(client, { - type: 'RESPONSE', - payload: { - requestId, - type: clonedResponse.type, - ok: clonedResponse.ok, - status: clonedResponse.status, - statusText: clonedResponse.statusText, - body: - clonedResponse.body === null ? null : await clonedResponse.text(), - headers: Object.fromEntries(clonedResponse.headers.entries()), - redirected: clonedResponse.redirected, + 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], + ) })() } @@ -201,20 +178,20 @@ async function resolveMainClient(event) { async function getResponse(event, client, requestId) { const { request } = event - const clonedRequest = request.clone() + + // 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() { - // Clone the request because it might've been already used - // (i.e. its body has been read and sent to the client). - const headers = Object.fromEntries(clonedRequest.headers.entries()) + const headers = Object.fromEntries(requestClone.headers.entries()) - // Remove MSW-specific request headers so the bypassed requests - // comply with the server's CORS preflight check. - // Operate with the headers as an object because request "Headers" - // are immutable. - delete headers['x-msw-bypass'] + // 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(clonedRequest, { headers }) + return fetch(requestClone, { headers }) } // Bypass mocking when the client is not active. @@ -232,31 +209,36 @@ async function getResponse(event, client, requestId) { // Bypass requests with the explicit bypass header. // Such requests can be issued by "ctx.fetch()". - if (request.headers.get('x-msw-bypass') === 'true') { + const mswIntention = request.headers.get('x-msw-intention') + if (['bypass', 'passthrough'].includes(mswIntention)) { return passthrough() } // Notify the client that a request has been intercepted. - const clientMessage = await sendToClient(client, { - type: 'REQUEST', - payload: { - id: requestId, - url: request.url, - method: request.method, - headers: Object.fromEntries(request.headers.entries()), - cache: request.cache, - mode: request.mode, - credentials: request.credentials, - destination: request.destination, - integrity: request.integrity, - redirect: request.redirect, - referrer: request.referrer, - referrerPolicy: request.referrerPolicy, - body: await request.text(), - bodyUsed: request.bodyUsed, - keepalive: request.keepalive, + 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': { @@ -266,21 +248,12 @@ async function getResponse(event, client, requestId) { case 'MOCK_NOT_FOUND': { return passthrough() } - - case 'NETWORK_ERROR': { - const { name, message } = clientMessage.data - const networkError = new Error(message) - networkError.name = name - - // Rejecting a "respondWith" promise emulates a network error. - throw networkError - } } return passthrough() } -function sendToClient(client, message) { +function sendToClient(client, message, transferrables = []) { return new Promise((resolve, reject) => { const channel = new MessageChannel() @@ -292,17 +265,28 @@ function sendToClient(client, message) { resolve(event.data) } - client.postMessage(message, [channel.port2]) + client.postMessage( + message, + [channel.port2].concat(transferrables.filter(Boolean)), + ) }) } -function sleep(timeMs) { - return new Promise((resolve) => { - setTimeout(resolve, timeMs) +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, }) -} -async function respondWithMock(response) { - await sleep(response.delay) - return new Response(response.body, response) + return mockedResponse } diff --git a/packages/manager/src/components/AbuseTicketBanner/AbuseTicketBanner.test.tsx b/packages/manager/src/components/AbuseTicketBanner/AbuseTicketBanner.test.tsx index 05d11b37f99..6b01de55344 100644 --- a/packages/manager/src/components/AbuseTicketBanner/AbuseTicketBanner.test.tsx +++ b/packages/manager/src/components/AbuseTicketBanner/AbuseTicketBanner.test.tsx @@ -6,7 +6,7 @@ import { notificationFactory, } from 'src/factories/notification'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { getAbuseTickets } from 'src/store/selectors/getAbuseTicket'; import { renderWithTheme, wrapWithTheme } from 'src/utilities/testHelpers'; @@ -17,11 +17,9 @@ const TICKET_TESTID = 'abuse-ticket-link'; describe('Abuse ticket banner', () => { it('should render a banner for an abuse ticket', async () => { server.use( - rest.get('*/account/notifications', (req, res, ctx) => { - return res( - ctx.json( - makeResourcePage(abuseTicketNotificationFactory.buildList(1)) - ) + http.get('*/account/notifications', () => { + return HttpResponse.json( + makeResourcePage(abuseTicketNotificationFactory.buildList(1)) ); }) ); @@ -34,11 +32,9 @@ describe('Abuse ticket banner', () => { it('should aggregate multiple abuse tickets', async () => { server.use( - rest.get('*/account/notifications', (req, res, ctx) => { - return res( - ctx.json( - makeResourcePage(abuseTicketNotificationFactory.buildList(2)) - ) + http.get('*/account/notifications', () => { + return HttpResponse.json( + makeResourcePage(abuseTicketNotificationFactory.buildList(2)) ); }) ); @@ -52,8 +48,8 @@ describe('Abuse ticket banner', () => { it('should link to the ticket if there is a single abuse ticket', async () => { const mockAbuseTicket = abuseTicketNotificationFactory.build(); server.use( - rest.get('*/account/notifications', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([mockAbuseTicket]))); + http.get('*/account/notifications', () => { + return HttpResponse.json(makeResourcePage([mockAbuseTicket])); }) ); const { getByTestId } = renderWithTheme(); @@ -67,8 +63,8 @@ describe('Abuse ticket banner', () => { it('should link to the ticket list view if there are multiple tickets', async () => { const mockAbuseTickets = abuseTicketNotificationFactory.buildList(2); server.use( - rest.get('*/account/notifications', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(mockAbuseTickets))); + http.get('*/account/notifications', () => { + return HttpResponse.json(makeResourcePage(mockAbuseTickets)); }) ); const { getByTestId } = renderWithTheme(); @@ -81,8 +77,8 @@ describe('Abuse ticket banner', () => { it('should return null if there are no abuse tickets', () => { server.use( - rest.get('*/account/notifications', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/account/notifications', () => { + return HttpResponse.json(makeResourcePage([])); }) ); const { queryByTestId } = renderWithTheme(); diff --git a/packages/manager/src/components/AccessPanel/UserSSHKeyPanel.test.tsx b/packages/manager/src/components/AccessPanel/UserSSHKeyPanel.test.tsx index 5326b0e1e92..52eb7865ec7 100644 --- a/packages/manager/src/components/AccessPanel/UserSSHKeyPanel.test.tsx +++ b/packages/manager/src/components/AccessPanel/UserSSHKeyPanel.test.tsx @@ -5,7 +5,7 @@ import * as React from 'react'; import { profileFactory, sshKeyFactory } from 'src/factories'; import { accountUserFactory } from 'src/factories/accountUsers'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import UserSSHKeyPanel from './UserSSHKeyPanel'; @@ -15,14 +15,14 @@ describe('UserSSHKeyPanel', () => { it('should render an empty state', async () => { // Mock a lot of API calls to simulate what a restricted user would get server.use( - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ restricted: true }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ restricted: true })); }), - rest.get('*/profile/sshkeys', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/profile/sshkeys', () => { + return HttpResponse.json(makeResourcePage([])); }), - rest.get('*/account/users', (req, res, ctx) => { - return res(ctx.status(401), ctx.json(makeResourcePage([]))); + http.get('*/account/users', () => { + return HttpResponse.json(makeResourcePage([]), { status: 401 }); }) ); const { queryByTestId } = renderWithTheme( @@ -35,18 +35,18 @@ describe('UserSSHKeyPanel', () => { it('should render the restricted users ssh key if they have one', async () => { // Mock a lot of API calls to simulate what a restricted user would get server.use( - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ restricted: true }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ restricted: true })); }), - rest.get('*/profile/sshkeys', (req, res, ctx) => { + http.get('*/profile/sshkeys', () => { const sshKeys = [ sshKeyFactory.build({ label: 'my-ssh-key' }), sshKeyFactory.build({ label: 'my-other-ssh-key' }), ]; - return res(ctx.json(makeResourcePage(sshKeys))); + return HttpResponse.json(makeResourcePage(sshKeys)); }), - rest.get('*/account/users', (req, res, ctx) => { - return res(ctx.status(401), ctx.json(makeResourcePage([]))); + http.get('*/account/users', () => { + return HttpResponse.json(makeResourcePage([]), { status: 401 }); }) ); const { getByText } = renderWithTheme( @@ -64,12 +64,12 @@ describe('UserSSHKeyPanel', () => { describe('normal user', () => { it('should render a row for each user', async () => { server.use( - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ restricted: false }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ restricted: false })); }), - rest.get('*/account/users', (req, res, ctx) => { + http.get('*/account/users', () => { const users = [accountUserFactory.build({ username: 'test-user' })]; - return res(ctx.json(makeResourcePage(users))); + return HttpResponse.json(makeResourcePage(users)); }) ); const { getByText } = renderWithTheme( @@ -81,17 +81,17 @@ describe('UserSSHKeyPanel', () => { }); it('should call the update handler when a user is checked', async () => { server.use( - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ restricted: false }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ restricted: false })); }), - rest.get('*/account/users', (req, res, ctx) => { + http.get('*/account/users', () => { const users = [ accountUserFactory.build({ ssh_keys: ['ssh-key'], username: 'test-user', }), ]; - return res(ctx.json(makeResourcePage(users))); + return HttpResponse.json(makeResourcePage(users)); }) ); diff --git a/packages/manager/src/components/PrimaryNav/PrimaryNav.test.tsx b/packages/manager/src/components/PrimaryNav/PrimaryNav.test.tsx index 3e38a08aca9..2150d7adeef 100644 --- a/packages/manager/src/components/PrimaryNav/PrimaryNav.test.tsx +++ b/packages/manager/src/components/PrimaryNav/PrimaryNav.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { accountFactory } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { queryClientFactory } from 'src/queries/base'; import { renderWithTheme, wrapWithTheme } from 'src/utilities/testHelpers'; @@ -20,8 +20,8 @@ const queryString = 'menu-item-Managed'; describe('PrimaryNav', () => { it('only contains a "Managed" menu link if the user has Managed services.', async () => { server.use( - rest.get('*/account/maintenance', (req, res, ctx) => { - return res(ctx.json({ managed: false })); + http.get('*/account/maintenance', () => { + return HttpResponse.json({ managed: false }); }) ); @@ -34,8 +34,8 @@ describe('PrimaryNav', () => { expect(queryByTestId(queryString)).not.toBeInTheDocument(); server.use( - rest.get('*/account/maintenance', (req, res, ctx) => { - return res(ctx.json({ managed: true })); + http.get('*/account/maintenance', () => { + return HttpResponse.json({ managed: true }); }) ); @@ -78,8 +78,8 @@ describe('PrimaryNav', () => { }); server.use( - rest.get('*/account', (req, res, ctx) => { - return res(ctx.json(account)); + http.get('*/account', () => { + return HttpResponse.json(account); }) ); @@ -98,8 +98,8 @@ describe('PrimaryNav', () => { }); server.use( - rest.get('*/account', (req, res, ctx) => { - return res(ctx.json(account)); + http.get('*/account', () => { + return HttpResponse.json(account); }) ); @@ -118,8 +118,8 @@ describe('PrimaryNav', () => { }); server.use( - rest.get('*/account', (req, res, ctx) => { - return res(ctx.json(account)); + http.get('*/account', () => { + return HttpResponse.json(account); }) ); diff --git a/packages/manager/src/components/TransferDisplay/TransferDisplay.test.tsx b/packages/manager/src/components/TransferDisplay/TransferDisplay.test.tsx index 752bf26f84b..91e55b6569c 100644 --- a/packages/manager/src/components/TransferDisplay/TransferDisplay.test.tsx +++ b/packages/manager/src/components/TransferDisplay/TransferDisplay.test.tsx @@ -2,7 +2,7 @@ import { fireEvent } from '@testing-library/react'; import React from 'react'; import { accountTransferFactory } from 'src/factories/account'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { TransferDisplay } from './TransferDisplay'; @@ -21,8 +21,8 @@ const mockServerQuery = (data: TransferDataOptions) => { } server.use( - rest.get('*/account/transfer', (req, res, ctx) => { - return res(ctx.json(data)); + http.get('*/account/transfer', () => { + return HttpResponse.json(data); }) ); }; diff --git a/packages/manager/src/features/Account/Maintenance/MaintenanceTable.test.tsx b/packages/manager/src/features/Account/Maintenance/MaintenanceTable.test.tsx index 5dddf2d778a..0529acee5e4 100644 --- a/packages/manager/src/features/Account/Maintenance/MaintenanceTable.test.tsx +++ b/packages/manager/src/features/Account/Maintenance/MaintenanceTable.test.tsx @@ -7,7 +7,7 @@ import * as React from 'react'; import { accountMaintenanceFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { parseAPIDate } from 'src/utilities/date'; import { formatDate } from 'src/utilities/formatDate'; import { @@ -48,11 +48,11 @@ describe('Maintenance Table Row', () => { describe('Maintenance Table', () => { it('should render maintenance table with items', async () => { server.use( - rest.get('*/account/maintenance', (req, res, ctx) => { + http.get('*/account/maintenance', () => { const accountMaintenance = accountMaintenanceFactory.buildList(1, { status: 'pending', }); - return res(ctx.json(makeResourcePage(accountMaintenance))); + return HttpResponse.json(makeResourcePage(accountMaintenance)); }) ); renderWithTheme(); @@ -79,8 +79,8 @@ describe('Maintenance Table', () => { it('should render maintenance table with empty state', async () => { server.use( - rest.get('*/account/maintenance', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/account/maintenance', () => { + return HttpResponse.json(makeResourcePage([])); }) ); diff --git a/packages/manager/src/features/Account/SwitchAccountDrawer.test.tsx b/packages/manager/src/features/Account/SwitchAccountDrawer.test.tsx index dcf11e472ce..cf9d125a51a 100644 --- a/packages/manager/src/features/Account/SwitchAccountDrawer.test.tsx +++ b/packages/manager/src/features/Account/SwitchAccountDrawer.test.tsx @@ -2,7 +2,7 @@ import { fireEvent } from '@testing-library/react'; import * as React from 'react'; import { profileFactory } from 'src/factories/profile'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { SwitchAccountDrawer } from './SwitchAccountDrawer'; @@ -32,8 +32,8 @@ describe('SwitchAccountDrawer', () => { it('should include a link to switch back to the parent account if the active user is a proxy user', async () => { server.use( - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ user_type: 'proxy' }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ user_type: 'proxy' })); }) ); diff --git a/packages/manager/src/features/Account/SwitchAccounts/ChildAccountList.test.tsx b/packages/manager/src/features/Account/SwitchAccounts/ChildAccountList.test.tsx index 555a6ee0801..5b2658791b8 100644 --- a/packages/manager/src/features/Account/SwitchAccounts/ChildAccountList.test.tsx +++ b/packages/manager/src/features/Account/SwitchAccounts/ChildAccountList.test.tsx @@ -4,7 +4,7 @@ import * as React from 'react'; import { accountFactory, profileFactory } from 'src/factories'; import { ChildAccountList } from 'src/features/Account/SwitchAccounts/ChildAccountList'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; const props = { @@ -16,16 +16,12 @@ const props = { it('should display a list of child accounts', async () => { server.use( - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ user_type: 'parent' }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ user_type: 'parent' })); }), - rest.get('*/account/child-accounts', (req, res, ctx) => { - return res( - ctx.json( - makeResourcePage( - accountFactory.buildList(5, { company: 'Child Co.' }) - ) - ) + http.get('*/account/child-accounts', () => { + return HttpResponse.json( + makeResourcePage(accountFactory.buildList(5, { company: 'Child Co.' })) ); }) ); diff --git a/packages/manager/src/features/Backups/BackupLinodeRow.test.tsx b/packages/manager/src/features/Backups/BackupLinodeRow.test.tsx index cfeb5e3cb2a..9660ccbfc4a 100644 --- a/packages/manager/src/features/Backups/BackupLinodeRow.test.tsx +++ b/packages/manager/src/features/Backups/BackupLinodeRow.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { linodeFactory, linodeTypeFactory } from 'src/factories/linodes'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme, wrapWithTableBody } from 'src/utilities/testHelpers'; import { BackupLinodeRow } from './BackupLinodeRow'; @@ -9,14 +9,12 @@ import { BackupLinodeRow } from './BackupLinodeRow'; describe('BackupLinodeRow', () => { it('should render linode, plan label, and base backups price', async () => { server.use( - rest.get('*/linode/types/linode-type-test', (req, res, ctx) => { - return res( - ctx.json( - linodeTypeFactory.build({ - addons: { backups: { price: { monthly: 12.99 } } }, - label: 'Linode Test Type', - }) - ) + http.get('*/linode/types/linode-type-test', () => { + return HttpResponse.json( + linodeTypeFactory.build({ + addons: { backups: { price: { monthly: 12.99 } } }, + label: 'Linode Test Type', + }) ); }) ); @@ -37,28 +35,26 @@ describe('BackupLinodeRow', () => { it('should render linode, plan label, and DC-specific backups price', async () => { server.use( - rest.get('*/linode/types/linode-type-test', (req, res, ctx) => { - return res( - ctx.json( - linodeTypeFactory.build({ - addons: { - backups: { - price: { - hourly: 0.004, - monthly: 2.5, - }, - region_prices: [ - { - hourly: 0.0048, - id: 'id-cgk', - monthly: 3.57, - }, - ], + http.get('*/linode/types/linode-type-test', () => { + return HttpResponse.json( + linodeTypeFactory.build({ + addons: { + backups: { + price: { + hourly: 0.004, + monthly: 2.5, }, + region_prices: [ + { + hourly: 0.0048, + id: 'id-cgk', + monthly: 3.57, + }, + ], }, - label: 'Linode Test Type', - }) - ) + }, + label: 'Linode Test Type', + }) ); }) ); @@ -81,8 +77,8 @@ describe('BackupLinodeRow', () => { it('should render error indicator when price cannot be determined', async () => { server.use( - rest.get('*/linode/types/linode-type-test', (req, res, ctx) => { - return res.networkError('A hypothetical network error has occurred!'); + http.get('*/linode/types/linode-type-test', () => { + return HttpResponse.error(); }) ); @@ -92,7 +88,7 @@ describe('BackupLinodeRow', () => { type: 'linode-type-test', }); - const { findByText, findByLabelText } = renderWithTheme( + const { findByLabelText, findByText } = renderWithTheme( wrapWithTableBody() ); @@ -104,28 +100,26 @@ describe('BackupLinodeRow', () => { it('should not render error indicator for $0 price', async () => { server.use( - rest.get('*/linode/types/linode-type-test', (req, res, ctx) => { - return res( - ctx.json( - linodeTypeFactory.build({ - addons: { - backups: { - price: { - hourly: 0.004, - monthly: 2.5, - }, - region_prices: [ - { - hourly: 0, - id: 'id-cgk', - monthly: 0, - }, - ], + http.get('*/linode/types/linode-type-test', () => { + return HttpResponse.json( + linodeTypeFactory.build({ + addons: { + backups: { + price: { + hourly: 0.004, + monthly: 2.5, }, + region_prices: [ + { + hourly: 0, + id: 'id-cgk', + monthly: 0, + }, + ], }, - label: 'Linode Test Type', - }) - ) + }, + label: 'Linode Test Type', + }) ); }) ); diff --git a/packages/manager/src/features/Backups/BackupsCTA.test.tsx b/packages/manager/src/features/Backups/BackupsCTA.test.tsx index 697ffadbc1c..cddd228d6ed 100644 --- a/packages/manager/src/features/Backups/BackupsCTA.test.tsx +++ b/packages/manager/src/features/Backups/BackupsCTA.test.tsx @@ -6,7 +6,7 @@ import { profileFactory, } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { BackupsCTA } from './BackupsCTA'; @@ -14,21 +14,21 @@ import { BackupsCTA } from './BackupsCTA'; describe('BackupsCTA', () => { it('should render if all conditions are met', async () => { server.use( - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ restricted: false }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ restricted: false })); }), - rest.get('*/account/settings', (req, res, ctx) => { - return res(ctx.json(accountSettingsFactory.build({ managed: false }))); + http.get('*/account/settings', () => { + return HttpResponse.json( + accountSettingsFactory.build({ managed: false }) + ); }), - rest.get('*/profile/preferences', (req, res, ctx) => { - return res(ctx.json(accountSettingsFactory.build({}))); + http.get('*/profile/preferences', () => { + return HttpResponse.json(accountSettingsFactory.build({})); }), - rest.get('*/linode/instances', (req, res, ctx) => { - return res( - ctx.json( - makeResourcePage( - linodeFactory.buildList(5, { backups: { enabled: false } }) - ) + http.get('*/linode/instances', () => { + return HttpResponse.json( + makeResourcePage( + linodeFactory.buildList(5, { backups: { enabled: false } }) ) ); }) diff --git a/packages/manager/src/features/Billing/BillingPanels/BillingSummary/PaymentDrawer/PaymentDrawer.test.tsx b/packages/manager/src/features/Billing/BillingPanels/BillingSummary/PaymentDrawer/PaymentDrawer.test.tsx index 6670bff1051..0133dffcccf 100644 --- a/packages/manager/src/features/Billing/BillingPanels/BillingSummary/PaymentDrawer/PaymentDrawer.test.tsx +++ b/packages/manager/src/features/Billing/BillingPanels/BillingSummary/PaymentDrawer/PaymentDrawer.test.tsx @@ -7,7 +7,7 @@ import userEvent from '@testing-library/user-event'; import * as React from 'react'; import { paymentFactory } from 'src/factories/billing'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { wrapWithTheme } from 'src/utilities/testHelpers'; import PaymentDrawer, { getMinimumPayment } from './PaymentDrawer'; @@ -52,8 +52,8 @@ describe('Make a Payment Panel', () => { it.skip('should not display a warning for a normal successful payment', async () => { server.use( - rest.post('*/account/payments', (req, res, ctx) => { - return res(ctx.json(paymentFactory.build())); + http.post('*/account/payments', () => { + return HttpResponse.json(paymentFactory.build()); }) ); render(wrapWithTheme()); diff --git a/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.test.tsx b/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.test.tsx index a8da6ff98bb..580d3b78eca 100644 --- a/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.test.tsx +++ b/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.test.tsx @@ -5,7 +5,7 @@ import { Router } from 'react-router-dom'; import { databaseTypeFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { mockMatchMedia } from 'src/utilities/testHelpers'; @@ -50,9 +50,9 @@ describe('Database Create', () => { class: 'dedicated', }); server.use( - rest.get('*/databases/types', (req, res, ctx) => { - return res( - ctx.json(makeResourcePage([...standardTypes, ...dedicatedTypes])) + http.get('*/databases/types', () => { + return HttpResponse.json( + makeResourcePage([...standardTypes, ...dedicatedTypes]) ); }) ); diff --git a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseBackups/DatabaseBackups.test.tsx b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseBackups/DatabaseBackups.test.tsx index 9881d95cb68..0ac9d790b01 100644 --- a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseBackups/DatabaseBackups.test.tsx +++ b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseBackups/DatabaseBackups.test.tsx @@ -6,7 +6,7 @@ import { profileFactory, } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { formatDate } from 'src/utilities/formatDate'; import { renderWithTheme } from 'src/utilities/testHelpers'; @@ -18,14 +18,14 @@ describe('Database Backups', () => { // Mock the Database because the Backups Details page requires it to be loaded server.use( - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ timezone: 'utc' }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ timezone: 'utc' })); }), - rest.get('*/databases/:engine/instances/:id', (req, res, ctx) => { - return res(ctx.json(databaseFactory.build())); + http.get('*/databases/:engine/instances/:id', () => { + return HttpResponse.json(databaseFactory.build()); }), - rest.get('*/databases/:engine/instances/:id/backups', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(backups))); + http.get('*/databases/:engine/instances/:id/backups', () => { + return HttpResponse.json(makeResourcePage(backups)); }) ); @@ -43,15 +43,15 @@ describe('Database Backups', () => { it('should render an empty state if there are no backups', async () => { // Mock the Database because the Backups Details page requires it to be loaded server.use( - rest.get('*/databases/:engine/instances/:id', (req, res, ctx) => { - return res(ctx.json(databaseFactory.build())); + http.get('*/databases/:engine/instances/:id', () => { + return HttpResponse.json(databaseFactory.build()); }) ); // Mock an empty list of backups server.use( - rest.get('*/databases/:engine/instances/:id/backups', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/databases/:engine/instances/:id/backups', () => { + return HttpResponse.json(makeResourcePage([])); }) ); diff --git a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResize.test.tsx b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResize.test.tsx index d37d71ea695..5a1271cbb02 100644 --- a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResize.test.tsx +++ b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResize.test.tsx @@ -9,7 +9,7 @@ import { Router } from 'react-router-dom'; import { databaseFactory, databaseTypeFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; import { DatabaseResize } from './DatabaseResize'; @@ -45,9 +45,9 @@ describe('database resize', () => { ...databaseTypeFactory.buildList(7, { class: 'standard' }), ]; server.use( - rest.get('*/databases/types', (req, res, ctx) => { - return res( - ctx.json(makeResourcePage([...standardTypes, ...dedicatedTypes])) + http.get('*/databases/types', () => { + return HttpResponse.json( + makeResourcePage([...standardTypes, ...dedicatedTypes]) ); }) ); @@ -82,9 +82,9 @@ describe('database resize', () => { ...databaseTypeFactory.buildList(7, { class: 'standard' }), ]; server.use( - rest.get('*/databases/types', (req, res, ctx) => { - return res( - ctx.json(makeResourcePage([...standardTypes, ...dedicatedTypes])) + http.get('*/databases/types', () => { + return HttpResponse.json( + makeResourcePage([...standardTypes, ...dedicatedTypes]) ); }) ); diff --git a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResizeCurrentConfiguration.test.tsx b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResizeCurrentConfiguration.test.tsx index d54812cfebb..3ad5df36400 100644 --- a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResizeCurrentConfiguration.test.tsx +++ b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResizeCurrentConfiguration.test.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { databaseFactory, databaseTypeFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; import { DatabaseResizeCurrentConfiguration } from './DatabaseResizeCurrentConfiguration'; @@ -38,9 +38,9 @@ describe('database current configuration section', () => { class: 'dedicated', }); server.use( - rest.get('*/databases/types', (req, res, ctx) => { - return res( - ctx.json(makeResourcePage([...standardTypes, ...dedicatedTypes])) + http.get('*/databases/types', () => { + return HttpResponse.json( + makeResourcePage([...standardTypes, ...dedicatedTypes]) ); }) ); diff --git a/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLanding.test.tsx b/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLanding.test.tsx index d59609730af..e88a861e1f6 100644 --- a/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLanding.test.tsx +++ b/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLanding.test.tsx @@ -4,7 +4,7 @@ import * as React from 'react'; import { databaseInstanceFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { capitalize } from 'src/utilities/capitalize'; import { formatDate } from 'src/utilities/formatDate'; import { @@ -51,11 +51,11 @@ describe('Database Table Row', () => { describe('Database Table', () => { it('should render database landing table with items', async () => { server.use( - rest.get('*/databases/instances', (req, res, ctx) => { + http.get('*/databases/instances', () => { const databases = databaseInstanceFactory.buildList(1, { status: 'active', }); - return res(ctx.json(makeResourcePage(databases))); + return HttpResponse.json(makeResourcePage(databases)); }) ); @@ -82,8 +82,8 @@ describe('Database Table', () => { it('should render database landing with empty state', async () => { server.use( - rest.get('*/databases/instances', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/databases/instances', () => { + return HttpResponse.json(makeResourcePage([])); }) ); diff --git a/packages/manager/src/features/EntityTransfers/EntityTransfersLanding/ConfirmTransferDialog.test.tsx b/packages/manager/src/features/EntityTransfers/EntityTransfersLanding/ConfirmTransferDialog.test.tsx index dc86536590b..55cfed29ada 100644 --- a/packages/manager/src/features/EntityTransfers/EntityTransfersLanding/ConfirmTransferDialog.test.tsx +++ b/packages/manager/src/features/EntityTransfers/EntityTransfersLanding/ConfirmTransferDialog.test.tsx @@ -3,7 +3,7 @@ import { DateTime } from 'luxon'; import * as React from 'react'; import { entityTransferFactory } from 'src/factories/entityTransfers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { @@ -23,11 +23,11 @@ describe('Accept Entity Transfer confirmation dialog', () => { describe('Component', () => { it("should show an error if the token being confirmed is from the current user's account", async () => { server.use( - rest.get('*/account/entity-transfers/:transferId', (req, res, ctx) => { + http.get('*/account/entity-transfers/:transferId', () => { const transfer = entityTransferFactory.build({ is_sender: true, }); - return res(ctx.json(transfer)); + return HttpResponse.json(transfer); }) ); renderWithTheme(); @@ -36,7 +36,7 @@ describe('Accept Entity Transfer confirmation dialog', () => { it('should render a list of entity types included in the token', async () => { server.use( - rest.get('*/account/entity-transfers/:transferId', (req, res, ctx) => { + http.get('*/account/entity-transfers/:transferId', () => { const transfer = entityTransferFactory.build({ entities: { domains: [1, 2, 3, 4, 5], @@ -44,7 +44,7 @@ describe('Accept Entity Transfer confirmation dialog', () => { } as any, // Domains aren't allowed yet is_sender: false, }); - return res(ctx.json(transfer)); + return HttpResponse.json(transfer); }) ); renderWithTheme(); diff --git a/packages/manager/src/features/Events/EventsLanding.test.tsx b/packages/manager/src/features/Events/EventsLanding.test.tsx index 4250cda4427..16c41f3a3c4 100644 --- a/packages/manager/src/features/Events/EventsLanding.test.tsx +++ b/packages/manager/src/features/Events/EventsLanding.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { eventFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { EventsLanding } from './EventsLanding'; @@ -10,9 +10,7 @@ import { EventsLanding } from './EventsLanding'; describe('EventsLanding', () => { it('renders an empty state', async () => { server.use( - rest.get('*/events', (req, res, ctx) => - res(ctx.json(makeResourcePage([]))) - ) + http.get('*/events', () => HttpResponse.json(makeResourcePage([]))) ); const { findByText } = renderWithTheme(); @@ -21,9 +19,7 @@ describe('EventsLanding', () => { }); it('renders a custom empty state message', async () => { server.use( - rest.get('*/events', (req, res, ctx) => - res(ctx.json(makeResourcePage([]))) - ) + http.get('*/events', () => HttpResponse.json(makeResourcePage([]))) ); const emptyMessage = 'No Linode Events :('; @@ -46,9 +42,7 @@ describe('EventsLanding', () => { }); server.use( - rest.get('*/events', (req, res, ctx) => - res(ctx.json(makeResourcePage([event]))) - ) + http.get('*/events', () => HttpResponse.json(makeResourcePage([event]))) ); const { findByText } = renderWithTheme(); @@ -61,9 +55,9 @@ describe('EventsLanding', () => { const event = eventFactory.build(); server.use( - rest.get('*/events', (req, res, ctx) => - res( - ctx.json(makeResourcePage([event], { page: 1, pages: 1, results: 1 })) + http.get('*/events', () => + HttpResponse.json( + makeResourcePage([event], { page: 1, pages: 1, results: 1 }) ) ) ); diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.test.tsx b/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.test.tsx index b625fb3365d..102a24c7cb5 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.test.tsx +++ b/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.test.tsx @@ -4,7 +4,7 @@ import * as React from 'react'; import { Router } from 'react-router-dom'; import { firewallDeviceFactory } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { @@ -39,8 +39,8 @@ services.forEach((service: FirewallDeviceEntityType) => { props.forEach((prop) => { it('should render the component', () => { server.use( - rest.get('*/firewalls/*', (req, res, ctx) => { - return res(ctx.json(firewallDeviceFactory.buildList(1))); + http.get('*/firewalls/*', () => { + return HttpResponse.json(firewallDeviceFactory.buildList(1)); }) ); const { getByRole, getByTestId } = renderWithTheme( diff --git a/packages/manager/src/features/GlobalNotifications/RegionStatusBanner.test.tsx b/packages/manager/src/features/GlobalNotifications/RegionStatusBanner.test.tsx index 9e6768a1707..48d3b49d19f 100644 --- a/packages/manager/src/features/GlobalNotifications/RegionStatusBanner.test.tsx +++ b/packages/manager/src/features/GlobalNotifications/RegionStatusBanner.test.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { regionFactory } from 'src/factories/regions'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { RegionStatusBanner } from './RegionStatusBanner'; @@ -11,9 +11,9 @@ import { RegionStatusBanner } from './RegionStatusBanner'; describe('Region status banner', () => { it('should render null if there are no warnings', () => { server.use( - rest.get('*/regions', (req, res, ctx) => { + http.get('*/regions', () => { const regions = regionFactory.buildList(5); - return res(ctx.json(makeResourcePage(regions))); + return HttpResponse.json(makeResourcePage(regions)); }) ); const { container } = renderWithTheme(); @@ -22,13 +22,13 @@ describe('Region status banner', () => { it("should render the region's name, and not a list, for a single affected region", async () => { server.use( - rest.get('*/regions', (req, res, ctx) => { + http.get('*/regions', () => { const regions = regionFactory.buildList(1, { id: 'us-east', label: 'Newark, NJ', status: 'outage', }); - return res(ctx.json(makeResourcePage(regions))); + return HttpResponse.json(makeResourcePage(regions)); }) ); const { queryAllByTestId, queryAllByText } = renderWithTheme( @@ -42,11 +42,11 @@ describe('Region status banner', () => { it("should render a list with each region with a status of 'outage' when there are more than one such region", async () => { server.use( - rest.get('*/regions', (req, res, ctx) => { + http.get('*/regions', () => { const regions = regionFactory.buildList(5, { status: 'outage', }); - return res(ctx.json(makeResourcePage(regions))); + return HttpResponse.json(makeResourcePage(regions)); }) ); const { queryAllByTestId } = renderWithTheme(); @@ -58,11 +58,11 @@ describe('Region status banner', () => { it('should filter out regions with no issues', async () => { server.use( - rest.get('*/regions', (req, res, ctx) => { + http.get('*/regions', () => { const badRegions = regionFactory.buildList(3, { status: 'outage' }); const goodRegions = regionFactory.buildList(2, { status: 'ok' }); const regions = [...badRegions, ...goodRegions]; - return res(ctx.json(makeResourcePage(regions))); + return HttpResponse.json(makeResourcePage(regions)); }) ); const { queryAllByTestId } = renderWithTheme(); diff --git a/packages/manager/src/features/Kubernetes/ClusterList/KubernetesClusterRow.test.tsx b/packages/manager/src/features/Kubernetes/ClusterList/KubernetesClusterRow.test.tsx index 4304d206b14..f914a962fd2 100644 --- a/packages/manager/src/features/Kubernetes/ClusterList/KubernetesClusterRow.test.tsx +++ b/packages/manager/src/features/Kubernetes/ClusterList/KubernetesClusterRow.test.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { kubernetesClusterFactory, regionFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { wrapWithTableBody, wrapWithTheme } from 'src/utilities/testHelpers'; import { KubernetesClusterRow, Props } from './KubernetesClusterRow'; @@ -27,12 +27,12 @@ describe('ClusterRow component', () => { it('renders a TableRow with label, and region', async () => { server.use( - rest.get('*/regions', (req, res, ctx) => { + http.get('*/regions', () => { const regions = regionFactory.buildList(1, { id: 'us-central', label: 'Fake Region, NC', }); - return res(ctx.json(makeResourcePage(regions))); + return HttpResponse.json(makeResourcePage(regions)); }) ); diff --git a/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/DeleteKubernetesClusterDialog.test.tsx b/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/DeleteKubernetesClusterDialog.test.tsx index 0440b167e3c..7685cb64d74 100644 --- a/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/DeleteKubernetesClusterDialog.test.tsx +++ b/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/DeleteKubernetesClusterDialog.test.tsx @@ -1,7 +1,7 @@ import { fireEvent } from '@testing-library/react'; import * as React from 'react'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { @@ -28,12 +28,10 @@ describe('Kubernetes deletion dialog', () => { it('should not be able to submit form before the user fills out confirmation text', async () => { server.use( - rest.get(`*/profile/preference`, (req, res, ctx) => { - return res( - ctx.json({ - type_to_confirm: true, - }) - ); + http.get(`*/profile/preference`, () => { + return HttpResponse.json({ + type_to_confirm: true, + }); }) ); diff --git a/packages/manager/src/features/Linodes/LinodeEntityDetail.test.tsx b/packages/manager/src/features/Linodes/LinodeEntityDetail.test.tsx index 0e4a60f71ff..6f5d664c719 100644 --- a/packages/manager/src/features/Linodes/LinodeEntityDetail.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeEntityDetail.test.tsx @@ -10,7 +10,7 @@ import { vpcFactory, } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { queryClientFactory } from 'src/queries/base'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; @@ -50,12 +50,12 @@ describe('Linode Entity Detail', () => { }); server.use( - rest.get('*/account', (req, res, ctx) => { - return res(ctx.json(account)); + http.get('*/account', () => { + return HttpResponse.json(account); }), - rest.get('*/vpcs', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([vpc]))); + http.get('*/vpcs', () => { + return HttpResponse.json(makeResourcePage([vpc])); }) ); @@ -91,12 +91,12 @@ describe('Linode Entity Detail', () => { }); server.use( - rest.get('*/account', (req, res, ctx) => { - return res(ctx.json(account)); + http.get('*/account', () => { + return HttpResponse.json(account); }), - rest.get('*/vpcs', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([vpc]))); + http.get('*/vpcs', () => { + return HttpResponse.json(makeResourcePage([vpc])); }) ); @@ -128,8 +128,8 @@ describe('Linode Entity Detail', () => { ]; server.use( - rest.get('*/vpcs', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(vpcs))); + http.get('*/vpcs', () => { + return HttpResponse.json(makeResourcePage(vpcs)); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesCreate/AddonsPanel.test.tsx b/packages/manager/src/features/Linodes/LinodesCreate/AddonsPanel.test.tsx index 102c84938f2..f4b16a11bb1 100644 --- a/packages/manager/src/features/Linodes/LinodesCreate/AddonsPanel.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesCreate/AddonsPanel.test.tsx @@ -2,7 +2,7 @@ import { waitFor } from '@testing-library/react'; import React from 'react'; import { imageFactory, linodeTypeFactory } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { getMonthlyBackupsPrice } from 'src/utilities/pricing/backups'; import { renderWithTheme, wrapWithTheme } from 'src/utilities/testHelpers'; @@ -193,8 +193,8 @@ const attachVLANTestId = 'attach-vlan'; describe('AddonsPanel', () => { beforeEach(() => { server.use( - rest.get('*/images/*', (req, res, ctx) => { - return res(ctx.json(imageFactory.build())); + http.get('*/images/*', () => { + return HttpResponse.json(imageFactory.build()); }) ); }); diff --git a/packages/manager/src/features/Linodes/LinodesCreate/SelectLinodePanel/SelectLinodePanel.test.tsx b/packages/manager/src/features/Linodes/LinodesCreate/SelectLinodePanel/SelectLinodePanel.test.tsx index a423e52f689..a4768d12200 100644 --- a/packages/manager/src/features/Linodes/LinodesCreate/SelectLinodePanel/SelectLinodePanel.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesCreate/SelectLinodePanel/SelectLinodePanel.test.tsx @@ -1,5 +1,5 @@ import { fireEvent } from '@testing-library/react'; -import { rest } from 'msw'; +import { http, HttpResponse } from 'msw'; import React from 'react'; import { imageFactory, linodeFactory } from 'src/factories'; @@ -22,11 +22,11 @@ const setupMocks = () => { }); server.use( - rest.get('*/linode/instances/:linodeId', (req, res, ctx) => { - return res(ctx.json(defaultProps.linodes[0])); + http.get('*/linode/instances/:linodeId', () => { + return HttpResponse.json(defaultProps.linodes[0]); }), - rest.get('*/images/:imageId', (req, res, ctx) => { - return res(ctx.json(image1)); + http.get('*/images/:imageId', () => { + return HttpResponse.json(image1); }) ); }; diff --git a/packages/manager/src/features/Linodes/LinodesCreate/SelectLinodePanel/SelectLinodeRow.test.tsx b/packages/manager/src/features/Linodes/LinodesCreate/SelectLinodePanel/SelectLinodeRow.test.tsx index a651175ff47..9d10ba30694 100644 --- a/packages/manager/src/features/Linodes/LinodesCreate/SelectLinodePanel/SelectLinodeRow.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesCreate/SelectLinodePanel/SelectLinodeRow.test.tsx @@ -1,10 +1,9 @@ import { waitForElementToBeRemoved } from '@testing-library/react'; import { fireEvent } from '@testing-library/react'; import * as React from 'react'; - import { imageFactory } from 'src/factories'; import { linodeFactory } from 'src/factories/linodes'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme, wrapWithTableBody } from 'src/utilities/testHelpers'; import { SelectLinodeRow } from './SelectLinodeRow'; @@ -23,11 +22,11 @@ describe('SelectLinodeRow', () => { }); server.use( - rest.get('*/linode/instances/:linodeId', (req, res, ctx) => { - return res(ctx.json(linode1)); + http.get('*/linode/instances/:linodeId', () => { + return HttpResponse.json(linode1); }), - rest.get('*/images/:imageId', (req, res, ctx) => { - return res(ctx.json(image1)); + http.get('*/images/:imageId', () => { + return HttpResponse.json(image1); }) ); @@ -79,11 +78,11 @@ describe('SelectLinodeRow', () => { label: 'Debian 10', }); server.use( - rest.get('*/linode/instances/:linodeId', (req, res, ctx) => { - return res(ctx.json(linode1)); + http.get('*/linode/instances/:linodeId', () => { + return HttpResponse.json(linode1); }), - rest.get('*/images/:imageId', (req, res, ctx) => { - return res(ctx.json(image1)); + http.get('*/images/:imageId', () => { + return HttpResponse.json(image1); }) ); @@ -123,11 +122,11 @@ describe('SelectLinodeRow', () => { label: 'Debian 10', }); server.use( - rest.get('*/linode/instances/:linodeId', (req, res, ctx) => { - return res(ctx.json(linode1)); + http.get('*/linode/instances/:linodeId', () => { + return HttpResponse.json(linode1); }), - rest.get('*/images/:imageId', (req, res, ctx) => { - return res(ctx.json(image1)); + http.get('*/images/:imageId', () => { + return HttpResponse.json(image1); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesCreate/TabbedContent/FromStackScriptContent.test.tsx b/packages/manager/src/features/Linodes/LinodesCreate/TabbedContent/FromStackScriptContent.test.tsx index c2e5df96c6e..e8079fea1a3 100644 --- a/packages/manager/src/features/Linodes/LinodesCreate/TabbedContent/FromStackScriptContent.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesCreate/TabbedContent/FromStackScriptContent.test.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { stackScriptFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { @@ -31,8 +31,8 @@ describe('FromStackScriptContent', () => { const stackscripts = stackScriptFactory.buildList(3); server.use( - rest.get('*/v4/linode/stackscripts', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(stackscripts))); + http.get('*/v4/linode/stackscripts', () => { + return HttpResponse.json(makeResourcePage(stackscripts)); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesCreate/VLANAccordion.test.tsx b/packages/manager/src/features/Linodes/LinodesCreate/VLANAccordion.test.tsx index ff2516dd172..c8d003ad422 100644 --- a/packages/manager/src/features/Linodes/LinodesCreate/VLANAccordion.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesCreate/VLANAccordion.test.tsx @@ -1,6 +1,7 @@ import { fireEvent, waitFor } from '@testing-library/react'; import React from 'react'; +import { regionFactory } from 'src/factories'; import { queryClientFactory } from 'src/queries/base'; import { renderWithTheme } from 'src/utilities/testHelpers'; @@ -17,6 +18,18 @@ const defaultProps: VLANAccordionProps = { vlanLabel: '', }; +const queryMocks = vi.hoisted(() => ({ + useRegionsQuery: vi.fn().mockReturnValue({}), +})); + +vi.mock('src/queries/regions', async () => { + const actual = await vi.importActual('src/queries/regions'); + return { + ...actual, + useRegionsQuery: queryMocks.useRegionsQuery, + }; +}); + describe('VLANAccordion Component', () => { it('renders collapsed VLANAccordion component', () => { const { getByRole } = renderWithTheme(, { @@ -59,6 +72,15 @@ describe('VLANAccordion Component', () => { }); it('enables the input fields when a region is selected', () => { + queryMocks.useRegionsQuery.mockReturnValue({ + data: [ + regionFactory.build({ + capabilities: ['Vlans'], + id: 'us-east', + }), + ], + }); + const { container, getByRole } = renderWithTheme( , { diff --git a/packages/manager/src/features/Linodes/LinodesCreate/VPCPanel.test.tsx b/packages/manager/src/features/Linodes/LinodesCreate/VPCPanel.test.tsx index 2f999fdfca6..bd4fb6e132d 100644 --- a/packages/manager/src/features/Linodes/LinodesCreate/VPCPanel.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesCreate/VPCPanel.test.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { accountFactory, regionFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; import { VPCPanel, VPCPanelProps } from './VPCPanel'; @@ -38,8 +38,8 @@ describe('VPCPanel', () => { }); server.use( - rest.get('*/account', (req, res, ctx) => { - return res(ctx.json(account)); + http.get('*/account', () => { + return HttpResponse.json(account); }) ); @@ -74,13 +74,13 @@ describe('VPCPanel', () => { const _props = { ...props, region: 'us-east', selectedVPCId: 5 }; server.use( - rest.get('*/regions', (req, res, ctx) => { + http.get('*/regions', () => { const usEast = regionFactory.build({ capabilities: ['VPCs'], id: 'us-east', }); const regions = regionFactory.buildList(5); - return res(ctx.json(makeResourcePage([usEast, ...regions]))); + return HttpResponse.json(makeResourcePage([usEast, ...regions])); }) ); @@ -104,13 +104,13 @@ describe('VPCPanel', () => { }; server.use( - rest.get('*/regions', (req, res, ctx) => { + http.get('*/regions', () => { const usEast = regionFactory.build({ capabilities: ['VPCs'], id: 'us-east', }); const regions = regionFactory.buildList(5); - return res(ctx.json(makeResourcePage([usEast, ...regions]))); + return HttpResponse.json(makeResourcePage([usEast, ...regions])); }) ); @@ -126,15 +126,15 @@ describe('VPCPanel', () => { it('should display helper text if there are no vpcs in the selected region and "from" is "linodeCreate"', async () => { server.use( - rest.get('*/regions', (req, res, ctx) => { + http.get('*/regions', () => { const usEast = regionFactory.build({ capabilities: ['VPCs'], id: 'us-east', }); - return res(ctx.json(makeResourcePage([usEast]))); + return HttpResponse.json(makeResourcePage([usEast])); }), - rest.get('*/vpcs', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/vpcs', () => { + return HttpResponse.json(makeResourcePage([])); }) ); @@ -153,15 +153,15 @@ describe('VPCPanel', () => { it('should not display helper text if there are no vpcs in the selected region and "from" is "linodeConfig"', async () => { server.use( - rest.get('*/regions', (req, res, ctx) => { + http.get('*/regions', () => { const usEast = regionFactory.build({ capabilities: ['VPCs'], id: 'us-east', }); - return res(ctx.json(makeResourcePage([usEast]))); + return HttpResponse.json(makeResourcePage([usEast])); }), - rest.get('*/vpcs', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/vpcs', () => { + return HttpResponse.json(makeResourcePage([])); }) ); @@ -182,12 +182,12 @@ describe('VPCPanel', () => { }); it('shows helper text for when "from" = "linodeCreate" if the selected region does not support VPCs', async () => { server.use( - rest.get('*/regions', (req, res, ctx) => { + http.get('*/regions', () => { const usEast = regionFactory.build({ capabilities: [], id: 'us-east', }); - return res(ctx.json(makeResourcePage([usEast]))); + return HttpResponse.json(makeResourcePage([usEast])); }) ); @@ -203,12 +203,12 @@ describe('VPCPanel', () => { }); it('should show the "Create VPC" drawer link when from = "linodeCreate" and a region that supports VPCs is selected', async () => { server.use( - rest.get('*/regions', (req, res, ctx) => { + http.get('*/regions', () => { const usEast = regionFactory.build({ capabilities: ['VPCs'], id: 'us-east', }); - return res(ctx.json(makeResourcePage([usEast]))); + return HttpResponse.json(makeResourcePage([usEast])); }) ); @@ -231,13 +231,13 @@ describe('VPCPanel', () => { }; server.use( - rest.get('*/regions', (req, res, ctx) => { + http.get('*/regions', () => { const usEast = regionFactory.build({ capabilities: ['VPCs'], id: 'us-east', }); const regions = regionFactory.buildList(5); - return res(ctx.json(makeResourcePage([usEast, ...regions]))); + return HttpResponse.json(makeResourcePage([usEast, ...regions])); }) ); @@ -265,13 +265,13 @@ describe('VPCPanel', () => { }; server.use( - rest.get('*/regions', (req, res, ctx) => { + http.get('*/regions', () => { const usEast = regionFactory.build({ capabilities: ['VPCs'], id: 'us-east', }); const regions = regionFactory.buildList(5); - return res(ctx.json(makeResourcePage([usEast, ...regions]))); + return HttpResponse.json(makeResourcePage([usEast, ...regions])); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/CaptureSnapshot.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/CaptureSnapshot.test.tsx index fdc2b732fcf..eb8f95f0d2b 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/CaptureSnapshot.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/CaptureSnapshot.test.tsx @@ -2,7 +2,7 @@ import userEvent from '@testing-library/user-event'; import * as React from 'react'; import { linodeFactory } from 'src/factories/linodes'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { CaptureSnapshot } from './CaptureSnapshot'; @@ -10,9 +10,9 @@ import { CaptureSnapshot } from './CaptureSnapshot'; describe('CaptureSnapshot', () => { it('renders heading and copy', async () => { server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json(linodeFactory.build({ backups: { enabled: true }, id: 1 })) + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ backups: { enabled: true }, id: 1 }) ); }) ); @@ -28,9 +28,9 @@ describe('CaptureSnapshot', () => { }); it('a confirmation dialog should open when you attempt to take a snapshot', async () => { server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json(linodeFactory.build({ backups: { enabled: true }, id: 1 })) + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ backups: { enabled: true }, id: 1 }) ); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackups.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackups.test.tsx index a7c64e1ab59..ca314b4a045 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackups.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackups.test.tsx @@ -2,7 +2,7 @@ import { LinodeBackupsResponse } from '@linode/api-v4'; import * as React from 'react'; import { backupFactory, linodeFactory } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { LinodeBackups } from './LinodeBackups'; @@ -19,12 +19,12 @@ vi.mock('react-router-dom', async () => { describe('LinodeBackups', () => { it('renders a list of different types of backups if backups are enabled', async () => { server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json(linodeFactory.build({ backups: { enabled: true }, id: 1 })) + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ backups: { enabled: true }, id: 1 }) ); }), - rest.get('*/linode/instances/1/backups', (req, res, ctx) => { + http.get('*/linode/instances/1/backups', () => { const response: LinodeBackupsResponse = { automatic: backupFactory.buildList(1, { label: null, type: 'auto' }), snapshot: { @@ -41,7 +41,7 @@ describe('LinodeBackups', () => { }), }, }; - return res(ctx.json(response)); + return HttpResponse.json(response); }) ); @@ -62,9 +62,9 @@ describe('LinodeBackups', () => { it('renders BackupsPlaceholder is backups are not enabled on this linode', async () => { server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json(linodeFactory.build({ backups: { enabled: false }, id: 1 })) + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ backups: { enabled: false }, id: 1 }) ); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/RestoreToLinodeDrawer.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/RestoreToLinodeDrawer.test.tsx index e0d7d61de7f..e951d207cae 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/RestoreToLinodeDrawer.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/RestoreToLinodeDrawer.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { backupFactory, linodeFactory } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { RestoreToLinodeDrawer } from './RestoreToLinodeDrawer'; @@ -9,9 +9,9 @@ import { RestoreToLinodeDrawer } from './RestoreToLinodeDrawer'; describe('RestoreToLinodeDrawer', () => { it('renders without crashing', async () => { server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json(linodeFactory.build({ backups: { enabled: true }, id: 1 })) + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ backups: { enabled: true }, id: 1 }) ); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/ScheduleSettings.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/ScheduleSettings.test.tsx index 808a720cb6b..231c3e872f5 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/ScheduleSettings.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/ScheduleSettings.test.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { profileFactory } from 'src/factories'; import { linodeFactory } from 'src/factories/linodes'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { ScheduleSettings } from './ScheduleSettings'; @@ -11,9 +11,9 @@ import { ScheduleSettings } from './ScheduleSettings'; describe('ScheduleSettings', () => { it('renders heading and copy', async () => { server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json(linodeFactory.build({ backups: { enabled: true }, id: 1 })) + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ backups: { enabled: true }, id: 1 }) ); }) ); @@ -30,24 +30,22 @@ describe('ScheduleSettings', () => { it('renders with the linode schedule taking into account the user timezone (UTC)', async () => { server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json( - linodeFactory.build({ - backups: { - enabled: true, - schedule: { - day: 'Monday', - window: 'W10', - }, + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ + backups: { + enabled: true, + schedule: { + day: 'Monday', + window: 'W10', }, - id: 1, - }) - ) + }, + id: 1, + }) ); }), - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ timezone: 'utc' }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ timezone: 'utc' })); }) ); @@ -65,25 +63,23 @@ describe('ScheduleSettings', () => { it('renders with the linode schedule taking into account the user timezone (America/New_York) (EDT)', async () => { server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json( - linodeFactory.build({ - backups: { - enabled: true, - schedule: { - day: 'Wednesday', - window: 'W10', - }, + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ + backups: { + enabled: true, + schedule: { + day: 'Wednesday', + window: 'W10', }, - id: 1, - }) - ) + }, + id: 1, + }) ); }), - rest.get('*/profile', (req, res, ctx) => { - return res( - ctx.json(profileFactory.build({ timezone: 'America/New_York' })) + http.get('*/profile', () => { + return HttpResponse.json( + profileFactory.build({ timezone: 'America/New_York' }) ); }) ); @@ -106,25 +102,23 @@ describe('ScheduleSettings', () => { it('renders with the linode schedule taking into account the user timezone (America/New_York) (EST)', async () => { server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json( - linodeFactory.build({ - backups: { - enabled: true, - schedule: { - day: 'Wednesday', - window: 'W10', - }, + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ + backups: { + enabled: true, + schedule: { + day: 'Wednesday', + window: 'W10', }, - id: 1, - }) - ) + }, + id: 1, + }) ); }), - rest.get('*/profile', (req, res, ctx) => { - return res( - ctx.json(profileFactory.build({ timezone: 'America/New_York' })) + http.get('*/profile', () => { + return HttpResponse.json( + profileFactory.build({ timezone: 'America/New_York' }) ); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/InterfaceListItem.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/InterfaceListItem.test.tsx index a3bbbc3db78..607d1c43b1b 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/InterfaceListItem.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/InterfaceListItem.test.tsx @@ -6,7 +6,7 @@ import { LinodeConfigInterfaceFactoryWithVPC, vpcFactory, } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { queryClientFactory } from 'src/queries/base'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; @@ -60,8 +60,8 @@ describe('InterfaceListItem', () => { }); server.use( - rest.get('*/vpcs/:vpcId', (req, res, ctx) => { - return res(ctx.json(vpc)); + http.get('*/vpcs/:vpcId', () => { + return HttpResponse.json(vpc); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigDialog.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigDialog.test.tsx index d139fa5af59..93a2302f0ca 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigDialog.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigDialog.test.tsx @@ -8,7 +8,7 @@ import { NATTED_PUBLIC_IP_HELPER_TEXT, NOT_NATTED_HELPER_TEXT, } from 'src/features/VPCs/constants'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { queryClientFactory } from 'src/queries/base'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; @@ -51,8 +51,8 @@ describe('LinodeConfigDialog', () => { const config = configFactory.build(); server.use( - rest.get('*/account', (req, res, ctx) => { - return res(ctx.json(account)); + http.get('*/account', () => { + return HttpResponse.json(account); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewalls.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewalls.test.tsx index 0c8c2e731df..7741c82f4d4 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewalls.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeFirewalls/LinodeFirewalls.test.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { firewallFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; import { LinodeFirewalls } from './LinodeFirewalls'; @@ -20,8 +20,8 @@ describe('LinodeFirewalls', () => { it('should have an empty row if the linode is not assigned to a firewall', async () => { server.use( - rest.get('*/linode/instances/1/firewalls', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/linode/instances/1/firewalls', () => { + return HttpResponse.json(makeResourcePage([])); }) ); @@ -32,8 +32,8 @@ describe('LinodeFirewalls', () => { it('should have a firewall listed if the linode is assigned to one', async () => { server.use( - rest.get('*/linode/instances/1/firewalls', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([firewallFactory.build()]))); + http.get('*/linode/instances/1/firewalls', () => { + return HttpResponse.json(makeResourcePage([firewallFactory.build()])); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeResize/LinodeResize.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeResize/LinodeResize.test.tsx index cb486a7dc38..283a5fb1b60 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeResize/LinodeResize.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeResize/LinodeResize.test.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { extendedTypes } from 'src/__data__/ExtendedType'; import { extDisk, swapDisk } from 'src/__data__/disks'; import { linodeFactory } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; import { LinodeResize } from './LinodeResize'; @@ -19,8 +19,8 @@ beforeAll(() => { describe('LinodeResize', () => { it('to render', async () => { server.use( - rest.get('*/linode/instances/:id', (req, res, ctx) => { - return res(ctx.json(linodeFactory.build({ label: 'test-resize' }))); + http.get('*/linode/instances/:id', () => { + return HttpResponse.json(linodeFactory.build({ label: 'test-resize' })); }) ); const { findByText } = renderWithTheme( diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx index ec9be4b2720..bffcc435beb 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx @@ -4,7 +4,7 @@ import { profileFactory } from 'src/factories'; import { accountUserFactory } from 'src/factories/accountUsers'; import { grantsFactory } from 'src/factories/grants'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { ImageAndPassword } from './ImageAndPassword'; @@ -42,8 +42,8 @@ describe('ImageAndPassword', () => { const users = accountUserFactory.buildList(3, { ssh_keys: ['my-ssh-key'] }); server.use( - rest.get('*/account/users', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(users))); + http.get('*/account/users', () => { + return HttpResponse.json(makeResourcePage(users)); }) ); @@ -60,16 +60,14 @@ describe('ImageAndPassword', () => { }); it('should be disabled for a restricted user with read only access', async () => { server.use( - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ restricted: true }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ restricted: true })); }), - rest.get('*/profile/grants', (req, res, ctx) => { - return res( - ctx.json( - grantsFactory.build({ - linode: [{ id: 0, permissions: 'read_only' }], - }) - ) + http.get('*/profile/grants', () => { + return HttpResponse.json( + grantsFactory.build({ + linode: [{ id: 0, permissions: 'read_only' }], + }) ); }) ); @@ -86,11 +84,11 @@ describe('ImageAndPassword', () => { }); it('should be disabled for a restricted user with no access', async () => { server.use( - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ restricted: true }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ restricted: true })); }), - rest.get('*/profile/grants', (req, res, ctx) => { - return res(ctx.json(grantsFactory.build({ linode: [] }))); + http.get('*/profile/grants', () => { + return HttpResponse.json(grantsFactory.build({ linode: [] })); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettingsLabelPanel.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettingsLabelPanel.test.tsx index b2ea8887fd1..789f3ff2d28 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettingsLabelPanel.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/LinodeSettingsLabelPanel.test.tsx @@ -2,7 +2,7 @@ import { waitFor } from '@testing-library/react'; import * as React from 'react'; import { linodeFactory } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { LinodeSettingsLabelPanel } from './LinodeSettingsLabelPanel'; @@ -10,9 +10,9 @@ import { LinodeSettingsLabelPanel } from './LinodeSettingsLabelPanel'; describe('LinodeSettingsLabelPanel', () => { it('should render and the linode label', async () => { server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json(linodeFactory.build({ id: 1, label: 'my-linode-1' })) + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ id: 1, label: 'my-linode-1' }) ); }) ); @@ -38,9 +38,9 @@ describe('LinodeSettingsLabelPanel', () => { it('should disable the input if the `isReadOnly` prop is true', async () => { server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json(linodeFactory.build({ id: 1, label: 'my-linode-1' })) + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ id: 1, label: 'my-linode-1' }) ); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/CreateDiskDrawer.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/CreateDiskDrawer.test.tsx index 215ebd9f34b..c7f1ca7228a 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/CreateDiskDrawer.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/CreateDiskDrawer.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { linodeDiskFactory, linodeFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { CreateDiskDrawer } from './CreateDiskDrawer'; @@ -10,13 +10,13 @@ import { CreateDiskDrawer } from './CreateDiskDrawer'; describe('CreateDiskDrawer', () => { it('should render', async () => { server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json(linodeFactory.build({ id: 1, specs: { disk: 1024 } })) + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ id: 1, specs: { disk: 1024 } }) ); }), - rest.get('*/linode/instances/1/disks', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/linode/instances/1/disks', () => { + return HttpResponse.json(makeResourcePage([])); }) ); @@ -41,18 +41,14 @@ describe('CreateDiskDrawer', () => { }); it('should correctly calculate the max size depending on API data', async () => { server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json(linodeFactory.build({ id: 1, specs: { disk: 1024 } })) + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ id: 1, specs: { disk: 1024 } }) ); }), - rest.get('*/linode/instances/1/disks', (req, res, ctx) => { - return res( - ctx.json( - makeResourcePage( - linodeDiskFactory.buildList(1, { id: 1, size: 24 }) - ) - ) + http.get('*/linode/instances/1/disks', () => { + return HttpResponse.json( + makeResourcePage(linodeDiskFactory.buildList(1, { id: 1, size: 24 })) ); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDisks.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDisks.test.tsx index 876d8adcd78..a2abaeeee7f 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDisks.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/LinodeDisks.test.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { linodeDiskFactory } from 'src/factories'; import { linodeFactory } from 'src/factories/linodes'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { LinodeDisks } from './LinodeDisks'; @@ -13,11 +13,11 @@ describe('LinodeDisks', () => { const disks = linodeDiskFactory.buildList(5); server.use( - rest.get('*/linode/instances/:id', (req, res, ctx) => { - return res(ctx.json(linodeFactory.build())); + http.get('*/linode/instances/:id', () => { + return HttpResponse.json(linodeFactory.build()); }), - rest.get('*/linode/instances/:id/disks', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(disks))); + http.get('*/linode/instances/:id/disks', () => { + return HttpResponse.json(makeResourcePage(disks)); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/ResizeDiskDrawer.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/ResizeDiskDrawer.test.tsx index 544282bc80a..c0d28d55a60 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/ResizeDiskDrawer.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeStorage/ResizeDiskDrawer.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { linodeDiskFactory, linodeFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { ResizeDiskDrawer } from './ResizeDiskDrawer'; @@ -12,13 +12,13 @@ describe('ResizeDiskDrawer', () => { const disk = linodeDiskFactory.build({ label: 'My Cool Disk' }); server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json(linodeFactory.build({ id: 1, specs: { disk: 1024 } })) + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ id: 1, specs: { disk: 1024 } }) ); }), - rest.get('*/linode/instances/1/disks', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([disk]))); + http.get('*/linode/instances/1/disks', () => { + return HttpResponse.json(makeResourcePage([disk])); }) ); @@ -47,19 +47,17 @@ describe('ResizeDiskDrawer', () => { }); server.use( - rest.get('*/linode/instances/1', (req, res, ctx) => { - return res( - ctx.json(linodeFactory.build({ id: 1, specs: { disk: 12 } })) + http.get('*/linode/instances/1', () => { + return HttpResponse.json( + linodeFactory.build({ id: 1, specs: { disk: 12 } }) ); }), - rest.get('*/linode/instances/1/disks', (req, res, ctx) => { - return res( - ctx.json( - makeResourcePage([ - diskToResize, - ...linodeDiskFactory.buildList(3, { size: 3 }), - ]) - ) + http.get('*/linode/instances/1/disks', () => { + return HttpResponse.json( + makeResourcePage([ + diskToResize, + ...linodeDiskFactory.buildList(3, { size: 3 }), + ]) ); }) ); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/VolumesUpgradeBenner.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/VolumesUpgradeBenner.test.tsx index ca51ccc58e3..dd3411a217c 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/VolumesUpgradeBenner.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/VolumesUpgradeBenner.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { notificationFactory, volumeFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { VolumesUpgradeBanner } from './VolumesUpgradeBanner'; @@ -16,11 +16,11 @@ describe('VolumesUpgradeBanner', () => { }); server.use( - rest.get('*/linode/instances/:id/volumes', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([volume]))); + http.get('*/linode/instances/:id/volumes', () => { + return HttpResponse.json(makeResourcePage([volume])); }), - rest.get('*/account/notifications', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([notification]))); + http.get('*/account/notifications', () => { + return HttpResponse.json(makeResourcePage([notification])); }) ); @@ -48,11 +48,11 @@ describe('VolumesUpgradeBanner', () => { ]; server.use( - rest.get('*/linode/instances/:id/volumes', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(volumes))); + http.get('*/linode/instances/:id/volumes', () => { + return HttpResponse.json(makeResourcePage(volumes)); }), - rest.get('*/account/notifications', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(notifications))); + http.get('*/account/notifications', () => { + return HttpResponse.json(makeResourcePage(notifications)); }) ); diff --git a/packages/manager/src/features/Linodes/MigrateLinode/ConfigureForm.test.tsx b/packages/manager/src/features/Linodes/MigrateLinode/ConfigureForm.test.tsx index fe25f736849..8ad60375310 100644 --- a/packages/manager/src/features/Linodes/MigrateLinode/ConfigureForm.test.tsx +++ b/packages/manager/src/features/Linodes/MigrateLinode/ConfigureForm.test.tsx @@ -2,7 +2,7 @@ import { waitFor } from '@testing-library/react'; import React from 'react'; import { typeFactory } from 'src/factories/types'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { ConfigureForm } from './ConfigureForm'; @@ -64,8 +64,8 @@ describe('ConfigureForm component with price comparison', () => { beforeEach(() => { server.use( - rest.get('*/linode/types/g6-standard-1', (req, res, ctx) => { - return res(ctx.json(mockLinodeType)); + http.get('*/linode/types/g6-standard-1', () => { + return HttpResponse.json(mockLinodeType); }) ); }); diff --git a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Configurations/ConfigurationAccordionHeader.test.tsx b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Configurations/ConfigurationAccordionHeader.test.tsx index c2ada09d05c..ea03df1077a 100644 --- a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Configurations/ConfigurationAccordionHeader.test.tsx +++ b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Configurations/ConfigurationAccordionHeader.test.tsx @@ -5,7 +5,7 @@ import { configurationsEndpointHealthFactory, endpointHealthFactory, } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { ConfigurationAccordionHeader } from './ConfigurationAccordionHeader'; @@ -53,9 +53,8 @@ describe('ConfigurationAccordionHeader', () => { ); server.use( - rest.get( - '*/v4beta/aclb/5/configurations/endpoints-health', - (req, res, ctx) => res(ctx.json(allConfigurationsEndpointHealth)) + http.get('*/v4beta/aclb/5/configurations/endpoints-health', () => + HttpResponse.json(allConfigurationsEndpointHealth) ) ); diff --git a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Configurations/ConfigurationEndpointHealth.test.tsx b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Configurations/ConfigurationEndpointHealth.test.tsx index 540cd2d5d01..9bb4c043542 100644 --- a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Configurations/ConfigurationEndpointHealth.test.tsx +++ b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Configurations/ConfigurationEndpointHealth.test.tsx @@ -4,7 +4,7 @@ import { configurationsEndpointHealthFactory, endpointHealthFactory, } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { ConfigurationEndpointHealth } from './ConfigurationEndpointHealth'; @@ -12,21 +12,18 @@ import { ConfigurationEndpointHealth } from './ConfigurationEndpointHealth'; describe('ConfigurationEndpointHealth', () => { it('renders endpoint health from API data', async () => { server.use( - rest.get( - '*/v4beta/aclb/:id/configurations/endpoints-health', - (req, res, ctx) => { - const health = configurationsEndpointHealthFactory.build({ - configurations: [ - endpointHealthFactory.build({ - healthy_endpoints: 10, - id: 0, - total_endpoints: 20, - }), - ], - }); - return res(ctx.json(health)); - } - ) + http.get('*/v4beta/aclb/:id/configurations/endpoints-health', () => { + const health = configurationsEndpointHealthFactory.build({ + configurations: [ + endpointHealthFactory.build({ + healthy_endpoints: 10, + id: 0, + total_endpoints: 20, + }), + ], + }); + return HttpResponse.json(health); + }) ); const { findByText } = renderWithTheme( diff --git a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/LoadBalancerEndpointHealth.test.tsx b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/LoadBalancerEndpointHealth.test.tsx index b327ce2a420..7815cf99c6a 100644 --- a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/LoadBalancerEndpointHealth.test.tsx +++ b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/LoadBalancerEndpointHealth.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { loadbalancerEndpointHealthFactory } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { LoadBalancerEndpointHealth } from './LoadBalancerEndpointHealth'; @@ -9,12 +9,12 @@ import { LoadBalancerEndpointHealth } from './LoadBalancerEndpointHealth'; describe('LoadBalancerEndpointHealth', () => { it('renders endpoint health from API data', async () => { server.use( - rest.get('*/v4beta/aclb/:id/endpoints-health', (req, res, ctx) => { + http.get('*/v4beta/aclb/:id/endpoints-health', () => { const health = loadbalancerEndpointHealthFactory.build({ healthy_endpoints: 150, total_endpoints: 200, }); - return res(ctx.json(health)); + return HttpResponse.json(health); }) ); diff --git a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/ServiceTargets/EndpointTable.test.tsx b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/ServiceTargets/EndpointTable.test.tsx index 52d7185e7a1..5b918c04d7d 100644 --- a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/ServiceTargets/EndpointTable.test.tsx +++ b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/ServiceTargets/EndpointTable.test.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { endpointFactory, linodeFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { EndpointTable } from './EndpointTable'; @@ -96,8 +96,8 @@ describe('EndpointTable', () => { ]; server.use( - rest.get('*/linode/instances', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(linodes))); + http.get('*/linode/instances', () => { + return HttpResponse.json(makeResourcePage(linodes)); }) ); diff --git a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/ServiceTargets/ServiceTargetEndpointHealth.test.tsx b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/ServiceTargets/ServiceTargetEndpointHealth.test.tsx index 1e662aec7dd..9f6aeae05fb 100644 --- a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/ServiceTargets/ServiceTargetEndpointHealth.test.tsx +++ b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/ServiceTargets/ServiceTargetEndpointHealth.test.tsx @@ -4,7 +4,7 @@ import { endpointHealthFactory, serviceTargetsEndpointHealthFactory, } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { ServiceTargetEndpontHeath } from './ServiceTargetEndpointHealth'; @@ -14,21 +14,18 @@ describe('ServiceTargetEndpontHeath', () => { const serviceTargetId = 1; server.use( - rest.get( - '*/v4beta/aclb/:id/service-targets/endpoints-health', - (req, res, ctx) => { - const health = serviceTargetsEndpointHealthFactory.build({ - service_targets: [ - endpointHealthFactory.build({ - healthy_endpoints: 99, - id: serviceTargetId, - total_endpoints: 100, - }), - ], - }); - return res(ctx.json(health)); - } - ) + http.get('*/v4beta/aclb/:id/service-targets/endpoints-health', () => { + const health = serviceTargetsEndpointHealthFactory.build({ + service_targets: [ + endpointHealthFactory.build({ + healthy_endpoints: 99, + id: serviceTargetId, + total_endpoints: 100, + }), + ], + }); + return HttpResponse.json(health); + }) ); const { findByText } = renderWithTheme( diff --git a/packages/manager/src/features/LoadBalancers/LoadBalancerLanding/Ports.test.tsx b/packages/manager/src/features/LoadBalancers/LoadBalancerLanding/Ports.test.tsx index 4af576fb1ef..9b161606a77 100644 --- a/packages/manager/src/features/LoadBalancers/LoadBalancerLanding/Ports.test.tsx +++ b/packages/manager/src/features/LoadBalancers/LoadBalancerLanding/Ports.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { configurationFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { Ports } from './Ports'; @@ -17,8 +17,8 @@ describe('Ports', () => { ]; server.use( - rest.get('*/aclb/1/configurations*', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(configs))); + http.get('*/aclb/1/configurations*', () => { + return HttpResponse.json(makeResourcePage(configs)); }) ); diff --git a/packages/manager/src/features/LoadBalancers/LoadBalancerLanding/RegionItem.test.tsx b/packages/manager/src/features/LoadBalancers/LoadBalancerLanding/RegionItem.test.tsx index d47a261ac7b..41b9a96d6d8 100644 --- a/packages/manager/src/features/LoadBalancers/LoadBalancerLanding/RegionItem.test.tsx +++ b/packages/manager/src/features/LoadBalancers/LoadBalancerLanding/RegionItem.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { regionFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { RegionItem } from './RegionItem'; @@ -12,8 +12,8 @@ describe('RegionItem', () => { const region = regionFactory.build(); server.use( - rest.get('*/v4/regions', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([region]))); + http.get('*/v4/regions', () => { + return HttpResponse.json(makeResourcePage([region])); }) ); diff --git a/packages/manager/src/features/Longview/LongviewLanding/LongviewPlans.test.tsx b/packages/manager/src/features/Longview/LongviewLanding/LongviewPlans.test.tsx index dc3eee3e42c..4057d539084 100644 --- a/packages/manager/src/features/Longview/LongviewLanding/LongviewPlans.test.tsx +++ b/packages/manager/src/features/Longview/LongviewLanding/LongviewPlans.test.tsx @@ -11,13 +11,13 @@ import { accountSettingsFactory } from 'src/factories'; import { grantsFactory } from 'src/factories/grants'; import { longviewSubscriptionFactory } from 'src/factories/longviewSubscription'; import { profileFactory } from 'src/factories/profile'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { - LongviewPlansProps, LONGVIEW_FREE_ID, LongviewPlans, + LongviewPlansProps, formatPrice, } from './LongviewPlans'; @@ -57,8 +57,10 @@ const testRow = async ( describe('LongviewPlans', () => { beforeEach(() => { server.use( - rest.get('*/account/settings', (req, res, ctx) => { - return res(ctx.json(accountSettingsFactory.build({ managed: false }))); + http.get('*/account/settings', () => { + return HttpResponse.json( + accountSettingsFactory.build({ managed: false }) + ); }) ); }); @@ -108,29 +110,27 @@ describe('LongviewPlans', () => { it('displays a notice if the user does not have permissions to modify', async () => { // Build a restricted user's profile so we get a permission error server.use( - rest.get('*/profile', (req, res, ctx) => { - return res( - ctx.json( - profileFactory.build({ - restricted: true, - }) - ) + http.get('*/profile', () => { + return HttpResponse.json( + profileFactory.build({ + restricted: true, + }) ); }) ); server.use( - rest.get('*/grants', (req, res, ctx) => { - return res( - ctx.status(200), - ctx.json( - grantsFactory.build({ - global: { - account_access: 'read_only', - longview_subscription: false, - }, - }) - ) + http.get('*/grants', () => { + return HttpResponse.json( + grantsFactory.build({ + global: { + account_access: 'read_only', + longview_subscription: false, + }, + }), + { + status: 200, + } ); }) ); @@ -146,8 +146,10 @@ describe('LongviewPlans', () => { it('displays a message id the account is managed', async () => { server.use( - rest.get('*/account/settings', (req, res, ctx) => { - return res(ctx.json(accountSettingsFactory.build({ managed: true }))); + http.get('*/account/settings', () => { + return HttpResponse.json( + accountSettingsFactory.build({ managed: true }) + ); }) ); diff --git a/packages/manager/src/features/ObjectStorage/AccessKeyLanding/HostNamesList.test.tsx b/packages/manager/src/features/ObjectStorage/AccessKeyLanding/HostNamesList.test.tsx index 2056065a2bb..e34235f7c7d 100644 --- a/packages/manager/src/features/ObjectStorage/AccessKeyLanding/HostNamesList.test.tsx +++ b/packages/manager/src/features/ObjectStorage/AccessKeyLanding/HostNamesList.test.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { regionFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { HostNamesList } from './HostNamesList'; @@ -21,12 +21,12 @@ const mockObjectStorageKey = { describe('HostNamesList', () => { it('renders without crashing', async () => { server.use( - rest.get('*/regions', (req, res, ctx) => { + http.get('*/regions', () => { const regions = regionFactory.buildList(1, { id: 'us-central', label: 'Fake Region, NC', }); - return res(ctx.json(makeResourcePage(regions))); + return HttpResponse.json(makeResourcePage(regions)); }) ); diff --git a/packages/manager/src/features/ObjectStorage/BucketDetail/BucketSSL.test.tsx b/packages/manager/src/features/ObjectStorage/BucketDetail/BucketSSL.test.tsx index b40ab1945f3..6714bc880d2 100644 --- a/packages/manager/src/features/ObjectStorage/BucketDetail/BucketSSL.test.tsx +++ b/packages/manager/src/features/ObjectStorage/BucketDetail/BucketSSL.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { BucketSSL } from './BucketSSL'; @@ -8,8 +8,8 @@ import { BucketSSL } from './BucketSSL'; describe('BucketSSL', () => { it('renders inputs for a Certificate and Private Key when no cert is set', async () => { server.use( - rest.get('*object-storage/buckets/*/*/ssl', (req, res, ctx) => { - return res(ctx.json({ ssl: false })); + http.get('*object-storage/buckets/*/*/ssl', () => { + return HttpResponse.json({ ssl: false }); }) ); @@ -25,8 +25,8 @@ describe('BucketSSL', () => { it('renders a notice and a remove button when certs are already set', async () => { server.use( - rest.get('*object-storage/buckets/*/*/ssl', (req, res, ctx) => { - return res(ctx.json({ ssl: true })); + http.get('*object-storage/buckets/*/*/ssl', () => { + return HttpResponse.json({ ssl: true }); }) ); diff --git a/packages/manager/src/features/ObjectStorage/BucketDetail/ObjectDetailsDrawer.test.tsx b/packages/manager/src/features/ObjectStorage/BucketDetail/ObjectDetailsDrawer.test.tsx index 13dc62299f2..59b43fb96de 100644 --- a/packages/manager/src/features/ObjectStorage/BucketDetail/ObjectDetailsDrawer.test.tsx +++ b/packages/manager/src/features/ObjectStorage/BucketDetail/ObjectDetailsDrawer.test.tsx @@ -2,7 +2,7 @@ import { act, waitFor } from '@testing-library/react'; import * as React from 'react'; import { profileFactory } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { ObjectDetailsDrawer } from './ObjectDetailsDrawer'; @@ -40,8 +40,8 @@ const props: ObjectDetailsDrawerProps = { describe('ObjectDetailsDrawer', () => { it('renders formatted size, formatted last modified, truncated URL', async () => { server.use( - rest.get('*/profile', (req, res, ctx) => - res(ctx.json(profileFactory.build({ timezone: 'utc' }))) + http.get('*/profile', () => + HttpResponse.json(profileFactory.build({ timezone: 'utc' })) ) ); const { getByText } = renderWithTheme(); diff --git a/packages/manager/src/features/ObjectStorage/BucketLanding/BucketLanding.test.tsx b/packages/manager/src/features/ObjectStorage/BucketLanding/BucketLanding.test.tsx index f37a071c3d5..ded2bc7bfaf 100644 --- a/packages/manager/src/features/ObjectStorage/BucketLanding/BucketLanding.test.tsx +++ b/packages/manager/src/features/ObjectStorage/BucketLanding/BucketLanding.test.tsx @@ -6,17 +6,21 @@ import { objectStorageClusterFactory, } from 'src/factories/objectStorage'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { BucketLanding } from './BucketLanding'; describe('ObjectStorageLanding', () => { + beforeAll(() => server.listen()); + afterEach(() => server.resetHandlers()); + afterAll(() => server.close()); + it('renders a loading state', () => { // Mock Buckets server.use( - rest.get('*/object-storage/buckets', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/object-storage/buckets', () => { + return HttpResponse.json(makeResourcePage([])); }) ); @@ -28,16 +32,16 @@ describe('ObjectStorageLanding', () => { it('renders an empty state', async () => { // Mock Clusters server.use( - rest.get('*/object-storage/clusters', (req, res, ctx) => { + http.get('*/object-storage/clusters', () => { const clusters = objectStorageClusterFactory.buildList(4); - return res(ctx.json(makeResourcePage(clusters))); + return HttpResponse.json(makeResourcePage(clusters)); }) ); // Mock Buckets server.use( - rest.get('*/object-storage/buckets/*', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/object-storage/buckets/*', () => { + return HttpResponse.json(makeResourcePage([])); }) ); @@ -56,28 +60,33 @@ describe('ObjectStorageLanding', () => { // Mock Clusters server.use( - rest.get('*/object-storage/clusters', (req, res, ctx) => { + http.get('*/object-storage/clusters', () => { const upClusters = objectStorageClusterFactory.buildList(1, { region: 'ap-south-1', }); - return res(ctx.json(makeResourcePage([downCluster, ...upClusters]))); + return HttpResponse.json( + makeResourcePage([downCluster, ...upClusters]) + ); }) ); // Mock Buckets server.use( - rest.get('*/object-storage/buckets/cluster-0', (req, res, ctx) => { - return res.once( - ctx.status(500), - ctx.json([{ reason: 'Cluster offline!' }]) - ); - }), - rest.get('*/object-storage/buckets/*', (req, res, ctx) => { - return res( - ctx.json( - makeResourcePage( - objectStorageBucketFactory.buildList(2, { cluster: 'ap-south-1' }) - ) + http.get( + '*/object-storage/buckets/cluster-0', + () => { + return HttpResponse.json([{ reason: 'Cluster offline!' }], { + status: 500, + }); + }, + { + once: true, + } + ), + http.get('*/object-storage/buckets/*', () => { + return HttpResponse.json( + makeResourcePage( + objectStorageBucketFactory.buildList(2, { cluster: 'ap-south-1' }) ) ); }) @@ -93,16 +102,18 @@ describe('ObjectStorageLanding', () => { it('renders general error state', async () => { // Mock Clusters server.use( - rest.get('*/object-storage/clusters', (req, res, ctx) => { + http.get('*/object-storage/clusters', () => { const clusters = objectStorageClusterFactory.buildList(1); - return res(ctx.json(makeResourcePage(clusters))); + return HttpResponse.json(makeResourcePage(clusters)); }) ); // Mock Buckets server.use( - rest.get('*/object-storage/buckets/*', (req, res, ctx) => { - return res(ctx.status(500), ctx.json([{ reason: 'Cluster offline!' }])); + http.get('*/object-storage/buckets/*', () => { + return HttpResponse.json([{ reason: 'Cluster offline!' }], { + status: 500, + }); }) ); renderWithTheme(); @@ -115,16 +126,16 @@ describe('ObjectStorageLanding', () => { // Mock Clusters server.use( - rest.get('*/object-storage/clusters', (req, res, ctx) => { + http.get('*/object-storage/clusters', () => { const clusters = objectStorageClusterFactory.buildList(1); - return res(ctx.json(makeResourcePage(clusters))); + return HttpResponse.json(makeResourcePage(clusters)); }) ); // Mock Buckets server.use( - rest.get('*/object-storage/buckets/*', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(buckets))); + http.get('*/object-storage/buckets/*', () => { + return HttpResponse.json(makeResourcePage(buckets)); }) ); @@ -141,16 +152,16 @@ describe('ObjectStorageLanding', () => { // Mock Clusters server.use( - rest.get('*/object-storage/clusters', (req, res, ctx) => { + http.get('*/object-storage/clusters', () => { const clusters = objectStorageClusterFactory.buildList(1); - return res(ctx.json(makeResourcePage(clusters))); + return HttpResponse.json(makeResourcePage(clusters)); }) ); // Mock Buckets server.use( - rest.get('*/object-storage/buckets/*', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(buckets))); + http.get('*/object-storage/buckets/*', () => { + return HttpResponse.json(makeResourcePage(buckets)); }) ); diff --git a/packages/manager/src/features/ObjectStorage/BucketLanding/CreateBucketDrawer.test.tsx b/packages/manager/src/features/ObjectStorage/BucketLanding/CreateBucketDrawer.test.tsx index 29800ff231c..0e6ca834b39 100644 --- a/packages/manager/src/features/ObjectStorage/BucketLanding/CreateBucketDrawer.test.tsx +++ b/packages/manager/src/features/ObjectStorage/BucketLanding/CreateBucketDrawer.test.tsx @@ -8,7 +8,7 @@ import { regionFactory, } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { CreateBucketDrawer } from './CreateBucketDrawer'; @@ -23,36 +23,34 @@ vi.mock('src/components/EnhancedSelect/Select'); describe('CreateBucketDrawer', () => { it.skip('Should show a general error notice if the API returns one', async () => { server.use( - rest.post('*/object-storage/buckets', (req, res, ctx) => { - return res( - ctx.status(500), - ctx.json({ errors: [{ reason: 'Object Storage is offline!' }] }) + http.post('*/object-storage/buckets', () => { + return HttpResponse.json( + { errors: [{ reason: 'Object Storage is offline!' }] }, + { + status: 500, + } ); }), - rest.get('*/regions', async (req, res, ctx) => { - return res( - ctx.json( - makeResourcePage( - regionFactory.buildList(1, { id: 'us-east', label: 'Newark, NJ' }) - ) + http.get('*/regions', async () => { + return HttpResponse.json( + makeResourcePage( + regionFactory.buildList(1, { id: 'us-east', label: 'Newark, NJ' }) ) ); }), - rest.get('*object-storage/clusters', (req, res, ctx) => { - return res( - ctx.json( - makeResourcePage( - objectStorageClusterFactory.buildList(1, { - id: 'us-east-1', - region: 'us-east', - }) - ) + http.get('*object-storage/clusters', () => { + return HttpResponse.json( + makeResourcePage( + objectStorageClusterFactory.buildList(1, { + id: 'us-east-1', + region: 'us-east', + }) ) ); }), - rest.get('*/account/settings', (req, res, ctx) => { - return res( - ctx.json(accountSettingsFactory.build({ object_storage: 'active' })) + http.get('*/account/settings', () => { + return HttpResponse.json( + accountSettingsFactory.build({ object_storage: 'active' }) ); }) ); diff --git a/packages/manager/src/features/Profile/APITokens/CreateAPITokenDrawer.test.tsx b/packages/manager/src/features/Profile/APITokens/CreateAPITokenDrawer.test.tsx index 5bc24a3c019..da315148f72 100644 --- a/packages/manager/src/features/Profile/APITokens/CreateAPITokenDrawer.test.tsx +++ b/packages/manager/src/features/Profile/APITokens/CreateAPITokenDrawer.test.tsx @@ -4,7 +4,7 @@ import * as React from 'react'; import { appTokenFactory } from 'src/factories'; import { profileFactory } from 'src/factories/profile'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { CreateAPITokenDrawer } from './CreateAPITokenDrawer'; @@ -55,8 +55,10 @@ describe('Create API Token Drawer', () => { it('Should see secret modal with secret when you type a label and submit the form successfully', async () => { server.use( - rest.post('*/profile/tokens', (req, res, ctx) => { - return res(ctx.json(appTokenFactory.build({ token: 'secret-value' }))); + http.post('*/profile/tokens', () => { + return HttpResponse.json( + appTokenFactory.build({ token: 'secret-value' }) + ); }) ); diff --git a/packages/manager/src/features/Profile/DisplaySettings/TimezoneForm.test.tsx b/packages/manager/src/features/Profile/DisplaySettings/TimezoneForm.test.tsx index dd97c5a5c8c..e3e94fe5e58 100644 --- a/packages/manager/src/features/Profile/DisplaySettings/TimezoneForm.test.tsx +++ b/packages/manager/src/features/Profile/DisplaySettings/TimezoneForm.test.tsx @@ -2,7 +2,7 @@ import { waitForElementToBeRemoved } from '@testing-library/react'; import * as React from 'react'; import { profileFactory } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { queryClientFactory } from 'src/queries/base'; import { renderWithTheme } from 'src/utilities/testHelpers'; @@ -14,9 +14,9 @@ describe('Timezone change form', () => { // Use the MSW to mock a profile with America/New_York as the timezone // for this specific suite of tests server.use( - rest.get('*/profile', (req, res, ctx) => { - return res( - ctx.json(profileFactory.build({ timezone: 'America/New_York' })) + http.get('*/profile', () => { + return HttpResponse.json( + profileFactory.build({ timezone: 'America/New_York' }) ); }) ); diff --git a/packages/manager/src/features/Profile/OAuthClients/CreateOAuthClientDrawer.test.tsx b/packages/manager/src/features/Profile/OAuthClients/CreateOAuthClientDrawer.test.tsx index 03d1ac7174e..59d5955191f 100644 --- a/packages/manager/src/features/Profile/OAuthClients/CreateOAuthClientDrawer.test.tsx +++ b/packages/manager/src/features/Profile/OAuthClients/CreateOAuthClientDrawer.test.tsx @@ -3,7 +3,7 @@ import userEvent from '@testing-library/user-event'; import * as React from 'react'; import { oauthClientFactory } from 'src/factories/accountOAuth'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { CreateOAuthClientDrawer } from './CreateOAuthClientDrawer'; @@ -39,13 +39,11 @@ describe('Create API Token Drawer', () => { }); it('Should see secret modal with secret when you type a label and callback url then submit the form successfully', async () => { server.use( - rest.post('*/account/oauth-clients', (req, res, ctx) => { - return res( - ctx.json({ - ...oauthClientFactory.build(), - secret: 'omg!', - }) - ); + http.post('*/account/oauth-clients', () => { + return HttpResponse.json({ + ...oauthClientFactory.build(), + secret: 'omg!', + }); }) ); diff --git a/packages/manager/src/features/Profile/OAuthClients/OAuthClients.test.tsx b/packages/manager/src/features/Profile/OAuthClients/OAuthClients.test.tsx index 72c1b7de3c5..75f45c7fa3e 100644 --- a/packages/manager/src/features/Profile/OAuthClients/OAuthClients.test.tsx +++ b/packages/manager/src/features/Profile/OAuthClients/OAuthClients.test.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { oauthClientFactory } from 'src/factories/accountOAuth'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import OAuthClients from './OAuthClients'; @@ -13,8 +13,8 @@ describe('Maintenance Table Row', () => { it('should render oauth clients that come from the API', async () => { server.use( - rest.get('*/account/oauth-clients', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(clients))); + http.get('*/account/oauth-clients', () => { + return HttpResponse.json(makeResourcePage(clients)); }) ); diff --git a/packages/manager/src/features/Profile/SSHKeys/CreateSSHKeyDrawer.test.tsx b/packages/manager/src/features/Profile/SSHKeys/CreateSSHKeyDrawer.test.tsx index a2ffc316139..e8101838b46 100644 --- a/packages/manager/src/features/Profile/SSHKeys/CreateSSHKeyDrawer.test.tsx +++ b/packages/manager/src/features/Profile/SSHKeys/CreateSSHKeyDrawer.test.tsx @@ -3,7 +3,7 @@ import userEvent from '@testing-library/user-event'; import * as React from 'react'; import { sshKeyFactory } from 'src/factories'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { CreateSSHKeyDrawer } from './CreateSSHKeyDrawer'; @@ -45,8 +45,8 @@ describe('SSHKeyCreationDrawer', () => { it('should submit and call onClose', async () => { server.use( - rest.post('*/profile/sshkeys', (req, res, ctx) => { - return res(ctx.json(sshKeyFactory.build())); + http.post('*/profile/sshkeys', () => { + return HttpResponse.json(sshKeyFactory.build()); }) ); diff --git a/packages/manager/src/features/Profile/SSHKeys/DeleteSSHKeyDialog.test.tsx b/packages/manager/src/features/Profile/SSHKeys/DeleteSSHKeyDialog.test.tsx index 514c581db2c..f75404ec8e6 100644 --- a/packages/manager/src/features/Profile/SSHKeys/DeleteSSHKeyDialog.test.tsx +++ b/packages/manager/src/features/Profile/SSHKeys/DeleteSSHKeyDialog.test.tsx @@ -2,7 +2,7 @@ import { waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import * as React from 'react'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme } from 'src/utilities/testHelpers'; import DeleteSSHKeyDialog from './DeleteSSHKeyDialog'; @@ -34,8 +34,8 @@ describe('DeleteSSHKeyDialog', () => { it('should submit and call onClose', async () => { server.use( - rest.delete('*/profile/sshkeys/0', (req, res, ctx) => { - return res(ctx.json({})); + http.delete('*/profile/sshkeys/0', () => { + return HttpResponse.json({}); }) ); diff --git a/packages/manager/src/features/Profile/SSHKeys/SSHKeys.test.tsx b/packages/manager/src/features/Profile/SSHKeys/SSHKeys.test.tsx index c2886fc2a86..296b121a1b0 100644 --- a/packages/manager/src/features/Profile/SSHKeys/SSHKeys.test.tsx +++ b/packages/manager/src/features/Profile/SSHKeys/SSHKeys.test.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { sshKeyFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; import { SSHKeys } from './SSHKeys'; @@ -16,8 +16,8 @@ describe('SSHKeys', () => { const sshKeys = sshKeyFactory.buildList(5); server.use( - rest.get('*/profile/sshkeys', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(sshKeys))); + http.get('*/profile/sshkeys', () => { + return HttpResponse.json(makeResourcePage(sshKeys)); }) ); diff --git a/packages/manager/src/features/Search/SearchLanding.test.tsx b/packages/manager/src/features/Search/SearchLanding.test.tsx index 17ddc9bb726..8c05434d07e 100644 --- a/packages/manager/src/features/Search/SearchLanding.test.tsx +++ b/packages/manager/src/features/Search/SearchLanding.test.tsx @@ -6,7 +6,7 @@ import { reactRouterProps } from 'src/__data__/reactRouterProps'; import { searchbarResult1 } from 'src/__data__/searchResults'; import { linodeTypeFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme, wrapWithTheme } from 'src/utilities/testHelpers'; import { CombinedProps as Props, SearchLanding } from './SearchLanding'; @@ -30,11 +30,11 @@ const propsWithResults: Props = { describe('Component', () => { beforeEach(() => { server.use( - rest.get('*/domains', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/domains', () => { + return HttpResponse.json(makeResourcePage([])); }), - rest.get('*/linode/types/*', (req, res, ctx) => { - return res(ctx.json(linodeTypeFactory.build())); + http.get('*/linode/types/*', () => { + return HttpResponse.json(linodeTypeFactory.build()); }) ); }); diff --git a/packages/manager/src/features/Support/SupportTicketDetail/SupportTicketDetail.test.tsx b/packages/manager/src/features/Support/SupportTicketDetail/SupportTicketDetail.test.tsx index bd91cd7da9a..4a5fc589ba2 100644 --- a/packages/manager/src/features/Support/SupportTicketDetail/SupportTicketDetail.test.tsx +++ b/packages/manager/src/features/Support/SupportTicketDetail/SupportTicketDetail.test.tsx @@ -6,7 +6,7 @@ import { supportTicketFactory, } from 'src/factories/support'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { renderWithTheme, wrapWithTheme } from 'src/utilities/testHelpers'; import { SupportTicketDetail } from './SupportTicketDetail'; @@ -19,14 +19,14 @@ describe('Support Ticket Detail', () => { it('should display the ticket body', async () => { server.use( - rest.get('*/support/tickets/:ticketId', (req, res, ctx) => { + http.get('*/support/tickets/:ticketId', ({ params }) => { const ticket = supportTicketFactory.build({ description: 'TEST Support Ticket body', - id: Number(req.params.ticketId), + id: Number(params.ticketId), status: 'open', summary: '#0: TEST Support Ticket', }); - return res(ctx.json(ticket)); + return HttpResponse.json(ticket); }) ); const { findByText } = render(wrapWithTheme()); @@ -38,13 +38,13 @@ describe('Support Ticket Detail', () => { it("should display a 'new' status and 'updated by' messaging", async () => { server.use( - rest.get('*/support/tickets/:ticketId', (req, res, ctx) => { + http.get('*/support/tickets/:ticketId', ({ params }) => { const ticket = supportTicketFactory.build({ - id: Number(req.params.ticketId), + id: Number(params.ticketId), status: 'new', updated_by: 'test-account', }); - return res(ctx.json(ticket)); + return HttpResponse.json(ticket); }) ); renderWithTheme(); @@ -56,13 +56,13 @@ describe('Support Ticket Detail', () => { it("should display an 'open' status and 'updated by' messaging", async () => { server.use( - rest.get('*/support/tickets/:ticketId', (req, res, ctx) => { + http.get('*/support/tickets/:ticketId', ({ params }) => { const ticket = supportTicketFactory.build({ - id: Number(req.params.ticketId), + id: Number(params.ticketId), status: 'open', updated_by: 'test-account', }); - return res(ctx.json(ticket)); + return HttpResponse.json(ticket); }) ); renderWithTheme(); @@ -74,12 +74,12 @@ describe('Support Ticket Detail', () => { it("should display a 'closed' status and 'closed by' messaging", async () => { server.use( - rest.get('*/support/tickets/:ticketId', (req, res, ctx) => { + http.get('*/support/tickets/:ticketId', ({ params }) => { const ticket = supportTicketFactory.build({ - id: Number(req.params.ticketId), + id: Number(params.ticketId), status: 'closed', }); - return res(ctx.json(ticket)); + return HttpResponse.json(ticket); }) ); renderWithTheme(); @@ -97,12 +97,12 @@ describe('Support Ticket Detail', () => { url: '/', }; server.use( - rest.get('*/support/tickets/:ticketId', (req, res, ctx) => { + http.get('*/support/tickets/:ticketId', ({ params }) => { const ticket = supportTicketFactory.build({ entity: mockEntity, - id: Number(req.params.ticketId), + id: Number(params.ticketId), }); - return res(ctx.json(ticket)); + return HttpResponse.json(ticket); }) ); renderWithTheme(); @@ -118,21 +118,21 @@ describe('Support Ticket Detail', () => { it('should display replies', async () => { server.use( - rest.get('*/support/tickets/:ticketId/replies', (req, res, ctx) => { + http.get('*/support/tickets/:ticketId/replies', () => { const ticket = supportReplyFactory.buildList(1, { description: 'Hi, this is lindoe support! OMG, sorry your Linode is broken!', }); - return res(ctx.json(makeResourcePage(ticket))); + return HttpResponse.json(makeResourcePage(ticket)); }), - rest.get('*/support/tickets/:ticketId', (req, res, ctx) => { + http.get('*/support/tickets/:ticketId', ({ params }) => { const ticket = supportTicketFactory.build({ description: 'this ticket should have a reply on it', - id: Number(req.params.ticketId), + id: Number(params.ticketId), status: 'open', summary: 'My Linode is broken :(', }); - return res(ctx.json(ticket)); + return HttpResponse.json(ticket); }) ); renderWithTheme(); diff --git a/packages/manager/src/features/Support/SupportTickets/TicketList.test.tsx b/packages/manager/src/features/Support/SupportTickets/TicketList.test.tsx index 12493eb0f7e..1a0c82886b3 100644 --- a/packages/manager/src/features/Support/SupportTickets/TicketList.test.tsx +++ b/packages/manager/src/features/Support/SupportTickets/TicketList.test.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { supportTicketFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; import { Props, TicketList } from './TicketList'; @@ -24,12 +24,12 @@ describe('TicketList', () => { it('should render ticket table containing tickets', async () => { server.use( - rest.get('*/support/tickets', (req, res, ctx) => { + http.get('*/support/tickets', () => { const tickets = supportTicketFactory.buildList(1, { status: 'open', summary: 'my linode is broken :(', }); - return res(ctx.json(makeResourcePage(tickets))); + return HttpResponse.json(makeResourcePage(tickets)); }) ); @@ -56,8 +56,8 @@ describe('TicketList', () => { it('should render ticket list empty state', async () => { server.use( - rest.get('*/support/tickets', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/support/tickets', () => { + return HttpResponse.json(makeResourcePage([])); }) ); diff --git a/packages/manager/src/features/TopMenu/UserMenu/UserMenu.test.tsx b/packages/manager/src/features/TopMenu/UserMenu/UserMenu.test.tsx index fc1ef0d6421..f29c643feef 100644 --- a/packages/manager/src/features/TopMenu/UserMenu/UserMenu.test.tsx +++ b/packages/manager/src/features/TopMenu/UserMenu/UserMenu.test.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { accountFactory, profileFactory } from 'src/factories'; import { grantsFactory } from 'src/factories/grants'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; import { UserMenu } from './UserMenu'; @@ -19,19 +19,14 @@ describe('UserMenu', () => { it("shows a parent user's username and company name in the TopMenu for a parent user", async () => { server.use( - rest.get('*/account', (req, res, ctx) => { - return res( - ctx.json(accountFactory.build({ company: 'Parent Company' })) + http.get('*/account', () => { + return HttpResponse.json( + accountFactory.build({ company: 'Parent Company' }) ); }), - rest.get('*/profile', (req, res, ctx) => { - return res( - ctx.json( - profileFactory.build({ - user_type: 'parent', - username: 'parent-user', - }) - ) + http.get('*/profile', () => { + return HttpResponse.json( + profileFactory.build({ user_type: 'parent', username: 'parent-user' }) ); }) ); @@ -46,19 +41,17 @@ describe('UserMenu', () => { it("shows the parent user's username and child company name in the TopMenu for a proxy user", async () => { server.use( - rest.get('*/account', (req, res, ctx) => { - return res( - ctx.json(accountFactory.build({ company: 'Child Company' })) + http.get('*/account', () => { + return HttpResponse.json( + accountFactory.build({ company: 'Child Company' }) ); }), - rest.get('*/profile', (req, res, ctx) => { - return res( - ctx.json( - profileFactory.build({ - user_type: 'proxy', - username: 'parent-user', - }) - ) + http.get('*/profile', () => { + return HttpResponse.json( + profileFactory.build({ + user_type: 'proxy', + username: 'parent-user', + }) ); }) ); @@ -73,16 +66,14 @@ describe('UserMenu', () => { it("shows the child user's username and company name in the TopMenu for a child user", async () => { server.use( - rest.get('*/account', (req, res, ctx) => { - return res( - ctx.json(accountFactory.build({ company: 'Child Company' })) + http.get('*/account', () => { + return HttpResponse.json( + accountFactory.build({ company: 'Child Company' }) ); }), - rest.get('*/profile', (req, res, ctx) => { - return res( - ctx.json( - profileFactory.build({ user_type: 'child', username: 'child-user' }) - ) + http.get('*/profile', () => { + return HttpResponse.json( + profileFactory.build({ user_type: 'child', username: 'child-user' }) ); }) ); @@ -97,17 +88,17 @@ describe('UserMenu', () => { it("shows the user's username and no company name in the TopMenu for a regular user", async () => { server.use( - rest.get('*/account', (req, res, ctx) => { - return res(ctx.json(accountFactory.build({ company: 'Test Company' }))); + http.get('*/account', () => { + return HttpResponse.json( + accountFactory.build({ company: 'Test Company' }) + ); }), - rest.get('*/profile', (req, res, ctx) => { - return res( - ctx.json( - profileFactory.build({ - user_type: 'default', - username: 'regular-user', - }) - ) + http.get('*/profile', () => { + return HttpResponse.json( + profileFactory.build({ + user_type: 'default', + username: 'regular-user', + }) ); }) ); @@ -123,13 +114,13 @@ describe('UserMenu', () => { it('shows the parent company name and Switch Account button in the dropdown menu for a parent user', async () => { server.use( - rest.get('*/account', (req, res, ctx) => { - return res( - ctx.json(accountFactory.build({ company: 'Parent Company' })) + http.get('*/account', () => { + return HttpResponse.json( + accountFactory.build({ company: 'Parent Company' }) ); }), - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ user_type: 'parent' }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ user_type: 'parent' })); }) ); @@ -148,18 +139,14 @@ describe('UserMenu', () => { it('hides Switch Account button in the dropdown menu for parent accounts lacking child_account_access', async () => { server.use( - rest.get('*/account/users/*/grants', (req, res, ctx) => { - return res( - ctx.json( - grantsFactory.build({ global: { child_account_access: false } }) - ) + http.get('*/account/users/*/grants', () => { + return HttpResponse.json( + grantsFactory.build({ global: { child_account_access: false } }) ); }), - rest.get('*/profile', (req, res, ctx) => { - return res( - ctx.json( - profileFactory.build({ restricted: true, user_type: 'parent' }) - ) + http.get('*/profile', () => { + return HttpResponse.json( + profileFactory.build({ restricted: true, user_type: 'parent' }) ); }) ); @@ -176,13 +163,13 @@ describe('UserMenu', () => { it('shows the child company name and Switch Account button in the dropdown menu for a proxy user', async () => { server.use( - rest.get('*/account', (req, res, ctx) => { - return res( - ctx.json(accountFactory.build({ company: 'Child Company' })) + http.get('*/account', () => { + return HttpResponse.json( + accountFactory.build({ company: 'Child Company' }) ); }), - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ user_type: 'proxy' }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ user_type: 'proxy' })); }) ); @@ -202,29 +189,25 @@ describe('UserMenu', () => { it('shows the parent email for a parent user in the top menu and dropdown menu if their company name is unavailable', async () => { // Mock a forbidden request to the /account endpoint, which happens if Billing (Account) Access is None. server.use( - rest.get('*/account/users/*/grants', (req, res, ctx) => { - return res( - ctx.json( - grantsFactory.build({ - global: { - account_access: null, - }, - }) - ) + http.get('*/account/users/*/grants', () => { + return HttpResponse.json( + grantsFactory.build({ + global: { + account_access: null, + }, + }) ); }), - rest.get('*/account', (req, res, ctx) => { - return res(ctx.status(403)); + http.get('*/account', () => { + return HttpResponse.json({}, { status: 403 }); }), - rest.get('*/profile', (req, res, ctx) => { - return res( - ctx.json( - profileFactory.build({ - email: 'parent@parent.com', - user_type: 'parent', - username: 'parent-username', - }) - ) + http.get('*/profile', () => { + return HttpResponse.json( + profileFactory.build({ + email: 'parent@parent.com', + user_type: 'parent', + username: 'parent-username', + }) ); }) ); diff --git a/packages/manager/src/features/Users/UserRow.test.tsx b/packages/manager/src/features/Users/UserRow.test.tsx index b921d65b4dd..eabb65e99d4 100644 --- a/packages/manager/src/features/Users/UserRow.test.tsx +++ b/packages/manager/src/features/Users/UserRow.test.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { profileFactory } from 'src/factories'; import { accountUserFactory } from 'src/factories/accountUsers'; import { grantsFactory } from 'src/factories/grants'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { mockMatchMedia, renderWithTheme, @@ -54,16 +54,14 @@ describe('UserRow', () => { server.use( // Mock the grants of the additional user on the parent account. - rest.get('*/account/users/*/grants', (req, res, ctx) => { - return res( - ctx.json( - grantsFactory.build({ global: { child_account_access: true } }) - ) + http.get('*/account/users/*/grants', () => { + return HttpResponse.json( + grantsFactory.build({ global: { child_account_access: true } }) ); }), // Mock the active profile, which must be of `parent` user type to see the Child Account Access column. - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ user_type: 'parent' }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ user_type: 'parent' })); }) ); @@ -81,16 +79,14 @@ describe('UserRow', () => { server.use( // Mock the grants of the additional user on the parent account. - rest.get('*/account/users/*/grants', (req, res, ctx) => { - return res( - ctx.json( - grantsFactory.build({ global: { child_account_access: false } }) - ) + http.get('*/account/users/*/grants', () => { + return HttpResponse.json( + grantsFactory.build({ global: { child_account_access: false } }) ); }), // Mock the active profile, which must be of `parent` user type to see the Child Account Access column. - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ user_type: 'parent' }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ user_type: 'parent' })); }) ); @@ -108,16 +104,16 @@ describe('UserRow', () => { server.use( // Mock the grants of the additional user on the parent account. - rest.get('*/account/users/*/grants', (req, res, ctx) => { - return res( - ctx.json( - grantsFactory.build({ global: { child_account_access: true } }) - ) + http.get('*/account/users/*/grants', () => { + return HttpResponse.json( + grantsFactory.build({ global: { child_account_access: true } }) ); }), // Mock the active profile, which must NOT be of `parent` user type to hide the Child Account Access column. - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ user_type: 'default' }))); + http.get('*/profile', () => { + return HttpResponse.json( + profileFactory.build({ user_type: 'default' }) + ); }) ); @@ -143,8 +139,8 @@ describe('UserRow', () => { server.use( // Mock the active profile for the child account. - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ user_type: 'child' }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ user_type: 'child' })); }) ); @@ -175,8 +171,8 @@ describe('UserRow', () => { it('renders a timestamp of the last_login if it was successful', async () => { // Because we are unit testing a timestamp, set our timezone to UTC server.use( - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ timezone: 'utc' }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ timezone: 'utc' })); }) ); @@ -198,8 +194,8 @@ describe('UserRow', () => { it('renders a timestamp and "Failed" of the last_login if it was failed', async () => { // Because we are unit testing a timestamp, set our timezone to UTC server.use( - rest.get('*/profile', (req, res, ctx) => { - return res(ctx.json(profileFactory.build({ timezone: 'utc' }))); + http.get('*/profile', () => { + return HttpResponse.json(profileFactory.build({ timezone: 'utc' })); }) ); diff --git a/packages/manager/src/features/VPCs/VPCDetail/SubnetAssignLinodesDrawer.test.tsx b/packages/manager/src/features/VPCs/VPCDetail/SubnetAssignLinodesDrawer.test.tsx index 53bc07d90e9..ab69f514099 100644 --- a/packages/manager/src/features/VPCs/VPCDetail/SubnetAssignLinodesDrawer.test.tsx +++ b/packages/manager/src/features/VPCs/VPCDetail/SubnetAssignLinodesDrawer.test.tsx @@ -4,7 +4,7 @@ import * as React from 'react'; import { linodeFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; import { SubnetAssignLinodesDrawer } from './SubnetAssignLinodesDrawer'; @@ -30,8 +30,8 @@ describe('Subnet Assign Linodes Drawer', () => { }); server.use( - rest.get('*/linode/instances', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([linode]))); + http.get('*/linode/instances', () => { + return HttpResponse.json(makeResourcePage([linode])); }) ); diff --git a/packages/manager/src/features/VPCs/VPCDetail/SubnetLinodeRow.test.tsx b/packages/manager/src/features/VPCs/VPCDetail/SubnetLinodeRow.test.tsx index 58d289b495e..3f582284da8 100644 --- a/packages/manager/src/features/VPCs/VPCDetail/SubnetLinodeRow.test.tsx +++ b/packages/manager/src/features/VPCs/VPCDetail/SubnetLinodeRow.test.tsx @@ -12,7 +12,7 @@ import { import { linodeConfigFactory } from 'src/factories/linodeConfigs'; import { linodeFactory } from 'src/factories/linodes'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { mockMatchMedia, renderWithTheme, @@ -31,16 +31,12 @@ describe('SubnetLinodeRow', () => { const linodeFactory1 = linodeFactory.build({ id: 1, label: 'linode-1' }); server.use( - rest.get('*/linodes/instances/:linodeId', (req, res, ctx) => { - return res(ctx.json(linodeFactory1)); + http.get('*/linodes/instances/:linodeId', () => { + return HttpResponse.json(linodeFactory1); }), - rest.get('*/linode/instances/:id/firewalls', (req, res, ctx) => { - return res( - ctx.json( - makeResourcePage( - firewallFactory.buildList(1, { label: mockFirewall0 }) - ) - ) + http.get('*/linode/instances/:id/firewalls', () => { + return HttpResponse.json( + makeResourcePage(firewallFactory.buildList(1, { label: mockFirewall0 })) ); }) ); @@ -52,9 +48,9 @@ describe('SubnetLinodeRow', () => { it('should display linode label, reboot status, VPC IPv4 address, associated firewalls, IPv4 chip, and Reboot and Unassign buttons', async () => { const linodeFactory1 = linodeFactory.build({ id: 1, label: 'linode-1' }); server.use( - rest.get('*/instances/*/configs', async (req, res, ctx) => { + http.get('*/instances/*/configs', async () => { const configs = linodeConfigFactory.buildList(3); - return res(ctx.json(makeResourcePage(configs))); + return HttpResponse.json(makeResourcePage(configs)); }) ); @@ -111,23 +107,21 @@ describe('SubnetLinodeRow', () => { primary: true, }); server.use( - rest.get('*/linodes/instances/:linodeId', (req, res, ctx) => { - return res(ctx.json(linodeFactory1)); + http.get('*/linodes/instances/:linodeId', () => { + return HttpResponse.json(linodeFactory1); }), - rest.get('*/linode/instances/:id/firewalls', (req, res, ctx) => { - return res( - ctx.json( - makeResourcePage( - firewallFactory.buildList(1, { label: mockFirewall0 }) - ) + http.get('*/linode/instances/:id/firewalls', () => { + return HttpResponse.json( + makeResourcePage( + firewallFactory.buildList(1, { label: mockFirewall0 }) ) ); }), - rest.get('*/instances/*/configs', (req, res, ctx) => { + http.get('*/instances/*/configs', () => { const configs = linodeConfigFactory.build({ interfaces: [vpcInterface], }); - return res(ctx.json(makeResourcePage([configs]))); + return HttpResponse.json(makeResourcePage([configs])); }) ); @@ -209,8 +203,8 @@ describe('SubnetLinodeRow', () => { }); server.use( - rest.get('*/instances/*/configs', async (req, res, ctx) => { - return res(ctx.json(makeResourcePage([configurationProfile]))); + http.get('*/instances/*/configs', async () => { + return HttpResponse.json(makeResourcePage([configurationProfile])); }) ); diff --git a/packages/manager/src/features/VPCs/VPCDetail/VPCDetail.test.tsx b/packages/manager/src/features/VPCs/VPCDetail/VPCDetail.test.tsx index 1204d1e55df..088e5c2b8e0 100644 --- a/packages/manager/src/features/VPCs/VPCDetail/VPCDetail.test.tsx +++ b/packages/manager/src/features/VPCs/VPCDetail/VPCDetail.test.tsx @@ -3,7 +3,7 @@ import { waitForElementToBeRemoved } from '@testing-library/react'; import * as React from 'react'; import { vpcFactory } from 'src/factories/vpcs'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; import VPCDetail from './VPCDetail'; @@ -16,8 +16,8 @@ describe('VPC Detail Summary section', () => { it('should display number of subnets and linodes, region, id, creation and update dates', async () => { const vpcFactory1 = vpcFactory.build({ id: 100 }); server.use( - rest.get('*/vpcs/:vpcId', (req, res, ctx) => { - return res(ctx.json(vpcFactory1)); + http.get('*/vpcs/:vpcId', () => { + return HttpResponse.json(vpcFactory1); }) ); @@ -50,8 +50,8 @@ describe('VPC Detail Summary section', () => { description: `VPC for webserver and database.`, }); server.use( - rest.get('*/vpcs/:vpcId', (req, res, ctx) => { - return res(ctx.json(vpcFactory1)); + http.get('*/vpcs/:vpcId', () => { + return HttpResponse.json(vpcFactory1); }) ); @@ -65,8 +65,8 @@ describe('VPC Detail Summary section', () => { it('should hide description if none is provided', async () => { server.use( - rest.get('*/vpcs/:vpcId', (req, res, ctx) => { - return res(ctx.json(vpcFactory.build())); + http.get('*/vpcs/:vpcId', () => { + return HttpResponse.json(vpcFactory.build()); }) ); @@ -82,8 +82,8 @@ describe('VPC Detail Summary section', () => { description: `VPC for webserver and database. VPC for webserver and database. VPC for webserver and database. VPC for webserver and database. VPC for webserver. VPC for webserver.`, }); server.use( - rest.get('*/vpcs/:vpcId', (req, res, ctx) => { - return res(ctx.json(vpcFactory1)); + http.get('*/vpcs/:vpcId', () => { + return HttpResponse.json(vpcFactory1); }) ); diff --git a/packages/manager/src/features/VPCs/VPCDetail/VPCSubnetsTable.test.tsx b/packages/manager/src/features/VPCs/VPCDetail/VPCSubnetsTable.test.tsx index 5363d8a8bf1..b658f2f6096 100644 --- a/packages/manager/src/features/VPCs/VPCDetail/VPCSubnetsTable.test.tsx +++ b/packages/manager/src/features/VPCs/VPCDetail/VPCSubnetsTable.test.tsx @@ -7,7 +7,7 @@ import { subnetFactory, } from 'src/factories/subnets'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; import { VPCSubnetsTable } from './VPCSubnetsTable'; @@ -26,8 +26,8 @@ describe('VPC Subnets table', () => { ], }); server.use( - rest.get('*/vpcs/:vpcId/subnets', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([subnet]))); + http.get('*/vpcs/:vpcId/subnets', () => { + return HttpResponse.json(makeResourcePage([subnet])); }) ); @@ -65,8 +65,8 @@ describe('VPC Subnets table', () => { it('should display no linodes text if there are no linodes associated with the subnet', async () => { const subnet = subnetFactory.build({ linodes: [] }); server.use( - rest.get('*/vpcs/:vpcId/subnets', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([subnet]))); + http.get('*/vpcs/:vpcId/subnets', () => { + return HttpResponse.json(makeResourcePage([subnet])); }) ); @@ -86,8 +86,8 @@ describe('VPC Subnets table', () => { linodes: [subnetAssignedLinodeDataFactory.build({ id: 1 })], }); server.use( - rest.get('*/vpcs/:vpcId/subnets', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([subnet]))); + http.get('*/vpcs/:vpcId/subnets', () => { + return HttpResponse.json(makeResourcePage([subnet])); }) ); const { getAllByRole, getByTestId, getByText } = renderWithTheme( diff --git a/packages/manager/src/features/VPCs/VPCLanding/VPCLanding.test.tsx b/packages/manager/src/features/VPCs/VPCLanding/VPCLanding.test.tsx index b4c7526fc46..6ff4c148261 100644 --- a/packages/manager/src/features/VPCs/VPCLanding/VPCLanding.test.tsx +++ b/packages/manager/src/features/VPCs/VPCLanding/VPCLanding.test.tsx @@ -4,7 +4,7 @@ import * as React from 'react'; import { subnetFactory } from 'src/factories'; import { vpcFactory } from 'src/factories/vpcs'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; import VPCLanding from './VPCLanding'; @@ -16,11 +16,11 @@ const loadingTestId = 'circle-progress'; describe('VPC Landing Table', () => { it('should render vpc landing table with items', async () => { server.use( - rest.get('*/vpcs', (req, res, ctx) => { + http.get('*/vpcs', () => { const vpcsWithSubnet = vpcFactory.buildList(3, { subnets: subnetFactory.buildList(Math.floor(Math.random() * 10) + 1), }); - return res(ctx.json(makeResourcePage(vpcsWithSubnet))); + return HttpResponse.json(makeResourcePage(vpcsWithSubnet)); }) ); @@ -41,8 +41,8 @@ describe('VPC Landing Table', () => { it('should render vpc landing with empty state', async () => { server.use( - rest.get('*/vpcs', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/vpcs', () => { + return HttpResponse.json(makeResourcePage([])); }) ); diff --git a/packages/manager/src/features/Volumes/VolumeTableRow.test.tsx b/packages/manager/src/features/Volumes/VolumeTableRow.test.tsx index f4b3f367d5b..f4895c4dfc1 100644 --- a/packages/manager/src/features/Volumes/VolumeTableRow.test.tsx +++ b/packages/manager/src/features/Volumes/VolumeTableRow.test.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { notificationFactory, volumeFactory } from 'src/factories'; import { makeResourcePage } from 'src/mocks/serverHandlers'; -import { rest, server } from 'src/mocks/testServer'; +import { http, HttpResponse, server } from 'src/mocks/testServer'; import { renderWithTheme, wrapWithTableBody } from 'src/utilities/testHelpers'; import { ActionHandlers } from './VolumesActionMenu'; @@ -73,8 +73,8 @@ describe('Volume table row', () => { }); server.use( - rest.get('*/account/notifications', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([notification]))); + http.get('*/account/notifications', () => { + return HttpResponse.json(makeResourcePage([notification])); }) ); @@ -93,8 +93,8 @@ describe('Volume table row', () => { }); server.use( - rest.get('*/account/notifications', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([notification]))); + http.get('*/account/notifications', () => { + return HttpResponse.json(makeResourcePage([notification])); }) ); diff --git a/packages/manager/src/hooks/useOrder.test.tsx b/packages/manager/src/hooks/useOrder.test.tsx index 1f6b4e0a559..e3776006646 100644 --- a/packages/manager/src/hooks/useOrder.test.tsx +++ b/packages/manager/src/hooks/useOrder.test.tsx @@ -1,7 +1,7 @@ -import { act, renderHook, waitFor } from '@testing-library/react'; import { QueryClient } from '@tanstack/react-query'; +import { act, renderHook, waitFor } from '@testing-library/react'; -import { rest, server } from 'src/mocks/testServer'; +import { HttpResponse, http, server } from 'src/mocks/testServer'; import { queryClientFactory } from 'src/queries/base'; import { usePreferences } from 'src/queries/preferences'; import { OrderSet } from 'src/types/ManagerPreferences'; @@ -80,14 +80,12 @@ describe('useOrder hook', () => { const queryClient = new QueryClient(); server.use( - rest.get('*/profile/preferences', (_, res, ctx) => { - return res( - ctx.json({ - sortKeys: { - 'account-maintenance-order': preferenceOrder, - }, - }) - ); + http.get('*/profile/preferences', () => { + return HttpResponse.json({ + sortKeys: { + 'account-maintenance-order': preferenceOrder, + }, + }); }) ); diff --git a/packages/manager/src/mocks/serverHandlers.ts b/packages/manager/src/mocks/serverHandlers.ts index f430df4c727..2d9acd1eab2 100644 --- a/packages/manager/src/mocks/serverHandlers.ts +++ b/packages/manager/src/mocks/serverHandlers.ts @@ -8,7 +8,7 @@ import { VolumeStatus, } from '@linode/api-v4'; import { DateTime } from 'luxon'; -import { rest } from 'msw'; +import { HttpResponse, http } from 'msw'; import { regions } from 'src/__data__/regionsData'; import { MOCK_THEME_STORAGE_KEY } from 'src/dev-tools/ThemeSelector'; @@ -120,13 +120,13 @@ export const makeResourcePage = ( }); const statusPage = [ - rest.get('*/api/v2/incidents*', (req, res, ctx) => { + http.get('*/api/v2/incidents*', () => { const response = incidentResponseFactory.build(); - return res(ctx.json(response)); + return HttpResponse.json(response); }), - rest.get('*/api/v2/scheduled-maintenances*', (req, res, ctx) => { + http.get('*/api/v2/scheduled-maintenances*', () => { const response = maintenanceResponseFactory.build(); - return res(ctx.json(response)); + return HttpResponse.json(response); }), ]; @@ -135,7 +135,7 @@ function sleep(ms: number) { } const entityTransfers = [ - rest.get('*/account/entity-transfers', (req, res, ctx) => { + http.get('*/account/entity-transfers', () => { const transfers1 = entityTransferFactory.buildList(10); const transfers2 = entityTransferFactory.buildList(10, { token: 'TEST123', @@ -158,40 +158,38 @@ const entityTransfers = [ transfer4, transfer5 ); - return res(ctx.json(makeResourcePage(combinedTransfers))); + return HttpResponse.json(makeResourcePage(combinedTransfers)); }), - rest.get('*/account/entity-transfers/:transferId', (req, res, ctx) => { + http.get('*/account/entity-transfers/:transferId', () => { const transfer = entityTransferFactory.build(); - return res(ctx.json(transfer)); + return HttpResponse.json(transfer); }), - rest.get('*/account/agreements', (req, res, ctx) => - res(ctx.json(accountAgreementsFactory.build())) + http.get('*/account/agreements', () => + HttpResponse.json(accountAgreementsFactory.build()) ), - rest.post('*/account/entity-transfers', (req, res, ctx) => { - const payload = req.body as any; + http.post('*/account/entity-transfers', async ({ request }) => { + const body = await request.json(); + const payload = body as any; const newTransfer = entityTransferFactory.build({ entities: payload.entities, }); - return res(ctx.json(newTransfer)); + return HttpResponse.json(newTransfer); }), - rest.post( - '*/account/entity-transfers/:transferId/accept', - (req, res, ctx) => { - return res(ctx.json({})); - } - ), - rest.delete('*/account/entity-transfers/:transferId', (req, res, ctx) => { - return res(ctx.json({})); + http.post('*/account/entity-transfers/:transferId/accept', () => { + return HttpResponse.json({}); + }), + http.delete('*/account/entity-transfers/:transferId', () => { + return HttpResponse.json({}); }), ]; const databases = [ - rest.get('*/databases/instances', (req, res, ctx) => { + http.get('*/databases/instances', () => { const databases = databaseInstanceFactory.buildList(5); - return res(ctx.json(makeResourcePage(databases))); + return HttpResponse.json(makeResourcePage(databases)); }), - rest.get('*/databases/types', (req, res, ctx) => { + http.get('*/databases/types', () => { const standardTypes = [ databaseTypeFactory.build({ class: 'nanode', @@ -207,14 +205,12 @@ const databases = [ const premiumTypes = databaseTypeFactory.buildList(7, { class: 'premium', }); - return res( - ctx.json( - makeResourcePage([...standardTypes, ...dedicatedTypes, ...premiumTypes]) - ) + return HttpResponse.json( + makeResourcePage([...standardTypes, ...dedicatedTypes, ...premiumTypes]) ); }), - rest.get('*/databases/engines', (req, res, ctx) => { + http.get('*/databases/engines', () => { const engine1 = databaseEngineFactory.buildList(3); const engine2 = databaseEngineFactory.buildList(3, { engine: 'postgresql', @@ -225,245 +221,249 @@ const databases = [ const combinedList = [...engine1, ...engine2, ...engine3]; - return res(ctx.json(makeResourcePage(combinedList))); + return HttpResponse.json(makeResourcePage(combinedList)); }), - rest.get('*/databases/:engine/instances/:id', (req, res, ctx) => { + http.get('*/databases/:engine/instances/:id', ({ params }) => { const database = databaseFactory.build({ - compression_type: req.params.engine === 'mongodb' ? 'none' : undefined, - engine: req.params.engine as 'mysql', - id: Number(req.params.id), - label: `database-${req.params.id}`, + compression_type: params.engine === 'mongodb' ? 'none' : undefined, + engine: params.engine as 'mysql', + id: Number(params.id), + label: `database-${params.id}`, replication_commit_type: - req.params.engine === 'postgresql' ? 'local' : undefined, + params.engine === 'postgresql' ? 'local' : undefined, replication_type: - req.params.engine === 'mysql' + params.engine === 'mysql' ? pickRandom(possibleMySQLReplicationTypes) - : req.params.engine === 'postgresql' + : params.engine === 'postgresql' ? pickRandom(possiblePostgresReplicationTypes) : (undefined as any), ssl_connection: true, - storage_engine: - req.params.engine === 'mongodb' ? 'wiredtiger' : undefined, + storage_engine: params.engine === 'mongodb' ? 'wiredtiger' : undefined, }); - return res(ctx.json(database)); + return HttpResponse.json(database); }), - rest.get( - '*/databases/:engine/instances/:databaseId/backups', - (req, res, ctx) => { - const backups = databaseBackupFactory.buildList(7); - return res(ctx.json(makeResourcePage(backups))); - } - ), + http.get('*/databases/:engine/instances/:databaseId/backups', () => { + const backups = databaseBackupFactory.buildList(7); + return HttpResponse.json(makeResourcePage(backups)); + }), - rest.get( - '*/databases/:engine/instances/:databaseId/credentials', - (req, res, ctx) => { - return res( - // ctx.status(400) - ctx.json({ - password: 'password123', - username: 'lnroot', - }) - ); - } - ), + http.get('*/databases/:engine/instances/:databaseId/credentials', () => { + return HttpResponse.json({ + password: 'password123', + username: 'lnroot', + }); + }), - rest.get('*/databases/:engine/instances/:databaseId/ssl', (req, res, ctx) => { - return res( - ctx.json({ - certificate: 'testcertificate', - public_key: 'testkey', - }) - ); + http.get('*/databases/:engine/instances/:databaseId/ssl', () => { + return HttpResponse.json({ + certificate: 'testcertificate', + public_key: 'testkey', + }); }), - rest.post('*/databases/:engine/instances', (req, res, ctx) => { - const payload: any = req.body; - return res( - ctx.json({ - ...databaseFactory.build({ - engine: req.params.engine as 'mysql', - label: payload?.label ?? 'Database', - }), - }) - ); + http.post('*/databases/:engine/instances', async ({ params, request }) => { + const body = await request.json(); + const payload: any = body; + return HttpResponse.json({ + ...databaseFactory.build({ + engine: params.engine as 'mysql', + label: payload?.label ?? 'Database', + }), + }); }), - rest.post( + http.post( '*/databases/:engine/instances/:databaseId/backups/:backupId/restore', - (req, res, ctx) => { - return res(ctx.json({})); + () => { + return HttpResponse.json({}); } ), - rest.post( + http.post( '*/databases/:engine/instances/:databaseId/credentials/reset', - (req, res, ctx) => { - return res(ctx.json({})); + () => { + return HttpResponse.json({}); } ), - rest.put('*/databases/mysql/instances/:databaseId', (req, res, ctx) => { - const id = Number(req.params.databaseId); - const body = req.body as any; - return res(ctx.json({ ...databaseFactory.build({ id }), ...body })); - }), + http.put( + '*/databases/mysql/instances/:databaseId', + async ({ params, request }) => { + const reqBody = await request.json(); + const id = Number(params.databaseId); + const body = reqBody as any; + return HttpResponse.json({ ...databaseFactory.build({ id }), ...body }); + } + ), - rest.delete('*/databases/mysql/instances/:databaseId', (req, res, ctx) => { - return res(ctx.json({})); + http.delete('*/databases/mysql/instances/:databaseId', () => { + return HttpResponse.json({}); }), ]; const aclb = [ // Configurations - rest.get('*/v4beta/aclb/:id/configurations', (req, res, ctx) => { + http.get('*/v4beta/aclb/:id/configurations', () => { const configurations = configurationFactory.buildList(3); - return res(ctx.json(makeResourcePage(configurations))); + return HttpResponse.json(makeResourcePage(configurations)); }), - rest.get('*/v4beta/aclb/:id/endpoints-health', (req, res, ctx) => { + http.get('*/v4beta/aclb/:id/endpoints-health', ({ params }) => { const health = loadbalancerEndpointHealthFactory.build({ - id: Number(req.params.id), + id: Number(params.id), }); - return res(ctx.json(health)); + return HttpResponse.json(health); }), - rest.get( + http.get( '*/v4beta/aclb/:id/configurations/endpoints-health', - (req, res, ctx) => { + ({ params }) => { const health = configurationsEndpointHealthFactory.build({ - id: Number(req.params.id), + id: Number(params.id), }); - return res(ctx.json(health)); + return HttpResponse.json(health); } ), - rest.get( + http.get( '*/v4beta/aclb/:id/service-targets/endpoints-health', - (req, res, ctx) => { + ({ params }) => { const health = serviceTargetsEndpointHealthFactory.build({ - id: Number(req.params.id), + id: Number(params.id), }); - return res(ctx.json(health)); + return HttpResponse.json(health); } ), - rest.get('*/v4beta/aclb/:id/configurations/:configId', (req, res, ctx) => { - return res(ctx.json(configurationFactory.build())); - }), - rest.post('*/v4beta/aclb/:id/configurations', (req, res, ctx) => { - return res(ctx.json(configurationFactory.build())); - }), - rest.put('*/v4beta/aclb/:id/configurations/:configId', (req, res, ctx) => { - const id = Number(req.params.configId); - const body = req.body as any; - return res(ctx.json(configurationFactory.build({ id, ...body }))); - }), - rest.delete('*/v4beta/aclb/:id/configurations/:configId', (req, res, ctx) => { - return res(ctx.json({})); + http.get('*/v4beta/aclb/:id/configurations/:configId', () => { + return HttpResponse.json(configurationFactory.build()); + }), + http.post('*/v4beta/aclb/:id/configurations', () => { + return HttpResponse.json(configurationFactory.build()); + }), + http.put( + '*/v4beta/aclb/:id/configurations/:configId', + async ({ params, request }) => { + const reqBody = await request.json(); + const id = Number(params.configId); + const body = reqBody as any; + return HttpResponse.json(configurationFactory.build({ id, ...body })); + } + ), + http.delete('*/v4beta/aclb/:id/configurations/:configId', () => { + return HttpResponse.json({}); }), // Load Balancers - rest.get('*/v4beta/aclb', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(loadbalancerFactory.buildList(3)))); - }), - rest.get('*/v4beta/aclb/:loadbalancerId', (req, res, ctx) => { - return res( - ctx.json( - loadbalancerFactory.build({ - id: Number(req.params.loadbalancerId), - label: `aclb-${req.params.loadbalancerId}`, - }) - ) + http.get('*/v4beta/aclb', () => { + return HttpResponse.json( + makeResourcePage(loadbalancerFactory.buildList(3)) + ); + }), + http.get('*/v4beta/aclb/:loadbalancerId', ({ params }) => { + return HttpResponse.json( + loadbalancerFactory.build({ + id: Number(params.loadbalancerId), + label: `aclb-${params.loadbalancerId}`, + }) ); }), - rest.post('*/v4beta/aclb', (req, res, ctx) => { - return res(ctx.json(loadbalancerFactory.build())); + http.post('*/v4beta/aclb', () => { + return HttpResponse.json(loadbalancerFactory.build()); }), - rest.put('*/v4beta/aclb/:id', (req, res, ctx) => { - const id = Number(req.params.id); - const body = req.body as any; + http.put('*/v4beta/aclb/:id', async ({ params, request }) => { + const reqBody = await request.json(); + const id = Number(params.id); + const body = reqBody as any; // The payload to update a loadbalancer is not the same as the payload to create a loadbalancer // In one instance we have a list of entrypoints objects, in the other we have a list of entrypoints ids // TODO: ACLB - figure out if this is still accurate - return res(ctx.json(loadbalancerFactory.build({ id, ...body }))); + return HttpResponse.json(loadbalancerFactory.build({ id, ...body })); }), - rest.delete('*/v4beta/aclb/:id', (req, res, ctx) => { - return res(ctx.json({})); + http.delete('*/v4beta/aclb/:id', () => { + return HttpResponse.json({}); }), // Routes - rest.get('*/v4beta/aclb/:id/routes', (req, res, ctx) => { - const headers = JSON.parse(req.headers.get('x-filter') || '{}'); + http.get('*/v4beta/aclb/:id/routes', ({ request }) => { + const headers = JSON.parse(request.headers.get('x-filter') || '{}'); if (headers['+or']) { - return res( - ctx.json( - makeResourcePage(routeFactory.buildList(headers['+or'].length)) - ) + return HttpResponse.json( + makeResourcePage(routeFactory.buildList(headers['+or'].length)) ); } - return res(ctx.json(makeResourcePage(routeFactory.buildList(5)))); + return HttpResponse.json(makeResourcePage(routeFactory.buildList(5))); }), - rest.post('*/v4beta/aclb/:id/routes', (req, res, ctx) => { - return res(ctx.json(createRouteFactory.buildList(4))); + http.post('*/v4beta/aclb/:id/routes', () => { + return HttpResponse.json(createRouteFactory.buildList(4)); }), - rest.put('*/v4beta/aclb/:id/routes/:routeId', (req, res, ctx) => { - const id = Number(req.params.routeId); - const body = req.body as any; - return res( - ctx.delay(1000), - ctx.json(createRouteFactory.build({ id, ...body })) - ); + http.put('*/v4beta/aclb/:id/routes/:routeId', async ({ params, request }) => { + const reqBody = await request.json(); + const id = Number(params.routeId); + const body = reqBody as any; + return HttpResponse.json(createRouteFactory.build({ id, ...body })); }), - rest.delete('*/v4beta/aclb/:id/routes/:routeId', (req, res, ctx) => { - return res(ctx.json({})); + http.delete('*/v4beta/aclb/:id/routes/:routeId', () => { + return HttpResponse.json({}); }), // Service Targets - rest.get('*/v4beta/aclb/:id/service-targets', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(serviceTargetFactory.buildList(5)))); + http.get('*/v4beta/aclb/:id/service-targets', () => { + return HttpResponse.json( + makeResourcePage(serviceTargetFactory.buildList(5)) + ); }), - rest.post('*/v4beta/aclb/:id/service-targets', (req, res, ctx) => { - return res(ctx.json(createServiceTargetFactory.build())); + http.post('*/v4beta/aclb/:id/service-targets', () => { + return HttpResponse.json(createServiceTargetFactory.build()); }), - rest.put( - '*/v4beta/aclb/:id/service-targets/:serviceTargetId', - (req, res, ctx) => { - const id = Number(req.params.serviceTargetId); - const body = req.body as any; - return res(ctx.json(createServiceTargetFactory.build({ id, ...body }))); - } - ), - rest.delete( + http.put( '*/v4beta/aclb/:id/service-targets/:serviceTargetId', - (req, res, ctx) => { - return res(ctx.json({})); + async ({ params, request }) => { + const reqBody = await request.json(); + const id = Number(params.serviceTargetId); + const body = reqBody as any; + return HttpResponse.json( + createServiceTargetFactory.build({ id, ...body }) + ); } ), + http.delete('*/v4beta/aclb/:id/service-targets/:serviceTargetId', () => { + return HttpResponse.json({}); + }), // Certificates - rest.get('*/v4beta/aclb/:id/certificates', (req, res, ctx) => { + http.get('*/v4beta/aclb/:id/certificates', () => { const tlsCertificate = certificateFactory.build({ label: 'tls-certificate', type: 'downstream', }); const certificates = certificateFactory.buildList(3); - return res(ctx.json(makeResourcePage([tlsCertificate, ...certificates]))); - }), - rest.get('*/v4beta/aclb/:id/certificates/:certId', (req, res, ctx) => { - const id = Number(req.params.certId); - const body = req.body as any; - return res(ctx.json(certificateFactory.build({ id, ...body }))); - }), - rest.post('*/v4beta/aclb/:id/certificates', (req, res, ctx) => { - return res(ctx.json(certificateFactory.build())); - }), - rest.put('*/v4beta/aclb/:id/certificates/:certId', (req, res, ctx) => { - const id = Number(req.params.certId); - const body = req.body as any; - return res(ctx.json(certificateFactory.build({ id, ...body }))); + return HttpResponse.json( + makeResourcePage([tlsCertificate, ...certificates]) + ); }), - rest.delete('*/v4beta/aclb/:id/certificates/:certId', (req, res, ctx) => { - return res(ctx.json({})); + http.get( + '*/v4beta/aclb/:id/certificates/:certId', + async ({ params, request }) => { + const reqBody = await request.json(); + const id = Number(params.certId); + const body = reqBody as any; + return HttpResponse.json(certificateFactory.build({ id, ...body })); + } + ), + http.post('*/v4beta/aclb/:id/certificates', () => { + return HttpResponse.json(certificateFactory.build()); + }), + http.put( + '*/v4beta/aclb/:id/certificates/:certId', + async ({ params, request }) => { + const reqBody = await request.json(); + const id = Number(params.certId); + const body = reqBody as any; + return HttpResponse.json(certificateFactory.build({ id, ...body })); + } + ), + http.delete('*/v4beta/aclb/:id/certificates/:certId', () => { + return HttpResponse.json({}); }), ]; const vpc = [ - rest.get('*/v4beta/vpcs', (req, res, ctx) => { + http.get('*/v4beta/vpcs', () => { const vpcsWithSubnet1 = vpcFactory.buildList(5, { subnets: subnetFactory.buildList(Math.floor(Math.random() * 10) + 1), }); @@ -472,49 +472,47 @@ const vpc = [ subnets: subnetFactory.buildList(Math.floor(Math.random() * 20) + 1), }); const vpcsWithoutSubnet = vpcFactory.buildList(20); - return res( - ctx.json( - makeResourcePage([ - ...vpcsWithSubnet1, - ...vpcsWithSubnet2, - ...vpcsWithoutSubnet, - ]) - ) + return HttpResponse.json( + makeResourcePage([ + ...vpcsWithSubnet1, + ...vpcsWithSubnet2, + ...vpcsWithoutSubnet, + ]) ); }), - rest.get('*/v4beta/vpcs/:vpcId', (req, res, ctx) => { - return res( - ctx.json( - vpcFactory.build({ - description: `VPC for webserver and database. VPC for webserver and database. VPC for webserver and database. VPC for webserver and database. VPC for webserver VPC for webserver VPC for webserver VPC for webserver VPC for webserver.VPC for webserver and database!!! VPC`, - subnets: subnetFactory.buildList(Math.floor(Math.random() * 10) + 1), - }) - ) + http.get('*/v4beta/vpcs/:vpcId', () => { + return HttpResponse.json( + vpcFactory.build({ + description: `VPC for webserver and database. VPC for webserver and database. VPC for webserver and database. VPC for webserver and database. VPC for webserver VPC for webserver VPC for webserver VPC for webserver VPC for webserver.VPC for webserver and database!!! VPC`, + subnets: subnetFactory.buildList(Math.floor(Math.random() * 10) + 1), + }) ); }), - rest.get('*/v4beta/vpcs/:vpcId/subnets', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(subnetFactory.buildList(30)))); + http.get('*/v4beta/vpcs/:vpcId/subnets', () => { + return HttpResponse.json(makeResourcePage(subnetFactory.buildList(30))); }), - rest.delete('*/v4beta/vpcs/:vpcId/subnets/:subnetId', (req, res, ctx) => { - return res(ctx.json({})); + http.delete('*/v4beta/vpcs/:vpcId/subnets/:subnetId', () => { + return HttpResponse.json({}); }), - rest.delete('*/v4beta/vpcs/:vpcId', (req, res, ctx) => { - return res(ctx.json({})); + http.delete('*/v4beta/vpcs/:vpcId', () => { + return HttpResponse.json({}); }), - rest.put('*/v4beta/vpcs/:vpcId', (req, res, ctx) => { - return res(ctx.json(vpcFactory.build({ description: 'testing' }))); + http.put('*/v4beta/vpcs/:vpcId', () => { + return HttpResponse.json(vpcFactory.build({ description: 'testing' })); }), - rest.get('*/v4beta/vpcs/:vpcID', (req, res, ctx) => { - const id = Number(req.params.id); - return res(ctx.json(vpcFactory.build({ id }))); + http.get('*/v4beta/vpcs/:vpcID', ({ params }) => { + const id = Number(params.id); + return HttpResponse.json(vpcFactory.build({ id })); }), - rest.post('*/v4beta/vpcs', (req, res, ctx) => { - const vpc = vpcFactory.build({ ...(req.body as any) }); - return res(ctx.json(vpc)); + http.post('*/v4beta/vpcs', async ({ request }) => { + const body = await request.json(); + const vpc = vpcFactory.build({ ...(body as any) }); + return HttpResponse.json(vpc); }), - rest.post('*/v4beta/vpcs/:vpcId/subnets', (req, res, ctx) => { - const subnet = subnetFactory.build({ ...(req.body as any) }); - return res(ctx.json(subnet)); + http.post('*/v4beta/vpcs/:vpcId/subnets', async ({ request }) => { + const body = await request.json(); + const subnet = subnetFactory.build({ ...(body as any) }); + return HttpResponse.json(subnet); }), ]; @@ -551,49 +549,53 @@ const parentAccountNonAdminUser = accountUserFactory.build({ }); export const handlers = [ - rest.get('*/profile', (req, res, ctx) => { + http.get('*/profile', () => { const profile = profileFactory.build({ restricted: false, // Parent/Child: switch the `user_type` depending on what account view you need to mock. user_type: 'parent', }); - return res(ctx.json(profile)); + return HttpResponse.json(profile); }), - rest.put('*/profile', (req, res, ctx) => { - return res(ctx.json({ ...profileFactory.build(), ...(req.body as any) })); + + http.put('*/profile', async ({ request }) => { + const body = await request.json(); + + return HttpResponse.json({ ...profileFactory.build(), ...(body as any) }); }), - rest.get('*/profile/grants', (req, res, ctx) => { - return res( - // Parent/Child: switch out the return statement if you want to mock a restricted parent user with access to child accounts. - // ctx.json(grantsFactory.build({ global: { child_account_access: true } })) - ctx.json(grantsFactory.build()) - ); + http.get('*/profile/grants', () => { + return HttpResponse.json(grantsFactory.build()); }), - rest.get('*/profile/apps', (req, res, ctx) => { + http.get('*/profile/apps', () => { const tokens = appTokenFactory.buildList(5); - return res(ctx.json(makeResourcePage(tokens))); + return HttpResponse.json(makeResourcePage(tokens)); }), - rest.post('*/profile/phone-number', async (req, res, ctx) => { + http.post('*/profile/phone-number', async () => { await sleep(2000); - return res(ctx.json({})); + return HttpResponse.json({}); }), - rest.post('*/profile/phone-number/verify', async (req, res, ctx) => { + http.post('*/profile/phone-number/verify', async () => { await sleep(2000); - return res(ctx.json({})); - }), - rest.delete('*/profile/phone-number', (req, res, ctx) => { - return res(ctx.json({})); + return HttpResponse.json({}); }), - rest.get('*/profile/security-questions', (req, res, ctx) => { - return res(ctx.json(securityQuestionsFactory.build())); + http.delete('*/profile/phone-number', () => { + return HttpResponse.json({}); }), - rest.post('*/profile/security-questions', (req, res, ctx) => { - return res(ctx.json(req.body as SecurityQuestionsPayload)); + http.get('*/profile/security-questions', () => { + return HttpResponse.json(securityQuestionsFactory.build()); }), - rest.get('*/regions', async (req, res, ctx) => { - return res(ctx.json(makeResourcePage(regions))); + http.post( + '*/profile/security-questions', + async ({ request }) => { + const body = await request.json(); + + return HttpResponse.json(body); + } + ), + http.get('*/regions', async () => { + return HttpResponse.json(makeResourcePage(regions)); }), - rest.get('*/images', async (req, res, ctx) => { + http.get('*/images', async () => { const privateImages = imageFactory.buildList(5, { status: 'available', type: 'manual', @@ -635,30 +637,29 @@ export const handlers = [ ...pendingImages, ...creatingImages, ]; - return res(ctx.json(makeResourcePage(images))); + return HttpResponse.json(makeResourcePage(images)); }), - rest.get('*/linode/types', (req, res, ctx) => { - return res( - ctx.json( - makeResourcePage([ - nanodeType, - ...standardTypes, - ...dedicatedTypes, - proDedicatedType, - ]) - ) + + http.get('*/linode/types', () => { + return HttpResponse.json( + makeResourcePage([ + nanodeType, + ...standardTypes, + ...dedicatedTypes, + proDedicatedType, + ]) ); }), - rest.get('*/linode/types-legacy', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(linodeTypeFactory.buildList(0)))); + http.get('*/linode/types-legacy', () => { + return HttpResponse.json(makeResourcePage(linodeTypeFactory.buildList(0))); }), ...[nanodeType, ...standardTypes, ...dedicatedTypes, proDedicatedType].map( (type) => - rest.get(`*/linode/types/${type.id}`, (req, res, ctx) => { - return res(ctx.json(type)); + http.get(`*/linode/types/${type.id}`, () => { + return HttpResponse.json(type); }) ), - rest.get('*/linode/instances', async (req, res, ctx) => { + http.get('*/linode/instances', async ({ request }) => { linodeFactory.resetSequenceNumber(); const metadataLinodeWithCompatibleImage = linodeFactory.build({ image: 'metadata-test-image', @@ -714,11 +715,6 @@ export const handlers = [ label: 'shadow-plan', type: 'g5-standard-20-s1', }), - linodeFactory.build({ - backups: { enabled: false }, - label: 'bare-metal', - type: 'g1-metal-c2', - }), linodeFactory.build({ backups: { enabled: false }, label: 'shadow-plan-with-tags', @@ -738,8 +734,8 @@ export const handlers = [ multipleIPLinode, ]; - if (req.headers.get('x-filter')) { - const headers = JSON.parse(req.headers.get('x-filter') || '{}'); + if (request.headers.get('x-filter')) { + const headers = JSON.parse(request.headers.get('x-filter') || '{}'); const orFilters = headers['+or']; if (orFilters) { @@ -754,203 +750,200 @@ export const handlers = [ return (filteredById || filteredByRegion) ?? linodes; }); - return res(ctx.json(makeResourcePage(filteredLinodes))); + return HttpResponse.json(makeResourcePage(filteredLinodes)); } } - return res(ctx.json(makeResourcePage(linodes))); - }), - rest.get('*/linode/instances/:id', async (req, res, ctx) => { - const id = Number(req.params.id); - return res( - ctx.json( - linodeFactory.build({ - backups: { enabled: false }, - id, - label: 'Gecko Edge Test', - region: 'us-edge-1', - }) - ) + return HttpResponse.json(makeResourcePage(linodes)); + }), + + http.get('*/linode/instances/:id', async ({ params }) => { + const id = Number(params.id); + return HttpResponse.json( + linodeFactory.build({ + backups: { enabled: false }, + id, + label: 'Gecko Edge Test', + region: 'us-edge-1', + }) ); }), - rest.get('*/linode/instances/:id/firewalls', async (req, res, ctx) => { + http.get('*/linode/instances/:id/firewalls', async () => { const firewalls = firewallFactory.buildList(10); firewallFactory.resetSequenceNumber(); - return res(ctx.json(makeResourcePage(firewalls))); + return HttpResponse.json(makeResourcePage(firewalls)); }), - rest.delete('*/instances/*', async (req, res, ctx) => { - return res(ctx.json({})); + http.delete('*/instances/*', async () => { + return HttpResponse.json({}); }), - rest.get('*/instances/*/configs', async (req, res, ctx) => { + http.get('*/instances/*/configs', async () => { const configs = linodeConfigFactory.buildList(3); - return res(ctx.json(makeResourcePage(configs))); + return HttpResponse.json(makeResourcePage(configs)); }), - rest.get('*/instances/*/disks', async (req, res, ctx) => { + http.get('*/instances/*/disks', async () => { const disks = linodeDiskFactory.buildList(3); - return res(ctx.json(makeResourcePage(disks))); + return HttpResponse.json(makeResourcePage(disks)); }), - rest.put('*/instances/*/disks/:id', async (req, res, ctx) => { - const id = Number(req.params.id); + http.put('*/instances/*/disks/:id', async ({ params }) => { + const id = Number(params.id); const disk = linodeDiskFactory.build({ id }); // If you want to mock an error - // return res(ctx.status(400), ctx.json({ errors: [{ field: 'label', reason: 'OMG!' }] })); - return res(ctx.json(disk)); + // return HttpResponse.json({ errors: [{ field: 'label', reason: 'OMG!' }] })); + return HttpResponse.json(disk); }), - rest.get('*/instances/*/transfer', async (req, res, ctx) => { + http.get('*/instances/*/transfer', async () => { const transfer = linodeTransferFactory.build(); - return res(ctx.json(transfer)); + return HttpResponse.json(transfer); }), - rest.get('*/instances/*/stats*', async (req, res, ctx) => { + http.get('*/instances/*/stats*', async () => { const stats = linodeStatsFactory.build(); - return res(ctx.json(stats)); + return HttpResponse.json(stats); }), - rest.get('*/instances/*/stats', async (req, res, ctx) => { + http.get('*/instances/*/stats', async () => { const stats = linodeStatsFactory.build(); - return res(ctx.json(stats)); + return HttpResponse.json(stats); }), - rest.get('*/instances/*/ips', async (req, res, ctx) => { + http.get('*/instances/*/ips', async () => { const ips = linodeIPFactory.build(); - return res(ctx.json(ips)); + return HttpResponse.json(ips); }), - rest.post('*/linode/instances', async (req, res, ctx) => { - const payload = req.body as any; + http.post('*/linode/instances', async ({ request }) => { + const body = await request.json(); + const payload = body as any; const linode = linodeFactory.build({ image: payload?.image ?? 'linode/debian-10', label: payload?.label ?? 'new-linode', region: payload?.region ?? 'us-east', type: payload?.type ?? 'g6-standard-1', }); - return res(ctx.json(linode)); - // return res( - // ctx.status(400), - // ctx.json({ errors: [{ reason: 'Invalid label', field: 'data.label' }] }) - // ); + return HttpResponse.json(linode); + // return HttpResponse.json({ errors: [{ reason: 'Invalid label', field: 'data.label' }] })); }), - rest.get('*/lke/clusters', async (req, res, ctx) => { + + http.get('*/lke/clusters', async () => { const clusters = kubernetesAPIResponse.buildList(10); - return res(ctx.json(makeResourcePage(clusters))); + return HttpResponse.json(makeResourcePage(clusters)); }), - rest.get('*/lke/versions', async (req, res, ctx) => { + http.get('*/lke/versions', async () => { const versions = kubernetesVersionFactory.buildList(1); - return res(ctx.json(makeResourcePage(versions))); + return HttpResponse.json(makeResourcePage(versions)); }), - rest.get('*/lke/clusters/:clusterId', async (req, res, ctx) => { - const id = Number(req.params.clusterId); + http.get('*/lke/clusters/:clusterId', async ({ params }) => { + const id = Number(params.clusterId); const cluster = kubernetesAPIResponse.build({ id, k8s_version: '1.16' }); - return res(ctx.json(cluster)); + return HttpResponse.json(cluster); }), - rest.put('*/lke/clusters/:clusterId', async (req, res, ctx) => { - const id = Number(req.params.clusterId); - const k8s_version = req.params.k8s_version as string; + http.put('*/lke/clusters/:clusterId', async ({ params }) => { + const id = Number(params.clusterId); + const k8s_version = params.k8s_version as string; const cluster = kubernetesAPIResponse.build({ id, k8s_version, }); - return res(ctx.json(cluster)); + return HttpResponse.json(cluster); }), - rest.get('*/lke/clusters/:clusterId/pools', async (req, res, ctx) => { + http.get('*/lke/clusters/:clusterId/pools', async () => { const pools = nodePoolFactory.buildList(10); nodePoolFactory.resetSequenceNumber(); - return res(ctx.json(makeResourcePage(pools))); + return HttpResponse.json(makeResourcePage(pools)); }), - rest.get('*/lke/clusters/*/api-endpoints', async (req, res, ctx) => { + http.get('*/lke/clusters/*/api-endpoints', async () => { const endpoints = kubeEndpointFactory.buildList(2); - return res(ctx.json(makeResourcePage(endpoints))); + return HttpResponse.json(makeResourcePage(endpoints)); }), - rest.get('*/lke/clusters/*/recycle', async (req, res, ctx) => { - return res(ctx.json({})); + http.get('*/lke/clusters/*/recycle', async () => { + return HttpResponse.json({}); }), - rest.get('*/v4beta/networking/firewalls', (req, res, ctx) => { + http.get('*/v4beta/networking/firewalls', () => { const firewalls = firewallFactory.buildList(10); firewallFactory.resetSequenceNumber(); - return res(ctx.json(makeResourcePage(firewalls))); + return HttpResponse.json(makeResourcePage(firewalls)); }), - rest.get('*/v4beta/networking/firewalls/*/devices', (req, res, ctx) => { + http.get('*/v4beta/networking/firewalls/*/devices', () => { const devices = firewallDeviceFactory.buildList(10); - return res(ctx.json(makeResourcePage(devices))); + return HttpResponse.json(makeResourcePage(devices)); }), - rest.get('*/v4beta/networking/firewalls/:firewallId', (req, res, ctx) => { + http.get('*/v4beta/networking/firewalls/:firewallId', () => { const firewall = firewallFactory.build(); - return res(ctx.json(firewall)); + return HttpResponse.json(firewall); }), - rest.put('*/v4beta/networking/firewalls/:firewallId', (req, res, ctx) => { + http.put('*/v4beta/networking/firewalls/:firewallId', async ({ request }) => { + const body = await request.json(); const firewall = firewallFactory.build({ - status: req.body?.['status'] ?? 'disabled', + status: body?.['status'] ?? 'disabled', }); - return res(ctx.json(firewall)); + return HttpResponse.json(firewall); }), - // rest.post('*/account/agreements', (req, res, ctx) => { + // http.post('*/account/agreements', () => { // return res(ctx.status(500), ctx.json({ reason: 'Unknown error' })); // }), - rest.post('*/v4beta/networking/firewalls', (req, res, ctx) => { - const payload = req.body as any; + http.post('*/v4beta/networking/firewalls', async ({ request }) => { + const body = await request.json(); + const payload = body as any; const newFirewall = firewallFactory.build({ label: payload.label ?? 'mock-firewall', }); - return res(ctx.json(newFirewall)); + return HttpResponse.json(newFirewall); }), - rest.get('*/v4/nodebalancers', (req, res, ctx) => { + http.get('*/v4/nodebalancers', () => { const nodeBalancers = nodeBalancerFactory.buildList(1); - return res(ctx.json(makeResourcePage(nodeBalancers))); + return HttpResponse.json(makeResourcePage(nodeBalancers)); }), - rest.get('*/v4/nodebalancers/:nodeBalancerID', (req, res, ctx) => { + http.get('*/v4/nodebalancers/:nodeBalancerID', ({ params }) => { const nodeBalancer = nodeBalancerFactory.build({ - id: Number(req.params.nodeBalancerID), + id: Number(params.nodeBalancerID), }); - return res(ctx.json(nodeBalancer)); + return HttpResponse.json(nodeBalancer); }), - rest.get('*/nodebalancers/:nodeBalancerID/configs', (req, res, ctx) => { + http.get('*/nodebalancers/:nodeBalancerID/configs', ({ params }) => { const configs = nodeBalancerConfigFactory.buildList(2, { - nodebalancer_id: Number(req.params.nodeBalancerID), - }); - return res(ctx.json(makeResourcePage(configs))); - }), - rest.get( - '*/nodebalancers/:nodeBalancerID/configs/:configID/nodes', - (req, res, ctx) => { - const configs = [ - nodeBalancerConfigNodeFactory.build({ status: 'UP' }), - nodeBalancerConfigNodeFactory.build({ status: 'DOWN' }), - nodeBalancerConfigNodeFactory.build({ status: 'unknown' }), - ]; - return res(ctx.json(makeResourcePage(configs))); - } - ), - rest.get('*object-storage/buckets/*/*/access', async (req, res, ctx) => { + nodebalancer_id: Number(params.nodeBalancerID), + }); + return HttpResponse.json(makeResourcePage(configs)); + }), + http.get('*/nodebalancers/:nodeBalancerID/configs/:configID/nodes', () => { + const configs = [ + nodeBalancerConfigNodeFactory.build({ status: 'UP' }), + nodeBalancerConfigNodeFactory.build({ status: 'DOWN' }), + nodeBalancerConfigNodeFactory.build({ status: 'unknown' }), + ]; + return HttpResponse.json(makeResourcePage(configs)); + }), + http.get('*object-storage/buckets/*/*/access', async () => { await sleep(2000); - return res( - ctx.json({ - acl: 'private', - acl_xml: - '2a2ce653-20dd-43f1-b803-e8a924ee63742a2ce653-20dd-43f1-b803-e8a924ee63742a2ce653-20dd-43f1-b803-e8a924ee63742a2ce653-20dd-43f1-b803-e8a924ee6374FULL_CONTROL', - cors_enabled: true, - cors_xml: - 'GETPUTDELETEHEADPOST**', - }) - ); + return HttpResponse.json({ + acl: 'private', + acl_xml: + '2a2ce653-20dd-43f1-b803-e8a924ee63742a2ce653-20dd-43f1-b803-e8a924ee63742a2ce653-20dd-43f1-b803-e8a924ee63742a2ce653-20dd-43f1-b803-e8a924ee6374FULL_CONTROL', + cors_enabled: true, + cors_xml: + 'GETPUTDELETEHEADPOST**', + }); }), - rest.put('*object-storage/buckets/*/*/access', async (req, res, ctx) => { + + http.put('*object-storage/buckets/*/*/access', async () => { await sleep(2000); - return res(ctx.json({})); + return HttpResponse.json({}); }), - rest.get('*object-storage/buckets/*/*/ssl', async (req, res, ctx) => { + http.get('*object-storage/buckets/*/*/ssl', async () => { await sleep(2000); - return res(ctx.json({ ssl: false })); + return HttpResponse.json({ ssl: false }); }), - rest.post('*object-storage/buckets/*/*/ssl', async (req, res, ctx) => { + http.post('*object-storage/buckets/*/*/ssl', async () => { await sleep(2000); - return res(ctx.json({ ssl: true })); + return HttpResponse.json({ ssl: true }); }), - rest.delete('*object-storage/buckets/*/*/ssl', async (req, res, ctx) => { + http.delete('*object-storage/buckets/*/*/ssl', async () => { await sleep(2000); - return res(ctx.json({})); + return HttpResponse.json({}); }), - rest.delete('*object-storage/buckets/*/*', async (req, res, ctx) => { + http.delete('*object-storage/buckets/*/*', async () => { await sleep(2000); - return res(ctx.json({})); + return HttpResponse.json({}); }), - rest.get('*/object-storage/buckets/*/*/object-list', (req, res, ctx) => { - const pageSize = Number(req.url.searchParams.get('page_size') || 100); - const marker = req.url.searchParams.get('marker'); + http.get('*/object-storage/buckets/*/*/object-list', ({ request }) => { + const url = new URL(request.url); + const pageSize = Number(url.searchParams.get('page_size') || 100); + const marker = url.searchParams.get('marker'); if (!marker) { const end = @@ -958,13 +951,11 @@ export const handlers = [ const is_truncated = staticObjects.length > pageSize; const page = staticObjects.slice(0, end); - return res( - ctx.json( - makeObjectsPage(page, { - is_truncated, - next_marker: is_truncated ? staticObjects[pageSize].name : null, - }) - ) + return HttpResponse.json( + makeObjectsPage(page, { + is_truncated, + next_marker: is_truncated ? staticObjects[pageSize].name : null, + }) ); } const index = staticObjects.findIndex((object) => object.name == marker); @@ -980,24 +971,21 @@ export const handlers = [ page[page.length - 1].name != staticObjects[staticObjects.length - 1].name; - return res( - ctx.json( - makeObjectsPage(page, { - is_truncated, - next_marker: is_truncated ? staticObjects[end].name : null, - }) - ) + return HttpResponse.json( + makeObjectsPage(page, { + is_truncated, + next_marker: is_truncated ? staticObjects[end].name : null, + }) ); }), - rest.get('*/object-storage/buckets/:region', (req, res, ctx) => { - // Temporarily added pagination logic to make sure my use of - // getAll worked for fetching all buckets. + http.get('*/object-storage/buckets/:region', ({ params, request }) => { + const url = new URL(request.url); - const region = req.params.region as string; + const region = params.region as string; objectStorageBucketFactory.resetSequenceNumber(); - const page = Number(req.url.searchParams.get('page') || 1); - const pageSize = Number(req.url.searchParams.get('page_size') || 25); + const page = Number(url.searchParams.get('page') || 1); + const pageSize = Number(url.searchParams.get('page_size') || 25); const buckets = objectStorageBucketFactory.buildList(1, { cluster: `${region}-1`, @@ -1006,26 +994,24 @@ export const handlers = [ region, }); - return res( - ctx.json({ - data: buckets.slice( - (page - 1) * pageSize, - (page - 1) * pageSize + pageSize - ), - page, - pages: Math.ceil(buckets.length / pageSize), - results: buckets.length, - }) - ); + return HttpResponse.json({ + data: buckets.slice( + (page - 1) * pageSize, + (page - 1) * pageSize + pageSize + ), + page, + pages: Math.ceil(buckets.length / pageSize), + results: buckets.length, + }); }), - rest.get('*/object-storage/buckets', (req, res, ctx) => { + http.get('*/object-storage/buckets', () => { const buckets = objectStorageBucketFactory.buildList(10); - return res(ctx.json(makeResourcePage(buckets))); + return HttpResponse.json(makeResourcePage(buckets)); }), - rest.post('*/object-storage/buckets', (req, res, ctx) => { - return res(ctx.json(objectStorageBucketFactory.build())); + http.post('*/object-storage/buckets', () => { + return HttpResponse.json(objectStorageBucketFactory.build()); }), - rest.get('*object-storage/clusters', (req, res, ctx) => { + http.get('*object-storage/clusters', () => { const jakartaCluster = objectStorageClusterFactory.build({ id: `id-cgk-0` as any, region: 'id-cgk', @@ -1039,124 +1025,123 @@ export const handlers = [ region: 'us-east', }); const clusters = objectStorageClusterFactory.buildList(3); - return res( - ctx.json( - makeResourcePage([ - jakartaCluster, - saoPauloCluster, - basePricingCluster, - ...clusters, - ]) - ) + return HttpResponse.json( + makeResourcePage([ + jakartaCluster, + saoPauloCluster, + basePricingCluster, + ...clusters, + ]) ); }), - rest.get('*object-storage/keys', (req, res, ctx) => { - return res( - ctx.json( - makeResourcePage([ - ...objectStorageKeyFactory.buildList(1), - ...objectStorageKeyFactory.buildList(1, { - regions: [ - { id: 'us-east', s3_endpoint: 'us-east.com' }, - { id: 'nl-ams', s3_endpoint: 'nl-ams.com' }, - { id: 'us-southeast', s3_endpoint: 'us-southeast.com' }, - { id: 'in-maa', s3_endpoint: 'in-maa.com' }, - { id: 'us-lax', s3_endpoint: 'us-lax.com' }, - { id: 'us-mia', s3_endpoint: 'us-mia.com' }, - { id: 'it-mil', s3_endpoint: 'it-mil.com' }, - ], - }), - ...objectStorageKeyFactory.buildList(1, { - regions: [ - { id: 'us-east', s3_endpoint: 'us-east.com' }, - { id: 'nl-ams', s3_endpoint: 'nl-ams.com' }, - { id: 'us-southeast', s3_endpoint: 'us-southeast.com' }, - { id: 'in-maa', s3_endpoint: 'in-maa.com' }, - { id: 'us-lax', s3_endpoint: 'us-lax.com' }, - ], - }), - ...objectStorageKeyFactory.buildList(1, { - bucket_access: [ - { - bucket_name: 'test007', - cluster: 'us-east-1', - permissions: 'read_only', - region: 'us-east', - }, - { - bucket_name: 'test001', - cluster: 'nl-ams-1', - permissions: 'read_write', - region: 'nl-ams', - }, - ], - limited: true, - regions: [ - { id: 'us-east', s3_endpoint: 'us-east.com' }, - { id: 'nl-ams', s3_endpoint: 'nl-ams.com' }, - ], - }), - ]) - ) + + http.get('*object-storage/keys', () => { + return HttpResponse.json( + makeResourcePage([ + ...objectStorageKeyFactory.buildList(1), + ...objectStorageKeyFactory.buildList(1, { + regions: [ + { id: 'us-east', s3_endpoint: 'us-east.com' }, + { id: 'nl-ams', s3_endpoint: 'nl-ams.com' }, + { id: 'us-southeast', s3_endpoint: 'us-southeast.com' }, + { id: 'in-maa', s3_endpoint: 'in-maa.com' }, + { id: 'us-lax', s3_endpoint: 'us-lax.com' }, + { id: 'us-mia', s3_endpoint: 'us-mia.com' }, + { id: 'it-mil', s3_endpoint: 'it-mil.com' }, + ], + }), + ...objectStorageKeyFactory.buildList(1, { + regions: [ + { id: 'us-east', s3_endpoint: 'us-east.com' }, + { id: 'nl-ams', s3_endpoint: 'nl-ams.com' }, + { id: 'us-southeast', s3_endpoint: 'us-southeast.com' }, + { id: 'in-maa', s3_endpoint: 'in-maa.com' }, + { id: 'us-lax', s3_endpoint: 'us-lax.com' }, + ], + }), + ...objectStorageKeyFactory.buildList(1, { + bucket_access: [ + { + bucket_name: 'test007', + cluster: 'us-east-1', + permissions: 'read_only', + region: 'us-east', + }, + { + bucket_name: 'test001', + cluster: 'nl-ams-1', + permissions: 'read_write', + region: 'nl-ams', + }, + ], + limited: true, + regions: [ + { id: 'us-east', s3_endpoint: 'us-east.com' }, + { id: 'nl-ams', s3_endpoint: 'nl-ams.com' }, + ], + }), + ]) ); }), - rest.post('*object-storage/keys', (req, res, ctx) => { - const { label, regions } = req.body as ObjectStorageKeyRequest; + http.post( + '*object-storage/keys', + async ({ request }) => { + const body = await request.json(); + const { label, regions } = body; - const regionsData = regions?.map((region: string) => ({ - id: region, - s3_endpoint: `${region}.com`, - })); + const regionsData = regions?.map((region: string) => ({ + id: region, + s3_endpoint: `${region}.com`, + })); - return res( - ctx.json( + return HttpResponse.json( objectStorageKeyFactory.build({ label, regions: regionsData, }) - ) - ); - }), - rest.put('*object-storage/keys/:id', (req, res, ctx) => { - const { label, regions } = req.body as ObjectStorageKeyRequest; - - const regionsData = regions?.map((region: string) => ({ - id: region, - s3_endpoint: `${region}.com`, - })); - - return res( - ctx.json( + ); + } + ), + http.put( + '*object-storage/keys/:id', + async ({ request }) => { + const body = await request.json(); + const { label, regions } = body; + + const regionsData = regions?.map((region: string) => ({ + id: region, + s3_endpoint: `${region}.com`, + })); + + return HttpResponse.json( objectStorageKeyFactory.build({ label, regions: regionsData, }) - ) - ); - }), - rest.delete('*object-storage/keys/:id', (req, res, ctx) => { - return res(ctx.json({})); + ); + } + ), + http.delete('*object-storage/keys/:id', () => { + return HttpResponse.json({}); }), - rest.get('*/domains', (req, res, ctx) => { + http.get('*/domains', () => { const domains = domainFactory.buildList(10); - return res(ctx.json(makeResourcePage(domains))); + return HttpResponse.json(makeResourcePage(domains)); }), - rest.post('*/domains/*/records', (req, res, ctx) => { + http.post('*/domains/*/records', () => { const record = domainRecordFactory.build(); - return res(ctx.json(record)); + return HttpResponse.json(record); }), - rest.post('*/volumes/migrate', (req, res, ctx) => { - return res(ctx.json({})); + http.post('*/volumes/migrate', () => { + return HttpResponse.json({}); }), - rest.get('*/regions/*/migration-queue', (req, res, ctx) => { - return res( - ctx.json({ - linodes: 8, - volumes: 953, - }) - ); + http.get('*/regions/*/migration-queue', () => { + return HttpResponse.json({ + linodes: 8, + volumes: 953, + }); }), - rest.get('*/volumes', (req, res, ctx) => { + http.get('*/volumes', () => { const statuses: VolumeStatus[] = [ 'active', 'creating', @@ -1165,67 +1150,65 @@ export const handlers = [ 'resizing', ]; const volumes = statuses.map((status) => volumeFactory.build({ status })); - return res(ctx.json(makeResourcePage(volumes))); + return HttpResponse.json(makeResourcePage(volumes)); }), - rest.post('*/volumes', (req, res, ctx) => { + http.post('*/volumes', () => { const volume = volumeFactory.build(); - return res(ctx.json(volume)); + return HttpResponse.json(volume); }), - rest.get('*/vlans', (req, res, ctx) => { + http.get('*/vlans', () => { const vlans = VLANFactory.buildList(2); - return res(ctx.json(makeResourcePage(vlans))); + return HttpResponse.json(makeResourcePage(vlans)); }), - rest.get('*/profile/preferences', (req, res, ctx) => { - return res( - ctx.json({ - theme: getStorage(MOCK_THEME_STORAGE_KEY) ?? 'system', - }) - ); + http.get('*/profile/preferences', () => { + return HttpResponse.json({ + theme: getStorage(MOCK_THEME_STORAGE_KEY) ?? 'system', + }); }), - rest.get('*/profile/devices', (req, res, ctx) => { - return res(ctx.json(makeResourcePage([]))); + http.get('*/profile/devices', () => { + return HttpResponse.json(makeResourcePage([])); }), - rest.put('*/profile/preferences', (req, res, ctx) => { - const body = req.body as any; - return res(ctx.json({ ...body })); + http.put('*/profile/preferences', async ({ request }) => { + const reqBody = await request.json(); + const body = reqBody as any; + return HttpResponse.json({ ...body }); }), - rest.get('*/kubeconfig', (req, res, ctx) => { - return res(ctx.json({ kubeconfig: 'SSBhbSBhIHRlYXBvdA==' })); + http.get('*/kubeconfig', () => { + return HttpResponse.json({ kubeconfig: 'SSBhbSBhIHRlYXBvdA==' }); }), - rest.get('*invoices/555/items', (req, res, ctx) => { - return res( - ctx.json( - makeResourcePage([ - invoiceItemFactory.build({ - label: 'Linode', - region: 'br-gru', - }), - invoiceItemFactory.build({ - label: 'Outbound Transfer Overage', - region: null, - }), - invoiceItemFactory.build({ - label: 'Outbound Transfer Overage', - region: 'id-cgk', - }), - ]) - ) + http.get('*invoices/555/items', () => { + return HttpResponse.json( + makeResourcePage([ + invoiceItemFactory.build({ + label: 'Linode', + region: 'br-gru', + }), + invoiceItemFactory.build({ + label: 'Outbound Transfer Overage', + region: null, + }), + invoiceItemFactory.build({ + label: 'Outbound Transfer Overage', + region: 'id-cgk', + }), + ]) ); }), - rest.get('*invoices/:invoiceId/items', (req, res, ctx) => { + + http.get('*invoices/:invoiceId/items', () => { const items = invoiceItemFactory.buildList(10); - return res(ctx.json(makeResourcePage(items, { page: 1, pages: 4 }))); + return HttpResponse.json(makeResourcePage(items, { page: 1, pages: 4 })); }), - rest.get('*/account', (req, res, ctx) => { + http.get('*/account', () => { const account = accountFactory.build({ active_promotions: promoFactory.buildList(1), active_since: '2022-11-30', balance: 50, company: 'Mock Company', }); - return res(ctx.json(account)); + return HttpResponse.json(account); }), - rest.get('*/account/availability', (req, res, ctx) => { + http.get('*/account/availability', () => { const newarkStorage = accountAvailabilityFactory.build({ region: 'us-east-0', unavailable: ['Object Storage'], @@ -1242,28 +1225,31 @@ export const handlers = [ region: 'ap-northeast', unavailable: ['Linodes', 'Block Storage', 'Kubernetes', 'NodeBalancers'], }); - return res( - ctx.json(makeResourcePage([atlanta, newarkStorage, singapore, tokyo])) + return HttpResponse.json( + makeResourcePage([atlanta, newarkStorage, singapore, tokyo]) ); }), - rest.get('*/account/availability/:regionId', (req, res, ctx) => { - return res(ctx.json(accountAvailabilityFactory.build())); + http.get('*/account/availability/:regionId', () => { + return HttpResponse.json(accountAvailabilityFactory.build()); }), - rest.put('*/account', (req, res, ctx) => { - return res(ctx.json({ ...accountFactory.build(), ...(req.body as any) })); + http.put('*/account', async ({ request }) => { + const body = await request.json(); + return HttpResponse.json({ ...accountFactory.build(), ...(body as any) }); }), - rest.get('*/account/transfer', (req, res, ctx) => { + http.get('*/account/transfer', () => { const transfer = accountTransferFactory.build(); - return res(ctx.delay(5000), ctx.json(transfer)); + return HttpResponse.json(transfer); }), - rest.get('*/account/payments', (req, res, ctx) => { + http.get('*/account/payments', () => { const paymentWithLargeId = paymentFactory.build({ id: 123_456_789_123_456, }); const payments = paymentFactory.buildList(5); - return res(ctx.json(makeResourcePage([paymentWithLargeId, ...payments]))); + return HttpResponse.json( + makeResourcePage([paymentWithLargeId, ...payments]) + ); }), - rest.get('*/account/invoices', (req, res, ctx) => { + http.get('*/account/invoices', () => { const linodeInvoice = invoiceFactory.build({ date: '2022-12-01T18:04:01', label: 'LinodeInvoice', @@ -1276,25 +1262,25 @@ export const handlers = [ id: 123_456_789_123_456, label: 'Invoice with Large ID', }); - return res( - ctx.json( - makeResourcePage([linodeInvoice, akamaiInvoice, invoiceWithLargerId]) - ) + return HttpResponse.json( + makeResourcePage([linodeInvoice, akamaiInvoice, invoiceWithLargerId]) ); }), - rest.get('*/account/invoices/:invoiceId', (req, res, ctx) => { + http.get('*/account/invoices/:invoiceId', () => { const linodeInvoice = invoiceFactory.build({ date: '2022-12-01T18:04:01', id: 1234, label: 'LinodeInvoice', }); - return res(ctx.json(linodeInvoice)); + return HttpResponse.json(linodeInvoice); }), - rest.get('*/account/maintenance', (req, res, ctx) => { + http.get('*/account/maintenance', ({ request }) => { + const url = new URL(request.url); + accountMaintenanceFactory.resetSequenceNumber(); - const page = Number(req.url.searchParams.get('page') || 1); - const pageSize = Number(req.url.searchParams.get('page_size') || 25); - const headers = JSON.parse(req.headers.get('x-filter') || '{}'); + const page = Number(url.searchParams.get('page') || 1); + const pageSize = Number(url.searchParams.get('page_size') || 25); + const headers = JSON.parse(request.headers.get('x-filter') || '{}'); const accountMaintenance = headers.status === 'completed' @@ -1304,7 +1290,7 @@ export const handlers = [ ...accountMaintenanceFactory.buildList(3, { status: 'started' }), ]; - if (req.headers.get('x-filter')) { + if (request.headers.get('x-filter')) { accountMaintenance.sort((a, b) => { const statusA = a[headers['+order_by']]; const statusB = b[headers['+order_by']]; @@ -1321,42 +1307,40 @@ export const handlers = [ if (headers['+order'] == 'desc') { accountMaintenance.reverse(); } - return res( - ctx.json({ - data: accountMaintenance.slice( - (page - 1) * pageSize, - (page - 1) * pageSize + pageSize - ), - page, - pages: Math.ceil(accountMaintenance.length / pageSize), - results: accountMaintenance.length, - }) - ); - } - - return res(ctx.json(makeResourcePage(accountMaintenance))); - }), - rest.get('*/account/child-accounts', (req, res, ctx) => { - const page = Number(req.url.searchParams.get('page') || 1); - const pageSize = Number(req.url.searchParams.get('page_size') || 25); - const childAccounts = accountFactory.buildList(100); - return res( - ctx.json({ - data: childAccounts.slice( + return HttpResponse.json({ + data: accountMaintenance.slice( (page - 1) * pageSize, (page - 1) * pageSize + pageSize ), page, - pages: Math.ceil(childAccounts.length / pageSize), - results: childAccounts.length, - }) - ); + pages: Math.ceil(accountMaintenance.length / pageSize), + results: accountMaintenance.length, + }); + } + + return HttpResponse.json(makeResourcePage(accountMaintenance)); + }), + + http.get('*/account/child-accounts', ({ request }) => { + const url = new URL(request.url); + const page = Number(url.searchParams.get('page') || 1); + const pageSize = Number(url.searchParams.get('page_size') || 25); + const childAccounts = accountFactory.buildList(100); + return HttpResponse.json({ + data: childAccounts.slice( + (page - 1) * pageSize, + (page - 1) * pageSize + pageSize + ), + page, + pages: Math.ceil(childAccounts.length / pageSize), + results: childAccounts.length, + }); }), - rest.get('*/account/child-accounts/:euuid', (req, res, ctx) => { + http.get('*/account/child-accounts/:euuid', () => { const childAccount = accountFactory.buildList(1); - return res(ctx.json(childAccount)); + return HttpResponse.json(childAccount); }), - rest.post('*/account/child-accounts/:euuid/token', (req, res, ctx) => { + http.post('*/account/child-accounts/:euuid/token', () => { // Proxy tokens expire in 15 minutes. const now = new Date(); const expiry = new Date(now.setMinutes(now.getMinutes() + 15)); @@ -1365,12 +1349,13 @@ export const handlers = [ expiry: expiry.toISOString(), token: `Bearer ${import.meta.env.REACT_APP_PROXY_PAT}`, }); - return res(ctx.json(proxyToken)); + return HttpResponse.json(proxyToken); }), - rest.get('*/account/users', (req, res, ctx) => { - const page = Number(req.url.searchParams.get('page') || 1); - const pageSize = Number(req.url.searchParams.get('page_size') || 25); - const headers = JSON.parse(req.headers.get('x-filter') || '{}'); + http.get('*/account/users', ({ request }) => { + const url = new URL(request.url); + const page = Number(url.searchParams.get('page') || 1); + const pageSize = Number(url.searchParams.get('page_size') || 25); + const headers = JSON.parse(request.headers.get('x-filter') || '{}'); const accountUsers = [ accountUserFactory.build({ @@ -1390,7 +1375,7 @@ export const handlers = [ parentAccountNonAdminUser, ]; - if (req.headers.get('x-filter')) { + if (request.headers.get('x-filter')) { let filteredAccountUsers = accountUsers; if (headers['user_type']) { @@ -1421,111 +1406,90 @@ export const handlers = [ if (headers['+order'] == 'desc') { filteredAccountUsers.reverse(); } - return res( - ctx.json({ - data: filteredAccountUsers.slice( - (page - 1) * pageSize, - (page - 1) * pageSize + pageSize - ), - page, - pages: Math.ceil(filteredAccountUsers.length / pageSize), - results: filteredAccountUsers.length, - }) - ); + return HttpResponse.json({ + data: filteredAccountUsers.slice( + (page - 1) * pageSize, + (page - 1) * pageSize + pageSize + ), + page, + pages: Math.ceil(filteredAccountUsers.length / pageSize), + results: filteredAccountUsers.length, + }); } // Return default response if 'x-filter' header is not present - return res(ctx.json(makeResourcePage(accountUsers))); + return HttpResponse.json(makeResourcePage(accountUsers)); }), - rest.get(`*/account/users/${childAccountUser.username}`, (req, res, ctx) => { - return res(ctx.json(childAccountUser)); + + http.get(`*/account/users/${childAccountUser.username}`, () => { + return HttpResponse.json(childAccountUser); }), - rest.get(`*/account/users/${proxyAccountUser.username}`, (req, res, ctx) => { - return res(ctx.json(proxyAccountUser)); + http.get(`*/account/users/${proxyAccountUser.username}`, () => { + return HttpResponse.json(proxyAccountUser); }), - rest.get(`*/account/users/${parentAccountUser.username}`, (req, res, ctx) => { - return res(ctx.json(parentAccountUser)); + http.get(`*/account/users/${parentAccountUser.username}`, () => { + return HttpResponse.json(parentAccountUser); }), - rest.get( - `*/account/users/${parentAccountNonAdminUser.username}`, - (req, res, ctx) => { - return res(ctx.json(parentAccountNonAdminUser)); - } - ), - rest.get('*/account/users/:user', (req, res, ctx) => { - // Parent/Child: switch the `user_type` depending on what account view you need to mock. - return res(ctx.json(accountUserFactory.build({ user_type: 'parent' }))); + http.get(`*/account/users/${parentAccountNonAdminUser.username}`, () => { + return HttpResponse.json(parentAccountNonAdminUser); }), - rest.put( + http.get('*/account/users/:user', () => { + return HttpResponse.json(accountUserFactory.build({ user_type: 'parent' })); + }), + http.put>( `*/account/users/${parentAccountNonAdminUser.username}`, - (req, res, ctx) => { - const { restricted } = req.body as Partial; + async ({ request }) => { + const body = await request.json(); + const { restricted } = body; if (restricted !== undefined) { parentAccountNonAdminUser.restricted = restricted; } - return res(ctx.json(parentAccountNonAdminUser)); - } - ), - rest.get( - `*/account/users/${childAccountUser.username}/grants`, - (req, res, ctx) => { - return res( - ctx.json( - grantsFactory.build({ - global: { - // The API returns 'read_write' for child account users' account access, - // On the frontend, we display 'read_only' and restrict child users from billing actions. - account_access: 'read_write', - cancel_account: false, - }, - }) - ) - ); + return HttpResponse.json(parentAccountNonAdminUser); } ), - rest.get( - `*/account/users/${proxyAccountUser.username}/grants`, - (req, res, ctx) => { - return res( - ctx.json( - grantsFactory.build({ - global: { - account_access: 'read_write', // This is immutable for proxy users - add_domains: false, - add_firewalls: false, - add_images: false, - add_linodes: false, - add_longview: false, - add_nodebalancers: false, - add_stackscripts: false, - add_volumes: false, - add_vpcs: false, - cancel_account: false, - longview_subscription: false, - }, - }) - ) - ); - } - ), - rest.get( - `*/account/users/${parentAccountUser.username}/grants`, - (req, res, ctx) => { - return res( - ctx.json( - grantsFactory.build({ - global: { - cancel_account: false, - child_account_access: true, - }, - }) - ) - ); - } - ), - rest.get( + http.get(`*/account/users/${childAccountUser.username}/grants`, () => { + return HttpResponse.json( + grantsFactory.build({ + global: { + account_access: 'read_write', + cancel_account: false, + }, + }) + ); + }), + http.get(`*/account/users/${proxyAccountUser.username}/grants`, () => { + return HttpResponse.json( + grantsFactory.build({ + global: { + account_access: 'read_write', + add_domains: false, + add_firewalls: false, + add_images: false, + add_linodes: false, + add_longview: false, + add_nodebalancers: false, + add_stackscripts: false, + add_volumes: false, + add_vpcs: false, + cancel_account: false, + longview_subscription: false, + }, + }) + ); + }), + http.get(`*/account/users/${parentAccountUser.username}/grants`, () => { + return HttpResponse.json( + grantsFactory.build({ + global: { + cancel_account: false, + child_account_access: true, + }, + }) + ); + }), + http.get( `*/account/users/${parentAccountNonAdminUser.username}/grants`, - (req, res, ctx) => { + () => { const grantsResponse = grantsFactory.build({ global: parentAccountNonAdminUser.restricted ? { @@ -1534,45 +1498,41 @@ export const handlers = [ } : undefined, }); - return res(ctx.json(grantsResponse)); + return HttpResponse.json(grantsResponse); } ), - rest.get('*/account/users/:user/grants', (req, res, ctx) => { - return res( - ctx.json( - grantsFactory.build({ - domain: [], - firewall: [], - global: { - cancel_account: true, - }, - image: [], - linode: grantFactory.buildList(6000), - longview: [], - nodebalancer: [], - stackscript: grantFactory.buildList(30), - volume: grantFactory.buildList(100), - }) - ) + http.get('*/account/users/:user/grants', () => { + return HttpResponse.json( + grantsFactory.build({ + domain: [], + firewall: [], + global: { + cancel_account: true, + }, + image: [], + linode: grantFactory.buildList(6000), + longview: [], + nodebalancer: [], + stackscript: grantFactory.buildList(30), + volume: grantFactory.buildList(100), + }) ); }), - rest.get('*/account/logins', (req, res, ctx) => { + http.get('*/account/logins', () => { const failedRestrictedAccountLogin = accountLoginFactory.build({ restricted: true, status: 'failed', }); const successfulAccountLogins = accountLoginFactory.buildList(25); - return res( - ctx.json( - makeResourcePage([ - failedRestrictedAccountLogin, - ...successfulAccountLogins, - ]) - ) + return HttpResponse.json( + makeResourcePage([ + failedRestrictedAccountLogin, + ...successfulAccountLogins, + ]) ); }), - rest.get('*/account/payment-methods', (req, res, ctx) => { + http.get('*/account/payment-methods', () => { const defaultPaymentMethod = paymentMethodFactory.build({ data: { card_type: 'MasterCard' }, is_default: true, @@ -1592,69 +1552,69 @@ export const handlers = [ const otherPaymentMethod = paymentMethodFactory.build(); - return res( - ctx.json( - makeResourcePage([ - defaultPaymentMethod, - otherPaymentMethod, - googlePayPaymentMethod, - paypalPaymentMethod, - ]) - ) + return HttpResponse.json( + makeResourcePage([ + defaultPaymentMethod, + otherPaymentMethod, + googlePayPaymentMethod, + paypalPaymentMethod, + ]) ); }), - rest.get('*/events', (req, res, ctx) => { - const events = eventFactory.buildList(1, { - action: 'lke_node_create', - entity: { id: 999, label: 'linode-1', type: 'linode' }, - message: - 'Rebooting this thing and showing an extremely long event message for no discernible reason other than the fairly obvious reason that we want to do some testing of whether or not these messages wrap.', - percent_complete: 15, - }); - const dbEvents = eventFactory.buildList(1, { - action: 'database_low_disk_space', - entity: { id: 999, label: 'database-1', type: 'database' }, - message: 'Low disk space.', - }); - const oldEvents = eventFactory.buildList(20, { - action: 'account_update', - percent_complete: 100, - seen: true, - }); - const eventWithSpecialCharacters = eventFactory.build({ - action: 'ticket_update', - entity: { - id: 10, - label: 'Ticket name with special characters... (?)', - type: 'ticket', - }, - message: 'Ticket name with special characters... (?)', - percent_complete: 100, - status: 'notification', - }); - const placementGroupCreateEvent = eventFactory.buildList(1, { - action: 'placement_group_created', - entity: { id: 999, label: 'PG-1', type: 'placement_group' }, - message: 'Placement Group successfully created.', - percent_complete: 100, - status: 'notification', - }); - const placementGroupAssignedEvent = eventFactory.buildList(1, { - action: 'placement_group_assigned', - entity: { id: 990, label: 'PG-2', type: 'placement_group' }, - message: 'Placement Group successfully assigned.', - percent_complete: 100, - secondary_entity: { - id: 1, - label: 'My Config', - type: 'linode', - url: '/v4/linode/instances/1/configs/1', - }, - status: 'notification', - }); - return res.once( - ctx.json( + http.get( + '*/events', + () => { + const events = eventFactory.buildList(1, { + action: 'lke_node_create', + entity: { id: 999, label: 'linode-1', type: 'linode' }, + message: + 'Rebooting this thing and showing an extremely long event message for no discernible reason other than the fairly obvious reason that we want to do some testing of whether or not these messages wrap.', + percent_complete: 15, + }); + const dbEvents = eventFactory.buildList(1, { + action: 'database_low_disk_space', + entity: { id: 999, label: 'database-1', type: 'database' }, + message: 'Low disk space.', + }); + const oldEvents = eventFactory.buildList(20, { + action: 'account_update', + percent_complete: 100, + seen: true, + }); + const eventWithSpecialCharacters = eventFactory.build({ + action: 'ticket_update', + entity: { + id: 10, + label: 'Ticket name with special characters... (?)', + type: 'ticket', + }, + message: 'Ticket name with special characters... (?)', + percent_complete: 100, + status: 'notification', + }); + const placementGroupCreateEvent = eventFactory.buildList(1, { + action: 'placement_group_created', + entity: { id: 999, label: 'PG-1', type: 'placement_group' }, + message: 'Placement Group successfully created.', + percent_complete: 100, + status: 'notification', + }); + const placementGroupAssignedEvent = eventFactory.buildList(1, { + action: 'placement_group_assigned', + entity: { id: 990, label: 'PG-2', type: 'placement_group' }, + message: 'Placement Group successfully assigned.', + percent_complete: 100, + secondary_entity: { + id: 1, + label: 'My Config', + type: 'linode', + url: '/v4/linode/instances/1/configs/1', + }, + status: 'notification', + }); + + return HttpResponse.json( makeResourcePage([ ...events, ...dbEvents, @@ -1663,74 +1623,77 @@ export const handlers = [ ...placementGroupCreateEvent, eventWithSpecialCharacters, ]) - ) - ); - }), - rest.get('*/support/tickets', (req, res, ctx) => { + ); + }, + { + once: true, + } + ), + // // HERE + http.get('*/support/tickets', () => { const tickets = supportTicketFactory.buildList(15, { status: 'open' }); - return res(ctx.json(makeResourcePage(tickets))); + return HttpResponse.json(makeResourcePage(tickets)); }), - rest.get('*/support/tickets/999', (req, res, ctx) => { + http.get('*/support/tickets/999', () => { const ticket = supportTicketFactory.build({ closed: new Date().toISOString(), id: 999, }); - return res(ctx.json(ticket)); + return HttpResponse.json(ticket); }), - rest.get('*/support/tickets/:ticketId', (req, res, ctx) => { + http.get('*/support/tickets/:ticketId', ({ params }) => { const ticket = supportTicketFactory.build({ - id: Number(req.params.ticketId), + id: Number(params.ticketId), }); - return res(ctx.json(ticket)); + return HttpResponse.json(ticket); }), - rest.get('*/support/tickets/:ticketId/replies', (req, res, ctx) => { + http.get('*/support/tickets/:ticketId/replies', () => { const replies = supportReplyFactory.buildList(15); - return res(ctx.json(makeResourcePage(replies))); + return HttpResponse.json(makeResourcePage(replies)); }), - rest.put('*/longview/plan', (req, res, ctx) => { - return res(ctx.json({})); + http.put('*/longview/plan', () => { + return HttpResponse.json({}); }), - rest.get('*/longview/plan', (req, res, ctx) => { + http.get('*/longview/plan', () => { const plan = longviewActivePlanFactory.build(); - return res(ctx.json(plan)); + return HttpResponse.json(plan); }), - rest.get('*/longview/subscriptions', (req, res, ctx) => { + http.get('*/longview/subscriptions', () => { const subscriptions = longviewSubscriptionFactory.buildList(10); - return res(ctx.json(makeResourcePage(subscriptions))); + return HttpResponse.json(makeResourcePage(subscriptions)); }), - rest.get('*/longview/clients', (req, res, ctx) => { + http.get('*/longview/clients', () => { const clients = longviewClientFactory.buildList(10); - return res(ctx.json(makeResourcePage(clients))); - }), - rest.post('*/backups/enable/*', (req, res, ctx) => { - return res(ctx.json({})); - }), - rest.get('*/account/settings', (req, res, ctx) => { - return res( - ctx.json({ - backups_enabled: true, - longview_subscription: 'longview-100', - managed: true, - network_helper: true, - object_storage: 'active', - }) - ); + return HttpResponse.json(makeResourcePage(clients)); + }), + http.post('*/backups/enable/*', () => { + return HttpResponse.json({}); + }), + http.get('*/account/settings', () => { + return HttpResponse.json({ + backups_enabled: true, + longview_subscription: 'longview-100', + managed: true, + network_helper: true, + object_storage: 'active', + }); }), - rest.put('*/account/settings/*', (req, res, ctx) => { - return res(ctx.json(req.body as any)); + http.put('*/account/settings/*', async ({ request }) => { + const body = await request.json(); + return HttpResponse.json(body as any); }), - rest.get('*/tags', (req, res, ctx) => { + http.get('*/tags', () => { tagFactory.resetSequenceNumber(); const tags = tagFactory.buildList(5); - return res(ctx.json(makeResourcePage(tags))); + return HttpResponse.json(makeResourcePage(tags)); }), - rest.get('*gravatar*', (req, res, ctx) => { - return res(ctx.status(400), ctx.json({})); + http.get('*gravatar*', () => { + return HttpResponse.json({}, { status: 400 }); }), - rest.get('*linode.com/blog/feed*', (req, res, ctx) => { - return res(ctx.status(400)); + http.get('*linode.com/blog/feed*', () => { + return HttpResponse.json(null, { status: 400 }); }), - rest.get('*managed/services', (req, res, ctx) => { + http.get('*managed/services', () => { const monitors = monitorFactory.buildList(5); const downUnresolvedMonitor = monitorFactory.build({ id: 998, @@ -1741,40 +1704,39 @@ export const handlers = [ label: 'Problem', status: 'problem', }); - return res( - ctx.json( - makeResourcePage([ - ...monitors, - downUnresolvedMonitor, - downResolvedMonitor, - ]) - ) + return HttpResponse.json( + makeResourcePage([ + ...monitors, + downUnresolvedMonitor, + downResolvedMonitor, + ]) ); }), - rest.post('*/managed/services', (req, res, ctx) => { - const monitor = monitorFactory.build(req.body as any); - return res(ctx.json(monitor)); + + http.post('*/managed/services', async ({ request }) => { + const body = await request.json(); + const monitor = monitorFactory.build(body as any); + return HttpResponse.json(monitor); }), - rest.put('*/managed/services/:id', (req, res, ctx) => { - const payload = req.body as any; + http.put('*/managed/services/:id', async ({ params, request }) => { + const body = await request.json(); + const payload = body as any; - return res( - ctx.json( - monitorFactory.build({ - ...payload, - id: Number(req.params.id), - }) - ) + return HttpResponse.json( + monitorFactory.build({ + ...payload, + id: Number(params.id), + }) ); }), - rest.delete('*/managed/services/:id', (_req, res, ctx) => { - return res(ctx.json({})); + http.delete('*/managed/services/:id', () => { + return HttpResponse.json({}); }), - rest.get('*managed/stats', (req, res, ctx) => { + http.get('*managed/stats', () => { const stats = managedStatsFactory.build(); - return res(ctx.json(stats)); + return HttpResponse.json(stats); }), - rest.get('*managed/issues', (req, res, ctx) => { + http.get('*managed/issues', () => { const openIssue = managedIssueFactory.build({ created: DateTime.now().minus({ days: 2 }).toISO(), entity: { id: 1 }, @@ -1785,53 +1747,57 @@ export const handlers = [ entity: { id: 999 }, services: [999], }); - return res(ctx.json(makeResourcePage([openIssue, closedIssue]))); + return HttpResponse.json(makeResourcePage([openIssue, closedIssue])); }), - rest.get('*managed/linode-settings', (req, res, ctx) => { - return res( - ctx.json(makeResourcePage(managedLinodeSettingFactory.buildList(5))) + http.get('*managed/linode-settings', () => { + return HttpResponse.json( + makeResourcePage(managedLinodeSettingFactory.buildList(5)) ); }), - rest.get('*managed/credentials/sshkey', (req, res, ctx) => { - return res(ctx.json(managedSSHPubKeyFactory.build())); + http.get('*managed/credentials/sshkey', () => { + return HttpResponse.json(managedSSHPubKeyFactory.build()); }), - rest.get('*managed/credentials', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(credentialFactory.buildList(5)))); + http.get('*managed/credentials', () => { + return HttpResponse.json(makeResourcePage(credentialFactory.buildList(5))); }), - rest.post('*managed/credentials', (req, res, ctx) => { + http.post('*managed/credentials', async ({ request }) => { + const body = await request.json(); const response = credentialFactory.build({ - ...(req.body as any), + ...(body as any), }); - return res(ctx.json(response)); + return HttpResponse.json(response); }), - rest.post('*managed/credentials/:id/revoke', (req, res, ctx) => { - return res(ctx.json({})); + http.post('*managed/credentials/:id/revoke', () => { + return HttpResponse.json({}); }), - rest.get('*managed/contacts', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(contactFactory.buildList(5)))); + http.get('*managed/contacts', () => { + return HttpResponse.json(makeResourcePage(contactFactory.buildList(5))); }), - rest.delete('*managed/contacts/:id', (req, res, ctx) => { - return res(ctx.json({})); + http.delete('*managed/contacts/:id', () => { + return HttpResponse.json({}); }), - rest.put('*managed/contacts/:id', (req, res, ctx) => { + http.put('*managed/contacts/:id', async ({ params, request }) => { + const body = await request.json(); const payload = { - ...(req.body as any), - id: Number(req.params.id), + ...(body as any), + id: Number(params.id), }; - return res(ctx.json(payload)); + return HttpResponse.json(payload); }), - rest.post('*managed/contacts', (req, res, ctx) => { + http.post('*managed/contacts', async ({ request }) => { + const body = await request.json(); const response = contactFactory.build({ - ...(req.body as any), + ...(body as any), }); - return res(ctx.json(response)); + return HttpResponse.json(response); }), - rest.get('*stackscripts/', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(stackScriptFactory.buildList(1)))); + http.get('*stackscripts/', () => { + return HttpResponse.json(makeResourcePage(stackScriptFactory.buildList(1))); }), - rest.get('*/notifications', (req, res, ctx) => { + + http.get('*/notifications', () => { // pastDueBalance included here merely for ease of testing for Notifications section in the Notifications drawer. const pastDueBalance = notificationFactory.build({ body: null, @@ -1973,125 +1939,96 @@ export const handlers = [ } ); - return res( - ctx.json( - makeResourcePage([ - pastDueBalance, - ...notificationFactory.buildList(1), - // gdprNotification, - generalGlobalNotice, - outageNotification, - minorSeverityNotification, - criticalSeverityNotification, - // abuseTicket, - // emailBounce, - migrationNotification, - balanceNotification, - blockStorageMigrationScheduledNotification, - blockStorageMigrationImminentNotification, - blockStorageMigrationScheduledNotificationUnattached, - ]) - ) + return HttpResponse.json( + makeResourcePage([ + pastDueBalance, + ...notificationFactory.buildList(1), + // gdprNotification, + generalGlobalNotice, + outageNotification, + minorSeverityNotification, + criticalSeverityNotification, + // abuseTicket, + // emailBounce, + migrationNotification, + balanceNotification, + blockStorageMigrationScheduledNotification, + blockStorageMigrationImminentNotification, + blockStorageMigrationScheduledNotificationUnattached, + ]) ); }), - rest.post('*/networking/vlans', (req, res, ctx) => { - return res(ctx.json({})); - }), - rest.post('*/networking/ipv6/ranges', (req, res, ctx) => { - const range = req.body?.['prefix_length']; - return res(ctx.json({ range, route_target: '2001:DB8::0000' })); - }), - rest.post('*/networking/ips/assign', (req, res, ctx) => { - return res(ctx.json({})); + + http.post('*/networking/vlans', () => { + return HttpResponse.json({}); }), - rest.post('*/account/payments', (req, res, ctx) => { - return res(ctx.json(creditPaymentResponseFactory.build())); + http.post('*/networking/ipv6/ranges', async ({ request }) => { + const body = await request.json(); + const range = body?.['prefix_length']; + return HttpResponse.json({ range, route_target: '2001:DB8::0000' }); }), - // rest.get('*/databases/mysql/instances', (req, res, ctx) => { - // const online = databaseFactory.build({ status: 'ready' }); - // const initializing = databaseFactory.build({ status: 'initializing' }); - // const error = databaseFactory.build({ status: 'error' }); - // const unknown = databaseFactory.build({ status: 'unknown' }); - // const databases = [online, initializing, error, unknown]; - // return res(ctx.json(makeResourcePage(databases))); - // }), - rest.get('*/profile/tokens', (req, res, ctx) => { - return res(ctx.json(makeResourcePage(appTokenFactory.buildList(30)))); + http.post('*/networking/ips/assign', () => { + return HttpResponse.json({}); }), - rest.post('*/profile/tokens', (req, res, ctx) => { - const data = req.body as TokenRequest; - return res(ctx.json(appTokenFactory.build(data))); + http.post('*/account/payments', () => { + return HttpResponse.json(creditPaymentResponseFactory.build()); }), - rest.put('*/profile/tokens/:id', (req, res, ctx) => { - const data = req.body as Partial; - return res( - ctx.json(appTokenFactory.build({ id: Number(req.params.id), ...data })) - ); + http.get('*/profile/tokens', () => { + return HttpResponse.json(makeResourcePage(appTokenFactory.buildList(30))); }), - rest.delete('*/profile/tokens/:id', (req, res, ctx) => { - return res(ctx.json({})); + http.post('*/profile/tokens', async ({ request }) => { + const body = await request.json(); + const data = body; + return HttpResponse.json(appTokenFactory.build(data)); }), - rest.get('*/account/betas', (_req, res, ctx) => { - return res( - ctx.json( - makeResourcePage([ - ...accountBetaFactory.buildList(5), - accountBetaFactory.build({ - ended: DateTime.now().minus({ days: 5 }).toISO(), - enrolled: DateTime.now().minus({ days: 20 }).toISO(), - started: DateTime.now().minus({ days: 30 }).toISO(), - }), - ]) - ) + http.put>( + '*/profile/tokens/:id', + async ({ params, request }) => { + const body = await request.json(); + const data = body; + return HttpResponse.json( + appTokenFactory.build({ id: Number(params.id), ...data }) + ); + } + ), + http.delete('*/profile/tokens/:id', () => { + return HttpResponse.json({}); + }), + http.get('*/account/betas', () => { + return HttpResponse.json( + makeResourcePage([ + ...accountBetaFactory.buildList(5), + accountBetaFactory.build({ + ended: DateTime.now().minus({ days: 5 }).toISO(), + enrolled: DateTime.now().minus({ days: 20 }).toISO(), + started: DateTime.now().minus({ days: 30 }).toISO(), + }), + ]) ); }), - rest.get('*/account/betas/:id', (req, res, ctx) => { - if (req.params.id !== 'undefined') { - return res( - ctx.json(accountBetaFactory.build({ id: req.params.id as string })) + http.get('*/account/betas/:id', ({ params }) => { + if (params.id !== 'undefined') { + return HttpResponse.json( + accountBetaFactory.build({ id: params.id as string }) ); } - return res(ctx.status(404)); + return HttpResponse.json({}, { status: 404 }); }), - rest.post('*/account/betas', (_req, res, ctx) => { - return res(ctx.json({})); + http.post('*/account/betas', () => { + return HttpResponse.json({}); }), - rest.get('*/betas/:id', (req, res, ctx) => { - if (req.params.id !== 'undefined') { - return res(ctx.json(betaFactory.build({ id: req.params.id as string }))); + http.get('*/betas/:id', ({ params }) => { + if (params.id !== 'undefined') { + return HttpResponse.json(betaFactory.build({ id: params.id as string })); } - return res(ctx.status(404)); - }), - rest.get('*/betas', (_req, res, ctx) => { - return res(ctx.json(makeResourcePage(betaFactory.buildList(5)))); + return HttpResponse.json({}, { status: 404 }); }), - rest.get('*regions/availability', (_req, res, ctx) => { - return res( - ctx.json( - makeResourcePage([ - regionAvailabilityFactory.build({ - plan: 'g6-standard-6', - region: 'us-east', - }), - regionAvailabilityFactory.build({ - plan: 'g6-standard-7', - region: 'us-east', - }), - regionAvailabilityFactory.build({ - plan: 'g6-dedicated-5', - region: 'us-central', - }), - regionAvailabilityFactory.build({ - plan: 'g6-dedicated-6', - region: 'us-central', - }), - ]) - ) - ); + http.get('*/betas', () => { + return HttpResponse.json(makeResourcePage(betaFactory.buildList(5))); }), - rest.get('*regions/:regionId/availability', (_req, res, ctx) => { - return res( - ctx.json([ + http.get('*regions/availability', () => { + return HttpResponse.json( + makeResourcePage([ regionAvailabilityFactory.build({ plan: 'g6-standard-6', region: 'us-east', @@ -2100,125 +2037,96 @@ export const handlers = [ plan: 'g6-standard-7', region: 'us-east', }), + regionAvailabilityFactory.build({ + plan: 'g6-dedicated-5', + region: 'us-central', + }), + regionAvailabilityFactory.build({ + plan: 'g6-dedicated-6', + region: 'us-central', + }), ]) ); }), - // Placement Groups - rest.get('*/placement/groups', (_req, res, ctx) => { - return res(ctx.json(makeResourcePage(placementGroupFactory.buildList(3)))); + http.get('*regions/:regionId/availability', () => { + return HttpResponse.json([ + regionAvailabilityFactory.build({ + plan: 'g6-standard-6', + region: 'us-east', + }), + regionAvailabilityFactory.build({ + plan: 'g6-standard-7', + region: 'us-east', + }), + ]); }), - rest.get('*/placement/groups/:placementGroupId', (req, res, ctx) => { - if (req.params.placementGroupId === 'undefined') { - return res(ctx.status(404)); - } - return res( - ctx.json( - placementGroupFactory.build({ - id: 1, - }) - ) + // Placement Groups + http.get('*/placement/groups', () => { + return HttpResponse.json( + makeResourcePage(placementGroupFactory.buildList(3)) ); }), - rest.post('*/placement/groups', (req, res, ctx) => { - return res( - ctx.json( - createPlacementGroupPayloadFactory.build( - req.body as CreatePlacementGroupPayload - ) - ) + http.get('*/placement/groups/:placementGroupId', ({ params }) => { + if (params.placementGroupId === 'undefined') { + return HttpResponse.json({}, { status: 404 }); + } + + return HttpResponse.json( + placementGroupFactory.build({ + id: 1, + }) ); }), - rest.put('*/placement/groups/:placementGroupId', (req, res, ctx) => { - if (req.params.placementGroupId === '-1') { - return res(ctx.status(404)); + http.post( + '*/placement/groups', + async ({ request }) => { + const body = await request.json(); + + return HttpResponse.json(createPlacementGroupPayloadFactory.build(body)); } + ), + http.put( + '*/placement/groups/:placementGroupId', + async ({ params, request }) => { + const body = await request.json(); - const response = placementGroupFactory.build({ - ...(req.body as any), - }); + if (params.placementGroupId === '-1') { + return HttpResponse.json({}, { status: 404 }); + } - return res(ctx.json(response)); - }), - rest.delete('*/placement/groups/:placementGroupId', (req, res, ctx) => { - if (req.params.placementGroupId === '-1') { - return res(ctx.status(404)); - } + const response = placementGroupFactory.build({ + ...(body as any), + }); - return res(ctx.json({})); - }), - rest.post('*/placement/groups/:placementGroupId/assign', (req, res, ctx) => { - if (req.params.placementGroupId === '-1') { - return res(ctx.status(404)); + return HttpResponse.json(response); + } + ), + http.delete('*/placement/groups/:placementGroupId', ({ params }) => { + if (params.placementGroupId === '-1') { + return HttpResponse.json({}, { status: 404 }); } - const response = placementGroupFactory.build({ - affinity_type: 'anti_affinity', - id: Number(req.params.placementGroupId) ?? -1, - label: 'pg-1', - linodes: [ - { - is_compliant: true, - linode: 1, - }, - { - is_compliant: true, - linode: 2, - }, - { - is_compliant: true, - linode: 3, - }, - { - is_compliant: true, - linode: 4, - }, - { - is_compliant: true, - linode: 5, - }, - { - is_compliant: true, - linode: 6, - }, - { - is_compliant: true, - linode: 7, - }, - { - is_compliant: true, - linode: 8, - }, - { - is_compliant: false, - linode: 43, - }, - { - is_compliant: true, - linode: (req.body as any).linodes[0], - }, - ], - }); - - return res(ctx.json(response)); + return HttpResponse.json({}); }), - rest.post( - '*/placement/groups/:placementGroupId/unassign', - (req, res, ctx) => { - if (req.params.placementGroupId === '-1') { - return res(ctx.status(404)); + http.post( + '*/placement/groups/:placementGroupId/assign', + async ({ params, request }) => { + const body = await request.json(); + + if (params.placementGroupId === '-1') { + return HttpResponse.json({}, { status: 404 }); } const response = placementGroupFactory.build({ affinity_type: 'anti_affinity', - id: Number(req.params.placementGroupId) ?? -1, + id: Number(params.placementGroupId) ?? -1, label: 'pg-1', linodes: [ { is_compliant: true, linode: 1, }, - { is_compliant: true, linode: 2, @@ -2251,12 +2159,68 @@ export const handlers = [ is_compliant: false, linode: 43, }, + { + is_compliant: true, + linode: (body as any).linodes[0], + }, ], }); - return res(ctx.json(response)); + return HttpResponse.json(response); } ), + http.post('*/placement/groups/:placementGroupId/unassign', ({ params }) => { + if (params.placementGroupId === '-1') { + return HttpResponse.json({}, { status: 404 }); + } + + const response = placementGroupFactory.build({ + affinity_type: 'anti_affinity', + id: Number(params.placementGroupId) ?? -1, + label: 'pg-1', + linodes: [ + { + is_compliant: true, + linode: 1, + }, + + { + is_compliant: true, + linode: 2, + }, + { + is_compliant: true, + linode: 3, + }, + { + is_compliant: true, + linode: 4, + }, + { + is_compliant: true, + linode: 5, + }, + { + is_compliant: true, + linode: 6, + }, + { + is_compliant: true, + linode: 7, + }, + { + is_compliant: true, + linode: 8, + }, + { + is_compliant: false, + linode: 43, + }, + ], + }); + + return HttpResponse.json(response); + }), ...entityTransfers, ...statusPage, ...databases, diff --git a/packages/manager/src/mocks/testBrowser.ts b/packages/manager/src/mocks/testBrowser.ts index 43c81b340b6..50b3dbe82ec 100644 --- a/packages/manager/src/mocks/testBrowser.ts +++ b/packages/manager/src/mocks/testBrowser.ts @@ -1,4 +1,4 @@ -import { setupWorker } from 'msw'; +import { setupWorker } from 'msw/browser'; import { handlers } from './serverHandlers'; diff --git a/packages/manager/src/mocks/testServer.ts b/packages/manager/src/mocks/testServer.ts index 571e5d80563..c03f85f2e82 100644 --- a/packages/manager/src/mocks/testServer.ts +++ b/packages/manager/src/mocks/testServer.ts @@ -3,4 +3,4 @@ import { setupServer } from 'msw/node'; import { handlers } from './serverHandlers'; export const server = setupServer(...handlers); -export { rest } from 'msw'; +export { HttpResponse, http } from 'msw'; diff --git a/yarn.lock b/yarn.lock index e3992646f1a..c2c23068d3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1218,6 +1218,20 @@ resolved "https://registry.yarnpkg.com/@braintree/wrap-promise/-/wrap-promise-2.1.0.tgz#7e27ffc5dacd2d71533b0c42506eea8e7c2e50fa" integrity sha512-UIrJB+AfKU0CCfbMoWrsGpd2D/hBpY/SGgFI6WRHPOwhaZ3g9rz1weiJ6eb6L9KgVyunT7s2tckcPkbHw+NzeA== +"@bundled-es-modules/cookie@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz#c3b82703969a61cf6a46e959a012b2c257f6b164" + integrity sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw== + dependencies: + cookie "^0.5.0" + +"@bundled-es-modules/statuses@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz#761d10f44e51a94902c4da48675b71a76cc98872" + integrity sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg== + dependencies: + statuses "^2.0.1" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -1759,6 +1773,39 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== +"@inquirer/confirm@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.0.tgz#526cb71ceab28ba827ea287aa81c969e437017b6" + integrity sha512-nH5mxoTEoqk6WpoBz80GMpDSm9jH5V9AF8n+JZAZfMzd9gHeEG9w1o3KawPRR72lfzpP+QxBHLkOKLEApwhDiQ== + dependencies: + "@inquirer/core" "^7.1.0" + "@inquirer/type" "^1.2.1" + +"@inquirer/core@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-7.1.0.tgz#fb78738fd6624de50f027c08d6f24298b72a402b" + integrity sha512-FRCiDiU54XHt5B/D8hX4twwZuzSP244ANHbu3R7CAsJfiv1dUOz24ePBgCZjygEjDUi6BWIJuk4eWLKJ7LATUw== + dependencies: + "@inquirer/type" "^1.2.1" + "@types/mute-stream" "^0.0.4" + "@types/node" "^20.11.26" + "@types/wrap-ansi" "^3.0.0" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + cli-spinners "^2.9.2" + cli-width "^4.1.0" + figures "^3.2.0" + mute-stream "^1.0.0" + run-async "^3.0.0" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + +"@inquirer/type@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.2.1.tgz#fbc7ab3a2e5050d0c150642d5e8f5e88faa066b8" + integrity sha512-xwMfkPAxeo8Ji/IxfUSqzRi0/+F2GIqJmpc5/thelgMGsjNZcjDDRBO9TLXT1s/hdx/mK5QbVIvgoLIFgXhTMQ== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1900,27 +1947,22 @@ "@types/mdx" "^2.0.0" "@types/react" ">=16" -"@mswjs/cookies@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-0.2.2.tgz#b4e207bf6989e5d5427539c2443380a33ebb922b" - integrity sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g== - dependencies: - "@types/set-cookie-parser" "^2.4.0" - set-cookie-parser "^2.4.6" +"@mswjs/cookies@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-1.1.0.tgz#1528eb43630caf83a1d75d5332b30e75e9bb1b5b" + integrity sha512-0ZcCVQxifZmhwNBoQIrystCb+2sWBY2Zw8lpfJBPCHGCA/HWqehITeCRVIv4VMy8MPlaHo2w2pTHFV2pFfqKPw== -"@mswjs/interceptors@^0.17.10": - version "0.17.10" - resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.17.10.tgz#857b41f30e2b92345ed9a4e2b1d0a08b8b6fcad4" - integrity sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw== +"@mswjs/interceptors@^0.25.16": + version "0.25.16" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.25.16.tgz#7955fbb8da479bc691df117dd4c8d889e507ecc2" + integrity sha512-8QC8JyKztvoGAdPgyZy49c9vSHHAZjHagwl4RY9E8carULk8ym3iTaiawrT1YoLF/qb449h48f71XDPgkUSOUg== dependencies: - "@open-draft/until" "^1.0.3" - "@types/debug" "^4.1.7" - "@xmldom/xmldom" "^0.8.3" - debug "^4.3.3" - headers-polyfill "3.2.5" + "@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.2.1" - strict-event-emitter "^0.2.4" - web-encoding "^1.1.5" + strict-event-emitter "^0.5.1" "@mui/base@5.0.0-beta.36": version "5.0.0-beta.36" @@ -2043,10 +2085,23 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@open-draft/until@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" - integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== +"@open-draft/deferred-promise@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz#4a822d10f6f0e316be4d67b4d4f8c9a124b073bd" + integrity sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA== + +"@open-draft/logger@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@open-draft/logger/-/logger-0.3.0.tgz#2b3ab1242b360aa0adb28b85f5d7da1c133a0954" + integrity sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ== + dependencies: + is-node-process "^1.2.0" + outvariant "^1.4.0" + +"@open-draft/until@^2.0.0", "@open-draft/until@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-2.1.0.tgz#0acf32f470af2ceaf47f095cdecd40d68666efda" + integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg== "@paypal/paypal-js@^5.1.6": version "5.1.6" @@ -3623,10 +3678,10 @@ dependencies: "@types/node" "*" -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== +"@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== "@types/cross-spawn@^6.0.2": version "6.0.6" @@ -3691,7 +3746,7 @@ resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70" integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== -"@types/debug@^4.0.0", "@types/debug@^4.1.7": +"@types/debug@^4.0.0": version "4.1.12" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== @@ -3837,11 +3892,6 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/js-levenshtein@^1.1.1": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz#a6fd0bdc8255b274e5438e0bfb25f154492d1106" - integrity sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ== - "@types/jsdom@^21.1.4": version "21.1.6" resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-21.1.6.tgz#bcbc7b245787ea863f3da1ef19aa1dcfb9271a1b" @@ -3938,6 +3988,13 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== +"@types/mute-stream@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@types/mute-stream/-/mute-stream-0.0.4.tgz#77208e56a08767af6c5e1237be8888e2f255c478" + integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow== + dependencies: + "@types/node" "*" + "@types/node-fetch@^2.6.4": version "2.6.11" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" @@ -3965,6 +4022,13 @@ dependencies: undici-types "~5.26.4" +"@types/node@^20.11.26": + version "20.11.27" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.27.tgz#debe5cfc8a507dd60fe2a3b4875b1604f215c2ac" + integrity sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg== + dependencies: + undici-types "~5.26.4" + "@types/normalize-package-data@^2.4.0": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" @@ -4151,13 +4215,6 @@ "@types/mime" "*" "@types/node" "*" -"@types/set-cookie-parser@^2.4.0": - version "2.4.7" - resolved "https://registry.yarnpkg.com/@types/set-cookie-parser/-/set-cookie-parser-2.4.7.tgz#4a341ed1d3a922573ee54db70b6f0a6d818290e7" - integrity sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg== - dependencies: - "@types/node" "*" - "@types/sinonjs__fake-timers@8.1.1": version "8.1.1" resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" @@ -4168,6 +4225,11 @@ resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.8.tgz#518609aefb797da19bf222feb199e8f653ff7627" integrity sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg== +"@types/statuses@^2.0.4": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/statuses/-/statuses-2.0.5.tgz#f61ab46d5352fd73c863a1ea4e1cef3b0b51ae63" + integrity sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A== + "@types/throttle-debounce@^1.0.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/throttle-debounce/-/throttle-debounce-1.1.1.tgz#4a78636c36a4534b76d85ee244fce238d435f22a" @@ -4198,6 +4260,11 @@ resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.3.tgz#d1884c8cc4a426d1ac117ca2611bf333834c6798" integrity sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q== +"@types/wrap-ansi@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd" + integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== + "@types/xml2js@0.4.14": version "0.4.14" resolved "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.4.14.tgz#5d462a2a7330345e2309c6b549a183a376de8f9a" @@ -4488,11 +4555,6 @@ loupe "^2.3.7" pretty-format "^29.7.0" -"@xmldom/xmldom@^0.8.3": - version "0.8.10" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" - integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== - "@yarnpkg/esbuild-plugin-pnp@^3.0.0-rc.10": version "3.0.0-rc.15" resolved "https://registry.yarnpkg.com/@yarnpkg/esbuild-plugin-pnp/-/esbuild-plugin-pnp-3.0.0-rc.15.tgz#4e40e7d2eb28825c9a35ab9d04c363931d7c0e67" @@ -4526,11 +4588,6 @@ resolved "https://registry.yarnpkg.com/@zeit/schemas/-/schemas-2.29.0.tgz#a59ae6ebfdf4ddc66a876872dd736baa58b6696c" integrity sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA== -"@zxing/text-encoding@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" - integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== - abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" @@ -4646,7 +4703,7 @@ ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -5333,7 +5390,7 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -5436,7 +5493,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -5499,7 +5556,7 @@ check-more-types@^2.24.0: resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== -chokidar@^3.4.2, chokidar@^3.5.1, chokidar@^3.5.3: +chokidar@^3.5.1, chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -5565,7 +5622,7 @@ cli-cursor@^4.0.0: dependencies: restore-cursor "^4.0.0" -cli-spinners@^2.5.0: +cli-spinners@^2.5.0, cli-spinners@^2.9.2: version "2.9.2" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== @@ -5600,6 +5657,11 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + clipboardy@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-3.0.0.tgz#f3876247404d334c9ed01b6f269c11d09a5e3092" @@ -5809,16 +5871,11 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: +cookie@0.5.0, cookie@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -cookie@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - copy-anything@^3.0.2: version "3.0.5" resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-3.0.5.tgz#2d92dce8c498f790fa7ad16b01a1ae5a45b020a0" @@ -6176,7 +6233,7 @@ debug@2.6.9, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -7166,11 +7223,6 @@ eventemitter3@^5.0.1: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== -events@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - execa@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" @@ -8057,10 +8109,10 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -headers-polyfill@3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.2.5.tgz#6e67d392c9d113d37448fe45014e0afdd168faed" - integrity sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA== +headers-polyfill@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-4.0.2.tgz#9115a76eee3ce8fbf95b6e3c6bf82d936785b44a" + integrity sha512-EWGTfnTqAO2L/j5HZgoM/3z82L7necsJ0pO9Tp0X1wil3PDLrkypTBRgVO2ExehEEvUycejZD3FuRaXpZZc3kw== hi-base32@^0.5.0: version "0.5.1" @@ -8337,27 +8389,6 @@ inquirer@^7.0.0: strip-ansi "^6.0.0" through "^2.3.6" -inquirer@^8.2.0: - version "8.2.6" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" - integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^6.0.1" - internal-slot@^1.0.4, internal-slot@^1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" @@ -8902,11 +8933,6 @@ joycon@^3.0.1: resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== -js-levenshtein@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -10203,36 +10229,39 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -msw@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/msw/-/msw-1.3.2.tgz#35e0271293e893fc3c55116e90aad5d955c66899" - integrity sha512-wKLhFPR+NitYTkQl5047pia0reNGgf0P6a1eTnA5aNlripmiz0sabMvvHcicE8kQ3/gZcI0YiPFWmYfowfm3lA== - dependencies: - "@mswjs/cookies" "^0.2.2" - "@mswjs/interceptors" "^0.17.10" - "@open-draft/until" "^1.0.3" - "@types/cookie" "^0.4.1" - "@types/js-levenshtein" "^1.1.1" - chalk "^4.1.1" - chokidar "^3.4.2" - cookie "^0.4.2" +msw@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.2.3.tgz#d05b46d73e8832cbf2145743938635beaaafa0d7" + integrity sha512-84CoNCkcJ/EvY8Tv0tD/6HKVd4S5HyGowHjM5W12K8Wgryp4fikqS7IaTOceyQgP5dNedxo2icTLDXo7dkpxCg== + dependencies: + "@bundled-es-modules/cookie" "^2.0.0" + "@bundled-es-modules/statuses" "^1.0.1" + "@inquirer/confirm" "^3.0.0" + "@mswjs/cookies" "^1.1.0" + "@mswjs/interceptors" "^0.25.16" + "@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 "3.2.5" - inquirer "^8.2.0" + headers-polyfill "^4.0.2" is-node-process "^1.2.0" - js-levenshtein "^1.1.6" - node-fetch "^2.6.7" - outvariant "^1.4.0" + outvariant "^1.4.2" path-to-regexp "^6.2.0" - strict-event-emitter "^0.4.3" - type-fest "^2.19.0" - yargs "^17.3.1" + strict-event-emitter "^0.5.1" + type-fest "^4.9.0" + yargs "^17.7.2" mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mute-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -10579,7 +10608,7 @@ ospath@^1.2.2: resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== -outvariant@^1.2.1, outvariant@^1.4.0: +outvariant@^1.2.1, outvariant@^1.4.0, outvariant@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.2.tgz#f54f19240eeb7f15b28263d5147405752d8e2066" integrity sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ== @@ -11967,6 +11996,11 @@ run-async@^2.4.0: resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-async@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" + integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== + run-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" @@ -11986,7 +12020,7 @@ rxjs@^6.5.2, rxjs@^6.6.0: dependencies: tslib "^1.9.0" -rxjs@^7.5.1, rxjs@^7.5.5: +rxjs@^7.5.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== @@ -12163,11 +12197,6 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-cookie-parser@^2.4.6: - version "2.6.0" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" - integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== - set-function-length@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" @@ -12432,7 +12461,7 @@ stackblur-canvas@^2.0.0: resolved "https://registry.yarnpkg.com/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz#af931277d0b5096df55e1f91c530043e066989b6" integrity sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ== -statuses@2.0.1: +statuses@2.0.1, statuses@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== @@ -12480,17 +12509,10 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== -strict-event-emitter@^0.2.4: - version "0.2.8" - resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz#b4e768927c67273c14c13d20e19d5e6c934b47ca" - integrity sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A== - dependencies: - events "^3.3.0" - -strict-event-emitter@^0.4.3: - version "0.4.6" - resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz#ff347c8162b3e931e3ff5f02cfce6772c3b07eb3" - integrity sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg== +strict-event-emitter@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" + integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== string-argv@0.3.2: version "0.3.2" @@ -13167,6 +13189,11 @@ type-fest@^2.13.0, type-fest@^2.19.0, type-fest@~2.19: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== +type-fest@^4.9.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.12.0.tgz#00ae70d02161b81ecd095158143c4bb8c879760d" + integrity sha512-5Y2/pp2wtJk8o08G0CMkuFPCO354FGwk/vbidxrdhRGZfd0tFnb4Qb8anp9XxXriwBgVPjdWbKpGl4J9lJY2jQ== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -13463,7 +13490,7 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.12.3, util@^0.12.4, util@^0.12.5: +util@^0.12.4, util@^0.12.5: version "0.12.5" resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== @@ -13684,15 +13711,6 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -web-encoding@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" - integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== - dependencies: - util "^0.12.3" - optionalDependencies: - "@zxing/text-encoding" "0.9.0" - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -13862,7 +13880,7 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" -wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: +wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== @@ -13993,15 +14011,12 @@ yaml@2.3.1, yaml@^1.10.0, yaml@^1.7.2, yaml@^2.2.2, yaml@^2.3.0, yaml@^2.3.4: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== -yargs-parser@^11.1.1, yargs-parser@^18.1.3, yargs-parser@^21.1.1: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yargs-parser@^11.1.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@17.7.2, yargs@^17.3.1: +yargs@17.7.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==