mutants-appfx
Version:
appfx module
415 lines (363 loc) • 9 kB
JavaScript
import DataModel from '../src/datamodels/DataModel';
import {
expect
} from 'chai';
import fs from 'fs';
describe('数据模型', () => {
it('支持string, object, array, number, boolean, date, reference 数据类型', () => {
const data = new DataModel({
id: 'string',
code: 'string',
name: 'string',
detail: [{
id: 'string',
price: 'number',
count: 'number',
ivnt: {
type: 'ref',
fields: {
id: 'string',
name: 'string'
}
}
}],
total: 'number'
}, 'testmodel1');
expect(data.toJS()).to.deep.equal({
id: null,
code: null,
name: null,
detail: [],
total: null
});
data.merge({
id: 'a0000000000001',
code: 'T-AAA',
name: 'aaaaaaaaaaaaaa',
detail: [{
id: '001',
ivnt: {
id: 'b0002',
name: 'bbbbbbbbbbbbb'
},
price: 2,
count: 10
}],
total: 20
})
expect(data.toJS()).to.deep.equal({
id: 'a0000000000001',
code: 'T-AAA',
name: 'aaaaaaaaaaaaaa',
detail: [{
id: '001',
ivnt: {
id: 'b0002',
name: 'bbbbbbbbbbbbb'
},
price: 2,
count: 10
}],
total: 20
});
})
it('支持偏平对象赋值', () => {
const data = new DataModel({
user: {
home: {
id: 'string',
address: 'string',
phone: 'string'
}
},
}, 'testmodel2');
data.merge({
userHomeId: 'h001',
userHomeAddress: 'xxxxxxxxxxxx', // => user.home.address
userHomePhone: '13122222222', // => user.home.phone
})
expect(data.toJS()).to.deep.equal({
user: {
home: {
id: 'h001',
address: 'xxxxxxxxxxxx',
phone: '13122222222',
}
},
});
})
it('大对象加载,和循环引用对象', () => {
const json = JSON.parse(fs.readFileSync(__dirname + '/dataInfo.json'));
const data = new DataModel(json, 'bigModel');
// 必须在--timeout 20000内结束
//console.log(data.toJS())
expect(data.RetailDetails.length).to.be.equal(0);
const detail = {
Code: "aa003",
Idinventory: 3, // 没定义
Inventory: {
ID: 3,
Code: "aa003",
Name: "榴莲"
},
Quantity: 1,
TaxPrice: 0,
Unit: {
Name: "个"
},
key: "aa003" // 这个没有定义
}
data.pushValue('RetailDetails', detail);
expect(data.RetailDetails.length).to.be.equal(1);
//console.log(data.RetailDetails[0].Inventory)
expect(data.RetailDetails[0]).to.deep.include({
Code: "aa003",
// Inventory: {
// ID: 3,
// Code: "aa003",
// Name: "榴莲"
// },
Quantity: 1,
TaxPrice: 0,
});
expect(data.RetailDetails[0].Inventory).to.deep.include({
ID: 3,
Code: "aa003",
Name: "榴莲"
});
})
it('引用类型会被数据裁剪,只保留id', () => {
const data = new DataModel({
id: 'string',
code: 'string',
name: 'string',
user: {
home: {
id: 'string',
address: 'string',
phone: 'string'
}
},
detail: [{
id: 'string',
price: 'number',
count: 'number',
ivnt: {
type: 'ref',
fields: {
id: 'string',
name: 'string'
}
}
}],
total: 'number'
}, 'testmodel3');
data.merge({
code: 'T-AAA',
name: 'aaaaaaaaaaaaaa',
userHomeId: 'h001',
userHomeAddress: 'xxxxxxxxxxxx', // => user.home.address
userHomePhone: '13122222222', // => user.home.phone
detail: [{
id: '001',
price: 2,
count: 10,
ivnt: {
id: 'b0002',
name: 'bbbbbbbbbbbbb'
},
}],
total: 20
})
//console.log('data',data.toJS())
expect(data.cut()).to.deep.equal({
code: 'T-AAA',
name: 'aaaaaaaaaaaaaa',
user: { // 这一层没有id
// home: {
// id: 'h001', // 引用类型会被数据裁剪,只保留id
// }
},
id: null,
detail: [{
id: '001',
price: 2,
count: 10,
ivnt: {
id: 'b0002', // 引用类型会被数据裁剪,只保留id
}
}],
total: 20
});
})
it('可以直接赋值一个子对象', () => {
const data = new DataModel({
id: 'string',
code: 'string',
name: 'string',
detail: [{
id: 'string',
price: 'number',
count: 'number',
ivnt: {
type: 'ref',
fields: {
id: 'string',
name: 'string'
}
}
}]
}, 'testmodel4');
const initObj = data.toJS();
data.code = 'XXXX-AAAA-BBBB'; // 简单字段直接赋值
// 添加明细
data.pushValue('detail', { // 数组可以pushValue
id: '001',
ivnt: {
id: 'ref001',
name: 'xxxxxxxxxxx'
}
});
expect(data.toJS()).to.deep.equal({
code: 'XXXX-AAAA-BBBB',
name: null,
id: null,
detail: [{
id: '001',
price: null, // 需要补全
count: null,
ivnt: {
id: 'ref001',
name: 'xxxxxxxxxxx'
}
}]
});
//console.log(data.detail[0])
data.setValue('detail[0].price', 100);
try {
data.setValue('detail[0].price2', 100);
expect.fail();
} catch (err) {
expect(err.message).to.eql('price2 not defined!')
}
// 修改明细存货参照
data.setValue('detail[0].ivnt', { // 对象可以直接赋值
id: 'ref002',
});
try {
data.setValue('detail[0].ivnt', {
id2: 'xxxxxx'
});
expect.fail();
} catch (err) {
expect(err.message).to.eql('id2 not defined!')
}
expect(data.toJS()).to.deep.equal({
code: 'XXXX-AAAA-BBBB',
name: null,
id: null,
detail: [{
id: '001',
price: 100,
count: null,
ivnt: {
id: 'ref002',
name: null
}
}]
});
})
it('支持初始化', () => {
const data = new DataModel({
id: 'string',
code: 'string',
name: 'string',
detail: [{
id: 'string',
price: 'number',
count: 'number',
ivnt: {
type: 'ref',
fields: {
id: 'string',
name: 'string'
}
}
}]
}, 'testmodel_init');
const initObj = data.toJS();
data.code = 'XXXX-AAAA-BBBB'; // 简单字段直接赋值
// 添加明细
data.pushValue('detail', { // 数组可以pushValue
id: '001',
ivnt: {
id: 'ref001',
name: 'xxxxxxxxxxx'
}
});
// 清空
data.restore();
expect(data.toJS()).to.deep.equal(initObj);
})
it('快照回滚特性', () => {
const data = new DataModel({
id: 'string',
code: 'string',
name: 'string',
member: {
id: 'string',
code: 'string',
name: 'string',
},
detail: [{
id: 'string',
price: 'number',
count: 'number',
ivnt: {
type: 'ref',
fields: {
id: 'string',
name: 'string'
}
}
}]
}, 'Snapshot');
// 初始值
data.code = 'XXXX-AAAA-BBBB';
data.setValue('member', {
id: 1,
name: '0001',
code: '0001'
})
// 快照
const snapshot = data.toJS();
// 可以回滚简单数据
data.code = '111111111';
// 可以回滚对象
data.member.id = 2;
data.member.name = '002';
data.member.code = '002';
// 可以回滚数组
data.pushValue('detail', {
price: 100,
count: 20
});
// 回滚
data.restore(snapshot);
expect(data.toJS()).to.deep.equal(snapshot);
})
it('支持简单数据类型集合', () => {
const json = JSON.parse(fs.readFileSync(__dirname + '/datainfo_elementType.json'));
const data = new DataModel(json, 'elementTypeModel');
expect(data.RetailCouponDetails.length).to.be.equal(0);
data.pushValue('RetailCouponDetails', {});
expect(data.RetailCouponDetails[0].DynamicPropertyKeys.slice()).to.be.deep.equal([]);
expect(data.RetailCouponDetails[0].DynamicPropertyValues.slice()).to.be.deep.equal([]);
data.RetailCouponDetails[0].DynamicPropertyKeys.push('freeitem1');
data.RetailCouponDetails[0].DynamicPropertyValues.push('red');
expect(data.RetailCouponDetails[0].DynamicPropertyKeys.slice()).to.be.deep.equal(['freeitem1']);
expect(data.RetailCouponDetails[0].DynamicPropertyValues.slice()).to.be.deep.equal(['red']);
// 必须在--timeout 20000内结束
//console.log(data.cut())
})
})