UNPKG

mutants-appfx

Version:

appfx module

415 lines (363 loc) 9 kB
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()) }) })