Skip to content

Commit ba3e43c

Browse files
authored
Merge pull request #7 from mrbrunelli/refactor/test-suite
Refactors test suite
2 parents 437530e + 6ceb241 commit ba3e43c

8 files changed

Lines changed: 199 additions & 145 deletions

index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
import Validate from './lib/validate'
1+
import { ObjectValidator } from './lib/object-validator'
22

3-
export default new Validate()
3+
export default new ObjectValidator()

lib/object-validator.spec.ts

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
import { Validator } from './object-validator.types'
2+
import { ObjectValidator } from './object-validator'
3+
import mainObjectValidator from '../'
4+
5+
class PayloadBuilder {
6+
private payload = {
7+
status: 200,
8+
data: {
9+
serviceName: 'DatasetSP.save',
10+
error: null,
11+
status: '1',
12+
pendingPrinting: false,
13+
transactionId: '6788329C5763C2982A9537E6DD1D122D',
14+
responseBody: {
15+
total: 0,
16+
entities: {
17+
entity: {
18+
data: ''
19+
}
20+
}
21+
}
22+
}
23+
}
24+
25+
static aPayload() {
26+
return new PayloadBuilder()
27+
}
28+
29+
private reset() {
30+
this.payload = {} as any
31+
}
32+
33+
setStatus(s: any) {
34+
this.payload.status = s
35+
return this
36+
}
37+
38+
setData(key: any, value: any) {
39+
this.payload.data[key] = value
40+
return this
41+
}
42+
43+
build() {
44+
const payload = this.payload
45+
this.reset()
46+
return payload
47+
}
48+
}
49+
50+
describe('ObjectValidator', () => {
51+
let sut: Validator
52+
let payload: PayloadBuilder
53+
54+
beforeEach(() => {
55+
sut = new ObjectValidator()
56+
payload = PayloadBuilder.aPayload()
57+
})
58+
59+
test('should be valid if fields match with provided payload entries', () => {
60+
const p = payload.build()
61+
62+
const isValid = sut.isValid(p, [
63+
['status'],
64+
['data.status'],
65+
['data.responseBody.entities.entity']
66+
])
67+
68+
expect(isValid).toBeTruthy()
69+
})
70+
71+
test('should be valid if fields are repeated and match with provided payload entries', () => {
72+
const p = payload.build()
73+
74+
const isValid = sut.isValid(p, [
75+
['data.status'],
76+
['data.status'],
77+
['data.status']
78+
])
79+
80+
expect(isValid).toBeTruthy()
81+
})
82+
83+
test('should be invalid if fields not exists in provided payload', () => {
84+
const p = payload.build()
85+
const isValid = sut.isValid(p, [['invalid'], ['invalid.field']])
86+
expect(isValid).toBeFalsy()
87+
})
88+
89+
test('should be invalid if fields is not provided', () => {
90+
const p = payload.build()
91+
const isValid = sut.isValid(p, [])
92+
expect(isValid).toBeFalsy()
93+
})
94+
95+
test('should be invalid if not provided payload', () => {
96+
const isValid = sut.isValid({}, [['status']])
97+
expect(isValid).toBeFalsy()
98+
})
99+
100+
test('should be invalid if one of many fields not exists in provided payload', () => {
101+
const p = payload.build()
102+
103+
const isValid = sut.isValid(p, [
104+
['status'],
105+
['data.responseBody.total'],
106+
['ivalid.field']
107+
])
108+
109+
expect(isValid).toBeFalsy()
110+
})
111+
112+
test('should calls isValid method with correct params', () => {
113+
const spy = jest.spyOn(sut, 'isValid')
114+
const p = payload.build()
115+
116+
sut.isValid(p, [['status'], ['data.status'], ['data.responseBody.total']])
117+
118+
expect(spy).toHaveBeenCalledTimes(4)
119+
expect(spy).toBeCalledWith(p, [
120+
['status'],
121+
['data.status'],
122+
['data.responseBody.total']
123+
])
124+
})
125+
126+
test('should be valid if fields and values match with provided payload', () => {
127+
const p = payload
128+
.setStatus(null)
129+
.setData('error', false)
130+
.setData('status', ' ')
131+
.build()
132+
133+
const isValid = sut.isValid(p, [
134+
['status', null],
135+
['data.status', ' '],
136+
['data.error', false],
137+
['data.responseBody.total', 0],
138+
['data.responseBody.entities.entity.data', '']
139+
])
140+
141+
expect(isValid).toBeTruthy()
142+
})
143+
144+
test('should be invalid if fields and values not match with provided payload', () => {
145+
const p = payload.setStatus(400).build()
146+
const isValid = sut.isValid(p, [['status', 200]])
147+
expect(isValid).toBeFalsy()
148+
})
149+
150+
test('should be invalid if one of many fields and values not match with provided payload', () => {
151+
const p = payload
152+
.setData('serviceName', 'any service')
153+
.setData('status', '1')
154+
.setStatus(200)
155+
.build()
156+
157+
const isValid = sut.isValid(p, [
158+
['status', 200],
159+
['data.status', '1'],
160+
['data.serviceName', 'invalid']
161+
])
162+
163+
expect(isValid).toBeFalsy()
164+
})
165+
166+
test('should be invalid if value is null and provided payload value is empty string', () => {
167+
const p = payload.setStatus('').build()
168+
const isValid = sut.isValid(p, [['status', null]])
169+
expect(isValid).toBeFalsy()
170+
})
171+
172+
test('should be defined', () => {
173+
expect(mainObjectValidator).toBeDefined()
174+
expect(mainObjectValidator).toEqual(sut)
175+
expect(mainObjectValidator.isValid({}, [])).toBeFalsy()
176+
expect(
177+
mainObjectValidator.isValid({ foo: 'bar' }, [['foo', 'bar']])
178+
).toBeTruthy()
179+
})
180+
})

