@exdst-sitecore-content-sdk/astro 0.0.23 → 0.0.25

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.
Files changed (72) hide show
  1. package/package.json +9 -14
  2. package/src/client/sitecore-astro-client.ts +0 -45
  3. package/src/context.ts +14 -16
  4. package/src/env.d.ts +1 -1
  5. package/src/sharedTypes/component-props.ts +0 -10
  6. package/src/tools/generate-map.ts +9 -21
  7. package/src/client/sitecore-astro-client.test.ts +0 -292
  8. package/src/components/AstroImage.astro.test.ts +0 -541
  9. package/src/components/Date.astro.test.ts +0 -197
  10. package/src/components/EditingScripts.astro.test.ts +0 -267
  11. package/src/components/ErrorBoundary.astro.test.ts +0 -252
  12. package/src/components/ErrorComponent.astro.test.ts +0 -31
  13. package/src/components/FieldMetadata.astro.test.ts +0 -40
  14. package/src/components/File.astro.test.ts +0 -68
  15. package/src/components/HiddenRendering.astro.test.ts +0 -36
  16. package/src/components/Image.astro.test.ts +0 -438
  17. package/src/components/Link.astro.test.ts +0 -261
  18. package/src/components/MissingComponent.astro.test.ts +0 -21
  19. package/src/components/Placeholder/Placeholder.astro.test.ts +0 -1088
  20. package/src/components/Placeholder/PlaceholderMetadata.astro.test.ts +0 -228
  21. package/src/components/Placeholder/PlaceholderUtils.astro.test.ts +0 -149
  22. package/src/components/Placeholder/placeholder-utils.test.ts +0 -309
  23. package/src/components/RichText.astro.test.ts +0 -205
  24. package/src/components/Text.astro.test.ts +0 -273
  25. package/src/config/define-config.test.ts +0 -526
  26. package/src/config-cli/define-cli-config.test.ts +0 -88
  27. package/src/editing/editing-config-middleware.test.ts +0 -164
  28. package/src/editing/editing-render-middleware.test.ts +0 -1143
  29. package/src/editing/render-middleware.test.ts +0 -57
  30. package/src/editing/utils.test.ts +0 -1212
  31. package/src/enhancers/WithEmptyFieldEditingComponent.astro.test.ts +0 -380
  32. package/src/enhancers/WithFieldMetadata.astro.test.ts +0 -113
  33. package/src/middleware/middleware.test.ts +0 -520
  34. package/src/middleware/multisite-middleware.test.ts +0 -667
  35. package/src/middleware/robots-middleware.test.ts +0 -129
  36. package/src/middleware/sitemap-middleware.test.ts +0 -184
  37. package/src/services/component-props-service.ts +0 -183
  38. package/src/tests/astro-helpers.ts +0 -61
  39. package/src/tests/helpers.ts +0 -46
  40. package/src/tests/personalizeData.ts +0 -63
  41. package/src/tests/test-components/CustomErrorComponent.astro +0 -3
  42. package/src/tests/test-components/CustomHiddenRendering.astro +0 -10
  43. package/src/tests/test-components/CustomMissingComponent.astro +0 -9
  44. package/src/tests/test-components/DownloadCallout.astro +0 -12
  45. package/src/tests/test-components/EmptyFieldEditingComponent.astro +0 -5
  46. package/src/tests/test-components/ErrorBoundaryWithError.astro +0 -10
  47. package/src/tests/test-components/Home.astro +0 -12
  48. package/src/tests/test-components/SxaRichText.astro +0 -23
  49. package/src/tests/test-components/SxaRichTextDefault.astro +0 -7
  50. package/src/tests/test-components/SxaRichTextWithTitle.astro +0 -8
  51. package/src/tests/test-components/TestComponent.astro +0 -9
  52. package/src/tests/test-components/TestComponentWithError.astro +0 -4
  53. package/src/tests/test-components/TestComponentWithField.astro +0 -17
  54. package/src/tests/test-components/TestHeader.astro +0 -8
  55. package/src/tests/test-components/TestLogo.astro +0 -5
  56. package/src/tests/test-components/TestParentWrapperComponent.astro +0 -5
  57. package/src/tests/test-components/TestWrapperComponent.astro +0 -5
  58. package/src/tests/test-components/map-components/Bar.astro +0 -0
  59. package/src/tests/test-components/map-components/Baz.astro +0 -0
  60. package/src/tests/test-components/map-components/Foo.astro +0 -0
  61. package/src/tests/test-components/map-components/Hero.variant.astro +0 -0
  62. package/src/tests/test-components/map-components/NotComponent.bsx +0 -0
  63. package/src/tests/test-components/map-components/Qux.astro +0 -0
  64. package/src/tests/test-components/map-components/folded/Folded.astro +0 -0
  65. package/src/tests/test-components/map-components/folded/random-file-2.docx +0 -0
  66. package/src/tests/test-components/map-components/random-file.txt +0 -0
  67. package/src/tests/test-data/metadata-data.ts +0 -86
  68. package/src/tests/test-data/normal-mode-data.ts +0 -466
  69. package/src/tests/vitest.setup.ts +0 -4
  70. package/src/tools/templating/components.test.ts +0 -318
  71. package/src/tools/templating/default-component.test.ts +0 -31
  72. package/src/utils/utils.test.ts +0 -48
