From e97c808b412167d334353c7f6370e6d8b70bc0ae Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 14 Dec 2022 15:17:15 -0300 Subject: moving testing sdk to web-utils --- packages/web-util/src/tests/axios.ts | 136 +++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 packages/web-util/src/tests/axios.ts (limited to 'packages/web-util/src/tests/axios.ts') diff --git a/packages/web-util/src/tests/axios.ts b/packages/web-util/src/tests/axios.ts new file mode 100644 index 000000000..38f8a9899 --- /dev/null +++ b/packages/web-util/src/tests/axios.ts @@ -0,0 +1,136 @@ +/* + This file is part of GNU Taler + (C) 2022 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see + */ + +// import axios, { AxiosPromise, AxiosRequestConfig } from "axios"; +import * as axios from "axios"; +import { + setAxiosRequestAsTestingEnvironment, + mockAxiosOnce, +} from "../utils/axios.js"; + +const TESTING_DEBUG_LOG = process.env["TESTING_DEBUG_LOG"] !== undefined; + +const defaultCallback = ( + actualQuery?: axios.AxiosRequestConfig, +): axios.AxiosPromise => { + if (TESTING_DEBUG_LOG) { + console.log("UNEXPECTED QUERY", actualQuery); + } + throw Error( + "Default Axios mock callback is called, this mean that the test did a tried to use axios but there was no expectation in place, try using JEST_DEBUG_LOG env", + ); +}; + +setAxiosRequestAsTestingEnvironment(defaultCallback); + +export type Query = { + method: axios.Method; + url: string; + code?: number; +}; + +type ExpectationValues = { + query: Query; + params?: { + auth?: string; + request?: object; + qparam?: Record; + response?: object; + }; +}; + +type TestValues = [ + axios.AxiosRequestConfig | undefined, + ExpectationValues | undefined, +]; + +export class AxiosMockEnvironment { + expectations: Array< + | { + query: Query; + auth?: string; + params?: { + request?: object; + qparam?: Record; + response?: object; + }; + result: { args: axios.AxiosRequestConfig | undefined }; + } + | undefined + > = []; + // axiosMock: jest.MockedFunction + + addRequestExpectation< + RequestType extends object, + ResponseType extends object, + >( + expectedQuery: Query, + params: { + auth?: string; + request?: RequestType; + qparam?: any; + response?: ResponseType; + }, + ): void { + const result = mockAxiosOnce(function ( + actualQuery?: axios.AxiosRequestConfig, + ): axios.AxiosPromise { + if (TESTING_DEBUG_LOG) { + console.log("query to the backend is made", actualQuery); + } + if (!expectedQuery) { + return Promise.reject("a query was made but it was not expected"); + } + if (TESTING_DEBUG_LOG) { + console.log("expected query:", params?.request); + console.log("expected qparams:", params?.qparam); + console.log("sending response:", params?.response); + } + + const responseCode = expectedQuery.code || 200; + + //This response is what buildRequestOk is expecting in file hook/backend.ts + if (responseCode >= 200 && responseCode < 300) { + return Promise.resolve({ + data: params?.response, + config: { + data: params?.response, + params: actualQuery?.params || {}, + }, + request: { params: actualQuery?.params || {} }, + } as any); + } + //This response is what buildRequestFailed is expecting in file hook/backend.ts + return Promise.reject({ + response: { + status: responseCode, + }, + request: { + data: params?.response, + params: actualQuery?.params || {}, + }, + }); + } as any); + + this.expectations.push({ query: expectedQuery, params, result }); + } + + getLastTestValues(): TestValues { + const expectedQuery = this.expectations.shift(); + + return [expectedQuery?.result.args, expectedQuery]; + } +} -- cgit v1.2.3