mares-tcomb-domain-helper
Version:
domain layer에서 tcomb를 이용하여 구현시, private method가 담기는 helper의 최상단 클래스입니다.
246 lines (231 loc) • 5.63 kB
JavaScript
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(() => {
})
})