-
Notifications
You must be signed in to change notification settings - Fork 69
Expand file tree
/
Copy pathopenapi.js
More file actions
117 lines (104 loc) · 3.76 KB
/
Copy pathopenapi.js
File metadata and controls
117 lines (104 loc) · 3.76 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
/* eslint-disable @typescript-eslint/no-var-requires */
const OpenAPIBackend = require('openapi-backend').default;
const express = require('express');
const SwaggerParser = require('@apidevtools/swagger-parser');
const multer = require('multer');
// Configure multer for multipart/form-data parsing
const upload = multer({ storage: multer.memoryStorage() });
async function getSchemas() {
// SchemaObject
const document = await SwaggerParser.dereference(
'../../test-resources/openapi-service-specs/specifications/test-service.json'
);
return document.components.schemas;
}
async function mockData(schemas, schemaName) {
const { generate } = await import('json-schema-faker');
return generate(schemas[schemaName]);
}
function mockTestEntity(schema) {
return mockData(schema, 'TestEntity');
}
async function createApi() {
const api = new OpenAPIBackend({
definition: '../../test-resources/openapi-service-specs/specifications/test-service.json'
});
const schema = await getSchemas();
const entities = [
await mockTestEntity(schema),
await mockTestEntity(schema),
await mockTestEntity(schema),
await mockTestEntity(schema)
];
entities[0].keyProperty = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa';
api.register({
headEntities: (c, req, res) => {
const hasCsrfFetchHeader = Object.entries(c.request.headers).some(
([key, value]) =>
key.toLowerCase() === 'x-csrf-token' &&
value.toLowerCase() === 'fetch'
);
if (hasCsrfFetchHeader) {
return res.status(204).set('x-csrf-token', 'e2e-test-token').end();
}
return res.status(204).end();
},
getAllEntities: (c, req, res) => res.status(200).json(entities),
countEntities: (c, req, res) => res.status(200).json(entities.length),
getEntityByKey: (c, req, res) => {
const entityId = c.request.params.entityId;
const entity = entities.find(e => e.keyProperty === entityId);
if (entity) {
return res.status(200).json(entity);
}
return res.status(400).json({ err: 'Bad request' });
},
createEntity: (c, req, res) => {
const hasCsrfHeader = Object.entries(c.request.headers).some(
([key, value]) =>
key.toLowerCase() === 'x-csrf-token' &&
value.toLowerCase() === 'e2e-test-token'
);
if (hasCsrfHeader) {
entities.push(c.request.requestBody);
return res.status(201).end();
}
return res.status(400).json({ err: 'Invalid or missing CSRF token.' });
},
testCasePostMultipartBody: (c, req, res) => {
// For multipart requests, multer populates req.body with text fields
const stringProperty = req.body?.stringProperty;
if (!stringProperty) {
return res.status(400).json({ err: 'stringProperty is required' });
}
return res.status(201).json({ received: { stringProperty } });
},
testCasePatchMultipartBodyWithHeaders: (c, req, res) => {
const stringProperty = req.body?.stringProperty;
const optionalHeader = c.request.headers['optionalheaderparam'];
if (!stringProperty) {
return res.status(400).json({ err: 'stringProperty is required' });
}
return res.status(200).json({
received: { stringProperty },
header: optionalHeader || null
});
},
validationFail: (c, req, res) => {
res.status(400).json({ err: c.validation.errors });
},
notFound: (c, req, res) => res.status(404).json({ err: 'not found' })
});
api.init();
return api;
}
module.exports = {
async createOpenApiApp() {
const api = await createApi();
const app = express();
app.use(express.json());
app.use(upload.any()); // Parse multipart/form-data
app.use(async (req, res) => api.handleRequest(req, req, res));
return app;
}
};