/*
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];
}
}