mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-12 19:52:51 +00:00
560 lines
16 KiB
TypeScript
560 lines
16 KiB
TypeScript
// @ts-nocheck
|
|
const mockJsonp = jest.fn();
|
|
const mockRequest = jest.fn();
|
|
const mockGet = jest.fn();
|
|
const mockPost = jest.fn();
|
|
jest.mock('../../src/utils/request', () => {
|
|
return {
|
|
jsonp: (uri, params, headers, otherProps) => {
|
|
return new Promise((resolve, reject) => {
|
|
resolve(mockJsonp(uri, params, headers, otherProps));
|
|
});
|
|
},
|
|
request: (uri, params, headers, otherProps) => {
|
|
return new Promise((resolve, reject) => {
|
|
resolve(mockRequest(uri, params, headers, otherProps));
|
|
});
|
|
},
|
|
get: (uri, params, headers, otherProps) => {
|
|
return new Promise((resolve, reject) => {
|
|
resolve(mockGet(uri, params, headers, otherProps));
|
|
});
|
|
},
|
|
post: (uri, params, headers, otherProps) => {
|
|
return new Promise((resolve, reject) => {
|
|
resolve(mockPost(uri, params, headers, otherProps));
|
|
});
|
|
},
|
|
};
|
|
});
|
|
|
|
import { DataHelper, doRequest } from '../../src/utils/data-helper';
|
|
import { parseData } from '../../src/utils/common';
|
|
|
|
describe('test DataHelper ', () => {
|
|
beforeEach(() => {
|
|
jest.resetModules();
|
|
})
|
|
it('can be inited', () => {
|
|
const mockHost = {};
|
|
let mockDataSourceConfig = {};
|
|
const mockAppHelper = {};
|
|
const mockParser = (config: any) => parseData(config);
|
|
let dataHelper = new DataHelper(mockHost, mockDataSourceConfig, mockAppHelper, mockParser);
|
|
|
|
expect(dataHelper).toBeTruthy();
|
|
expect(dataHelper.host).toBe(mockHost);
|
|
expect(dataHelper.config).toBe(mockDataSourceConfig);
|
|
expect(dataHelper.appHelper).toBe(mockAppHelper);
|
|
expect(dataHelper.parser).toBe(mockParser);
|
|
|
|
|
|
dataHelper = new DataHelper(mockHost, undefined, mockAppHelper, mockParser);
|
|
expect(dataHelper.config).toStrictEqual({});
|
|
expect(dataHelper.ajaxList).toStrictEqual([]);
|
|
|
|
mockDataSourceConfig = {
|
|
list: [
|
|
{
|
|
id: 'ds1',
|
|
}, {
|
|
id: 'ds2',
|
|
},
|
|
]
|
|
};
|
|
dataHelper = new DataHelper(mockHost, mockDataSourceConfig, mockAppHelper, mockParser);
|
|
expect(dataHelper.config).toBe(mockDataSourceConfig);
|
|
expect(dataHelper.ajaxList.length).toBe(2);
|
|
expect(dataHelper.ajaxMap.ds1).toStrictEqual({
|
|
id: 'ds1',
|
|
});
|
|
});
|
|
it('should handle generateDataSourceMap properly in constructor', () => {
|
|
const mockHost = {};
|
|
let mockDataSourceConfig = {};
|
|
const mockAppHelper = {};
|
|
const mockParser = (config: any) => parseData(config);
|
|
let dataHelper = new DataHelper(mockHost, mockDataSourceConfig, mockAppHelper, mockParser);
|
|
|
|
// test generateDataSourceMap logic
|
|
mockDataSourceConfig = {
|
|
list: [
|
|
{
|
|
id: 'getInfo',
|
|
isInit: true,
|
|
type: 'fetch', // fetch/mtop/jsonp/custom
|
|
options: {
|
|
uri: 'mock/info.json',
|
|
method: 'GET',
|
|
params: { a: 1 },
|
|
timeout: 5000,
|
|
},
|
|
}, {
|
|
id: 'postInfo',
|
|
isInit: true,
|
|
type: 'fetch',
|
|
options: {
|
|
uri: 'mock/info.json',
|
|
method: 'POST',
|
|
params: { a: 1 },
|
|
timeout: 5000,
|
|
},
|
|
},
|
|
]
|
|
};
|
|
dataHelper = new DataHelper(mockHost, mockDataSourceConfig, mockAppHelper, mockParser);
|
|
expect(Object.keys(dataHelper.dataSourceMap).length).toBe(2);
|
|
expect(dataHelper.dataSourceMap.getInfo.status).toBe('init');
|
|
expect(typeof dataHelper.dataSourceMap.getInfo.load).toBe('function');
|
|
});
|
|
|
|
it('getInitDataSourseConfigs should work', () => {
|
|
const mockHost = {};
|
|
let mockDataSourceConfig = {};
|
|
const mockAppHelper = {};
|
|
const mockParser = (config: any) => parseData(config);
|
|
|
|
// test generateDataSourceMap logic
|
|
mockDataSourceConfig = {
|
|
list: [
|
|
{
|
|
id: 'getInfo',
|
|
isInit: true,
|
|
type: 'fetch', // fetch/mtop/jsonp/custom
|
|
options: {
|
|
uri: 'mock/info.json',
|
|
method: 'GET',
|
|
params: { a: 1 },
|
|
timeout: 5000,
|
|
},
|
|
},
|
|
{
|
|
id: 'postInfo',
|
|
isInit: false,
|
|
type: 'fetch',
|
|
options: {
|
|
uri: 'mock/info.json',
|
|
method: 'POST',
|
|
params: { a: 1 },
|
|
timeout: 5000,
|
|
},
|
|
},
|
|
{
|
|
id: 'getInfoLater',
|
|
isInit: false,
|
|
type: 'fetch',
|
|
options: {
|
|
uri: 'mock/info.json',
|
|
method: 'POST',
|
|
params: { a: 1 },
|
|
timeout: 5000,
|
|
},
|
|
},
|
|
{
|
|
id: 'getInfoLater2',
|
|
isInit: 'not a valid boolean',
|
|
type: 'fetch',
|
|
options: {
|
|
uri: 'mock/info.json',
|
|
method: 'POST',
|
|
params: { a: 1 },
|
|
timeout: 5000,
|
|
},
|
|
},
|
|
],
|
|
};
|
|
|
|
const dataHelper = new DataHelper(mockHost, mockDataSourceConfig, mockAppHelper, mockParser);
|
|
expect(dataHelper.getInitDataSourseConfigs().length).toBe(1);
|
|
expect(dataHelper.getInitDataSourseConfigs()[0].id).toBe('getInfo');
|
|
});
|
|
it('util function doRequest should work', () => {
|
|
doRequest('jsonp', {
|
|
uri: 'https://www.baidu.com',
|
|
params: { a: 1 },
|
|
otherStuff1: 'aaa',
|
|
});
|
|
expect(mockJsonp).toBeCalled();
|
|
|
|
// test GET
|
|
doRequest('fetch', {
|
|
uri: 'https://www.baidu.com',
|
|
method: 'get',
|
|
params: { a: 1 },
|
|
otherStuff1: 'aaa',
|
|
});
|
|
expect(mockGet).toBeCalled();
|
|
|
|
mockGet.mockClear();
|
|
doRequest('fetch', {
|
|
uri: 'https://www.baidu.com',
|
|
method: 'Get',
|
|
params: { a: 1 },
|
|
otherStuff1: 'aaa',
|
|
});
|
|
expect(mockGet).toBeCalled();
|
|
|
|
mockGet.mockClear();
|
|
doRequest('fetch', {
|
|
uri: 'https://www.baidu.com',
|
|
method: 'GET',
|
|
params: { a: 1 },
|
|
otherStuff1: 'aaa',
|
|
});
|
|
expect(mockGet).toBeCalled();
|
|
|
|
mockGet.mockClear();
|
|
|
|
// test POST
|
|
doRequest('fetch', {
|
|
uri: 'https://www.baidu.com',
|
|
method: 'post',
|
|
params: { a: 1 },
|
|
otherStuff1: 'aaa',
|
|
});
|
|
expect(mockPost).toBeCalled();
|
|
mockPost.mockClear();
|
|
|
|
doRequest('fetch', {
|
|
uri: 'https://www.baidu.com',
|
|
method: 'POST',
|
|
params: { a: 1 },
|
|
otherStuff1: 'aaa',
|
|
});
|
|
expect(mockPost).toBeCalled();
|
|
mockPost.mockClear();
|
|
doRequest('fetch', {
|
|
uri: 'https://www.baidu.com',
|
|
method: 'Post',
|
|
params: { a: 1 },
|
|
otherStuff1: 'aaa',
|
|
});
|
|
expect(mockPost).toBeCalled();
|
|
mockPost.mockClear();
|
|
|
|
// test default
|
|
doRequest('fetch', {
|
|
uri: 'https://www.baidu.com',
|
|
method: 'whatever',
|
|
params: { a: 1 },
|
|
otherStuff1: 'aaa',
|
|
});
|
|
expect(mockRequest).toBeCalled();
|
|
mockRequest.mockClear();
|
|
mockGet.mockClear();
|
|
|
|
// method will be GET when not provided
|
|
doRequest('fetch', {
|
|
uri: 'https://www.baidu.com',
|
|
params: { a: 1 },
|
|
otherStuff1: 'aaa',
|
|
});
|
|
expect(mockRequest).toBeCalledTimes(0);
|
|
expect(mockGet).toBeCalledTimes(1);
|
|
|
|
mockRequest.mockClear();
|
|
mockGet.mockClear();
|
|
mockPost.mockClear();
|
|
mockJsonp.mockClear();
|
|
|
|
doRequest('someOtherType', {
|
|
uri: 'https://www.baidu.com',
|
|
params: { a: 1 },
|
|
otherStuff1: 'aaa',
|
|
});
|
|
expect(mockRequest).toBeCalledTimes(0);
|
|
expect(mockGet).toBeCalledTimes(0);
|
|
expect(mockPost).toBeCalledTimes(0);
|
|
expect(mockJsonp).toBeCalledTimes(0);
|
|
});
|
|
it('updateDataSourceMap should work', () => {
|
|
const mockHost = {};
|
|
const mockDataSourceConfig = {
|
|
list: [
|
|
{
|
|
id: 'ds1',
|
|
}, {
|
|
id: 'ds2',
|
|
},
|
|
]
|
|
};
|
|
const mockAppHelper = {};
|
|
const mockParser = (config: any) => parseData(config);
|
|
const dataHelper = new DataHelper(mockHost, mockDataSourceConfig, mockAppHelper, mockParser);
|
|
dataHelper.updateDataSourceMap('ds1', { a: 1 }, null);
|
|
expect(dataHelper.dataSourceMap['ds1']).toBeTruthy();
|
|
expect(dataHelper.dataSourceMap['ds1'].data).toStrictEqual({ a: 1 });
|
|
expect(dataHelper.dataSourceMap['ds1'].error).toBeUndefined();
|
|
expect(dataHelper.dataSourceMap['ds1'].status).toBe('loaded');
|
|
dataHelper.updateDataSourceMap('ds2', { b: 2 }, new Error());
|
|
expect(dataHelper.dataSourceMap['ds2']).toBeTruthy();
|
|
expect(dataHelper.dataSourceMap['ds2'].data).toStrictEqual({ b: 2 });
|
|
expect(dataHelper.dataSourceMap['ds2'].status).toBe('error');
|
|
expect(dataHelper.dataSourceMap['ds2'].error).toBeTruthy();
|
|
});
|
|
|
|
it('handleData should work', () => {
|
|
const mockHost = { stateA: 'aValue'};
|
|
const mockDataSourceConfig = {
|
|
list: [
|
|
{
|
|
id: 'fullConfigGet',
|
|
isInit: true,
|
|
options: {
|
|
params: {},
|
|
method: 'GET',
|
|
isCors: true,
|
|
timeout: 5000,
|
|
headers: {},
|
|
uri: 'mock/info.json',
|
|
},
|
|
shouldFetch: {
|
|
type: 'JSFunction',
|
|
value: 'function() { return true; }',
|
|
},
|
|
dataHandler: {
|
|
type: 'JSFunction',
|
|
value: 'function(res) { return res.data; }',
|
|
},
|
|
errorHandler: {
|
|
type: 'JSFunction',
|
|
value: 'function(error) {}',
|
|
},
|
|
willFetch: {
|
|
type: 'JSFunction',
|
|
value: 'function(options) { return options; }',
|
|
},
|
|
},
|
|
]
|
|
};
|
|
const mockAppHelper = {};
|
|
const mockParser = (config: any) => parseData(config);
|
|
const dataHelper = new DataHelper(mockHost, mockDataSourceConfig, mockAppHelper, mockParser);
|
|
// test valid case
|
|
let mockDataHandler = {
|
|
type: 'JSFunction',
|
|
value: 'function(res) { return res.data + \'+\' + this.stateA; }',
|
|
};
|
|
let result = dataHelper.handleData('fullConfigGet', mockDataHandler, { data: 'mockDataValue' }, null);
|
|
expect(result).toBe('mockDataValue+aValue');
|
|
|
|
// test invalid datahandler
|
|
mockDataHandler = {
|
|
type: 'not a JSFunction',
|
|
value: 'function(res) { return res.data + \'+\' + this.stateA; }',
|
|
};
|
|
result = dataHelper.handleData('fullConfigGet', mockDataHandler, { data: 'mockDataValue' }, null);
|
|
expect(result).toStrictEqual({ data: 'mockDataValue' });
|
|
|
|
// exception with id
|
|
mockDataHandler = {
|
|
type: 'JSFunction',
|
|
value: 'function(res) { return res.data + \'+\' + JSON.parse({a:1}); }',
|
|
};
|
|
result = dataHelper.handleData('fullConfigGet', mockDataHandler, { data: 'mockDataValue' }, null);
|
|
expect(result).toBeUndefined();
|
|
|
|
// exception without id
|
|
mockDataHandler = {
|
|
type: 'JSFunction',
|
|
value: 'function(res) { return res.data + \'+\' + JSON.parse({a:1}); }',
|
|
};
|
|
result = dataHelper.handleData(null, mockDataHandler, { data: 'mockDataValue' }, null);
|
|
expect(result).toBeUndefined();
|
|
});
|
|
|
|
it('updateConfig should work', () => {
|
|
const mockHost = { stateA: 'aValue'};
|
|
const mockDataSourceConfig = {
|
|
list: [
|
|
{
|
|
id: 'ds1',
|
|
}, {
|
|
id: 'ds2',
|
|
},
|
|
{
|
|
id: 'fullConfigGet',
|
|
isInit: true,
|
|
options: {
|
|
params: {},
|
|
method: 'GET',
|
|
isCors: true,
|
|
timeout: 5000,
|
|
headers: {},
|
|
uri: 'mock/info.json',
|
|
},
|
|
shouldFetch: {
|
|
type: 'JSFunction',
|
|
value: 'function() { return true; }',
|
|
},
|
|
dataHandler: {
|
|
type: 'JSFunction',
|
|
value: 'function(res) { return res.data; }',
|
|
},
|
|
errorHandler: {
|
|
type: 'JSFunction',
|
|
value: 'function(error) {}',
|
|
},
|
|
willFetch: {
|
|
type: 'JSFunction',
|
|
value: 'function(options) { return options; }',
|
|
},
|
|
},
|
|
]
|
|
};
|
|
const mockAppHelper = {};
|
|
const mockParser = (config: any) => parseData(config);
|
|
const dataHelper = new DataHelper(mockHost, mockDataSourceConfig, mockAppHelper, mockParser);
|
|
|
|
expect(dataHelper.ajaxList.length).toBe(3);
|
|
|
|
let updatedConfig = {
|
|
list: [
|
|
{
|
|
id: 'ds2',
|
|
},
|
|
{
|
|
id: 'fullConfigGet',
|
|
},
|
|
]
|
|
};
|
|
dataHelper.updateConfig(updatedConfig);
|
|
|
|
expect(dataHelper.ajaxList.length).toBe(2);
|
|
expect(dataHelper.dataSourceMap.ds1).toBeUndefined();
|
|
|
|
updatedConfig = {
|
|
list: [
|
|
{
|
|
id: 'ds2',
|
|
},
|
|
{
|
|
id: 'fullConfigGet',
|
|
},
|
|
{
|
|
id: 'ds3',
|
|
},
|
|
]
|
|
};
|
|
dataHelper.updateConfig(updatedConfig);
|
|
expect(dataHelper.ajaxList.length).toBe(3);
|
|
expect(dataHelper.dataSourceMap.ds3).toBeTruthy();
|
|
});
|
|
|
|
it('getInitData should work', () => {
|
|
const mockHost = { stateA: 'aValue'};
|
|
const mockDataSourceConfig = {
|
|
list: [
|
|
{
|
|
id: 'ds1',
|
|
}, {
|
|
id: 'ds2',
|
|
},
|
|
{
|
|
id: 'fullConfigGet',
|
|
isInit: true,
|
|
type: 'fetch',
|
|
options: {
|
|
params: {},
|
|
method: 'GET',
|
|
isCors: true,
|
|
timeout: 5000,
|
|
headers: {
|
|
headerA: 1,
|
|
},
|
|
uri: 'mock/info.json',
|
|
},
|
|
shouldFetch: {
|
|
type: 'JSFunction',
|
|
value: 'function() { return true; }',
|
|
},
|
|
dataHandler: {
|
|
type: 'JSFunction',
|
|
value: 'function(res) { return 123; }',
|
|
},
|
|
errorHandler: {
|
|
type: 'JSFunction',
|
|
value: 'function(error) {}',
|
|
},
|
|
willFetch: {
|
|
type: 'JSFunction',
|
|
value: 'function(options) { return options; }',
|
|
},
|
|
},
|
|
]
|
|
};
|
|
const mockAppHelper = {};
|
|
const mockParser = (config: any) => parseData(config);
|
|
const dataHelper = new DataHelper(mockHost, mockDataSourceConfig, mockAppHelper, mockParser);
|
|
|
|
expect(dataHelper.ajaxList.length).toBe(3);
|
|
expect(mockGet).toBeCalledTimes(0);
|
|
dataHelper.getInitData().then(res => {
|
|
expect(mockGet).toBeCalledTimes(1);
|
|
expect(mockGet).toBeCalledWith('mock/info.json', {}, {
|
|
headerA: 1,
|
|
}, expect.anything());
|
|
mockGet.mockClear();
|
|
});
|
|
});
|
|
|
|
it('getDataSource should work', () => {
|
|
const mockHost = { stateA: 'aValue'};
|
|
const mockDataSourceConfig = {
|
|
list: [
|
|
{
|
|
id: 'ds1',
|
|
}, {
|
|
id: 'ds2',
|
|
},
|
|
{
|
|
id: 'fullConfigGet',
|
|
isInit: true,
|
|
type: 'fetch',
|
|
options: {
|
|
params: {},
|
|
method: 'GET',
|
|
isCors: true,
|
|
timeout: 5000,
|
|
headers: {
|
|
headerA: 1,
|
|
},
|
|
uri: 'mock/info.json',
|
|
},
|
|
shouldFetch: {
|
|
type: 'JSFunction',
|
|
value: 'function() { return true; }',
|
|
},
|
|
dataHandler: {
|
|
type: 'JSFunction',
|
|
value: 'function(res) { return 123; }',
|
|
},
|
|
errorHandler: {
|
|
type: 'JSFunction',
|
|
value: 'function(error) {}',
|
|
},
|
|
willFetch: {
|
|
type: 'JSFunction',
|
|
value: 'function(options) { return options; }',
|
|
},
|
|
},
|
|
]
|
|
};
|
|
const mockAppHelper = {};
|
|
const mockParser = (config: any) => parseData(config);
|
|
const dataHelper = new DataHelper(mockHost, mockDataSourceConfig, mockAppHelper, mockParser);
|
|
|
|
expect(dataHelper.ajaxList.length).toBe(3);
|
|
expect(mockGet).toBeCalledTimes(0);
|
|
const callbackFn = jest.fn();
|
|
dataHelper.getDataSource('fullConfigGet', { param1: 'value1' }, {}, callbackFn).then(res => {
|
|
expect(mockGet).toBeCalledTimes(1);
|
|
expect(mockGet).toBeCalledWith('mock/info.json', { param1: 'value1' }, {
|
|
headerA: 1,
|
|
}, expect.anything());
|
|
mockGet.mockClear();
|
|
expect(callbackFn).toBeCalledTimes(1);
|
|
});
|
|
});
|
|
});
|