2023-04-20 10:57:10 +08:00
|
|
|
import { test } from 'vitest';
|
|
|
|
import {
|
2023-04-22 16:12:32 +08:00
|
|
|
PLAIN_METHODS,
|
|
|
|
WITH_PARAMS_METHODS,
|
|
|
|
WITH_DATA_METHODS,
|
|
|
|
} from '@/constants/methods';
|
|
|
|
import { AxiosAdapterRequestConfig } from '@/adpater/createAdapter';
|
2023-04-02 23:27:45 +08:00
|
|
|
|
2023-03-29 22:23:36 +08:00
|
|
|
export function asyncNext() {
|
|
|
|
return Promise.resolve().then;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function asyncTimeout(delay = 0) {
|
2023-04-01 23:11:55 +08:00
|
|
|
return new Promise((resolve) => setTimeout(resolve, delay));
|
2023-03-29 22:23:36 +08:00
|
|
|
}
|
|
|
|
|
2023-04-03 21:03:33 +08:00
|
|
|
export function captureError<T = any>(fn: () => void) {
|
2023-03-29 22:23:36 +08:00
|
|
|
try {
|
|
|
|
fn();
|
2023-04-01 23:11:55 +08:00
|
|
|
throw new Error('without Error');
|
2023-03-29 22:23:36 +08:00
|
|
|
} catch (err) {
|
|
|
|
return err as T;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export function noop() {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2023-04-09 15:20:10 +08:00
|
|
|
export function mockResponse(
|
2023-04-25 22:18:08 +08:00
|
|
|
status = 200,
|
|
|
|
headers: AnyObject = {},
|
|
|
|
data: AnyObject = {},
|
2023-03-29 22:23:36 +08:00
|
|
|
) {
|
|
|
|
return {
|
|
|
|
status,
|
|
|
|
headers,
|
|
|
|
data,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2023-04-02 23:27:45 +08:00
|
|
|
export interface MockAdapterOptions {
|
|
|
|
headers?: AnyObject;
|
|
|
|
data?: AnyObject;
|
|
|
|
delay?: number;
|
|
|
|
before?: (config: AxiosAdapterRequestConfig) => void;
|
|
|
|
after?: () => void;
|
|
|
|
}
|
|
|
|
|
2023-04-09 21:01:43 +08:00
|
|
|
function mockAdapterBase(
|
2023-04-03 21:03:33 +08:00
|
|
|
type: 'success' | 'error' | 'fail' = 'success',
|
2023-04-02 23:27:45 +08:00
|
|
|
options: MockAdapterOptions = {},
|
|
|
|
) {
|
2023-04-09 21:01:43 +08:00
|
|
|
const {
|
|
|
|
headers = {},
|
|
|
|
data = {
|
|
|
|
result: null,
|
|
|
|
},
|
|
|
|
delay = 0,
|
|
|
|
before,
|
|
|
|
after,
|
|
|
|
} = options;
|
2023-04-02 23:27:45 +08:00
|
|
|
|
|
|
|
return (config: AxiosAdapterRequestConfig) => {
|
2023-04-09 15:20:10 +08:00
|
|
|
let canceled = false;
|
|
|
|
|
2023-04-02 23:27:45 +08:00
|
|
|
before?.(config);
|
2023-04-09 15:20:10 +08:00
|
|
|
|
2023-04-02 23:27:45 +08:00
|
|
|
setTimeout(() => {
|
2023-04-09 15:20:10 +08:00
|
|
|
if (!canceled) {
|
|
|
|
switch (type) {
|
|
|
|
case 'success':
|
2023-11-01 20:45:19 +08:00
|
|
|
config.success(mockResponse(200, headers, data));
|
2023-04-09 15:20:10 +08:00
|
|
|
break;
|
|
|
|
case 'error':
|
2023-11-01 20:45:19 +08:00
|
|
|
config.success(mockResponse(500, headers, data));
|
2023-04-09 15:20:10 +08:00
|
|
|
break;
|
|
|
|
case 'fail':
|
2023-11-01 20:45:19 +08:00
|
|
|
config.fail(mockResponse(400, headers, data));
|
2023-04-09 15:20:10 +08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
after?.();
|
2023-04-02 23:27:45 +08:00
|
|
|
}
|
|
|
|
}, delay);
|
2023-04-09 15:20:10 +08:00
|
|
|
|
|
|
|
return {
|
|
|
|
abort() {
|
|
|
|
canceled = true;
|
|
|
|
},
|
|
|
|
};
|
2023-04-02 23:27:45 +08:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2023-04-03 21:03:33 +08:00
|
|
|
export function mockAdapter(options: MockAdapterOptions = {}) {
|
|
|
|
return mockAdapterBase('success', options);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function mockAdapterError(options: MockAdapterOptions = {}) {
|
|
|
|
return mockAdapterBase('error', options);
|
2023-04-02 23:27:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
export function mockAdapterFail(options: MockAdapterOptions = {}) {
|
2023-04-03 21:03:33 +08:00
|
|
|
return mockAdapterBase('fail', options);
|
2023-04-02 23:27:45 +08:00
|
|
|
}
|
2023-04-20 10:57:10 +08:00
|
|
|
|
2023-04-20 21:49:26 +08:00
|
|
|
export const methods = [
|
2023-04-22 16:12:32 +08:00
|
|
|
...PLAIN_METHODS,
|
|
|
|
...WITH_PARAMS_METHODS,
|
|
|
|
...WITH_DATA_METHODS,
|
2023-04-20 21:49:26 +08:00
|
|
|
];
|
|
|
|
|
|
|
|
export const testEachMethods = test.each(methods);
|
|
|
|
|
|
|
|
export function eachMethods(cb: (k: (typeof methods)[number]) => void) {
|
|
|
|
methods.forEach(cb);
|
|
|
|
}
|