@wix/motion-edm-autogen-transformations-core 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/__tests__/corvid-entity.spec.js +68 -0
- package/dist/cjs/__tests__/corvid-entity.spec.js.map +1 -0
- package/dist/cjs/__tests__/getArgumentCardinality.spec.js +58 -0
- package/dist/cjs/__tests__/getArgumentCardinality.spec.js.map +1 -0
- package/dist/cjs/__tests__/helpers.spec.js +90 -0
- package/dist/cjs/__tests__/helpers.spec.js.map +1 -0
- package/dist/cjs/__tests__/reduceTransformation.spec.js +478 -0
- package/dist/cjs/__tests__/reduceTransformation.spec.js.map +1 -0
- package/dist/cjs/__tests__/transformations/custom-functions.spec.js +111 -0
- package/dist/cjs/__tests__/transformations/custom-functions.spec.js.map +1 -0
- package/dist/cjs/__tests__/transformations/preset/create-transformation.spec.js +47 -0
- package/dist/cjs/__tests__/transformations/preset/create-transformation.spec.js.map +1 -0
- package/dist/cjs/__tests__/transformations/preset/delete-transformation.spec.js +75 -0
- package/dist/cjs/__tests__/transformations/preset/delete-transformation.spec.js.map +1 -0
- package/dist/cjs/__tests__/transformations/preset/get-transformation.spec.js +46 -0
- package/dist/cjs/__tests__/transformations/preset/get-transformation.spec.js.map +1 -0
- package/dist/cjs/__tests__/transformations/preset/list-transformation.spec.js +28 -0
- package/dist/cjs/__tests__/transformations/preset/list-transformation.spec.js.map +1 -0
- package/dist/cjs/__tests__/transformations/preset/query-transformation.spec.js +66 -0
- package/dist/cjs/__tests__/transformations/preset/query-transformation.spec.js.map +1 -0
- package/dist/cjs/__tests__/transformations/preset/update-transformation.spec.js +90 -0
- package/dist/cjs/__tests__/transformations/preset/update-transformation.spec.js.map +1 -0
- package/dist/cjs/__tests__/validations/validateRequestTransformation.spec.js +291 -0
- package/dist/cjs/__tests__/validations/validateRequestTransformation.spec.js.map +1 -0
- package/dist/cjs/__tests__/validations/validateResponseTransformation.spec.js +370 -0
- package/dist/cjs/__tests__/validations/validateResponseTransformation.spec.js.map +1 -0
- package/dist/cjs/index.js +102 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/corvid-entity/index.js +32 -0
- package/dist/cjs/lib/corvid-entity/index.js.map +1 -0
- package/dist/cjs/lib/getArgumentCardinality.js +34 -0
- package/dist/cjs/lib/getArgumentCardinality.js.map +1 -0
- package/dist/cjs/lib/helpers.js +111 -0
- package/dist/cjs/lib/helpers.js.map +1 -0
- package/dist/cjs/lib/transformations/common.js +24 -0
- package/dist/cjs/lib/transformations/common.js.map +1 -0
- package/dist/cjs/lib/transformations/constants.js +23 -0
- package/dist/cjs/lib/transformations/constants.js.map +1 -0
- package/dist/cjs/lib/transformations/custom-functions.js +46 -0
- package/dist/cjs/lib/transformations/custom-functions.js.map +1 -0
- package/dist/cjs/lib/transformations/preset/create.js +17 -0
- package/dist/cjs/lib/transformations/preset/create.js.map +1 -0
- package/dist/cjs/lib/transformations/preset/delete.js +42 -0
- package/dist/cjs/lib/transformations/preset/delete.js.map +1 -0
- package/dist/cjs/lib/transformations/preset/get.js +17 -0
- package/dist/cjs/lib/transformations/preset/get.js.map +1 -0
- package/dist/cjs/lib/transformations/preset/list.js +13 -0
- package/dist/cjs/lib/transformations/preset/list.js.map +1 -0
- package/dist/cjs/lib/transformations/preset/query.js +40 -0
- package/dist/cjs/lib/transformations/preset/query.js.map +1 -0
- package/dist/cjs/lib/transformations/preset/update.js +37 -0
- package/dist/cjs/lib/transformations/preset/update.js.map +1 -0
- package/dist/cjs/lib/transformations/reduceTransformation.js +180 -0
- package/dist/cjs/lib/transformations/reduceTransformation.js.map +1 -0
- package/dist/cjs/lib/transformations/validations/common.js +50 -0
- package/dist/cjs/lib/transformations/validations/common.js.map +1 -0
- package/dist/cjs/lib/transformations/validations/validateRequestTransformation.js +118 -0
- package/dist/cjs/lib/transformations/validations/validateRequestTransformation.js.map +1 -0
- package/dist/cjs/lib/transformations/validations/validateResponseTransformation.js +161 -0
- package/dist/cjs/lib/transformations/validations/validateResponseTransformation.js.map +1 -0
- package/dist/esm/__tests__/corvid-entity.spec.js +58 -0
- package/dist/esm/__tests__/corvid-entity.spec.js.map +1 -0
- package/dist/esm/__tests__/getArgumentCardinality.spec.js +42 -0
- package/dist/esm/__tests__/getArgumentCardinality.spec.js.map +1 -0
- package/dist/esm/__tests__/helpers.spec.js +61 -0
- package/dist/esm/__tests__/helpers.spec.js.map +1 -0
- package/dist/esm/__tests__/reduceTransformation.spec.js +416 -0
- package/dist/esm/__tests__/reduceTransformation.spec.js.map +1 -0
- package/dist/esm/__tests__/transformations/custom-functions.spec.js +87 -0
- package/dist/esm/__tests__/transformations/custom-functions.spec.js.map +1 -0
- package/dist/esm/__tests__/transformations/preset/create-transformation.spec.js +40 -0
- package/dist/esm/__tests__/transformations/preset/create-transformation.spec.js.map +1 -0
- package/dist/esm/__tests__/transformations/preset/delete-transformation.spec.js +65 -0
- package/dist/esm/__tests__/transformations/preset/delete-transformation.spec.js.map +1 -0
- package/dist/esm/__tests__/transformations/preset/get-transformation.spec.js +39 -0
- package/dist/esm/__tests__/transformations/preset/get-transformation.spec.js.map +1 -0
- package/dist/esm/__tests__/transformations/preset/list-transformation.spec.js +22 -0
- package/dist/esm/__tests__/transformations/preset/list-transformation.spec.js.map +1 -0
- package/dist/esm/__tests__/transformations/preset/query-transformation.spec.js +57 -0
- package/dist/esm/__tests__/transformations/preset/query-transformation.spec.js.map +1 -0
- package/dist/esm/__tests__/transformations/preset/update-transformation.spec.js +85 -0
- package/dist/esm/__tests__/transformations/preset/update-transformation.spec.js.map +1 -0
- package/dist/esm/__tests__/validations/validateRequestTransformation.spec.js +200 -0
- package/dist/esm/__tests__/validations/validateRequestTransformation.spec.js.map +1 -0
- package/dist/esm/__tests__/validations/validateResponseTransformation.spec.js +246 -0
- package/dist/esm/__tests__/validations/validateResponseTransformation.spec.js.map +1 -0
- package/dist/esm/index.js +47 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/corvid-entity/index.js +17 -0
- package/dist/esm/lib/corvid-entity/index.js.map +1 -0
- package/dist/esm/lib/getArgumentCardinality.js +30 -0
- package/dist/esm/lib/getArgumentCardinality.js.map +1 -0
- package/dist/esm/lib/helpers.js +56 -0
- package/dist/esm/lib/helpers.js.map +1 -0
- package/dist/esm/lib/transformations/common.js +17 -0
- package/dist/esm/lib/transformations/common.js.map +1 -0
- package/dist/esm/lib/transformations/constants.js +18 -0
- package/dist/esm/lib/transformations/constants.js.map +1 -0
- package/dist/esm/lib/transformations/custom-functions.js +34 -0
- package/dist/esm/lib/transformations/custom-functions.js.map +1 -0
- package/dist/esm/lib/transformations/preset/create.js +8 -0
- package/dist/esm/lib/transformations/preset/create.js.map +1 -0
- package/dist/esm/lib/transformations/preset/delete.js +25 -0
- package/dist/esm/lib/transformations/preset/delete.js.map +1 -0
- package/dist/esm/lib/transformations/preset/get.js +8 -0
- package/dist/esm/lib/transformations/preset/get.js.map +1 -0
- package/dist/esm/lib/transformations/preset/list.js +6 -0
- package/dist/esm/lib/transformations/preset/list.js.map +1 -0
- package/dist/esm/lib/transformations/preset/query.js +28 -0
- package/dist/esm/lib/transformations/preset/query.js.map +1 -0
- package/dist/esm/lib/transformations/preset/update.js +18 -0
- package/dist/esm/lib/transformations/preset/update.js.map +1 -0
- package/dist/esm/lib/transformations/reduceTransformation.js +122 -0
- package/dist/esm/lib/transformations/reduceTransformation.js.map +1 -0
- package/dist/esm/lib/transformations/validations/common.js +35 -0
- package/dist/esm/lib/transformations/validations/common.js.map +1 -0
- package/dist/esm/lib/transformations/validations/validateRequestTransformation.js +107 -0
- package/dist/esm/lib/transformations/validations/validateRequestTransformation.js.map +1 -0
- package/dist/esm/lib/transformations/validations/validateResponseTransformation.js +142 -0
- package/dist/esm/lib/transformations/validations/validateResponseTransformation.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/__tests__/corvid-entity.spec.d.ts +2 -0
- package/dist/types/__tests__/corvid-entity.spec.d.ts.map +1 -0
- package/dist/types/__tests__/getArgumentCardinality.spec.d.ts +2 -0
- package/dist/types/__tests__/getArgumentCardinality.spec.d.ts.map +1 -0
- package/dist/types/__tests__/helpers.spec.d.ts +2 -0
- package/dist/types/__tests__/helpers.spec.d.ts.map +1 -0
- package/dist/types/__tests__/reduceTransformation.spec.d.ts +2 -0
- package/dist/types/__tests__/reduceTransformation.spec.d.ts.map +1 -0
- package/dist/types/__tests__/transformations/custom-functions.spec.d.ts +2 -0
- package/dist/types/__tests__/transformations/custom-functions.spec.d.ts.map +1 -0
- package/dist/types/__tests__/transformations/preset/create-transformation.spec.d.ts +2 -0
- package/dist/types/__tests__/transformations/preset/create-transformation.spec.d.ts.map +1 -0
- package/dist/types/__tests__/transformations/preset/delete-transformation.spec.d.ts +2 -0
- package/dist/types/__tests__/transformations/preset/delete-transformation.spec.d.ts.map +1 -0
- package/dist/types/__tests__/transformations/preset/get-transformation.spec.d.ts +2 -0
- package/dist/types/__tests__/transformations/preset/get-transformation.spec.d.ts.map +1 -0
- package/dist/types/__tests__/transformations/preset/list-transformation.spec.d.ts +2 -0
- package/dist/types/__tests__/transformations/preset/list-transformation.spec.d.ts.map +1 -0
- package/dist/types/__tests__/transformations/preset/query-transformation.spec.d.ts +2 -0
- package/dist/types/__tests__/transformations/preset/query-transformation.spec.d.ts.map +1 -0
- package/dist/types/__tests__/transformations/preset/update-transformation.spec.d.ts +2 -0
- package/dist/types/__tests__/transformations/preset/update-transformation.spec.d.ts.map +1 -0
- package/dist/types/__tests__/validations/validateRequestTransformation.spec.d.ts +2 -0
- package/dist/types/__tests__/validations/validateRequestTransformation.spec.d.ts.map +1 -0
- package/dist/types/__tests__/validations/validateResponseTransformation.spec.d.ts +2 -0
- package/dist/types/__tests__/validations/validateResponseTransformation.spec.d.ts.map +1 -0
- package/dist/types/index.d.ts +55 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/lib/corvid-entity/index.d.ts +13 -0
- package/dist/types/lib/corvid-entity/index.d.ts.map +1 -0
- package/dist/types/lib/getArgumentCardinality.d.ts +3 -0
- package/dist/types/lib/getArgumentCardinality.d.ts.map +1 -0
- package/dist/types/lib/helpers.d.ts +28 -0
- package/dist/types/lib/helpers.d.ts.map +1 -0
- package/dist/types/lib/transformations/common.d.ts +15 -0
- package/dist/types/lib/transformations/common.d.ts.map +1 -0
- package/dist/types/lib/transformations/constants.d.ts +18 -0
- package/dist/types/lib/transformations/constants.d.ts.map +1 -0
- package/dist/types/lib/transformations/custom-functions.d.ts +13 -0
- package/dist/types/lib/transformations/custom-functions.d.ts.map +1 -0
- package/dist/types/lib/transformations/preset/create.d.ts +6 -0
- package/dist/types/lib/transformations/preset/create.d.ts.map +1 -0
- package/dist/types/lib/transformations/preset/delete.d.ts +7 -0
- package/dist/types/lib/transformations/preset/delete.d.ts.map +1 -0
- package/dist/types/lib/transformations/preset/get.d.ts +6 -0
- package/dist/types/lib/transformations/preset/get.d.ts.map +1 -0
- package/dist/types/lib/transformations/preset/list.d.ts +4 -0
- package/dist/types/lib/transformations/preset/list.d.ts.map +1 -0
- package/dist/types/lib/transformations/preset/query.d.ts +20 -0
- package/dist/types/lib/transformations/preset/query.d.ts.map +1 -0
- package/dist/types/lib/transformations/preset/update.d.ts +8 -0
- package/dist/types/lib/transformations/preset/update.d.ts.map +1 -0
- package/dist/types/lib/transformations/reduceTransformation.d.ts +6 -0
- package/dist/types/lib/transformations/reduceTransformation.d.ts.map +1 -0
- package/dist/types/lib/transformations/validations/common.d.ts +13 -0
- package/dist/types/lib/transformations/validations/common.d.ts.map +1 -0
- package/dist/types/lib/transformations/validations/validateRequestTransformation.d.ts +6 -0
- package/dist/types/lib/transformations/validations/validateRequestTransformation.d.ts.map +1 -0
- package/dist/types/lib/transformations/validations/validateResponseTransformation.d.ts +6 -0
- package/dist/types/lib/transformations/validations/validateResponseTransformation.d.ts.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _motionRuntimeTestContext = require("@wix/motion-runtime-test-context");
|
|
4
|
+
|
|
5
|
+
var _lodash = require("lodash");
|
|
6
|
+
|
|
7
|
+
var _ = require("../..");
|
|
8
|
+
|
|
9
|
+
const validateRequestTransformation = _.validation.validateRequestTransformation;
|
|
10
|
+
describe('validateRequestTransformation', () => {
|
|
11
|
+
describe('valid transformations', () => {
|
|
12
|
+
const validResults = {
|
|
13
|
+
isValid: true,
|
|
14
|
+
validationErrors: []
|
|
15
|
+
};
|
|
16
|
+
test('returns valid transformation response for a valid simple transformation', () => {
|
|
17
|
+
const validTransformation = '$[0].a.b.c';
|
|
18
|
+
expect(validateRequestTransformation(validTransformation)).toStrictEqual(validResults);
|
|
19
|
+
});
|
|
20
|
+
test('returns valid transformation response for a valid complex transformation', () => {
|
|
21
|
+
const validTransformation = {
|
|
22
|
+
a: '$[0].a.b.c'
|
|
23
|
+
};
|
|
24
|
+
expect(validateRequestTransformation(validTransformation)).toStrictEqual(validResults);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe('invalid transformations', () => {
|
|
28
|
+
const validationErrorWith = ({
|
|
29
|
+
parentPath,
|
|
30
|
+
invalidValue,
|
|
31
|
+
description
|
|
32
|
+
}) => ({
|
|
33
|
+
isValid: false,
|
|
34
|
+
validationErrors: expect.arrayContaining([expect.objectContaining({
|
|
35
|
+
parentPath,
|
|
36
|
+
invalidValue,
|
|
37
|
+
description
|
|
38
|
+
})])
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
describe('invalid complex-transformation keys', () => {
|
|
42
|
+
test.each`
|
|
43
|
+
description | transformationKey | expectedValidationMessage
|
|
44
|
+
${'refers to an argument index'} | ${'$[0]'} | ${"must start with '$.'"}
|
|
45
|
+
${'refers to a custom function'} | ${'#someFunction'} | ${'cannot be a custom function call'}
|
|
46
|
+
`('returns a validation error when a transformation value segment $description', ({
|
|
47
|
+
transformationKey,
|
|
48
|
+
expectedValidationMessage
|
|
49
|
+
}) => {
|
|
50
|
+
const transformation = {
|
|
51
|
+
d: {
|
|
52
|
+
e: {
|
|
53
|
+
f: {
|
|
54
|
+
[transformationKey]: '$[0].a.b.c'
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
'*': '$[1]'
|
|
59
|
+
};
|
|
60
|
+
expect(validateRequestTransformation(transformation)).toStrictEqual(validationErrorWith({
|
|
61
|
+
parentPath: 'd.e.f',
|
|
62
|
+
invalidValue: transformationKey,
|
|
63
|
+
description: expectedValidationMessage
|
|
64
|
+
}));
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('invalid transformations values', () => {
|
|
68
|
+
describe('omit transformation', () => {
|
|
69
|
+
const parentKey = (0, _motionRuntimeTestContext.aString)();
|
|
70
|
+
describe('invalid source', () => {
|
|
71
|
+
const invalidSourceValue = '$[x].a.b.c';
|
|
72
|
+
const invalidSourceTransformation = {
|
|
73
|
+
'@source': invalidSourceValue,
|
|
74
|
+
'@omit': (0, _lodash.times)(2, () => (0, _motionRuntimeTestContext.aString)())
|
|
75
|
+
};
|
|
76
|
+
test.each`
|
|
77
|
+
description | invalidTransformation | expectedParentPath
|
|
78
|
+
${'top level'} | ${invalidSourceTransformation} | ${'@source'}
|
|
79
|
+
${'nested'} | ${{
|
|
80
|
+
[parentKey]: invalidSourceTransformation
|
|
81
|
+
}} | ${`${parentKey}.@source`}
|
|
82
|
+
`('returns a validation error when the @source value is invalid', ({
|
|
83
|
+
invalidTransformation,
|
|
84
|
+
expectedParentPath
|
|
85
|
+
}) => {
|
|
86
|
+
expect(validateRequestTransformation(invalidTransformation)).toStrictEqual(validationErrorWith({
|
|
87
|
+
parentPath: expectedParentPath,
|
|
88
|
+
invalidValue: invalidSourceValue,
|
|
89
|
+
description: 'must start with $[N] where N is an index'
|
|
90
|
+
}));
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('invalid @omit', () => {
|
|
94
|
+
const transformationWithOmitValue = value => ({
|
|
95
|
+
'@source': '$[0].a.b.c',
|
|
96
|
+
'@omit': value
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
const nonArray = (0, _motionRuntimeTestContext.aString)();
|
|
100
|
+
const nonStringArray = (0, _lodash.times)(2, () => (0, _motionRuntimeTestContext.aNumber)());
|
|
101
|
+
const arrayWithInvalidPaths = ['a.b.c', (0, _motionRuntimeTestContext.aString)()];
|
|
102
|
+
describe.each`
|
|
103
|
+
description | invalidTransformation | expectedParentPath
|
|
104
|
+
${'top level'} | ${transformationWithOmitValue(nonArray)} | ${'@omit'}
|
|
105
|
+
${'nested'} | ${{
|
|
106
|
+
[parentKey]: transformationWithOmitValue(nonArray)
|
|
107
|
+
}} | ${`${parentKey}.@omit`}
|
|
108
|
+
`('@omit is not an array', ({
|
|
109
|
+
invalidTransformation,
|
|
110
|
+
expectedParentPath
|
|
111
|
+
}) => {
|
|
112
|
+
test('returns a validation error', () => {
|
|
113
|
+
expect(validateRequestTransformation(invalidTransformation)).toStrictEqual(validationErrorWith({
|
|
114
|
+
parentPath: expectedParentPath,
|
|
115
|
+
invalidValue: nonArray,
|
|
116
|
+
description: 'must be an array of strings'
|
|
117
|
+
}));
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe.each`
|
|
121
|
+
description | invalidTransformation | expectedParentPath
|
|
122
|
+
${'top level'} | ${transformationWithOmitValue(nonStringArray)} | ${'@omit'}
|
|
123
|
+
${'nested'} | ${{
|
|
124
|
+
[parentKey]: transformationWithOmitValue(nonStringArray)
|
|
125
|
+
}} | ${`${parentKey}.@omit`}
|
|
126
|
+
`('@omit is an array of non-strings', ({
|
|
127
|
+
invalidTransformation,
|
|
128
|
+
expectedParentPath
|
|
129
|
+
}) => {
|
|
130
|
+
test('return a validation error', () => {
|
|
131
|
+
expect(validateRequestTransformation(invalidTransformation)).toStrictEqual(validationErrorWith({
|
|
132
|
+
parentPath: expectedParentPath,
|
|
133
|
+
invalidValue: nonStringArray,
|
|
134
|
+
description: 'must be an array of strings'
|
|
135
|
+
}));
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
/* eslint-disable max-len */
|
|
139
|
+
|
|
140
|
+
describe.each`
|
|
141
|
+
description | invalidTransformation | expectedParentPath
|
|
142
|
+
${'top level'} | ${transformationWithOmitValue(arrayWithInvalidPaths)} | ${'@omit'}
|
|
143
|
+
${'nested'} | ${{
|
|
144
|
+
[parentKey]: transformationWithOmitValue(arrayWithInvalidPaths)
|
|
145
|
+
}} | ${`${parentKey}.@omit`}
|
|
146
|
+
`('@omit is an array with invalid string paths', ({
|
|
147
|
+
description,
|
|
148
|
+
invalidTransformation,
|
|
149
|
+
expectedParentPath
|
|
150
|
+
}) => {
|
|
151
|
+
/* eslint-enable max-len */
|
|
152
|
+
test(`returns a validation error for invalid ${description} transformation`, () => {
|
|
153
|
+
expect(validateRequestTransformation(invalidTransformation)).toStrictEqual(validationErrorWith({
|
|
154
|
+
parentPath: expectedParentPath,
|
|
155
|
+
invalidValue: arrayWithInvalidPaths,
|
|
156
|
+
description: 'must contain non-nested paths only'
|
|
157
|
+
}));
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
describe('custom function expressions', () => {
|
|
163
|
+
test('returns a validation error when an invalid custom function-name is used', () => {
|
|
164
|
+
const invalidCustomFunctionCallExpression = '#1a';
|
|
165
|
+
const transformation = {
|
|
166
|
+
a: {
|
|
167
|
+
b: {
|
|
168
|
+
c: invalidCustomFunctionCallExpression
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
expect(validateRequestTransformation(transformation)).toStrictEqual(validationErrorWith({
|
|
173
|
+
parentPath: 'a.b.c',
|
|
174
|
+
invalidValue: invalidCustomFunctionCallExpression,
|
|
175
|
+
description: 'contains an invalid custom function expression'
|
|
176
|
+
}));
|
|
177
|
+
});
|
|
178
|
+
test('returns a validation error when a custom function argument is invalid for request transformation', () => {
|
|
179
|
+
const invalidCustomFunctionExpression = '#someFunction($.id)';
|
|
180
|
+
const transformation = {
|
|
181
|
+
a: {
|
|
182
|
+
b: {
|
|
183
|
+
c: invalidCustomFunctionExpression
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
expect(validateRequestTransformation(transformation)).toStrictEqual(validationErrorWith({
|
|
188
|
+
parentPath: 'a.b.c',
|
|
189
|
+
invalidValue: '$.id',
|
|
190
|
+
description: 'must start with $[N] where N is an index'
|
|
191
|
+
}));
|
|
192
|
+
});
|
|
193
|
+
describe('#constant function', () => {
|
|
194
|
+
test('returns a validation error when passed value is not a valid json value', () => {
|
|
195
|
+
const invalidCustomFunctionExpression = '#constant(not-json)';
|
|
196
|
+
const transformation = {
|
|
197
|
+
a: {
|
|
198
|
+
b: {
|
|
199
|
+
c: invalidCustomFunctionExpression
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
expect(validateRequestTransformation(transformation)).toStrictEqual(validationErrorWith({
|
|
204
|
+
parentPath: 'a.b.c',
|
|
205
|
+
invalidValue: 'not-json',
|
|
206
|
+
description: 'must be a valid json value'
|
|
207
|
+
}));
|
|
208
|
+
});
|
|
209
|
+
test('allows passing non json-path arguments to the #constant function', () => {
|
|
210
|
+
const transformation = {
|
|
211
|
+
a: {
|
|
212
|
+
b: {
|
|
213
|
+
c: '#constant("abc")'
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
expect(validateRequestTransformation(transformation)).toStrictEqual({
|
|
218
|
+
isValid: true,
|
|
219
|
+
validationErrors: []
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
/* eslint-disable max-len */
|
|
225
|
+
|
|
226
|
+
describe.each`
|
|
227
|
+
description | transformationValue | expectedValidationMessage
|
|
228
|
+
${'does not start with $[N] where N is a numeric index'} | ${'$[x].a.b.c'} | ${'must start with $[N] where N is an index'}
|
|
229
|
+
${'is not a valid json-path'} | ${'@'} | ${'must start with $[N] where N is an index'}
|
|
230
|
+
${'has several arguments referred to in the transformation'} | ${'$[0].$[1]'} | ${'must have a single argument-index as the first path segment'}
|
|
231
|
+
${'refers to * in the path'} | ${'$[0].a.b.*'} | ${'cannot refer to the * operator'}
|
|
232
|
+
`(
|
|
233
|
+
/* eslint-enable max-len */
|
|
234
|
+
'returns a validation error when a transformation value segment $description', ({
|
|
235
|
+
transformationValue,
|
|
236
|
+
expectedValidationMessage
|
|
237
|
+
}) => {
|
|
238
|
+
test('simple transformation', () => {
|
|
239
|
+
expect(validateRequestTransformation(transformationValue)).toStrictEqual(validationErrorWith({
|
|
240
|
+
parentPath: null,
|
|
241
|
+
invalidValue: transformationValue,
|
|
242
|
+
description: expectedValidationMessage
|
|
243
|
+
}));
|
|
244
|
+
});
|
|
245
|
+
test('complex transformation', () => {
|
|
246
|
+
const transformation = {
|
|
247
|
+
a: {
|
|
248
|
+
b: {
|
|
249
|
+
c: transformationValue
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
expect(validateRequestTransformation(transformation)).toStrictEqual(validationErrorWith({
|
|
254
|
+
parentPath: 'a.b.c',
|
|
255
|
+
invalidValue: transformationValue,
|
|
256
|
+
description: expectedValidationMessage
|
|
257
|
+
}));
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
describe('special fields', () => {
|
|
261
|
+
describe.each(['id', 'createdDate', 'updatedDate'])('%s', specialField => {
|
|
262
|
+
const transformationValue = `$[0].a.b.${specialField}`; // eslint-disable-next-line max-len
|
|
263
|
+
|
|
264
|
+
const expectedValidationMessage = `cannot refer to ${specialField} field, consider using _${specialField} instead`;
|
|
265
|
+
test('simple transformation', () => {
|
|
266
|
+
expect(validateRequestTransformation(transformationValue)).toStrictEqual(validationErrorWith({
|
|
267
|
+
parentPath: null,
|
|
268
|
+
invalidValue: transformationValue,
|
|
269
|
+
description: expectedValidationMessage
|
|
270
|
+
}));
|
|
271
|
+
});
|
|
272
|
+
test('complex transformation', () => {
|
|
273
|
+
const transformation = {
|
|
274
|
+
a: {
|
|
275
|
+
b: {
|
|
276
|
+
c: transformationValue
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
expect(validateRequestTransformation(transformation)).toStrictEqual(validationErrorWith({
|
|
281
|
+
parentPath: 'a.b.c',
|
|
282
|
+
invalidValue: transformationValue,
|
|
283
|
+
description: expectedValidationMessage
|
|
284
|
+
}));
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
//# sourceMappingURL=validateRequestTransformation.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/__tests__/validations/validateRequestTransformation.spec.ts"],"names":["validateRequestTransformation","validation","describe","validResults","isValid","validationErrors","test","validTransformation","expect","toStrictEqual","a","validationErrorWith","parentPath","invalidValue","description","arrayContaining","objectContaining","each","transformationKey","expectedValidationMessage","transformation","d","e","f","parentKey","invalidSourceValue","invalidSourceTransformation","invalidTransformation","expectedParentPath","transformationWithOmitValue","value","nonArray","nonStringArray","arrayWithInvalidPaths","invalidCustomFunctionCallExpression","b","c","invalidCustomFunctionExpression","transformationValue","specialField"],"mappings":";;AAAA;;AACA;;AACA;;AAEA,MAAQA,6BAAR,GAA0CC,YAA1C,CAAQD,6BAAR;AAEAE,QAAQ,CAAC,+BAAD,EAAkC,MAAM;AAC9CA,EAAAA,QAAQ,CAAC,uBAAD,EAA0B,MAAM;AACtC,UAAMC,YAAY,GAAG;AAAEC,MAAAA,OAAO,EAAE,IAAX;AAAiBC,MAAAA,gBAAgB,EAAE;AAAnC,KAArB;AAEAC,IAAAA,IAAI,CAAC,yEAAD,EAA4E,MAAM;AACpF,YAAMC,mBAAmB,GAAG,YAA5B;AAEAC,MAAAA,MAAM,CAACR,6BAA6B,CAACO,mBAAD,CAA9B,CAAN,CAA2DE,aAA3D,CACEN,YADF;AAGD,KANG,CAAJ;AAQAG,IAAAA,IAAI,CAAC,0EAAD,EAA6E,MAAM;AACrF,YAAMC,mBAAmB,GAAG;AAAEG,QAAAA,CAAC,EAAE;AAAL,OAA5B;AAEAF,MAAAA,MAAM,CAACR,6BAA6B,CAACO,mBAAD,CAA9B,CAAN,CAA2DE,aAA3D,CACEN,YADF;AAGD,KANG,CAAJ;AAOD,GAlBO,CAAR;AAoBAD,EAAAA,QAAQ,CAAC,yBAAD,EAA4B,MAAM;AACxC,UAAMS,mBAAmB,GAAG,CAAC;AAC3BC,MAAAA,UAD2B;AAE3BC,MAAAA,YAF2B;AAG3BC,MAAAA;AAH2B,KAAD,MAIrB;AACLV,MAAAA,OAAO,EAAE,KADJ;AAELC,MAAAA,gBAAgB,EAAEG,MAAM,CAACO,eAAP,CAAuB,CACvCP,MAAM,CAACQ,gBAAP,CAAwB;AACtBJ,QAAAA,UADsB;AAEtBC,QAAAA,YAFsB;AAGtBC,QAAAA;AAHsB,OAAxB,CADuC,CAAvB;AAFb,KAJqB,CAA5B;;AAeAZ,IAAAA,QAAQ,CAAC,qCAAD,EAAwC,MAAM;AACpDI,MAAAA,IAAI,CAACW,IAAK;AAChB;AACA,UAAU,6BAA8B,MAAK,MAAO,eAAc,sBAAuB;AACzF,UAAU,6BAA8B,MAAK,eAAgB,MAAK,kCAAmC;AACrG,OAJM,CAKE,6EALF,EAME,CAAC;AAAEC,QAAAA,iBAAF;AAAqBC,QAAAA;AAArB,OAAD,KAAsD;AACpD,cAAMC,cAAc,GAAG;AACrBC,UAAAA,CAAC,EAAE;AAAEC,YAAAA,CAAC,EAAE;AAAEC,cAAAA,CAAC,EAAE;AAAE,iBAACL,iBAAD,GAAqB;AAAvB;AAAL;AAAL,WADkB;AAErB,eAAK;AAFgB,SAAvB;AAKAV,QAAAA,MAAM,CAACR,6BAA6B,CAACoB,cAAD,CAA9B,CAAN,CAAsDX,aAAtD,CACEE,mBAAmB,CAAC;AAClBC,UAAAA,UAAU,EAAE,OADM;AAElBC,UAAAA,YAAY,EAAEK,iBAFI;AAGlBJ,UAAAA,WAAW,EAAEK;AAHK,SAAD,CADrB;AAOD,OAnBH;AAqBD,KAtBO,CAAR;AAwBAjB,IAAAA,QAAQ,CAAC,gCAAD,EAAmC,MAAM;AAC/CA,MAAAA,QAAQ,CAAC,qBAAD,EAAwB,MAAM;AACpC,cAAMsB,SAAS,GAAG,wCAAlB;AAEAtB,QAAAA,QAAQ,CAAC,gBAAD,EAAmB,MAAM;AAC/B,gBAAMuB,kBAAkB,GAAG,YAA3B;AACA,gBAAMC,2BAA2B,GAAG;AAClC,uBAAWD,kBADuB;AAElC,qBAAS,mBAAM,CAAN,EAAS,MAAM,wCAAf;AAFyB,WAApC;AAKAnB,UAAAA,IAAI,CAACW,IAAK;AACpB;AACA,cAAc,WAAY,MAAKS,2BAA4B,uBAAsB,SAAU;AAC3F,cAAc,QAAS,SAAQ;AAAE,aAACF,SAAD,GAAaE;AAAf,WAA6C,MAAM,GAAEF,SAAU,UAAU;AACxG,WAJU,CAKE,8DALF,EAME,CAAC;AAAEG,YAAAA,qBAAF;AAAyBC,YAAAA;AAAzB,WAAD,KAAmD;AACjDpB,YAAAA,MAAM,CACJR,6BAA6B,CAAC2B,qBAAD,CADzB,CAAN,CAEElB,aAFF,CAGEE,mBAAmB,CAAC;AAClBC,cAAAA,UAAU,EAAEgB,kBADM;AAElBf,cAAAA,YAAY,EAAEY,kBAFI;AAGlBX,cAAAA,WAAW,EAAE;AAHK,aAAD,CAHrB;AASD,WAhBH;AAkBD,SAzBO,CAAR;AA2BAZ,QAAAA,QAAQ,CAAC,eAAD,EAAkB,MAAM;AAC9B,gBAAM2B,2BAA2B,GAAIC,KAAD,KAAY;AAC9C,uBAAW,YADmC;AAE9C,qBAASA;AAFqC,WAAZ,CAApC;;AAKA,gBAAMC,QAAQ,GAAG,wCAAjB;AACA,gBAAMC,cAAc,GAAG,mBAAM,CAAN,EAAS,MAAM,wCAAf,CAAvB;AACA,gBAAMC,qBAAqB,GAAG,CAAC,OAAD,EAAU,wCAAV,CAA9B;AAEA/B,UAAAA,QAAQ,CAACe,IAAK;AACxB;AACA,cAAc,WAAY,MAAKY,2BAA2B,CAACE,QAAD,CAAW,uBAAsB,OAAQ;AACnG,cAAc,QAAS,SAAQ;AAAE,aAACP,SAAD,GAAaK,2BAA2B,CAACE,QAAD;AAA1C,WAAuD,MAAM,GAAEP,SAAU,QAAQ;AAChH,WAJU,CAKE,uBALF,EAME,CAAC;AAAEG,YAAAA,qBAAF;AAAyBC,YAAAA;AAAzB,WAAD,KAAmD;AACjDtB,YAAAA,IAAI,CAAC,4BAAD,EAA+B,MAAM;AACvCE,cAAAA,MAAM,CACJR,6BAA6B,CAAC2B,qBAAD,CADzB,CAAN,CAEElB,aAFF,CAGEE,mBAAmB,CAAC;AAClBC,gBAAAA,UAAU,EAAEgB,kBADM;AAElBf,gBAAAA,YAAY,EAAEkB,QAFI;AAGlBjB,gBAAAA,WAAW,EAAE;AAHK,eAAD,CAHrB;AASD,aAVG,CAAJ;AAWD,WAlBH;AAqBAZ,UAAAA,QAAQ,CAACe,IAAK;AACxB;AACA,cAAc,WAAY,MAAKY,2BAA2B,CAACG,cAAD,CAAiB,uBAAsB,OAAQ;AACzG,cAAc,QAAS,SAAQ;AAAE,aAACR,SAAD,GAAaK,2BAA2B,CAACG,cAAD;AAA1C,WAA6D,MAAM,GAAER,SAAU,QAAQ;AACtH,WAJU,CAKE,kCALF,EAME,CAAC;AAAEG,YAAAA,qBAAF;AAAyBC,YAAAA;AAAzB,WAAD,KAAmD;AACjDtB,YAAAA,IAAI,CAAC,2BAAD,EAA8B,MAAM;AACtCE,cAAAA,MAAM,CACJR,6BAA6B,CAAC2B,qBAAD,CADzB,CAAN,CAEElB,aAFF,CAGEE,mBAAmB,CAAC;AAClBC,gBAAAA,UAAU,EAAEgB,kBADM;AAElBf,gBAAAA,YAAY,EAAEmB,cAFI;AAGlBlB,gBAAAA,WAAW,EAAE;AAHK,eAAD,CAHrB;AASD,aAVG,CAAJ;AAWD,WAlBH;AAqBA;;AACAZ,UAAAA,QAAQ,CAACe,IAAK;AACxB;AACA,cAAc,WAAY,MAAKY,2BAA2B,CAACI,qBAAD,CAAwB,uBAAsB,OAAQ;AAChH,cAAc,QAAS,SAAQ;AAAE,aAACT,SAAD,GAAaK,2BAA2B,CAACI,qBAAD;AAA1C,WAAoE,MAAM,GAAET,SAAU,QAAQ;AAC7H,WAJU,CAKE,6CALF,EAME,CAAC;AAAEV,YAAAA,WAAF;AAAea,YAAAA,qBAAf;AAAsCC,YAAAA;AAAtC,WAAD,KAAgE;AAC9D;AACAtB,YAAAA,IAAI,CAAE,0CAAyCQ,WAAY,iBAAvD,EAAyE,MAAM;AACjFN,cAAAA,MAAM,CACJR,6BAA6B,CAAC2B,qBAAD,CADzB,CAAN,CAEElB,aAFF,CAGEE,mBAAmB,CAAC;AAClBC,gBAAAA,UAAU,EAAEgB,kBADM;AAElBf,gBAAAA,YAAY,EAAEoB,qBAFI;AAGlBnB,gBAAAA,WAAW,EAAE;AAHK,eAAD,CAHrB;AASD,aAVG,CAAJ;AAWD,WAnBH;AAqBD,SA1EO,CAAR;AA2ED,OAzGO,CAAR;AA2GAZ,MAAAA,QAAQ,CAAC,6BAAD,EAAgC,MAAM;AAC5CI,QAAAA,IAAI,CAAC,yEAAD,EAA4E,MAAM;AACpF,gBAAM4B,mCAAmC,GAAG,KAA5C;AACA,gBAAMd,cAAc,GAAG;AACrBV,YAAAA,CAAC,EAAE;AAAEyB,cAAAA,CAAC,EAAE;AAAEC,gBAAAA,CAAC,EAAEF;AAAL;AAAL;AADkB,WAAvB;AAIA1B,UAAAA,MAAM,CAACR,6BAA6B,CAACoB,cAAD,CAA9B,CAAN,CAAsDX,aAAtD,CACEE,mBAAmB,CAAC;AAClBC,YAAAA,UAAU,EAAE,OADM;AAElBC,YAAAA,YAAY,EAAEqB,mCAFI;AAGlBpB,YAAAA,WAAW,EAAE;AAHK,WAAD,CADrB;AAOD,SAbG,CAAJ;AAeAR,QAAAA,IAAI,CAAC,kGAAD,EAAqG,MAAM;AAC7G,gBAAM+B,+BAA+B,GAAG,qBAAxC;AACA,gBAAMjB,cAAc,GAAG;AACrBV,YAAAA,CAAC,EAAE;AAAEyB,cAAAA,CAAC,EAAE;AAAEC,gBAAAA,CAAC,EAAEC;AAAL;AAAL;AADkB,WAAvB;AAIA7B,UAAAA,MAAM,CAACR,6BAA6B,CAACoB,cAAD,CAA9B,CAAN,CAAsDX,aAAtD,CACEE,mBAAmB,CAAC;AAClBC,YAAAA,UAAU,EAAE,OADM;AAElBC,YAAAA,YAAY,EAAE,MAFI;AAGlBC,YAAAA,WAAW,EAAE;AAHK,WAAD,CADrB;AAOD,SAbG,CAAJ;AAeAZ,QAAAA,QAAQ,CAAC,oBAAD,EAAuB,MAAM;AACnCI,UAAAA,IAAI,CAAC,wEAAD,EAA2E,MAAM;AACnF,kBAAM+B,+BAA+B,GAAG,qBAAxC;AACA,kBAAMjB,cAAc,GAAG;AACrBV,cAAAA,CAAC,EAAE;AAAEyB,gBAAAA,CAAC,EAAE;AAAEC,kBAAAA,CAAC,EAAEC;AAAL;AAAL;AADkB,aAAvB;AAIA7B,YAAAA,MAAM,CAACR,6BAA6B,CAACoB,cAAD,CAA9B,CAAN,CAAsDX,aAAtD,CACEE,mBAAmB,CAAC;AAClBC,cAAAA,UAAU,EAAE,OADM;AAElBC,cAAAA,YAAY,EAAE,UAFI;AAGlBC,cAAAA,WAAW,EAAE;AAHK,aAAD,CADrB;AAOD,WAbG,CAAJ;AAeAR,UAAAA,IAAI,CAAC,kEAAD,EAAqE,MAAM;AAC7E,kBAAMc,cAAc,GAAG;AAAEV,cAAAA,CAAC,EAAE;AAAEyB,gBAAAA,CAAC,EAAE;AAAEC,kBAAAA,CAAC,EAAE;AAAL;AAAL;AAAL,aAAvB;AAEA5B,YAAAA,MAAM,CAACR,6BAA6B,CAACoB,cAAD,CAA9B,CAAN,CAAsDX,aAAtD,CACE;AACEL,cAAAA,OAAO,EAAE,IADX;AAEEC,cAAAA,gBAAgB,EAAE;AAFpB,aADF;AAMD,WATG,CAAJ;AAUD,SA1BO,CAAR;AA2BD,OA1DO,CAAR;AA4DA;;AACAH,MAAAA,QAAQ,CAACe,IAAK;AACpB;AACA,UAAU,qDAAsD,UAAS,YAAa,UAAS,0CAA2C;AAC1I,UAAU,0BAA2B,qCAAoC,GAAI,mBAAkB,0CAA2C;AAC1I,UAAU,yDAA0D,MAAK,WAAY,WAAU,6DAA8D;AAC7J,UAAU,yBAA0B,sCAAqC,YAAa,UAAS,gCAAiC;AAChI,OANM;AAOE;AACA,mFARF,EASE,CAAC;AAAEqB,QAAAA,mBAAF;AAAuBnB,QAAAA;AAAvB,OAAD,KAAwD;AACtDb,QAAAA,IAAI,CAAC,uBAAD,EAA0B,MAAM;AAClCE,UAAAA,MAAM,CACJR,6BAA6B,CAACsC,mBAAD,CADzB,CAAN,CAEE7B,aAFF,CAGEE,mBAAmB,CAAC;AAClBC,YAAAA,UAAU,EAAE,IADM;AAElBC,YAAAA,YAAY,EAAEyB,mBAFI;AAGlBxB,YAAAA,WAAW,EAAEK;AAHK,WAAD,CAHrB;AASD,SAVG,CAAJ;AAYAb,QAAAA,IAAI,CAAC,wBAAD,EAA2B,MAAM;AACnC,gBAAMc,cAAc,GAAG;AAAEV,YAAAA,CAAC,EAAE;AAAEyB,cAAAA,CAAC,EAAE;AAAEC,gBAAAA,CAAC,EAAEE;AAAL;AAAL;AAAL,WAAvB;AAEA9B,UAAAA,MAAM,CAACR,6BAA6B,CAACoB,cAAD,CAA9B,CAAN,CAAsDX,aAAtD,CACEE,mBAAmB,CAAC;AAClBC,YAAAA,UAAU,EAAE,OADM;AAElBC,YAAAA,YAAY,EAAEyB,mBAFI;AAGlBxB,YAAAA,WAAW,EAAEK;AAHK,WAAD,CADrB;AAOD,SAVG,CAAJ;AAWD,OAjCH;AAoCAjB,MAAAA,QAAQ,CAAC,gBAAD,EAAmB,MAAM;AAC/BA,QAAAA,QAAQ,CAACe,IAAT,CAAc,CAAC,IAAD,EAAO,aAAP,EAAsB,aAAtB,CAAd,EACE,IADF,EAEGsB,YAAD,IAAkB;AAChB,gBAAMD,mBAAmB,GAAI,YAAWC,YAAa,EAArD,CADgB,CAEhB;;AACA,gBAAMpB,yBAAyB,GAAI,mBAAkBoB,YAAa,2BAA0BA,YAAa,UAAzG;AAEAjC,UAAAA,IAAI,CAAC,uBAAD,EAA0B,MAAM;AAClCE,YAAAA,MAAM,CACJR,6BAA6B,CAACsC,mBAAD,CADzB,CAAN,CAEE7B,aAFF,CAGEE,mBAAmB,CAAC;AAClBC,cAAAA,UAAU,EAAE,IADM;AAElBC,cAAAA,YAAY,EAAEyB,mBAFI;AAGlBxB,cAAAA,WAAW,EAAEK;AAHK,aAAD,CAHrB;AASD,WAVG,CAAJ;AAYAb,UAAAA,IAAI,CAAC,wBAAD,EAA2B,MAAM;AACnC,kBAAMc,cAAc,GAAG;AAAEV,cAAAA,CAAC,EAAE;AAAEyB,gBAAAA,CAAC,EAAE;AAAEC,kBAAAA,CAAC,EAAEE;AAAL;AAAL;AAAL,aAAvB;AAEA9B,YAAAA,MAAM,CACJR,6BAA6B,CAACoB,cAAD,CADzB,CAAN,CAEEX,aAFF,CAGEE,mBAAmB,CAAC;AAClBC,cAAAA,UAAU,EAAE,OADM;AAElBC,cAAAA,YAAY,EAAEyB,mBAFI;AAGlBxB,cAAAA,WAAW,EAAEK;AAHK,aAAD,CAHrB;AASD,WAZG,CAAJ;AAaD,SAhCH;AAkCD,OAnCO,CAAR;AAoCD,KAjPO,CAAR;AAkPD,GA1RO,CAAR;AA2RD,CAhTO,CAAR","sourcesContent":["import { aString, aNumber } from '@wix/motion-runtime-test-context';\nimport { times } from 'lodash';\nimport { validation } from '../..';\n\nconst { validateRequestTransformation } = validation;\n\ndescribe('validateRequestTransformation', () => {\n describe('valid transformations', () => {\n const validResults = { isValid: true, validationErrors: [] };\n\n test('returns valid transformation response for a valid simple transformation', () => {\n const validTransformation = '$[0].a.b.c';\n\n expect(validateRequestTransformation(validTransformation)).toStrictEqual(\n validResults,\n );\n });\n\n test('returns valid transformation response for a valid complex transformation', () => {\n const validTransformation = { a: '$[0].a.b.c' };\n\n expect(validateRequestTransformation(validTransformation)).toStrictEqual(\n validResults,\n );\n });\n });\n\n describe('invalid transformations', () => {\n const validationErrorWith = ({\n parentPath,\n invalidValue,\n description,\n }) => ({\n isValid: false,\n validationErrors: expect.arrayContaining([\n expect.objectContaining({\n parentPath,\n invalidValue,\n description,\n }),\n ]),\n });\n\n describe('invalid complex-transformation keys', () => {\n test.each`\n description | transformationKey | expectedValidationMessage\n ${'refers to an argument index'} | ${'$[0]'} | ${\"must start with '$.'\"}\n ${'refers to a custom function'} | ${'#someFunction'} | ${'cannot be a custom function call'}\n `(\n 'returns a validation error when a transformation value segment $description',\n ({ transformationKey, expectedValidationMessage }) => {\n const transformation = {\n d: { e: { f: { [transformationKey]: '$[0].a.b.c' } } },\n '*': '$[1]',\n };\n\n expect(validateRequestTransformation(transformation)).toStrictEqual(\n validationErrorWith({\n parentPath: 'd.e.f',\n invalidValue: transformationKey,\n description: expectedValidationMessage,\n }),\n );\n },\n );\n });\n\n describe('invalid transformations values', () => {\n describe('omit transformation', () => {\n const parentKey = aString();\n\n describe('invalid source', () => {\n const invalidSourceValue = '$[x].a.b.c';\n const invalidSourceTransformation = {\n '@source': invalidSourceValue,\n '@omit': times(2, () => aString()),\n };\n\n test.each`\n description | invalidTransformation | expectedParentPath\n ${'top level'} | ${invalidSourceTransformation} | ${'@source'}\n ${'nested'} | ${{ [parentKey]: invalidSourceTransformation }} | ${`${parentKey}.@source`}\n `(\n 'returns a validation error when the @source value is invalid',\n ({ invalidTransformation, expectedParentPath }) => {\n expect(\n validateRequestTransformation(invalidTransformation),\n ).toStrictEqual(\n validationErrorWith({\n parentPath: expectedParentPath,\n invalidValue: invalidSourceValue,\n description: 'must start with $[N] where N is an index',\n }),\n );\n },\n );\n });\n\n describe('invalid @omit', () => {\n const transformationWithOmitValue = (value) => ({\n '@source': '$[0].a.b.c',\n '@omit': value,\n });\n\n const nonArray = aString();\n const nonStringArray = times(2, () => aNumber());\n const arrayWithInvalidPaths = ['a.b.c', aString()];\n\n describe.each`\n description | invalidTransformation | expectedParentPath\n ${'top level'} | ${transformationWithOmitValue(nonArray)} | ${'@omit'}\n ${'nested'} | ${{ [parentKey]: transformationWithOmitValue(nonArray) }} | ${`${parentKey}.@omit`}\n `(\n '@omit is not an array',\n ({ invalidTransformation, expectedParentPath }) => {\n test('returns a validation error', () => {\n expect(\n validateRequestTransformation(invalidTransformation),\n ).toStrictEqual(\n validationErrorWith({\n parentPath: expectedParentPath,\n invalidValue: nonArray,\n description: 'must be an array of strings',\n }),\n );\n });\n },\n );\n\n describe.each`\n description | invalidTransformation | expectedParentPath\n ${'top level'} | ${transformationWithOmitValue(nonStringArray)} | ${'@omit'}\n ${'nested'} | ${{ [parentKey]: transformationWithOmitValue(nonStringArray) }} | ${`${parentKey}.@omit`}\n `(\n '@omit is an array of non-strings',\n ({ invalidTransformation, expectedParentPath }) => {\n test('return a validation error', () => {\n expect(\n validateRequestTransformation(invalidTransformation),\n ).toStrictEqual(\n validationErrorWith({\n parentPath: expectedParentPath,\n invalidValue: nonStringArray,\n description: 'must be an array of strings',\n }),\n );\n });\n },\n );\n\n /* eslint-disable max-len */\n describe.each`\n description | invalidTransformation | expectedParentPath\n ${'top level'} | ${transformationWithOmitValue(arrayWithInvalidPaths)} | ${'@omit'}\n ${'nested'} | ${{ [parentKey]: transformationWithOmitValue(arrayWithInvalidPaths) }} | ${`${parentKey}.@omit`}\n `(\n '@omit is an array with invalid string paths',\n ({ description, invalidTransformation, expectedParentPath }) => {\n /* eslint-enable max-len */\n test(`returns a validation error for invalid ${description} transformation`, () => {\n expect(\n validateRequestTransformation(invalidTransformation),\n ).toStrictEqual(\n validationErrorWith({\n parentPath: expectedParentPath,\n invalidValue: arrayWithInvalidPaths,\n description: 'must contain non-nested paths only',\n }),\n );\n });\n },\n );\n });\n });\n\n describe('custom function expressions', () => {\n test('returns a validation error when an invalid custom function-name is used', () => {\n const invalidCustomFunctionCallExpression = '#1a';\n const transformation = {\n a: { b: { c: invalidCustomFunctionCallExpression } },\n };\n\n expect(validateRequestTransformation(transformation)).toStrictEqual(\n validationErrorWith({\n parentPath: 'a.b.c',\n invalidValue: invalidCustomFunctionCallExpression,\n description: 'contains an invalid custom function expression',\n }),\n );\n });\n\n test('returns a validation error when a custom function argument is invalid for request transformation', () => {\n const invalidCustomFunctionExpression = '#someFunction($.id)';\n const transformation = {\n a: { b: { c: invalidCustomFunctionExpression } },\n };\n\n expect(validateRequestTransformation(transformation)).toStrictEqual(\n validationErrorWith({\n parentPath: 'a.b.c',\n invalidValue: '$.id',\n description: 'must start with $[N] where N is an index',\n }),\n );\n });\n\n describe('#constant function', () => {\n test('returns a validation error when passed value is not a valid json value', () => {\n const invalidCustomFunctionExpression = '#constant(not-json)';\n const transformation = {\n a: { b: { c: invalidCustomFunctionExpression } },\n };\n\n expect(validateRequestTransformation(transformation)).toStrictEqual(\n validationErrorWith({\n parentPath: 'a.b.c',\n invalidValue: 'not-json',\n description: 'must be a valid json value',\n }),\n );\n });\n\n test('allows passing non json-path arguments to the #constant function', () => {\n const transformation = { a: { b: { c: '#constant(\"abc\")' } } };\n\n expect(validateRequestTransformation(transformation)).toStrictEqual(\n {\n isValid: true,\n validationErrors: [],\n },\n );\n });\n });\n });\n\n /* eslint-disable max-len */\n describe.each`\n description | transformationValue | expectedValidationMessage\n ${'does not start with $[N] where N is a numeric index'} | ${'$[x].a.b.c'} | ${'must start with $[N] where N is an index'}\n ${'is not a valid json-path'} | ${'@'} | ${'must start with $[N] where N is an index'}\n ${'has several arguments referred to in the transformation'} | ${'$[0].$[1]'} | ${'must have a single argument-index as the first path segment'}\n ${'refers to * in the path'} | ${'$[0].a.b.*'} | ${'cannot refer to the * operator'}\n `(\n /* eslint-enable max-len */\n 'returns a validation error when a transformation value segment $description',\n ({ transformationValue, expectedValidationMessage }) => {\n test('simple transformation', () => {\n expect(\n validateRequestTransformation(transformationValue),\n ).toStrictEqual(\n validationErrorWith({\n parentPath: null,\n invalidValue: transformationValue,\n description: expectedValidationMessage,\n }),\n );\n });\n\n test('complex transformation', () => {\n const transformation = { a: { b: { c: transformationValue } } };\n\n expect(validateRequestTransformation(transformation)).toStrictEqual(\n validationErrorWith({\n parentPath: 'a.b.c',\n invalidValue: transformationValue,\n description: expectedValidationMessage,\n }),\n );\n });\n },\n );\n\n describe('special fields', () => {\n describe.each(['id', 'createdDate', 'updatedDate'])(\n '%s',\n (specialField) => {\n const transformationValue = `$[0].a.b.${specialField}`;\n // eslint-disable-next-line max-len\n const expectedValidationMessage = `cannot refer to ${specialField} field, consider using _${specialField} instead`;\n\n test('simple transformation', () => {\n expect(\n validateRequestTransformation(transformationValue),\n ).toStrictEqual(\n validationErrorWith({\n parentPath: null,\n invalidValue: transformationValue,\n description: expectedValidationMessage,\n }),\n );\n });\n\n test('complex transformation', () => {\n const transformation = { a: { b: { c: transformationValue } } };\n\n expect(\n validateRequestTransformation(transformation),\n ).toStrictEqual(\n validationErrorWith({\n parentPath: 'a.b.c',\n invalidValue: transformationValue,\n description: expectedValidationMessage,\n }),\n );\n });\n },\n );\n });\n });\n });\n});\n"]}
|