UNPKG

mares-tcomb-domain-helper

Version:

domain layer에서 tcomb를 이용하여 구현시, private method가 담기는 helper의 최상단 클래스입니다.

246 lines (231 loc) 5.63 kB
const should = require('should') const BaseDomainHelper = require('./index') const t = require('tcomb-validation') const _ = require('lodash') const MaresTcombError = require('mares-tcomb-error') suite('Module BaseTcombDomainHelper Test', () => { suiteSetup(async () => { this.Test = t.struct({ id: t.String, title: t.maybe(t.String), value: t.Integer, country: t.maybe(t.enums.of(['KR', 'US'])), list: t.list(t.struct({ name: t.String, age: t.maybe(t.Number) })) }) this.NestedTest = t.struct({ name1: t.maybe(t.String), array1: t.maybe(t.list(t.maybe(t.struct({name: t.maybe(t.String)})))), object2: t.maybe(t.struct({ name2: t.maybe(t.String), array2: t.list(t.String) })) }) }) suite('combine method', () => { test('combine nested Object', () => { const mock = { name1: 'hello', array1: [{ name: 'hello' }, { name: 'hello' }], object2: { name2: 'hello', array2: [ 'OinA1', 'OinA2', 'hello' ] } } let template = BaseDomainHelper.generate(this.NestedTest, mock) const combineMock = { name1: 'hi', array1: [{ name: 'hi' }], object2: { array2: [ undefined, undefined, 'asdf' ] } } let combine = BaseDomainHelper.deeplyCombine(template, combineMock, ['array1', 'object2.array2']) combine.name1.should.eql('hi') combine.array1[0].name.should.eql('hi') combine.array1[1].name.should.eql('hello') combine.object2.name2.should.eql('hello') combine.object2.array2[0].should.eql('OinA1') combine.object2.array2[1].should.eql('OinA2') combine.object2.array2[2].should.eql('asdf') }) test('combine nested Object with null', () => { const mock = { name1: 'hello', array1: [{ name: 'hello' }, { name: 'hello' }], object2: { name2: 'hello', array2: [ 'OinA1', 'OinA2', 'hello' ] } } let template = BaseDomainHelper.generate(this.NestedTest, mock) const combineMock = { name1: 'hi', array1: [null, { name: null }], object2: null } let combine = BaseDomainHelper.deeplyCombine(template, combineMock, ['array1', 'object2.array2']) combine.name1.should.eql('hi') true.should.be.eql(combine.array1[0] === null) true.should.be.eql(combine.array1[1].name === null) true.should.be.eql(combine.object2 === null) }) test('combine nested Object with null. array just set', () => { const mock = { name1: 'hello', array1: [{ name: 'hello' }, { name: 'hello' }], object2: { name2: 'hello', array2: [ 'OinA1', 'OinA2', 'hello' ] } } let template = BaseDomainHelper.generate(this.NestedTest, mock) const combineMock = { name1: 'hi', array1: [{ name: 'hi' }], object2: { array2: [ 'hello' ] } } let combine = BaseDomainHelper.deeplyCombine(template, combineMock) combine.name1.should.eql('hi') true.should.be.eql(combine.array1[0].name === 'hi') should.not.exists(combine.array1[1]) true.should.be.eql(combine.object2.array2[0] === 'hello') true.should.be.eql(combine.object2.name2 ==='hello') should.not.exists(combine.object2.array2[1]) }) }) suite('getCodes method', () => { test('get codes should equal MaresTcombErrors codes', () => { const codes = BaseDomainHelper.getCodes() const maresTcombErrorCodes = MaresTcombError.codes codes.should.eql(maresTcombErrorCodes) }) }) suite('generate method', async () => { test('should create domain', () => { const mock = { id: 'id', title: 'title', value: 10, country: 'KR', list: [{ name: 'name', age: 100 }, { name: 'name2', age: 101 }] } let template = BaseDomainHelper.generate(this.Test, mock) template.should.property('id', mock.id) }) test('should fail to create domain with invalid parameters', () => { const codes = BaseDomainHelper.getCodes() const mock = { id: 1, title: 'title', value: '10', country: 'AA', list: [{ name: 'name', age: 100 }, { name: null, age: 101 }] } try { BaseDomainHelper.generate(this.Test, mock) } catch (e) { let error = e.getError() let object = _.keyBy(error.body.rows, 'param') object.id.should.property('code', codes.invalidType) object.value.should.property('code', codes.invalidType) object.country.should.property('code', codes.invalidType) object['list.1.name'].should.property('code', codes.invalidType) } }) }) suite('generate method', async () => { test('should create domain', () => { let mock = { id: 'id', title: 'title', value: 10, country: 'KR', list: [{ name: 'name', age: 100 }, { name: 'name2', age: 101 }] } let domain = BaseDomainHelper.generate(this.Test, mock) domain = BaseDomainHelper.combine(domain, { id: '100' }) domain.id.should.eql('100') }) test('should create domain', () => { let mock = { id: 'id', title: 'title', value: 10, country: 'KR', list: [{ name: 'name', age: 100 }, { name: 'name2', age: 101 }] } let domain = BaseDomainHelper.generate(this.Test, mock) try { BaseDomainHelper.combine(domain, { id: 100 }) } catch (e) { let error = e.getError() error.status.should.eql(400) let obj = _.keyBy(error.body.rows, 'param') obj.id.should.property('code', BaseDomainHelper.getCodes().invalidType) } }) }) suiteTeardown(() => { }) })