-
Notifications
You must be signed in to change notification settings - Fork 34
/
Copy pathfixture.js
116 lines (100 loc) · 3.09 KB
/
fixture.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
const isObject = require('lodash.isobject')
function setFixture(mock, operation, parsedQuery, parsedSchema, opts) {
const mockedFixture = Object.assign({}, mock[operation])
if (Array.isArray(parsedQuery)) {
parsedQuery.forEach((name) => {
const { fixture, saveFixture = false, autoMock = true } = opts
const operationSchema = parsedSchema[operation].fields.filter(
(el) => el.name === name
)[0]
if (!autoMock && fixture.data && fixture.data[name] !== undefined) {
mockedFixture[name] = validateFixture(
{},
fixture.data[name],
operationSchema,
parsedSchema
)
} else {
if (fixture && fixture.data && fixture.data[name] !== undefined) {
mockedFixture[name] = validateFixture(
mock[operation][name],
fixture.data[name],
operationSchema,
parsedSchema
)
if (saveFixture) {
mock[operation][name] = mockedFixture[name]
}
}
}
})
}
return mockedFixture
}
function validateFixture(usedMock, fixture, selectedType, schema, name) {
const mock = Object.assign({}, usedMock)
if (fixture === null) {
return null
}
if (schema[selectedType.type]) {
const fields = schema[selectedType.type].fields
if (Array.isArray(fixture)) {
return fixture.map((val) => {
// If the autoMock is false, set an empty object to set the value after validation
const mockedVal = mock[0] || {}
return validateFixture(
mockedVal,
val,
schema[selectedType.type],
schema,
name
)
})
} else if (isObject(fixture)) {
for (const val of Object.keys(fixture)) {
const selectedField = fields.filter((field) => field.name === val)
// If the autoMock is false, set an empty object to set the value after validation
const mockedVal = mock[val] || {}
// If it's extra fields on the fixture, continue
if (!selectedField.length) {
continue
}
mock[val] = validateFixture(
mockedVal,
fixture[val],
selectedField[0],
schema,
name
)
}
return mock
}
return fixture
} else if (Array.isArray(fixture)) {
fixture.forEach((val) => val)
return fixture
} else if (isObject(fixture)) {
const fields = selectedType.fields
for (const val of Object.keys(fixture)) {
// If the autoMock is false, set an empty object to set the value after validation
const mockedVal = mock[val] || {}
const selectedField = fields.filter((field) => field.name === val)
mock[val] = validateFixture(
mockedVal,
fixture[val],
selectedField[0],
schema,
name
)
}
return mock
}
return fixture !== undefined ? fixture : mock
}
function setFixtureError(fixtureErrors) {
if (!Array.isArray(fixtureErrors)) {
throw new Error('The errors fixture should be an array')
}
return fixtureErrors
}
module.exports = { setFixture, setFixtureError }