284 lines
7.0 KiB
TypeScript
284 lines
7.0 KiB
TypeScript
/*
|
|
* Copyright 2025 coze-dev Authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import { isEqual } from 'lodash-es';
|
|
import { type JSONSchema7 } from 'json-schema';
|
|
import {
|
|
ROOT_KEY,
|
|
getArrayItemKey,
|
|
transDataWithStatus2Object,
|
|
transSchema2DataWithStatus,
|
|
} from '@coze-studio/mockset-shared';
|
|
|
|
import {
|
|
getMergedDataWithStatus,
|
|
mergeDataWithStatus,
|
|
safeJSONParse,
|
|
transMockData2DataWithStatus,
|
|
} from '../src/util/utils';
|
|
import {
|
|
MockDataStatus,
|
|
type MockDataValueType,
|
|
type MockDataWithStatus,
|
|
} from '../src/util/typings';
|
|
|
|
const testSchema: JSONSchema7 = {
|
|
$schema: 'https://json-schema.org/draft-07/schema',
|
|
required: ['num', 'str', 'bool'],
|
|
properties: {
|
|
bool: {
|
|
additionalProperties: false,
|
|
type: ['boolean'],
|
|
},
|
|
int: {
|
|
additionalProperties: false,
|
|
type: ['integer'],
|
|
},
|
|
num: {
|
|
additionalProperties: false,
|
|
type: ['number'],
|
|
},
|
|
str: {
|
|
additionalProperties: false,
|
|
type: ['string'],
|
|
},
|
|
},
|
|
additionalProperties: false,
|
|
type: ['object'],
|
|
};
|
|
|
|
const testMockA: MockDataWithStatus = {
|
|
children: [
|
|
{
|
|
description: undefined,
|
|
displayValue: 'false',
|
|
isRequired: true,
|
|
key: 'mock-bool',
|
|
label: 'bool',
|
|
status: 'added' as MockDataStatus,
|
|
type: 'boolean' as MockDataValueType,
|
|
realValue: false,
|
|
},
|
|
{
|
|
description: undefined,
|
|
displayValue: '0',
|
|
isRequired: false,
|
|
key: 'mock-int',
|
|
label: 'int',
|
|
status: 'added' as MockDataStatus,
|
|
type: 'integer' as MockDataValueType,
|
|
realValue: 0,
|
|
},
|
|
{
|
|
description: undefined,
|
|
displayValue: '0',
|
|
isRequired: true,
|
|
key: 'mock-num',
|
|
label: 'num',
|
|
status: 'added' as MockDataStatus,
|
|
type: 'number' as MockDataValueType,
|
|
realValue: 0,
|
|
},
|
|
{
|
|
description: undefined,
|
|
displayValue: '""',
|
|
isRequired: true,
|
|
key: 'mock-str',
|
|
label: 'str',
|
|
status: 'added' as MockDataStatus,
|
|
type: 'string' as MockDataValueType,
|
|
realValue: '',
|
|
},
|
|
],
|
|
description: undefined,
|
|
displayValue: undefined,
|
|
isRequired: false,
|
|
key: 'mock',
|
|
label: 'mock',
|
|
status: 'added' as MockDataStatus,
|
|
type: 'object' as MockDataValueType,
|
|
realValue: undefined,
|
|
};
|
|
|
|
const testMockAObj = { mock: { bool: false, int: 0, num: 0, str: '' } };
|
|
|
|
const testMockBStr = '{"bool":true,"num":2,"str":"hello","extra":"extra"}';
|
|
|
|
const testMockB: MockDataWithStatus = {
|
|
key: 'mock',
|
|
label: 'mock',
|
|
realValue: undefined,
|
|
displayValue: undefined,
|
|
isRequired: false,
|
|
type: 'object' as MockDataValueType,
|
|
status: 'removed' as MockDataStatus,
|
|
children: [
|
|
{
|
|
key: 'mock-bool',
|
|
label: 'bool',
|
|
realValue: true,
|
|
displayValue: 'true',
|
|
isRequired: false,
|
|
type: 'boolean' as MockDataValueType,
|
|
status: 'removed' as MockDataStatus,
|
|
},
|
|
{
|
|
key: 'mock-num',
|
|
label: 'num',
|
|
realValue: 2,
|
|
displayValue: '2',
|
|
isRequired: false,
|
|
type: 'number' as MockDataValueType,
|
|
status: 'removed' as MockDataStatus,
|
|
},
|
|
{
|
|
key: 'mock-str',
|
|
label: 'str',
|
|
realValue: 'hello',
|
|
displayValue: '"hello"',
|
|
isRequired: false,
|
|
type: 'string' as MockDataValueType,
|
|
status: 'removed' as MockDataStatus,
|
|
},
|
|
{
|
|
key: 'mock-extra',
|
|
label: 'extra',
|
|
realValue: 'extra',
|
|
displayValue: '"extra"',
|
|
isRequired: false,
|
|
type: 'string' as MockDataValueType,
|
|
status: 'removed' as MockDataStatus,
|
|
},
|
|
],
|
|
};
|
|
|
|
const testMergedMockData: MockDataWithStatus = {
|
|
key: 'mock',
|
|
label: 'mock',
|
|
description: undefined,
|
|
realValue: undefined,
|
|
displayValue: undefined,
|
|
isRequired: false,
|
|
type: 'object' as MockDataValueType,
|
|
status: 'added' as MockDataStatus,
|
|
children: [
|
|
{
|
|
description: undefined,
|
|
displayValue: 'true',
|
|
isRequired: true,
|
|
key: 'mock-bool',
|
|
label: 'bool',
|
|
status: 'default' as MockDataStatus,
|
|
type: 'boolean' as MockDataValueType,
|
|
realValue: true,
|
|
},
|
|
{
|
|
description: undefined,
|
|
displayValue: '0',
|
|
isRequired: false,
|
|
key: 'mock-int',
|
|
label: 'int',
|
|
status: 'added' as MockDataStatus,
|
|
type: 'integer' as MockDataValueType,
|
|
realValue: 0,
|
|
},
|
|
{
|
|
description: undefined,
|
|
displayValue: '2',
|
|
isRequired: true,
|
|
key: 'mock-num',
|
|
label: 'num',
|
|
status: 'default' as MockDataStatus,
|
|
type: 'number' as MockDataValueType,
|
|
realValue: 2,
|
|
},
|
|
{
|
|
description: undefined,
|
|
displayValue: '"hello"',
|
|
isRequired: true,
|
|
key: 'mock-str',
|
|
label: 'str',
|
|
status: 'default' as MockDataStatus,
|
|
type: 'string' as MockDataValueType,
|
|
realValue: 'hello',
|
|
},
|
|
{
|
|
key: 'mock-extra',
|
|
label: 'extra',
|
|
realValue: 'extra',
|
|
displayValue: '"extra"',
|
|
isRequired: false,
|
|
type: 'string' as MockDataValueType,
|
|
status: 'removed' as MockDataStatus,
|
|
},
|
|
],
|
|
};
|
|
|
|
describe('plugin-mock-data-utils', () => {
|
|
it('getArrayItemKey', () => {
|
|
const key = getArrayItemKey(1);
|
|
|
|
expect(key).toEqual('item_1');
|
|
});
|
|
|
|
it('transSchema2DataWithStatus', () => {
|
|
const data = transSchema2DataWithStatus(ROOT_KEY, testSchema);
|
|
const compareResult = isEqual(data, testMockA);
|
|
|
|
expect(compareResult).toEqual(true);
|
|
});
|
|
|
|
it('transDataWithStatus2Object', () => {
|
|
const data = transDataWithStatus2Object(testMockA);
|
|
const compareResult = isEqual(data, testMockAObj);
|
|
|
|
expect(compareResult).toEqual(true);
|
|
});
|
|
|
|
it('transMockData2DataWithStatus', () => {
|
|
const obj = safeJSONParse(testMockBStr);
|
|
const parsedMockData = transMockData2DataWithStatus(ROOT_KEY, obj, {
|
|
defaultStatus: MockDataStatus.REMOVED,
|
|
});
|
|
const compareResult = isEqual(parsedMockData, testMockB);
|
|
|
|
expect(compareResult).toEqual(true);
|
|
});
|
|
|
|
it('mergeDataWithStatus', () => {
|
|
const { merged: mergedMockData, incompatible } = mergeDataWithStatus(
|
|
testMockA.children,
|
|
testMockB.children,
|
|
);
|
|
const compareResult = isEqual(mergedMockData, testMergedMockData.children);
|
|
|
|
expect(compareResult).toEqual(true);
|
|
expect(incompatible).toEqual(true);
|
|
});
|
|
|
|
it('getMergedDataWithStatus', () => {
|
|
const { result: mergedMockData, incompatible } = getMergedDataWithStatus(
|
|
testMockA,
|
|
testMockBStr,
|
|
);
|
|
|
|
const compareResult = isEqual(mergedMockData, testMergedMockData);
|
|
|
|
expect(compareResult).toEqual(true);
|
|
expect(incompatible).toEqual(true);
|
|
});
|
|
});
|