-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathvalidateSchema.ts
More file actions
154 lines (137 loc) · 5.55 KB
/
Copy pathvalidateSchema.ts
File metadata and controls
154 lines (137 loc) · 5.55 KB
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import { ValidateFunction } from 'ajv-draft-04';
import { generateIdentificationEvent } from '../utils/validateSchema/generateIdentificationEvent';
import { z } from 'zod';
import { parseEnv } from 'znv';
import 'dotenv/config';
import { TestSubscription, testSubscriptionEnvVariableZod, ValidateJsonFn } from './validationTools/types';
import {
validateEventResponseSchemaV3,
validateRelatedVisitorsResponseSchemaV3,
validateSearchEventsResponseSchemaV3,
validateVisitsResponseSchemaV3,
} from './validationScenarios/v3-200';
import {
validateEventSchemaV4,
validateEventSearchSchemaV4,
validateEventUpdateRequestSchemaV4,
} from './validationScenarios/v4-200';
import {
validateCommonError403SchemaV4,
validateCommonError500SchemaV4,
validateErrorCommon429ResponseV4,
validateErrorVisitor400ResponseV4,
validateErrorVisitor404ResponseV4,
validateEventError404SchemaV4,
validateSearchEventsError400SchemaV4,
validateUpdateEventError400SchemaV4,
validateUpdateEventError409SchemaV4,
} from './validationScenarios/v4-errors';
import {
validateCommonError403SchemaV3,
validateErrorVisitor400ResponseV3,
validateErrorVisitor404ResponseV3,
validateEventError404SchemaV3,
validateGetVisitsError400SchemaV3,
validateGetVisitsError403SchemaV3,
validateSearchEventsError400SchemaV3,
validateUpdateEventError400SchemaV3,
validateUpdateEventError409SchemaV3,
} from './validationScenarios/v3-errors';
import { initAjv } from './validationTools/validation';
initAjv();
// Global exit code variable and helper
let exitCode: number = 0;
const fail = (message: string) => {
console.error(message);
exitCode = 1;
};
// Validation Helper
const validateJson: ValidateJsonFn = ({
json,
validator,
jsonName,
schemaName,
}: {
json: any;
validator: ValidateFunction;
jsonName: string;
schemaName: string;
}) => {
const valid = validator(json);
if (valid) {
console.log(`✅ ${schemaName} schema matches ${jsonName}`);
} else {
fail(`❌ ${schemaName} schema does not match ${jsonName} schema, because:`);
console.error(validator.errors);
console.log('::debug::Invalid JSON: ', JSON.stringify(json, null, 2));
}
};
/**
* Main function
*/
(async () => {
// Parse an array of test subscriptions objects from environment variables
const { TEST_SUBSCRIPTIONS } = parseEnv(process.env, {
TEST_SUBSCRIPTIONS: z.array(testSubscriptionEnvVariableZod),
});
// Generate and identification event for each subscription and add the fresh requestId and visitorId to the object
const testSubscriptions: TestSubscription[] = [];
for (const sub of TEST_SUBSCRIPTIONS) {
const { requestId, visitorId } = await generateIdentificationEvent(sub.publicApiKey, sub.region, sub.name);
testSubscriptions.push({ ...sub, requestId, visitorId });
}
// Validate all parts of the schema against static examples AND live Server API responses from each test subscription
// API v3
await validateEventResponseSchemaV3({ testSubscriptions, validateJson, fail });
await validateVisitsResponseSchemaV3({ testSubscriptions, validateJson, fail });
await validateSearchEventsResponseSchemaV3({ testSubscriptions, validateJson, fail });
await validateRelatedVisitorsResponseSchemaV3({
testSubscriptions: testSubscriptions.filter((sub) => sub.relatedVisitorsEnabled),
validateJson,
fail,
});
await validateCommonError403SchemaV3({ testSubscriptions, validateJson, fail });
await validateEventError404SchemaV3({ testSubscriptions, validateJson, fail });
await validateGetVisitsError400SchemaV3({ testSubscriptions, validateJson, fail });
await validateGetVisitsError403SchemaV3({ testSubscriptions, validateJson, fail });
await validateErrorVisitor400ResponseV3({ testSubscriptions, validateJson, fail });
await validateErrorVisitor404ResponseV3({
testSubscriptions: testSubscriptions.filter((sub) => sub.deleteEnabled && sub.relatedVisitorsEnabled),
validateJson,
fail,
});
await validateUpdateEventError400SchemaV3({ testSubscriptions, validateJson, fail });
await validateUpdateEventError409SchemaV3({
testSubscriptions: testSubscriptions.slice(1, 2),
validateJson,
fail,
});
await validateSearchEventsError400SchemaV3({ testSubscriptions, validateJson, fail });
// API v4
await validateEventSchemaV4({ testSubscriptions, validateJson, fail });
await validateEventSearchSchemaV4({ testSubscriptions, validateJson, fail });
await validateEventUpdateRequestSchemaV4({ testSubscriptions, validateJson, fail });
await validateCommonError403SchemaV4({ testSubscriptions, validateJson, fail });
await validateEventError404SchemaV4({ testSubscriptions, validateJson, fail });
await validateErrorVisitor400ResponseV4({ testSubscriptions, validateJson, fail });
await validateErrorCommon429ResponseV4({ testSubscriptions, validateJson, fail });
await validateCommonError500SchemaV4({ testSubscriptions, validateJson, fail });
await validateErrorVisitor404ResponseV4({
testSubscriptions: testSubscriptions.filter((sub) => sub.deleteEnabled && sub.relatedVisitorsEnabled),
validateJson,
fail,
});
await validateUpdateEventError400SchemaV4({ testSubscriptions, validateJson, fail });
await validateUpdateEventError409SchemaV4({
testSubscriptions: testSubscriptions.slice(1, 2),
validateJson,
fail,
});
await validateSearchEventsError400SchemaV4({ testSubscriptions, validateJson, fail });
if (exitCode === 0) {
console.log('\n ✅✅✅ All schemas are valid');
} else {
console.error('\n ❌❌❌ Some schema checks failed, see errors above.');
}
process.exit(exitCode);
})();