diff options
author | Sebastian <sebasjm@gmail.com> | 2023-04-20 15:32:36 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2023-04-20 15:32:36 -0300 |
commit | b9c24772f52387c123f3529f8db0754b6f500d74 (patch) | |
tree | baf7bb768ac4be1351be4d957dfa02ab45551c5d /packages/web-util/src/tests | |
parent | 45bbe7ba127dc07ae06b420faca591c03402a3f5 (diff) | |
download | wallet-core-b9c24772f52387c123f3529f8db0754b6f500d74.tar.xz |
better swr mocks
Diffstat (limited to 'packages/web-util/src/tests')
-rw-r--r-- | packages/web-util/src/tests/mock.ts | 16 | ||||
-rw-r--r-- | packages/web-util/src/tests/swr.ts | 102 |
2 files changed, 74 insertions, 44 deletions
diff --git a/packages/web-util/src/tests/mock.ts b/packages/web-util/src/tests/mock.ts index c01e66849..f4eb0e7aa 100644 --- a/packages/web-util/src/tests/mock.ts +++ b/packages/web-util/src/tests/mock.ts @@ -15,6 +15,7 @@ */ import { Logger } from "@gnu-taler/taler-util"; +import { deprecate } from "util"; type HttpMethod = | "get" @@ -63,6 +64,11 @@ type TestValues = { const logger = new Logger("testing/mock.ts"); +type MockedResponse = { + queryMade: ExpectationValues; + expectedQuery?: ExpectationValues; +}; + export abstract class MockEnvironment { expectations: Array<ExpectationValues> = []; queriesMade: Array<ExpectationValues> = []; @@ -108,7 +114,7 @@ export abstract class MockEnvironment { qparam?: any; response?: ResponseType; }, - ): { status: number; payload: ResponseType } | undefined { + ): MockedResponse { const queryMade = { query, params, auth: params.auth }; this.queriesMade.push(queryMade); const expectedQuery = this.expectations[this.index]; @@ -116,11 +122,9 @@ export abstract class MockEnvironment { if (this.debug) { logger.info("unexpected query made", queryMade); } - return undefined; + return { queryMade }; } - const responseCode = this.expectations[this.index].query.code ?? 200; - const mockedResponse = this.expectations[this.index].params - ?.response as ResponseType; + if (this.debug) { logger.info("tracking query made", { queryMade, @@ -128,7 +132,7 @@ export abstract class MockEnvironment { }); } this.index++; - return { status: responseCode, payload: mockedResponse }; + return { queryMade, expectedQuery }; } public assertJustExpectedRequestWereMade(): AssertStatus { diff --git a/packages/web-util/src/tests/swr.ts b/packages/web-util/src/tests/swr.ts index 62a35f83d..903cd48d8 100644 --- a/packages/web-util/src/tests/swr.ts +++ b/packages/web-util/src/tests/swr.ts @@ -17,12 +17,17 @@ import { ComponentChildren, FunctionalComponent, h, VNode } from "preact"; import { MockEnvironment } from "./mock.js"; import { SWRConfig } from "swr"; +import * as swr__internal from "swr/_internal"; +import { Logger } from "@gnu-taler/taler-util"; +import { buildRequestFailed, RequestError } from "../index.browser.js"; + +const logger = new Logger("tests/swr.ts"); /** * Helper for hook that use SWR inside. - * + * * buildTestingContext() will return a testing context - * + * */ export class SwrMockEnvironment extends MockEnvironment { constructor(debug = false) { @@ -32,47 +37,68 @@ export class SwrMockEnvironment extends MockEnvironment { public buildTestingContext(): FunctionalComponent<{ children: ComponentChildren; }> { - const __SAVE_REQUEST_AND_GET_MOCKED_RESPONSE = this.saveRequestAndGetMockedResponse.bind(this); + const __SAVE_REQUEST_AND_GET_MOCKED_RESPONSE = + this.saveRequestAndGetMockedResponse.bind(this); + + function testingFetcher(params: any): any { + const url = JSON.stringify(params); + const mocked = __SAVE_REQUEST_AND_GET_MOCKED_RESPONSE<any, any>( + { + method: "get", + url, + }, + {}, + ); + + //unexpected query + if (!mocked.expectedQuery) return undefined; + const status = mocked.expectedQuery.query.code ?? 200; + const requestPayload = mocked.expectedQuery.params?.request; + const responsePayload = mocked.expectedQuery.params?.response; + //simulated error + if (status >= 400) { + const error = buildRequestFailed( + url, + JSON.stringify(responsePayload), + status, + requestPayload, + ); + //example error handling from https://swr.vercel.app/docs/error-handling + throw new RequestError(error); + } + return responsePayload; + } + + const value: Partial<swr__internal.PublicConfiguration> & { + provider: () => Map<any, any>; + } = { + use: [ + (useSWRNext) => { + return (key, fetcher, config) => { + //prevent the request + //use the testing fetcher instead + return useSWRNext(key, testingFetcher, config); + }; + }, + ], + fetcher: testingFetcher, + //These options are set for ending the test faster + //otherwise SWR will create timeouts that will live after the test finished + loadingTimeout: 0, + dedupingInterval: 0, + shouldRetryOnError: false, + errorRetryInterval: 0, + errorRetryCount: 0, + //clean cache for every test + provider: () => new Map(), + }; + return function TestingContext({ children, }: { children: ComponentChildren; }): VNode { - return h( - SWRConfig, - { - value: { - // eslint-disable-next-line @typescript-eslint/ban-types - fetcher: (url: string, options: object) => { - const mocked = __SAVE_REQUEST_AND_GET_MOCKED_RESPONSE( - { - method: "get", - url, - }, - {}, - ); - if (!mocked) return undefined; - if (mocked.status > 400) { - const e: any = Error("simulated error for testing"); - //example error handling from https://swr.vercel.app/docs/error-handling - e.status = mocked.status; - throw e; - } - return mocked.payload; - }, - //These options are set for ending the test faster - //otherwise SWR will create timeouts that will live after the test finished - loadingTimeout: 0, - dedupingInterval: 0, - shouldRetryOnError: false, - errorRetryInterval: 0, - errorRetryCount: 0, - //clean cache for every test - provider: () => new Map(), - }, - }, - children, - ); + return h(SWRConfig, { value }, children); }; } } |