lib/validate.ts renamed to lib/object-validator.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { IValidate, IObject, IFields } from './validate.types'
1+
import { Fields, Payload, Validator } from './object-validator.types'
22

3-
export default class Validate implements IValidate {
4-
isValid(object: IObject, fields: IFields): boolean {
3+
export class ObjectValidator implements Validator {
4+
isValid(object: Payload, fields: Fields): boolean {
55
if (!this.isValidProps(object, fields)) return false
66

77
return fields.every(([field, value]) => {
@@ -24,7 +24,7 @@ export default class Validate implements IValidate {
2424
})
2525
}
2626

27-
private isValidProps(object: IObject, fields: IFields) {
27+
private isValidProps(object: Payload, fields: Fields) {
2828
const hasFields = fields && Array.isArray(fields) && fields.length > 0
2929
const hasObject =
3030
object && typeof object === 'object' && Object.keys(object).length > 0

lib/object-validator.types.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface Validator {
2+
isValid(object: Payload, fields: Fields): boolean
3+
}
4+
5+
export type Payload = { [key: string]: any }
6+
7+
export type Fields = Array<[string, any?]>

lib/validate.spec.ts

Lines changed: 0 additions & 128 deletions
This file was deleted.

lib/validate.types.ts

Lines changed: 0 additions & 7 deletions
This file was deleted.

package.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
{
22
"name": "@mrbrunelli/object-validator",
3-
"version": "2.0.7",
3+
"version": "2.0.8",
44
"description": "A simple object validator for tiny schemas",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",
7-
"files": ["/dist"],
7+
"files": [
8+
"/dist"
9+
],
810
"scripts": {
911
"test": "jest --runInBand --verbose --passWithNoTests",
1012
"tdd": "yarn test --watch",
1113
"test:ci": "jest --runInBand --verbose --coverage",
1214
"build": "tsc",
1315
"prepublishOnly": "yarn build",
14-
"prepare": "husky install"
16+
"prepare": "husky install",
17+
"bump:patch": "npm version patch"
1518
},
1619
"repository": {
1720
"type": "git",

tsconfig.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
"outDir": "./dist",
1111
"esModuleInterop": true,
1212
"forceConsistentCasingInFileNames": true,
13-
"strict": true,
1413
"skipLibCheck": true
1514
}
1615
}

0 commit comments

Comments
 (0)