@squiz/render-runtime-lib 1.73.0 → 1.75.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/lib/PreviewComponentService.js +43 -0
- package/lib/PreviewComponentService.js.map +1 -0
- package/lib/PreviewComponentService.spec.js +64 -0
- package/lib/PreviewComponentService.spec.js.map +1 -0
- package/lib/RenderInputService.js +286 -0
- package/lib/RenderInputService.js.map +1 -0
- package/lib/RenderInputService.spec.js +645 -0
- package/lib/RenderInputService.spec.js.map +1 -0
- package/lib/component-runner/ComponentRootUrlResolver.js +3 -0
- package/lib/component-runner/ComponentRootUrlResolver.js.map +1 -0
- package/lib/component-runner/ComponentRunnerServiceWithWorkers.js +91 -0
- package/lib/component-runner/ComponentRunnerServiceWithWorkers.js.map +1 -0
- package/lib/component-runner/ComponentRunnerServiceWithWorkers.spec.js +104 -0
- package/lib/component-runner/ComponentRunnerServiceWithWorkers.spec.js.map +1 -0
- package/lib/component-runner/ComponentRuntimeContext.d.ts +1 -8
- package/lib/component-runner/ComponentRuntimeContext.js +3 -0
- package/lib/component-runner/ComponentRuntimeContext.js.map +1 -0
- package/lib/component-runner/ContentRuntimeService.d.ts +1 -1
- package/lib/component-runner/ContentRuntimeService.js +31 -0
- package/lib/component-runner/ContentRuntimeService.js.map +1 -0
- package/lib/component-runner/ExecuteComponentTask.d.ts +1 -9
- package/lib/component-runner/ExecuteComponentTask.js +8 -0
- package/lib/component-runner/ExecuteComponentTask.js.map +1 -0
- package/lib/component-runner/FunctionReturnTypes.js +3 -0
- package/lib/component-runner/FunctionReturnTypes.js.map +1 -0
- package/lib/component-runner/index.js +23 -0
- package/lib/component-runner/index.js.map +1 -0
- package/lib/component-runner/worker/component-bootstrapper.js +63 -0
- package/lib/component-runner/worker/component-bootstrapper.js.map +1 -0
- package/lib/health-check-service.js +3 -0
- package/lib/health-check-service.js.map +1 -0
- package/lib/index.d.ts +0 -16
- package/lib/index.js +23 -4590
- package/lib/index.js.map +1 -7
- package/lib/ioc.js +37 -0
- package/lib/ioc.js.map +1 -0
- package/lib/test/helpers/fixtures.js +152 -0
- package/lib/test/helpers/fixtures.js.map +1 -0
- package/lib/test/helpers/stack.js +121 -0
- package/lib/test/helpers/stack.js.map +1 -0
- package/lib/test/index.js +21 -0
- package/lib/test/index.js.map +1 -0
- package/lib/test/mock-services/MockedComponentSetService.js +413 -0
- package/lib/test/mock-services/MockedComponentSetService.js.map +1 -0
- package/lib/test/mock-services/MockedContentItemService.js +37 -0
- package/lib/test/mock-services/MockedContentItemService.js.map +1 -0
- package/lib/test-helpers.d.ts +16 -0
- package/lib/test-helpers.js +44 -0
- package/lib/test-helpers.js.map +1 -0
- package/lib/utils/getContentItemIdFromInput.js +13 -0
- package/lib/utils/getContentItemIdFromInput.js.map +1 -0
- package/lib/utils/getContentItemIdFromInput.spec.js +18 -0
- package/lib/utils/getContentItemIdFromInput.spec.js.map +1 -0
- package/lib/utils/resolvePreviewOutput.js +71 -0
- package/lib/utils/resolvePreviewOutput.js.map +1 -0
- package/lib/utils/resolvePreviewOutput.spec.js +168 -0
- package/lib/utils/resolvePreviewOutput.spec.js.map +1 -0
- package/lib/utils/setHeadersOnExpressResponse.js +15 -0
- package/lib/utils/setHeadersOnExpressResponse.js.map +1 -0
- package/lib/utils/setHeadersOnExpressResponse.sepc.js +21 -0
- package/lib/utils/setHeadersOnExpressResponse.sepc.js.map +1 -0
- package/lib/webserver/app.js +78 -0
- package/lib/webserver/app.js.map +1 -0
- package/lib/webserver/controllers/CoreController.js +116 -0
- package/lib/webserver/controllers/CoreController.js.map +1 -0
- package/lib/webserver/controllers/CoreController.spec.js +132 -0
- package/lib/webserver/controllers/CoreController.spec.js.map +1 -0
- package/lib/webserver/controllers/DefinitionController.js +162 -0
- package/lib/webserver/controllers/DefinitionController.js.map +1 -0
- package/lib/webserver/controllers/DefinitionController.spec.js +16 -0
- package/lib/webserver/controllers/DefinitionController.spec.js.map +1 -0
- package/lib/webserver/controllers/DevelopmentController.js +149 -0
- package/lib/webserver/controllers/DevelopmentController.js.map +1 -0
- package/lib/webserver/controllers/DevelopmentController.spec.js +29 -0
- package/lib/webserver/controllers/DevelopmentController.spec.js.map +1 -0
- package/lib/webserver/controllers/PreviewController.spec.js +124 -0
- package/lib/webserver/controllers/PreviewController.spec.js.map +1 -0
- package/lib/webserver/controllers/RenderController.d.ts +3 -2
- package/lib/webserver/controllers/RenderController.js +221 -0
- package/lib/webserver/controllers/RenderController.js.map +1 -0
- package/lib/webserver/controllers/RenderController.spec.js +441 -0
- package/lib/webserver/controllers/RenderController.spec.js.map +1 -0
- package/lib/webserver/controllers/StaticController.js +149 -0
- package/lib/webserver/controllers/StaticController.js.map +1 -0
- package/lib/webserver/controllers/StaticController.spec.js +28 -0
- package/lib/webserver/controllers/StaticController.spec.js.map +1 -0
- package/lib/webserver/controllers/test/definition-route-tests.js +627 -0
- package/lib/webserver/controllers/test/definition-route-tests.js.map +1 -0
- package/lib/webserver/controllers/test/development-route-tests.js +110 -0
- package/lib/webserver/controllers/test/development-route-tests.js.map +1 -0
- package/lib/webserver/controllers/test/preview-route-tests.js +122 -0
- package/lib/webserver/controllers/test/preview-route-tests.js.map +1 -0
- package/lib/webserver/controllers/test/render-route-sandbox-tests.js +194 -0
- package/lib/webserver/controllers/test/render-route-sandbox-tests.js.map +1 -0
- package/lib/webserver/controllers/test/render-route-tests.js +422 -0
- package/lib/webserver/controllers/test/render-route-tests.js.map +1 -0
- package/lib/webserver/controllers/test/static-route-tests.js +96 -0
- package/lib/webserver/controllers/test/static-route-tests.js.map +1 -0
- package/lib/webserver/index.js +6 -0
- package/lib/webserver/index.js.map +1 -0
- package/lib/webserver/routes/routes.js +902 -0
- package/lib/webserver/routes/routes.js.map +1 -0
- package/package.json +13 -6
- package/lib/migrations/20220704054051_initial.sql +0 -19
- package/lib/migrations/20220718172237_adding_component_sets.sql +0 -23
- package/lib/migrations/20220728113941_add_env_vars_field.sql +0 -1
- package/lib/migrations/20220817113300_removing_null_props_from_jsonb.sql +0 -41
- package/lib/migrations/20221027151225_dummy.sql +0 -2
- package/lib/migrations/20221117151200_add_detail_columns_to_component_version.js +0 -40
- package/lib/migrations/20221220151200_add_required_to_manifests.js +0 -7794
- package/lib/migrations/20221222151200_add_required_to_manifests.js +0 -7856
- package/lib/migrations/20223525103556_component_set_rule.sql +0 -19
- package/lib/migrations/20230111095522_update_environment_property.js +0 -7802
- package/lib/migrations/20230203084900_ensure_static_root_exists.js +0 -47
- package/lib/migrations/20230210143300_lowercase_all_uri_names.js +0 -88
- package/lib/migrations/20230217151212_component_set_component_version_updates.sql +0 -38
- package/lib/migrations/20230218121212_add_component_set_rules.js +0 -24
- package/lib/migrations/202406061447_edge_component_type.sql +0 -1
- package/lib/migrations/202407111308_component_version_type.sql +0 -1
- package/lib/migrations/202408061132_update_type_to_server.sql +0 -1
- package/lib/public/docs.json +0 -5509
- package/lib/worker/component-bootstrapper.js +0 -185979
- package/lib/worker/component-bootstrapper.js.map +0 -7
|
@@ -0,0 +1,645 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const RenderInputService_1 = require("./RenderInputService");
|
|
4
|
+
const component_lib_1 = require("@squiz/component-lib");
|
|
5
|
+
const dx_common_lib_1 = require("@squiz/dx-common-lib");
|
|
6
|
+
const test_1 = require("./test");
|
|
7
|
+
const test_helpers_1 = require("./test-helpers");
|
|
8
|
+
const rootUrl = 'http://localhost:3000';
|
|
9
|
+
const expressRequest = (query = {}) => ({
|
|
10
|
+
id: 'test-id',
|
|
11
|
+
app: {
|
|
12
|
+
locals: {
|
|
13
|
+
rootUrl: rootUrl,
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
query,
|
|
17
|
+
header: jest.fn(),
|
|
18
|
+
headers: {},
|
|
19
|
+
});
|
|
20
|
+
describe('RenderInputService', () => {
|
|
21
|
+
const mockGetContentItem = jest.fn();
|
|
22
|
+
const apiKeyService = new dx_common_lib_1.DevelopmentApiKeyService();
|
|
23
|
+
const componentSetService = new test_1.MockedComponentSetServiceForProduction();
|
|
24
|
+
const componentFunctionService = new component_lib_1.ComponentFunctionService();
|
|
25
|
+
const manifestService = new component_lib_1.ManifestServiceForProduction(test_helpers_1.TestHelpers.getTestComponentFolder(), test_helpers_1.TestHelpers.testLogger);
|
|
26
|
+
const contentService = new test_1.MockedContentItemService({
|
|
27
|
+
createContentItem: jest.fn(),
|
|
28
|
+
getPaginatedContentItems: jest.fn(),
|
|
29
|
+
updateContentItem: jest.fn(),
|
|
30
|
+
getContentItem: mockGetContentItem,
|
|
31
|
+
deleteContentItemById: jest.fn(),
|
|
32
|
+
});
|
|
33
|
+
const getContentItemSpy = jest.spyOn(contentService, 'getContentItem');
|
|
34
|
+
const rootUrlResolver = jest.fn(() => rootUrl);
|
|
35
|
+
const renderInputService = new RenderInputService_1.RenderInputService(apiKeyService, componentSetService, manifestService, componentFunctionService, contentService, rootUrlResolver);
|
|
36
|
+
it(`should return the component root url returned by the root url resolver`, async () => {
|
|
37
|
+
const request = expressRequest({
|
|
38
|
+
something: '123',
|
|
39
|
+
foo: 'foo-val',
|
|
40
|
+
});
|
|
41
|
+
const requestInput = {
|
|
42
|
+
componentSet: 'set',
|
|
43
|
+
previewKey: undefined,
|
|
44
|
+
contentItemId: undefined,
|
|
45
|
+
namespace: 'unit-test-components',
|
|
46
|
+
componentName: 'test-component',
|
|
47
|
+
version: '1.3.0',
|
|
48
|
+
expressRequest: request,
|
|
49
|
+
functionName: 'main',
|
|
50
|
+
};
|
|
51
|
+
const componentInput = await renderInputService.resolveInput(requestInput);
|
|
52
|
+
expect(componentInput.componentRootUrl).toEqual(rootUrl);
|
|
53
|
+
expect(rootUrlResolver).toHaveBeenCalledWith(request, true);
|
|
54
|
+
});
|
|
55
|
+
it('should throw meaningful error when input contains both contentId and previewKey', async () => {
|
|
56
|
+
const requestInput = {
|
|
57
|
+
componentSet: 'set',
|
|
58
|
+
previewKey: 'test-preview-key',
|
|
59
|
+
contentItemId: 'valid-id',
|
|
60
|
+
namespace: 'unit-test-components',
|
|
61
|
+
componentName: 'test-component',
|
|
62
|
+
version: '1.0.0',
|
|
63
|
+
expressRequest: expressRequest(),
|
|
64
|
+
functionName: 'main',
|
|
65
|
+
};
|
|
66
|
+
await expect(renderInputService.resolveInput(requestInput)).rejects.toThrowErrorMatchingInlineSnapshot(`"You cannot provide a previewKey and a ContentId as input"`);
|
|
67
|
+
});
|
|
68
|
+
it('should throw meaningful error when input contains both componentSet and previewKey', async () => {
|
|
69
|
+
const requestInput = {
|
|
70
|
+
componentSet: 'set',
|
|
71
|
+
previewKey: 'test-preview-key',
|
|
72
|
+
contentItemId: undefined,
|
|
73
|
+
namespace: 'test-namespace',
|
|
74
|
+
componentName: 'test-name',
|
|
75
|
+
version: '1.0.0',
|
|
76
|
+
expressRequest: expressRequest(),
|
|
77
|
+
functionName: 'main',
|
|
78
|
+
};
|
|
79
|
+
await expect(renderInputService.resolveInput(requestInput)).rejects.toThrowErrorMatchingInlineSnapshot(`"You cannot provide a previewKey and a componentSet as input"`);
|
|
80
|
+
});
|
|
81
|
+
it('should return correct preview render input when preview-key is provided', async () => {
|
|
82
|
+
const requestInput = {
|
|
83
|
+
componentSet: undefined,
|
|
84
|
+
previewKey: 'test-preview',
|
|
85
|
+
contentItemId: undefined,
|
|
86
|
+
namespace: 'unit-test-components',
|
|
87
|
+
componentName: 'test-preview-component',
|
|
88
|
+
version: '1.2.4',
|
|
89
|
+
expressRequest: expressRequest({
|
|
90
|
+
something: '123',
|
|
91
|
+
}),
|
|
92
|
+
functionName: 'main',
|
|
93
|
+
};
|
|
94
|
+
const result = await renderInputService.resolveInput(requestInput);
|
|
95
|
+
const manifest = await manifestService.loadManifest('unit-test-components', 'test-preview-component', '1.2.4');
|
|
96
|
+
const webReadyManifest = componentFunctionService.prepareManifestForWebResponse(manifest, 'set', rootUrl);
|
|
97
|
+
const expectedResult = {
|
|
98
|
+
requestId: 'test-id',
|
|
99
|
+
renderType: 'preview',
|
|
100
|
+
functionEntryFilePath: `${test_helpers_1.TestHelpers.getTestComponentFolder()}/unit-test-components/test-preview-component/1.2.4/main.js`,
|
|
101
|
+
input: {
|
|
102
|
+
integerValue: 8,
|
|
103
|
+
nested: {
|
|
104
|
+
content: 'this is nested content',
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
headers: {},
|
|
108
|
+
componentRootUrl: rootUrl,
|
|
109
|
+
functionName: 'main',
|
|
110
|
+
manifestForWeb: webReadyManifest,
|
|
111
|
+
componentFullName: 'unit-test-components/test-preview-component',
|
|
112
|
+
previewKey: 'test-preview',
|
|
113
|
+
runtimeSet: {
|
|
114
|
+
displayName: 'unknown',
|
|
115
|
+
environment: {},
|
|
116
|
+
webPath: 'unknown',
|
|
117
|
+
},
|
|
118
|
+
componentFunction: manifest.getComponentFunctionByName('main'),
|
|
119
|
+
manifest: manifest,
|
|
120
|
+
manifestPath: `${test_helpers_1.TestHelpers.getTestComponentFolder()}/unit-test-components/test-preview-component/1.2.4/manifest.json`,
|
|
121
|
+
queryParameters: {},
|
|
122
|
+
};
|
|
123
|
+
expect(result).toEqual(expectedResult);
|
|
124
|
+
});
|
|
125
|
+
it('should return the content and set on the input object when contentId and componentSet are provided', async () => {
|
|
126
|
+
const request = expressRequest({
|
|
127
|
+
something: '123',
|
|
128
|
+
});
|
|
129
|
+
apiKeyService.getInterServiceKeys = jest.fn(() => ['x-inter-service-api-key']);
|
|
130
|
+
const requestInput = {
|
|
131
|
+
componentSet: 'set',
|
|
132
|
+
previewKey: undefined,
|
|
133
|
+
contentItemId: 'valid-id',
|
|
134
|
+
namespace: 'unit-test-components',
|
|
135
|
+
componentName: 'test-component',
|
|
136
|
+
version: '1.0.0',
|
|
137
|
+
expressRequest: request,
|
|
138
|
+
functionName: 'main',
|
|
139
|
+
};
|
|
140
|
+
const result = await renderInputService.resolveInput(requestInput);
|
|
141
|
+
const manifest = await manifestService.loadManifest('unit-test-components', 'test-component', '1.0.0');
|
|
142
|
+
const webReadyManifest = componentFunctionService.prepareManifestForWebResponse(manifest, 'set', rootUrl);
|
|
143
|
+
const expectedResult = {
|
|
144
|
+
requestId: 'test-id',
|
|
145
|
+
renderType: 'content-item-and-set',
|
|
146
|
+
functionEntryFilePath: `${test_helpers_1.TestHelpers.getTestComponentFolder()}/unit-test-components/test-component/1.0.0/main.js`,
|
|
147
|
+
input: {
|
|
148
|
+
something: 'input-from-content-item-service',
|
|
149
|
+
},
|
|
150
|
+
headers: {
|
|
151
|
+
'some-header-name-1': 'mocked-component-set-header-val-1',
|
|
152
|
+
'some-header-name-2': 'mocked-component-set-header-val-2',
|
|
153
|
+
},
|
|
154
|
+
componentRootUrl: rootUrl,
|
|
155
|
+
dxpApiKey: 'x-inter-service-api-key',
|
|
156
|
+
functionName: 'main',
|
|
157
|
+
manifestForWeb: webReadyManifest,
|
|
158
|
+
componentFullName: 'unit-test-components/test-component',
|
|
159
|
+
runtimeSet: {
|
|
160
|
+
displayName: 'set',
|
|
161
|
+
environment: {},
|
|
162
|
+
webPath: 'set',
|
|
163
|
+
},
|
|
164
|
+
componentFunction: manifest.getComponentFunctionByName('main'),
|
|
165
|
+
componentSet: await componentSetService.getComponentSet('set'),
|
|
166
|
+
manifest: manifest,
|
|
167
|
+
queryParameters: {},
|
|
168
|
+
};
|
|
169
|
+
expect(result).toEqual(expectedResult);
|
|
170
|
+
});
|
|
171
|
+
it('should use input from the preview data when preview key is provided instead of query parameters', async () => {
|
|
172
|
+
const requestInput = {
|
|
173
|
+
componentSet: undefined,
|
|
174
|
+
previewKey: 'test-preview',
|
|
175
|
+
contentItemId: undefined,
|
|
176
|
+
namespace: 'unit-test-components',
|
|
177
|
+
componentName: 'test-component',
|
|
178
|
+
version: '1.3.0',
|
|
179
|
+
expressRequest: expressRequest({
|
|
180
|
+
something: 'something-query-param',
|
|
181
|
+
foo: 'foo-query-param', // defined as function query parameter in the manifest
|
|
182
|
+
}),
|
|
183
|
+
functionName: 'main',
|
|
184
|
+
};
|
|
185
|
+
const result = await renderInputService.resolveInput(requestInput);
|
|
186
|
+
const manifest = await manifestService.loadManifest('unit-test-components', 'test-component', '1.3.0');
|
|
187
|
+
const webReadyManifest = componentFunctionService.prepareManifestForWebResponse(manifest, 'set', rootUrl);
|
|
188
|
+
const expectedResult = {
|
|
189
|
+
requestId: 'test-id',
|
|
190
|
+
renderType: 'preview',
|
|
191
|
+
functionEntryFilePath: `${test_helpers_1.TestHelpers.getTestComponentFolder()}/unit-test-components/test-component/1.3.0/main.js`,
|
|
192
|
+
input: {
|
|
193
|
+
something: 'something-input-val',
|
|
194
|
+
},
|
|
195
|
+
headers: {},
|
|
196
|
+
componentRootUrl: rootUrl,
|
|
197
|
+
functionName: 'main',
|
|
198
|
+
manifestForWeb: webReadyManifest,
|
|
199
|
+
componentFullName: 'unit-test-components/test-component',
|
|
200
|
+
previewKey: 'test-preview',
|
|
201
|
+
runtimeSet: {
|
|
202
|
+
displayName: 'unknown',
|
|
203
|
+
environment: {},
|
|
204
|
+
webPath: 'unknown',
|
|
205
|
+
},
|
|
206
|
+
componentFunction: manifest.getComponentFunctionByName('main'),
|
|
207
|
+
manifest: manifest,
|
|
208
|
+
manifestPath: `${test_helpers_1.TestHelpers.getTestComponentFolder()}/unit-test-components/test-component/1.3.0/manifest.json`,
|
|
209
|
+
queryParameters: {
|
|
210
|
+
foo: 'foo-query-param',
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
expect(result).toEqual(expectedResult);
|
|
214
|
+
});
|
|
215
|
+
it('should use input from the content item when using content item ID is provided instead of query parameters', async () => {
|
|
216
|
+
const request = expressRequest({
|
|
217
|
+
something: 'something-query-param',
|
|
218
|
+
foo: 'foo-query-param', // defined as function query parameter in the manifest
|
|
219
|
+
});
|
|
220
|
+
apiKeyService.getInterServiceKeys = jest.fn(() => ['x-inter-service-api-key']);
|
|
221
|
+
const requestInput = {
|
|
222
|
+
componentSet: 'set',
|
|
223
|
+
previewKey: undefined,
|
|
224
|
+
contentItemId: 'valid-id',
|
|
225
|
+
namespace: 'unit-test-components',
|
|
226
|
+
componentName: 'test-component',
|
|
227
|
+
version: '1.3.0',
|
|
228
|
+
expressRequest: request,
|
|
229
|
+
functionName: 'main',
|
|
230
|
+
};
|
|
231
|
+
const result = await renderInputService.resolveInput(requestInput);
|
|
232
|
+
const manifest = await manifestService.loadManifest('unit-test-components', 'test-component', '1.3.0');
|
|
233
|
+
const webReadyManifest = componentFunctionService.prepareManifestForWebResponse(manifest, 'set', rootUrl);
|
|
234
|
+
const expectedResult = {
|
|
235
|
+
requestId: 'test-id',
|
|
236
|
+
renderType: 'content-item-and-set',
|
|
237
|
+
functionEntryFilePath: `${test_helpers_1.TestHelpers.getTestComponentFolder()}/unit-test-components/test-component/1.3.0/main.js`,
|
|
238
|
+
input: {
|
|
239
|
+
something: 'input-from-content-item-service',
|
|
240
|
+
},
|
|
241
|
+
headers: {
|
|
242
|
+
'some-header-name-1': 'mocked-component-set-header-val-1',
|
|
243
|
+
'some-header-name-2': 'mocked-component-set-header-val-2',
|
|
244
|
+
},
|
|
245
|
+
componentRootUrl: rootUrl,
|
|
246
|
+
dxpApiKey: 'x-inter-service-api-key',
|
|
247
|
+
functionName: 'main',
|
|
248
|
+
manifestForWeb: webReadyManifest,
|
|
249
|
+
componentFullName: 'unit-test-components/test-component',
|
|
250
|
+
runtimeSet: {
|
|
251
|
+
displayName: 'set',
|
|
252
|
+
environment: {},
|
|
253
|
+
webPath: 'set',
|
|
254
|
+
},
|
|
255
|
+
componentFunction: manifest.getComponentFunctionByName('main'),
|
|
256
|
+
componentSet: await componentSetService.getComponentSet('set'),
|
|
257
|
+
manifest: manifest,
|
|
258
|
+
queryParameters: {
|
|
259
|
+
foo: 'foo-query-param',
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
expect(result).toEqual(expectedResult);
|
|
263
|
+
});
|
|
264
|
+
it('should include the defined query parameters in "queryParameters"', async () => {
|
|
265
|
+
const request = expressRequest({
|
|
266
|
+
test: '123',
|
|
267
|
+
squiz: 'test test',
|
|
268
|
+
dx: 'team',
|
|
269
|
+
something: 'some value',
|
|
270
|
+
foo: 'val1',
|
|
271
|
+
foo2: 'val2', // defined as function query parameter
|
|
272
|
+
});
|
|
273
|
+
const requestInput = {
|
|
274
|
+
componentSet: 'set',
|
|
275
|
+
previewKey: undefined,
|
|
276
|
+
contentItemId: undefined,
|
|
277
|
+
namespace: 'unit-test-components',
|
|
278
|
+
componentName: 'test-component',
|
|
279
|
+
version: '1.3.0',
|
|
280
|
+
expressRequest: request,
|
|
281
|
+
functionName: 'main',
|
|
282
|
+
};
|
|
283
|
+
const result = await renderInputService.resolveInput(requestInput);
|
|
284
|
+
const manifest = await manifestService.loadManifest('unit-test-components', 'test-component', '1.3.0');
|
|
285
|
+
const webReadyManifest = componentFunctionService.prepareManifestForWebResponse(manifest, 'set', rootUrl);
|
|
286
|
+
const expectedResult = {
|
|
287
|
+
requestId: 'test-id',
|
|
288
|
+
renderType: 'set-without-content-item',
|
|
289
|
+
functionEntryFilePath: `${test_helpers_1.TestHelpers.getTestComponentFolder()}/unit-test-components/test-component/1.3.0/main.js`,
|
|
290
|
+
input: {},
|
|
291
|
+
headers: {
|
|
292
|
+
'some-header-name-1': 'mocked-component-set-header-val-1',
|
|
293
|
+
'some-header-name-2': 'mocked-component-set-header-val-2',
|
|
294
|
+
},
|
|
295
|
+
componentRootUrl: rootUrl,
|
|
296
|
+
functionName: 'main',
|
|
297
|
+
manifestForWeb: webReadyManifest,
|
|
298
|
+
componentFullName: 'unit-test-components/test-component',
|
|
299
|
+
runtimeSet: {
|
|
300
|
+
displayName: 'set',
|
|
301
|
+
environment: {},
|
|
302
|
+
webPath: 'set',
|
|
303
|
+
},
|
|
304
|
+
dxpApiKey: 'x-inter-service-api-key',
|
|
305
|
+
componentFunction: manifest.getComponentFunctionByName('main'),
|
|
306
|
+
componentSet: await componentSetService.getComponentSet('set'),
|
|
307
|
+
manifest: manifest,
|
|
308
|
+
queryParameters: {
|
|
309
|
+
foo: 'val1',
|
|
310
|
+
foo2: 'val2',
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
expect(result).toEqual(expectedResult);
|
|
314
|
+
});
|
|
315
|
+
it('should throw error if query parameter defined as required in "queryParameters" is not available', async () => {
|
|
316
|
+
const request = expressRequest({
|
|
317
|
+
test: '123',
|
|
318
|
+
squiz: 'test test',
|
|
319
|
+
dx: 'team',
|
|
320
|
+
something: 'some value',
|
|
321
|
+
foo2: 'val2',
|
|
322
|
+
});
|
|
323
|
+
const requestInput = {
|
|
324
|
+
componentSet: 'set',
|
|
325
|
+
previewKey: undefined,
|
|
326
|
+
contentItemId: undefined,
|
|
327
|
+
namespace: 'unit-test-components',
|
|
328
|
+
componentName: 'test-component',
|
|
329
|
+
version: '1.3.0',
|
|
330
|
+
expressRequest: request,
|
|
331
|
+
functionName: 'main',
|
|
332
|
+
};
|
|
333
|
+
await expect(renderInputService.resolveInput(requestInput)).rejects.toMatchInlineSnapshot(`[Error: Required query parameter 'foo' is missing]`);
|
|
334
|
+
});
|
|
335
|
+
it('should NOT throw error if query parameter defined as not required in "queryParameters" is not available', async () => {
|
|
336
|
+
const request = expressRequest({
|
|
337
|
+
test: '123',
|
|
338
|
+
squiz: 'test test',
|
|
339
|
+
dx: 'team',
|
|
340
|
+
something: 'some value',
|
|
341
|
+
foo: 'foo-val',
|
|
342
|
+
});
|
|
343
|
+
const requestInput = {
|
|
344
|
+
componentSet: 'set',
|
|
345
|
+
previewKey: undefined,
|
|
346
|
+
contentItemId: undefined,
|
|
347
|
+
namespace: 'unit-test-components',
|
|
348
|
+
componentName: 'test-component',
|
|
349
|
+
version: '1.3.0',
|
|
350
|
+
expressRequest: request,
|
|
351
|
+
functionName: 'main',
|
|
352
|
+
};
|
|
353
|
+
await expect(renderInputService.resolveInput(requestInput)).resolves.toBeTruthy();
|
|
354
|
+
});
|
|
355
|
+
it('should return with preview input for file data when render type is preview', async () => {
|
|
356
|
+
const requestInput = {
|
|
357
|
+
componentSet: undefined,
|
|
358
|
+
previewKey: 'another-preview',
|
|
359
|
+
contentItemId: undefined,
|
|
360
|
+
namespace: 'unit-test-components',
|
|
361
|
+
componentName: 'test-preview-component',
|
|
362
|
+
version: '1.2.4',
|
|
363
|
+
expressRequest: expressRequest({
|
|
364
|
+
'should-not': 'see-this',
|
|
365
|
+
}),
|
|
366
|
+
functionName: 'main',
|
|
367
|
+
};
|
|
368
|
+
const result = await renderInputService.resolveInput(requestInput);
|
|
369
|
+
const manifest = await manifestService.loadManifest('unit-test-components', 'test-preview-component', '1.2.4');
|
|
370
|
+
const webReadyManifest = componentFunctionService.prepareManifestForWebResponse(manifest, 'set', rootUrl);
|
|
371
|
+
const expectedResult = {
|
|
372
|
+
requestId: 'test-id',
|
|
373
|
+
renderType: 'preview',
|
|
374
|
+
functionEntryFilePath: `${test_helpers_1.TestHelpers.getTestComponentFolder()}/unit-test-components/test-preview-component/1.2.4/main.js`,
|
|
375
|
+
input: {
|
|
376
|
+
integerValue: 123,
|
|
377
|
+
nested: {
|
|
378
|
+
content: 'this is also nested content',
|
|
379
|
+
},
|
|
380
|
+
},
|
|
381
|
+
headers: {},
|
|
382
|
+
componentRootUrl: rootUrl,
|
|
383
|
+
functionName: 'main',
|
|
384
|
+
manifestForWeb: webReadyManifest,
|
|
385
|
+
componentFullName: 'unit-test-components/test-preview-component',
|
|
386
|
+
previewKey: 'another-preview',
|
|
387
|
+
runtimeSet: {
|
|
388
|
+
displayName: 'unknown',
|
|
389
|
+
environment: {},
|
|
390
|
+
webPath: 'unknown',
|
|
391
|
+
},
|
|
392
|
+
componentFunction: manifest.getComponentFunctionByName('main'),
|
|
393
|
+
manifest: manifest,
|
|
394
|
+
manifestPath: `${test_helpers_1.TestHelpers.getTestComponentFolder()}/unit-test-components/test-preview-component/1.2.4/manifest.json`,
|
|
395
|
+
queryParameters: {},
|
|
396
|
+
};
|
|
397
|
+
expect(result).toEqual(expectedResult);
|
|
398
|
+
});
|
|
399
|
+
it('should return with preview input for inline data when render type is preview', async () => {
|
|
400
|
+
const requestInput = {
|
|
401
|
+
componentSet: undefined,
|
|
402
|
+
previewKey: 'test-preview',
|
|
403
|
+
contentItemId: undefined,
|
|
404
|
+
namespace: 'unit-test-components',
|
|
405
|
+
componentName: 'test-preview-component',
|
|
406
|
+
version: '1.2.4',
|
|
407
|
+
expressRequest: expressRequest({
|
|
408
|
+
'should-not': 'see-this',
|
|
409
|
+
}),
|
|
410
|
+
functionName: 'main',
|
|
411
|
+
};
|
|
412
|
+
const result = await renderInputService.resolveInput(requestInput);
|
|
413
|
+
const manifest = await manifestService.loadManifest('unit-test-components', 'test-preview-component', '1.2.4');
|
|
414
|
+
const webReadyManifest = componentFunctionService.prepareManifestForWebResponse(manifest, 'set', rootUrl);
|
|
415
|
+
const expectedResult = {
|
|
416
|
+
requestId: 'test-id',
|
|
417
|
+
renderType: 'preview',
|
|
418
|
+
functionEntryFilePath: `${test_helpers_1.TestHelpers.getTestComponentFolder()}/unit-test-components/test-preview-component/1.2.4/main.js`,
|
|
419
|
+
input: {
|
|
420
|
+
integerValue: 8,
|
|
421
|
+
nested: {
|
|
422
|
+
content: 'this is nested content',
|
|
423
|
+
},
|
|
424
|
+
},
|
|
425
|
+
headers: {},
|
|
426
|
+
componentRootUrl: rootUrl,
|
|
427
|
+
functionName: 'main',
|
|
428
|
+
manifestForWeb: webReadyManifest,
|
|
429
|
+
componentFullName: 'unit-test-components/test-preview-component',
|
|
430
|
+
previewKey: 'test-preview',
|
|
431
|
+
runtimeSet: {
|
|
432
|
+
displayName: 'unknown',
|
|
433
|
+
environment: {},
|
|
434
|
+
webPath: 'unknown',
|
|
435
|
+
},
|
|
436
|
+
componentFunction: manifest.getComponentFunctionByName('main'),
|
|
437
|
+
manifest: manifest,
|
|
438
|
+
manifestPath: `${test_helpers_1.TestHelpers.getTestComponentFolder()}/unit-test-components/test-preview-component/1.2.4/manifest.json`,
|
|
439
|
+
queryParameters: {},
|
|
440
|
+
};
|
|
441
|
+
expect(result).toEqual(expectedResult);
|
|
442
|
+
});
|
|
443
|
+
it('should pass the x-api-key through to the content item service', async () => {
|
|
444
|
+
const requestInput = {
|
|
445
|
+
componentSet: 'set',
|
|
446
|
+
previewKey: undefined,
|
|
447
|
+
contentItemId: 'valid-id',
|
|
448
|
+
namespace: 'unit-test-components',
|
|
449
|
+
componentName: 'test-component',
|
|
450
|
+
version: '1.0.0',
|
|
451
|
+
expressRequest: expressRequest(),
|
|
452
|
+
functionName: 'main',
|
|
453
|
+
};
|
|
454
|
+
await renderInputService.resolveInput(requestInput);
|
|
455
|
+
expect(getContentItemSpy).toHaveBeenCalledWith('valid-id', 'x-inter-service-api-key');
|
|
456
|
+
});
|
|
457
|
+
it('should return expected runtime set with env vars', async () => {
|
|
458
|
+
process.env.M_VAR = 'm-var-val';
|
|
459
|
+
process.env.M_VAR2 = 'm-var2-val';
|
|
460
|
+
process.env.NM_VAR = 'nm-var-val';
|
|
461
|
+
const requestInput = {
|
|
462
|
+
componentSet: undefined,
|
|
463
|
+
previewKey: 'my-preview',
|
|
464
|
+
contentItemId: undefined,
|
|
465
|
+
namespace: 'unit-test-components',
|
|
466
|
+
componentName: 'test-environment-variables',
|
|
467
|
+
version: '1.0.4',
|
|
468
|
+
expressRequest: expressRequest(),
|
|
469
|
+
functionName: 'main',
|
|
470
|
+
};
|
|
471
|
+
const result = await renderInputService.resolveInput(requestInput);
|
|
472
|
+
expect(result.runtimeSet).toEqual({
|
|
473
|
+
webPath: 'unknown',
|
|
474
|
+
displayName: 'unknown',
|
|
475
|
+
environment: {
|
|
476
|
+
M_VAR: 'm-var-val',
|
|
477
|
+
M_VAR2: 'm-var2-val',
|
|
478
|
+
NM_VAR: 'nm-var-val',
|
|
479
|
+
},
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
it('should return expected runtime set with env vars - non-mandatory var not required', async () => {
|
|
483
|
+
process.env.M_VAR = 'm-var-val';
|
|
484
|
+
process.env.M_VAR2 = 'm-var2-val';
|
|
485
|
+
delete process.env.NM_VAR;
|
|
486
|
+
const requestInput = {
|
|
487
|
+
componentSet: undefined,
|
|
488
|
+
previewKey: 'my-preview',
|
|
489
|
+
contentItemId: undefined,
|
|
490
|
+
namespace: 'unit-test-components',
|
|
491
|
+
componentName: 'test-environment-variables',
|
|
492
|
+
version: '1.0.4',
|
|
493
|
+
expressRequest: expressRequest(),
|
|
494
|
+
functionName: 'main',
|
|
495
|
+
};
|
|
496
|
+
const result = await renderInputService.resolveInput(requestInput);
|
|
497
|
+
expect(result.runtimeSet).toEqual({
|
|
498
|
+
webPath: 'unknown',
|
|
499
|
+
displayName: 'unknown',
|
|
500
|
+
environment: {
|
|
501
|
+
M_VAR: 'm-var-val',
|
|
502
|
+
M_VAR2: 'm-var2-val',
|
|
503
|
+
},
|
|
504
|
+
});
|
|
505
|
+
});
|
|
506
|
+
it('should return error if mandatory vars not provided', async () => {
|
|
507
|
+
delete process.env.M_VAR;
|
|
508
|
+
delete process.env.M_VAR2;
|
|
509
|
+
delete process.env.NM_VAR;
|
|
510
|
+
const requestInput = {
|
|
511
|
+
componentSet: undefined,
|
|
512
|
+
previewKey: 'my-preview',
|
|
513
|
+
contentItemId: undefined,
|
|
514
|
+
namespace: 'unit-test-components',
|
|
515
|
+
componentName: 'test-environment-variables',
|
|
516
|
+
version: '1.0.4',
|
|
517
|
+
expressRequest: expressRequest(),
|
|
518
|
+
functionName: 'main',
|
|
519
|
+
};
|
|
520
|
+
await expect(renderInputService.resolveInput(requestInput)).rejects.toThrowErrorMatchingInlineSnapshot(`"Missing required environment variables: "M_VAR","M_VAR2""`);
|
|
521
|
+
});
|
|
522
|
+
describe('getPreviewRenderInput', () => {
|
|
523
|
+
it('should not resolve formatted text from the preview data', async () => {
|
|
524
|
+
const requestInput = {
|
|
525
|
+
componentSet: undefined,
|
|
526
|
+
previewKey: 'preview-inline',
|
|
527
|
+
contentItemId: undefined,
|
|
528
|
+
namespace: 'unit-test-components',
|
|
529
|
+
componentName: 'test-preview-component',
|
|
530
|
+
version: '1.1.0',
|
|
531
|
+
expressRequest: expressRequest(),
|
|
532
|
+
functionName: 'main',
|
|
533
|
+
};
|
|
534
|
+
await expect(renderInputService.resolveInput(requestInput)).rejects.toThrowError();
|
|
535
|
+
});
|
|
536
|
+
it('should not resolve formatted text from the preview file', async () => {
|
|
537
|
+
const requestInput = {
|
|
538
|
+
componentSet: undefined,
|
|
539
|
+
previewKey: 'preview-file',
|
|
540
|
+
contentItemId: undefined,
|
|
541
|
+
namespace: 'unit-test-components',
|
|
542
|
+
componentName: 'test-preview-component',
|
|
543
|
+
version: '1.1.0',
|
|
544
|
+
expressRequest: expressRequest(),
|
|
545
|
+
functionName: 'main',
|
|
546
|
+
};
|
|
547
|
+
await expect(renderInputService.resolveInput(requestInput)).rejects.toThrowError();
|
|
548
|
+
});
|
|
549
|
+
it('should expect a string for input properties of type FormattedText', async () => {
|
|
550
|
+
const requestInput = {
|
|
551
|
+
componentSet: undefined,
|
|
552
|
+
contentItemId: undefined,
|
|
553
|
+
previewKey: 'valid-inline-preview',
|
|
554
|
+
namespace: 'unit-test-components',
|
|
555
|
+
componentName: 'test-formatted-text',
|
|
556
|
+
version: '1.0.0',
|
|
557
|
+
expressRequest: expressRequest(),
|
|
558
|
+
functionName: 'main',
|
|
559
|
+
};
|
|
560
|
+
await expect(renderInputService.resolveInput(requestInput)).resolves.toEqual(expect.objectContaining({ input: { text: expect.any(String) } }));
|
|
561
|
+
});
|
|
562
|
+
});
|
|
563
|
+
describe('getContentItemAndSetInput', () => {
|
|
564
|
+
it('should resolve formatted text from the a content item', async () => {
|
|
565
|
+
const requestInput = {
|
|
566
|
+
componentSet: 'set',
|
|
567
|
+
previewKey: undefined,
|
|
568
|
+
contentItemId: 'formatted-text-content-item',
|
|
569
|
+
namespace: 'unit-test-components',
|
|
570
|
+
componentName: 'test-formatted-text',
|
|
571
|
+
version: '2.0.0',
|
|
572
|
+
expressRequest: expressRequest(),
|
|
573
|
+
functionName: 'main',
|
|
574
|
+
};
|
|
575
|
+
const result = await renderInputService.resolveInput(requestInput);
|
|
576
|
+
expect(result.input).toEqual({
|
|
577
|
+
formattedText: '<p>This is a paragraph<span> with a span</span></p>',
|
|
578
|
+
});
|
|
579
|
+
});
|
|
580
|
+
});
|
|
581
|
+
describe('getQueryParametersFromRequest', () => {
|
|
582
|
+
const requestInputHelper = (expressRequest, version = '1.0.0') => ({
|
|
583
|
+
componentSet: 'set',
|
|
584
|
+
previewKey: undefined,
|
|
585
|
+
contentItemId: 'valid-id',
|
|
586
|
+
namespace: 'unit-test-components',
|
|
587
|
+
componentName: 'test-component-query-parameters',
|
|
588
|
+
version,
|
|
589
|
+
expressRequest,
|
|
590
|
+
functionName: 'main',
|
|
591
|
+
});
|
|
592
|
+
it('should return query parameters that are specified within the manifest component function', async () => {
|
|
593
|
+
const queryParameterToShow = { 'manifest-specified': 'shown' };
|
|
594
|
+
const queryParameterDontShow = { 'not-in-manifest': 'not shown' };
|
|
595
|
+
const requestInput = requestInputHelper(expressRequest({
|
|
596
|
+
...queryParameterToShow,
|
|
597
|
+
...queryParameterDontShow,
|
|
598
|
+
}));
|
|
599
|
+
const result = await renderInputService.resolveInput(requestInput);
|
|
600
|
+
expect(result.queryParameters).toEqual({
|
|
601
|
+
...queryParameterToShow,
|
|
602
|
+
});
|
|
603
|
+
});
|
|
604
|
+
it('should throw error if required query parameters that are specified within the manifest component function not provided', async () => {
|
|
605
|
+
const parameter = 'manifest-specified';
|
|
606
|
+
const queryParameterDontShow = { 'not-in-manifest': 'not shown' };
|
|
607
|
+
const requestInput = requestInputHelper(expressRequest({
|
|
608
|
+
...queryParameterDontShow,
|
|
609
|
+
}));
|
|
610
|
+
await expect(() => renderInputService.resolveInput(requestInput)).rejects.toThrowError(`Required query parameter '${parameter}' is missing`);
|
|
611
|
+
});
|
|
612
|
+
it('should throw error if required query parameters that are specified within the manifest component function are not string', async () => {
|
|
613
|
+
const parameter = 'manifest-specified';
|
|
614
|
+
const queryParameterToShow = { 'manifest-specified': 123 };
|
|
615
|
+
const requestInput = requestInputHelper(expressRequest({
|
|
616
|
+
...queryParameterToShow,
|
|
617
|
+
}));
|
|
618
|
+
await expect(() => renderInputService.resolveInput(requestInput)).rejects.toThrowError(`Value for query parameter '${parameter}' must be a string`);
|
|
619
|
+
});
|
|
620
|
+
it('should return query parameters that are whitelisted and not in component function', async () => {
|
|
621
|
+
const queryParameterToShow = { 'manifest-specified': 'shown' };
|
|
622
|
+
const queryParameterDontShow = { 'not-in-manifest': 'not shown' };
|
|
623
|
+
const queryParameterWhitelisted = { _contentContext: 'matrix context' };
|
|
624
|
+
const requestInput = requestInputHelper(expressRequest({
|
|
625
|
+
...queryParameterToShow,
|
|
626
|
+
...queryParameterDontShow,
|
|
627
|
+
...queryParameterWhitelisted,
|
|
628
|
+
}));
|
|
629
|
+
const result = await renderInputService.resolveInput(requestInput);
|
|
630
|
+
expect(result.queryParameters).toEqual({
|
|
631
|
+
...queryParameterToShow,
|
|
632
|
+
...queryParameterWhitelisted,
|
|
633
|
+
});
|
|
634
|
+
});
|
|
635
|
+
it('should throw error if whitelisted query parameters that are included are not string', async () => {
|
|
636
|
+
const parameter = '_contentContext';
|
|
637
|
+
const queryParameterWhitelisted = { _contentContext: 123 };
|
|
638
|
+
const requestInput = requestInputHelper(expressRequest({
|
|
639
|
+
...queryParameterWhitelisted,
|
|
640
|
+
}));
|
|
641
|
+
await expect(() => renderInputService.resolveInput(requestInput)).rejects.toThrowError(`Value for query parameter '${parameter}' must be a string`);
|
|
642
|
+
});
|
|
643
|
+
});
|
|
644
|
+
});
|
|
645
|
+
//# sourceMappingURL=RenderInputService.spec.js.map
|