@@ -1,667 +0,0 @@
1
- /* eslint-disable no-unused-expressions */
2
- /* eslint-disable dot-notation */
3
- import * as chai from 'chai';
4
- import { use } from 'chai';
5
- import chaiString from 'chai-string';
6
- import sinonChai from 'sinon-chai';
7
- import sinon, { spy } from 'sinon';
8
- import debug from '../debug';
9
-
10
- import { MultisiteMiddleware } from './multisite-middleware';
11
- import { SiteInfo, SiteResolver } from '@sitecore-content-sdk/content/site';
12
- import { APIContext, AstroCookieSetOptions } from 'astro';
13
-
14
- use(sinonChai);
15
- const expect = chai.use(chaiString).expect;
16
-
17
- describe('MultisiteMiddleware', () => {
18
- let debugSpy!: ReturnType<typeof spy>;
19
- const validateDebugLog = (message: string, ...params: any[]) =>
20
- expect(debugSpy.args.find((log: any[]) => log[0] === message)).to.deep.equal([
21
- message,
22
- ...params,
23
- ]);
24
- const validateEndMessageDebugLog = (message: string, params: any) => {
25
- const logParams = debugSpy.args.find((log: any[]) => log[0] === message) as Array<unknown>;
26
-
27
- expect(logParams[2]).to.deep.include(params);
28
- };
29
-
30
- const siteName = 'foo';
31
- const hostname = 'http://test.test/styleguide';
32
-
33
- const defaultConfig = {
34
- sites: [],
35
- enabled: true,
36
- useCookieResolution: () => false,
37
- defaultHostname: '',
38
- };
39
-
40
- const createContext = (props: any = {}) => {
41
- const context = {
42
- request: {
43
- url: props.url || new URL(hostname),
44
- headers: {
45
- get(key: string) {
46
- const headers = {
47
- host: 'foo.net',
48
- ...props.headerValues,
49
- };
50
- return headers[key];
51
- },
52
- append(key: string, value: string | Record<string, any>) {
53
- context.request.headers.set(key, value as string);
54
- },
55
- ...props.headers,
56
- },
57
- },
58
- cookies: {
59
- get(cookieName: string) {
60
- const cookies = { ...props?.cookieValues };
61
- return cookies[cookieName] ? { value: cookies[cookieName] } : undefined;
62
- },
63
- set(
64
- cookieName: string,
65
- value: string | Record<string, any>,
66
- options?: AstroCookieSetOptions
67
- ) {
68
- context.cookies.set(cookieName, value as string, options);
69
- },
70
- ...props?.cookies,
71
- ...props.cookieValues,
72
- },
73
- locals: props.locals || {},
74
- url: props.url || new URL(hostname),
75
- currentLocale: props.currentLocale,
76
- preferredLocale: props.preferredLocale,
77
- // eslint-disable-next-line no-unused-vars
78
- rewrite: (_) => props.response,
79
- } as APIContext;
80
-
81
- return context;
82
- };
83
-
84
- const createResponse = (props: any = {}) => {
85
- const response = {
86
- ...props,
87
- headers: {
88
- get(key: string) {
89
- const headers = {
90
- ...response.headers,
91
- ...props.headerValues,
92
- };
93
- return headers[key];
94
- },
95
- append(key: string, value: string | Record<string, any>) {
96
- response.headers[key] = value;
97
- },
98
- ...props.headers,
99
- },
100
- } as Response;
101
-
102
- Object.defineProperties(response.headers, {
103
- forEach: {
104
- value: (cb: any) => {
105
- Object.keys(response.headers).forEach((key) =>
106
- cb(response.headers.get(key), key, response.headers)
107
- );
108
- },
109
- enumerable: false,
110
- },
111
- });
112
-
113
- return response;
114
- };
115
-
116
- const createMiddleware = (input: { [key: string]: any; siteResolver?: SiteResolver } = {}) => {
117
- const props = { ...defaultConfig, ...input.config };
118
- class MockSiteResolver extends SiteResolver {
119
- getByName = sinon.stub().returns({
120
- name: siteName,
121
- language: input.language || '',
122
- hostName: input.hostName,
123
- });
124
-
125
- getByHost = sinon.stub().returns({
126
- name: siteName,
127
- language: input.language || '',
128
- hostName: input.hostName,
129
- });
130
- }
131
-
132
- const siteResolver = new MockSiteResolver([]);
133
- const middleware = new MultisiteMiddleware({
134
- ...props,
135
- });
136
- middleware['siteResolver'] = siteResolver;
137
-
138
- return { middleware, siteResolver };
139
- };
140
-
141
- before(() => {
142
- debugSpy = spy(debug, 'multisite');
143
- });
144
-
145
- afterEach(() => {
146
- debugSpy.resetHistory();
147
- });
148
-
149
- describe('request skipped', () => {
150
- describe('disabled / skip', () => {
151
- const res = createResponse();
152
-
153
- const test = async (pathname: string, middleware: MultisiteMiddleware) => {
154
- const context = createContext({
155
- url: {
156
- pathname,
157
- },
158
- });
159
-
160
- const mockNext = async () => res;
161
-
162
- const finalRes = await middleware.handle(context, mockNext);
163
- const isDisabledGlobally = middleware['config'].enabled === false;
164
-
165
- if (!isDisabledGlobally) {
166
- validateDebugLog('multisite middleware start: %o', {
167
- pathname,
168
- language: 'en',
169
- hostname: 'foo.net',
170
- });
171
- }
172
-
173
- const message = isDisabledGlobally
174
- ? 'skipped (multisite middleware is disabled globally)'
175
- : 'skipped (multisite middleware is disabled)';
176
- validateDebugLog(message);
177
-
178
- expect(finalRes).to.deep.equal(res);
179
-
180
- debugSpy.resetHistory();
181
- };
182
-
183
- it('default', async () => {
184
- const { middleware } = createMiddleware();
185
-
186
- await test('/src/image.png', middleware);
187
- await test('/api/layout/render', middleware);
188
- await test('/sitecore/render', middleware);
189
- });
190
-
191
- it('should apply both default and custom rules when custom disabled function provided', async () => {
192
- const skip = (context: APIContext) => context.url.pathname === '/crazypath/luna';
193
-
194
- const { middleware } = createMiddleware({
195
- config: { ...defaultConfig, skip },
196
- });
197
-
198
- await test('/src/image.png', middleware);
199
- await test('/api/layout/render', middleware);
200
- await test('/sitecore/render', middleware);
201
- await test('/crazypath/luna', middleware);
202
- });
203
- });
204
-
205
- describe('disabled in chain', () => {
206
- it('should skip if skipMiddleware local variable is true', async () => {
207
- const { middleware } = createMiddleware();
208
- const res = createResponse();
209
-
210
- const context = createContext({
211
- locals: {
212
- skipMiddleware: true,
213
- },
214
- });
215
-
216
- const mockNext = async () => res;
217
-
218
- const finalRes = await middleware.handle(context, mockNext);
219
-
220
- validateDebugLog(
221
- 'skipped (multisite middleware is disabled by one of the previous middlewares)'
222
- );
223
-
224
- expect(finalRes).to.deep.equal(res);
225
- });
226
- });
227
- });
228
-
229
- // describe('preview', () => {
230
- // it('preview data cookie is present', async () => {
231
- // const { middleware } = createMiddleware();
232
- // const res = createResponse();
233
-
234
- // const context = createContext({
235
- // url: new URL(hostname),
236
- // cookieValues: {
237
- // _preview_data: true,
238
- // },
239
- // });
240
-
241
- // const mockNext = async () => {
242
- // return res;
243
- // };
244
-
245
- // const finalRes = await middleware.handle(context, mockNext);
246
-
247
- // validateDebugLog('skipped (preview)');
248
-
249
- // const resCookies = (finalRes as Response).headers.getSetCookie();
250
- // expect(resCookies).to.contain('_preview_data=true');
251
- // });
252
- // });
253
-
254
- describe('Sitecore Preview', () => {
255
- it('request is passed', async () => {
256
- const context = createContext({
257
- cookieValues: { sc_site: 'foobar', sc_preview: 'true' },
258
- });
259
-
260
- const mockNext = sinon.stub().returns(
261
- createResponse({
262
- headers: [],
263
- })
264
- );
265
-
266
- const { middleware, siteResolver } = createMiddleware({
267
- config: { ...defaultConfig, useCookieResolution: () => true },
268
- });
269
-
270
- const finalRes = await middleware.handle(context, mockNext);
271
-
272
- validateDebugLog('multisite middleware start: %o', {
273
- pathname: '/styleguide',
274
- language: 'en',
275
- hostname: 'foo.net',
276
- });
277
-
278
- validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
279
- rewritePath: '/_site_foobar/styleguide',
280
- siteName: 'foobar',
281
- headers: {
282
- ...(finalRes as Response).headers,
283
- 'x-sc-rewrite': '/_site_foobar/styleguide',
284
- },
285
- cookies: 'sc_site=foobar; HttpOnly; Secure; SameSite=None',
286
- });
287
-
288
- expect(siteResolver.getByHost.called).to.be.false;
289
- expect(siteResolver.getByName.called).to.be.false;
290
-
291
- expect(mockNext).calledWith(sinon.match({ pathname: '/_site_foobar/styleguide' }));
292
- });
293
-
294
- it('should not be skipped if multisite middleware is disabled globally', async () => {
295
- const context = createContext({
296
- cookieValues: { sc_site: 'foobar', sc_preview: 'true' },
297
- });
298
-
299
- const mockNext = sinon.stub().returns(
300
- createResponse({
301
- headers: [],
302
- })
303
- );
304
-
305
- const { middleware, siteResolver } = createMiddleware({
306
- config: { ...defaultConfig, enabled: false, useCookieResolution: () => true },
307
- });
308
-
309
- const finalRes = await middleware.handle(context, mockNext);
310
-
311
- validateDebugLog('multisite middleware start: %o', {
312
- pathname: '/styleguide',
313
- language: 'en',
314
- hostname: 'foo.net',
315
- });
316
-
317
- validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
318
- rewritePath: '/_site_foobar/styleguide',
319
- siteName: 'foobar',
320
- headers: {
321
- ...(finalRes as Response).headers,
322
- 'x-sc-rewrite': '/_site_foobar/styleguide',
323
- },
324
- cookies: 'sc_site=foobar; HttpOnly; Secure; SameSite=None',
325
- });
326
-
327
- expect(siteResolver.getByHost.called).to.be.false;
328
- expect(siteResolver.getByName.called).to.be.false;
329
-
330
- expect(mockNext).calledWith(sinon.match({ pathname: '/_site_foobar/styleguide' }));
331
- });
332
- });
333
-
334
- describe('request passed', () => {
335
- it('fallback hostname is used', async () => {
336
- const context = createContext({
337
- headerValues: { host: undefined },
338
- });
339
-
340
- const mockNext = sinon.stub().returns(
341
- createResponse({
342
- headers: [],
343
- })
344
- );
345
-
346
- const { middleware, siteResolver } = createMiddleware({
347
- config: { ...defaultConfig, defaultHostname: 'bar.net' },
348
- });
349
-
350
- const finalRes = await middleware.handle(context, mockNext);
351
-
352
- validateDebugLog('multisite middleware start: %o', {
353
- pathname: '/styleguide',
354
- language: 'en',
355
- hostname: 'bar.net',
356
- });
357
-
358
- validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
359
- rewritePath: '/_site_foo/styleguide',
360
- siteName: 'foo',
361
- headers: {
362
- ...(finalRes as Response).headers,
363
- 'x-sc-rewrite': '/_site_foo/styleguide',
364
- },
365
- cookies: 'sc_site=foo; HttpOnly; Secure; SameSite=None',
366
- });
367
-
368
- expect(siteResolver.getByHost.calledWith('bar.net')).to.be.true;
369
-
370
- expect(mockNext).calledWith(sinon.match({ pathname: '/_site_foo/styleguide' }));
371
- });
372
-
373
- it('fallback default hostName is used', async () => {
374
- const context = createContext({
375
- headerValues: { host: undefined },
376
- });
377
-
378
- const mockNext = sinon.stub().returns(
379
- createResponse({
380
- headers: [],
381
- })
382
- );
383
-
384
- const { middleware, siteResolver } = createMiddleware();
385
-
386
- const finalRes = await middleware.handle(context, mockNext);
387
-
388
- validateDebugLog('multisite middleware start: %o', {
389
- pathname: '/styleguide',
390
- language: 'en',
391
- hostname: 'localhost',
392
- });
393
-
394
- validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
395
- rewritePath: '/_site_foo/styleguide',
396
- siteName: 'foo',
397
- headers: {
398
- ...(finalRes as Response).headers,
399
- 'x-sc-rewrite': '/_site_foo/styleguide',
400
- },
401
- cookies: 'sc_site=foo; HttpOnly; Secure; SameSite=None',
402
- });
403
-
404
- expect(siteResolver.getByHost).to.be.calledWith('localhost');
405
-
406
- expect(mockNext).calledWith(sinon.match({ pathname: '/_site_foo/styleguide' }));
407
- });
408
-
409
- it('host header is used', async () => {
410
- const context = createContext();
411
-
412
- const mockNext = sinon.stub().returns(
413
- createResponse({
414
- headers: [],
415
- })
416
- );
417
-
418
- const { middleware, siteResolver } = createMiddleware();
419
-
420
- const finalRes = await middleware.handle(context, mockNext);
421
-
422
- validateDebugLog('multisite middleware start: %o', {
423
- pathname: '/styleguide',
424
- language: 'en',
425
- hostname: 'foo.net',
426
- });
427
-
428
- validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
429
- rewritePath: '/_site_foo/styleguide',
430
- siteName: 'foo',
431
- headers: {
432
- ...(finalRes as Response).headers,
433
- 'x-sc-rewrite': '/_site_foo/styleguide',
434
- },
435
- cookies: 'sc_site=foo; HttpOnly; Secure; SameSite=None',
436
- });
437
-
438
- expect(siteResolver.getByHost).to.be.calledWith('foo.net');
439
-
440
- expect(mockNext).calledWith(sinon.match({ pathname: '/_site_foo/styleguide' }));
441
- });
442
-
443
- it('custom response object is not provided', async () => {
444
- const context = createContext();
445
-
446
- const mockNext = sinon.stub().returns(
447
- createResponse({
448
- headers: [],
449
- })
450
- );
451
-
452
- const { middleware, siteResolver } = createMiddleware({});
453
-
454
- const finalRes = await middleware.handle(context, mockNext);
455
-
456
- validateDebugLog('multisite middleware start: %o', {
457
- pathname: '/styleguide',
458
- language: 'en',
459
- hostname: 'foo.net',
460
- });
461
-
462
- validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
463
- rewritePath: '/_site_foo/styleguide',
464
- siteName: 'foo',
465
- headers: {
466
- ...(finalRes as Response).headers,
467
- 'x-sc-rewrite': '/_site_foo/styleguide',
468
- },
469
- cookies: 'sc_site=foo; HttpOnly; Secure; SameSite=None',
470
- });
471
-
472
- expect(siteResolver.getByHost).to.be.calledWith('foo.net');
473
-
474
- expect(mockNext).calledWith(sinon.match({ pathname: '/_site_foo/styleguide' }));
475
- });
476
-
477
- it('site querystring parameter is provided', async () => {
478
- const context = createContext({
479
- url: new URL(hostname + '?site=qsFoo'),
480
- });
481
-
482
- const mockNext = sinon.stub().returns(
483
- createResponse({
484
- headers: [],
485
- })
486
- );
487
-
488
- const { middleware, siteResolver } = createMiddleware({
489
- useCookieResolution: () => true,
490
- });
491
-
492
- const finalRes = await middleware.handle(context, mockNext);
493
-
494
- validateDebugLog('multisite middleware start: %o', {
495
- pathname: '/styleguide',
496
- language: 'en',
497
- hostname: 'foo.net',
498
- });
499
-
500
- validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
501
- rewritePath: '/_site_qsFoo/styleguide',
502
- siteName: 'qsFoo',
503
- headers: {
504
- ...(finalRes as Response).headers,
505
- 'x-sc-rewrite': '/_site_qsFoo/styleguide',
506
- },
507
- cookies: 'sc_site=qsFoo; HttpOnly; Secure; SameSite=None',
508
- });
509
-
510
- expect(siteResolver.getByHost.called).to.be.false;
511
- expect(siteResolver.getByName.called).to.be.false;
512
-
513
- expect(mockNext).calledWith(sinon.match({ pathname: '/_site_qsFoo/styleguide' }));
514
- });
515
-
516
- it('sc_site querystring parameter is provided', async () => {
517
- const context = createContext({
518
- url: new URL(hostname + '?sc_site=qsFoo'),
519
- });
520
-
521
- const mockNext = sinon.stub().returns(
522
- createResponse({
523
- headers: [],
524
- })
525
- );
526
-
527
- const { middleware, siteResolver } = createMiddleware({
528
- useCookieResolution: () => true,
529
- });
530
-
531
- const finalRes = await middleware.handle(context, mockNext);
532
-
533
- validateDebugLog('multisite middleware start: %o', {
534
- pathname: '/styleguide',
535
- language: 'en',
536
- hostname: 'foo.net',
537
- });
538
-
539
- validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
540
- rewritePath: '/_site_qsFoo/styleguide',
541
- siteName: 'qsFoo',
542
- headers: {
543
- ...(finalRes as Response).headers,
544
- 'x-sc-rewrite': '/_site_qsFoo/styleguide',
545
- },
546
- cookies: 'sc_site=qsFoo; HttpOnly; Secure; SameSite=None',
547
- });
548
-
549
- expect(siteResolver.getByHost.called).to.be.false;
550
- expect(siteResolver.getByName.called).to.be.false;
551
-
552
- expect(mockNext).calledWith(sinon.match({ pathname: '/_site_qsFoo/styleguide' }));
553
- });
554
-
555
- it('sc_site cookie is provided and its usage enabled', async () => {
556
- const context = createContext({
557
- cookieValues: { sc_site: 'foobar' },
558
- });
559
-
560
- const mockNext = sinon.stub().returns(
561
- createResponse({
562
- headers: [],
563
- })
564
- );
565
-
566
- const { middleware, siteResolver } = createMiddleware({
567
- config: { ...defaultConfig, useCookieResolution: () => true },
568
- });
569
-
570
- const finalRes = await middleware.handle(context, mockNext);
571
-
572
- validateDebugLog('multisite middleware start: %o', {
573
- pathname: '/styleguide',
574
- language: 'en',
575
- hostname: 'foo.net',
576
- });
577
-
578
- validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
579
- rewritePath: '/_site_foobar/styleguide',
580
- siteName: 'foobar',
581
- headers: {
582
- ...(finalRes as Response).headers,
583
- 'x-sc-rewrite': '/_site_foobar/styleguide',
584
- },
585
- cookies: 'sc_site=foobar; HttpOnly; Secure; SameSite=None',
586
- });
587
-
588
- expect(siteResolver.getByHost.called).to.be.false;
589
- expect(siteResolver.getByName.called).to.be.false;
590
-
591
- expect(mockNext).calledWith(sinon.match({ pathname: '/_site_foobar/styleguide' }));
592
- });
593
-
594
- it('sc_site cookie is provided and its usage disabled', async () => {
595
- const context = createContext({
596
- cookieValues: { sc_site: 'foobar' },
597
- });
598
-
599
- const mockNext = sinon.stub().returns(
600
- createResponse({
601
- headers: [],
602
- })
603
- );
604
-
605
- const { middleware, siteResolver } = createMiddleware();
606
-
607
- const finalRes = await middleware.handle(context, mockNext);
608
-
609
- validateDebugLog('multisite middleware start: %o', {
610
- pathname: '/styleguide',
611
- language: 'en',
612
- hostname: 'foo.net',
613
- });
614
-
615
- validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
616
- rewritePath: '/_site_foo/styleguide',
617
- siteName: 'foo',
618
- headers: {
619
- ...(finalRes as Response).headers,
620
- 'x-sc-rewrite': '/_site_foo/styleguide',
621
- },
622
- cookies: 'sc_site=foo; HttpOnly; Secure; SameSite=None',
623
- });
624
-
625
- expect(siteResolver.getByHost.calledWith('foo.net')).to.be.true;
626
-
627
- expect(mockNext).calledWith(sinon.match({ pathname: '/_site_foo/styleguide' }));
628
- });
629
- });
630
-
631
- describe('error handling', () => {
632
- const context = createContext();
633
- const res = createResponse();
634
-
635
- it('should handle error', async () => {
636
- const errorSpy = sinon.stub(console, 'log');
637
-
638
- try {
639
- const error = new Error('Custom error');
640
-
641
- class SampleSiteResolver extends SiteResolver {
642
- constructor(sites: SiteInfo[]) {
643
- super(sites);
644
- }
645
-
646
- getByHost = () => {
647
- throw error;
648
- };
649
- }
650
-
651
- const middleware = new MultisiteMiddleware({ ...defaultConfig });
652
- middleware['siteResolver'] = new SampleSiteResolver([]);
653
-
654
- const mockNext = sinon.stub().returns(res);
655
-
656
- const finalRes = await middleware.handle(context, mockNext);
657
-
658
- expect(errorSpy.getCall(0).calledWith('Multisite middleware failed:')).to.be.true;
659
- expect(errorSpy.getCall(1).calledWith(error)).to.be.true;
660
-
661
- expect(finalRes).to.deep.equal(res);
662
- } finally {
663
- errorSpy.restore();
664
- }
665
- });
666
- });
667
- });