@coveo/quantic 3.11.1 → 3.12.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.
Files changed (54) hide show
  1. package/force-app/main/default/lwc/quanticBreadcrumbManager/__tests__/quanticBreadcrumbManager.test.js +326 -57
  2. package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/fixture.ts +76 -0
  3. package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/pageObject.ts +282 -0
  4. package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/quanticBreadcrumbManager.e2e.ts +167 -0
  5. package/force-app/main/default/lwc/quanticBreadcrumbManager/quanticBreadcrumbManager.html +10 -10
  6. package/force-app/main/default/lwc/quanticPager/e2e/fixture.ts +4 -4
  7. package/force-app/main/default/lwc/quanticTab/__tests__/quanticTab.test.js +287 -0
  8. package/force-app/main/default/lwc/quanticTab/e2e/fixture.ts +62 -0
  9. package/force-app/main/default/lwc/quanticTab/e2e/pageObject.ts +67 -0
  10. package/force-app/main/default/lwc/quanticTab/e2e/quanticTab.e2e.ts +77 -0
  11. package/force-app/main/default/lwc/quanticTab/quanticTab.html +1 -1
  12. package/force-app/main/default/lwc/quanticTabBar/__tests__/quanticTabBar.test.js +331 -0
  13. package/force-app/main/default/lwc/quanticTabBar/e2e/fixture.ts +61 -0
  14. package/force-app/main/default/lwc/quanticTabBar/e2e/pageObject.ts +80 -0
  15. package/force-app/main/default/lwc/quanticTabBar/e2e/quanticTabBar.e2e.ts +173 -0
  16. package/force-app/main/default/lwc/quanticTabBar/quanticTabBar.html +30 -8
  17. package/force-app/main/default/lwc/quanticTabBar/quanticTabBar.js +5 -4
  18. package/force-app/main/default/lwc/quanticUtils/__tests__/markdownUtils.test.js +1 -1
  19. package/force-app/main/default/staticresources/coveoheadless/case-assist/headless.js +5 -5
  20. package/force-app/main/default/staticresources/coveoheadless/definitions/api/commerce/common/request.d.ts +1 -1
  21. package/force-app/main/default/staticresources/coveoheadless/definitions/api/knowledge/stream-answer-api.d.ts +1 -1
  22. package/force-app/main/default/staticresources/coveoheadless/definitions/api/search/search-api-params.d.ts +1 -1
  23. package/force-app/main/default/staticresources/coveoheadless/definitions/api/service/case-assist/case-assist-params.d.ts +1 -1
  24. package/force-app/main/default/staticresources/coveoheadless/definitions/api/service/insight/insight-params.d.ts +2 -2
  25. package/force-app/main/default/staticresources/coveoheadless/definitions/app/commerce-ssr-engine/types/kind.d.ts +3 -0
  26. package/force-app/main/default/staticresources/coveoheadless/definitions/app/undoable.d.ts +0 -3
  27. package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/sub-controller/headless-sub-controller.ssr.d.ts +2 -1
  28. package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/core/context/example-deleteme-headless-case-context.d.ts +1 -1
  29. package/force-app/main/default/staticresources/coveoheadless/definitions/features/actions-history/ipx-actions-history-actions.d.ts +1 -1
  30. package/force-app/main/default/staticresources/coveoheadless/definitions/features/analytics/analytics-utils.d.ts +3 -3
  31. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/parameters/parameters-serializer.d.ts +2 -1
  32. package/force-app/main/default/staticresources/coveoheadless/definitions/features/generated-answer/generated-answer-analytics-actions.d.ts +1 -1
  33. package/force-app/main/default/staticresources/coveoheadless/definitions/features/history/history-actions.d.ts +3 -3
  34. package/force-app/main/default/staticresources/coveoheadless/definitions/features/pipeline/select-pipeline.d.ts +1 -1
  35. package/force-app/main/default/staticresources/coveoheadless/definitions/features/query/query-selectors.d.ts +1 -1
  36. package/force-app/main/default/staticresources/coveoheadless/definitions/features/question-answering/question-answering-document-id.d.ts +1 -1
  37. package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/legacy/search-actions.d.ts +42 -42
  38. package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/legacy/search-request.d.ts +44 -44
  39. package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/search-actions.d.ts +42 -43
  40. package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/search-mappings.d.ts +1 -1
  41. package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/search-request.d.ts +44 -44
  42. package/force-app/main/default/staticresources/coveoheadless/definitions/features/search-hub/search-hub-selectors.d.ts +1 -1
  43. package/force-app/main/default/staticresources/coveoheadless/definitions/selectors/commerce-selectors.index.d.ts +2 -2
  44. package/force-app/main/default/staticresources/coveoheadless/definitions/test/mock-search-request.d.ts +44 -44
  45. package/force-app/main/default/staticresources/coveoheadless/definitions/tsdoc-metadata.json +1 -1
  46. package/force-app/main/default/staticresources/coveoheadless/definitions/utils/compare-utils.d.ts +2 -1
  47. package/force-app/main/default/staticresources/coveoheadless/definitions/utils/utils.d.ts +0 -1
  48. package/force-app/main/default/staticresources/coveoheadless/definitions/utils/validate-payload.d.ts +1 -1
  49. package/force-app/main/default/staticresources/coveoheadless/headless.js +7 -7
  50. package/force-app/main/default/staticresources/coveoheadless/insight/headless.js +6 -6
  51. package/force-app/main/default/staticresources/coveoheadless/recommendation/headless.js +5 -5
  52. package/force-app/main/default/staticresources/marked/marked.min.js +3 -3
  53. package/package.json +6 -10
  54. /package/force-app/main/default/lwc/quanticPager/e2e/{pagerObject.ts → pageObject.ts} +0 -0
@@ -30,21 +30,25 @@ const functionsMocks = {
30
30
  };
31
31
 
32
32
  const selectors = {
33
- facetBreadcrumb: '[data-test="facet-breadcrumb"]',
34
- facetBreadcrumbValue: '[data-test="facet-breadcrumb-value"]',
35
- categoryFacetBreadcrumb: '[data-test="category-facet-breadcrumb"]',
36
- categoryFacetBreadcrumbValue: '[data-test="category-facet-breadcrumb-value"]',
37
- numericFacetBreadcrumb: '[data-test="numeric-facet-breadcrumb"]',
38
- numericFacetBreadcrumbValue: '[data-test="numeric-facet-breadcrumb-value"]',
39
- dateFacetBreadcrumb: '[data-test="date-facet-breadcrumb"]',
40
- dateFacetBreadcrumbValue: '[data-test="date-facet-breadcrumb-value"]',
33
+ initializationError: 'c-quantic-component-error',
34
+ breadcrumbShowMoreButton: '[data-testid="breadcrumb-manager__more-button"]',
35
+ breadcrumbClearAllFiltersButton:
36
+ '[data-testid="breadcrumb-manager__clear-button"]',
37
+ facetBreadcrumb: '[data-testid="facet-breadcrumb"]',
38
+ facetBreadcrumbValue: '[data-testid="facet-breadcrumb-value"]',
39
+ categoryFacetBreadcrumb: '[data-testid="category-facet-breadcrumb"]',
40
+ categoryFacetBreadcrumbValue:
41
+ '[data-testid="category-facet-breadcrumb-value"]',
42
+ numericFacetBreadcrumb: '[data-testid="numeric-facet-breadcrumb"]',
43
+ numericFacetBreadcrumbValue: '[data-testid="numeric-facet-breadcrumb-value"]',
44
+ dateFacetBreadcrumb: '[data-testid="date-facet-breadcrumb"]',
45
+ dateFacetBreadcrumbValue: '[data-testid="date-facet-breadcrumb-value"]',
41
46
  };
42
47
 
43
48
  const exampleEngine = {
44
49
  id: 'dummy engine',
45
50
  };
46
- const exampleFacetId = 'idOne';
47
-
51
+ const defaultCollapseThreshold = 5;
48
52
  let isInitialized = false;
49
53
 
50
54
  function createTestComponent(options = {}) {
@@ -91,6 +95,15 @@ function mockSuccessfulHeadlessInitialization() {
91
95
  };
92
96
  }
93
97
 
98
+ function mockErroneousHeadlessInitialization() {
99
+ // @ts-ignore
100
+ mockHeadlessLoader.initializeWithHeadless = (element) => {
101
+ if (element instanceof QuanticBreadcrumbManager) {
102
+ element.setInitializationError();
103
+ }
104
+ };
105
+ }
106
+
94
107
  function cleanup() {
95
108
  // The jsdom instance is shared across test cases in a single file so reset the DOM
96
109
  while (document.body.firstChild) {
@@ -101,6 +114,47 @@ function cleanup() {
101
114
  }
102
115
 
103
116
  describe('c-quantic-breadcrumb-manager', () => {
117
+ afterEach(() => {
118
+ breadcrumbManagerState = initialBreadcrumbManagerState;
119
+ storeState = initialStoreState;
120
+ cleanup();
121
+ });
122
+
123
+ describe('when an initialization error occurs', () => {
124
+ beforeEach(() => {
125
+ mockErroneousHeadlessInitialization();
126
+ });
127
+
128
+ it('should display the initialization error component', async () => {
129
+ const element = createTestComponent();
130
+ await flushPromises();
131
+
132
+ const errorComponent = element.shadowRoot.querySelector(
133
+ selectors.initializationError
134
+ );
135
+
136
+ expect(errorComponent).not.toBeNull();
137
+ });
138
+ });
139
+
140
+ describe('controller initialization', () => {
141
+ beforeEach(() => {
142
+ mockSuccessfulHeadlessInitialization();
143
+ prepareHeadlessState();
144
+ });
145
+
146
+ it('should build the breadcrumb manager and subscribe to state', async () => {
147
+ createTestComponent();
148
+ await flushPromises();
149
+
150
+ expect(functionsMocks.buildBreadcrumbManager).toHaveBeenCalledTimes(1);
151
+ expect(functionsMocks.buildBreadcrumbManager).toHaveBeenCalledWith(
152
+ exampleEngine
153
+ );
154
+ expect(functionsMocks.subscribe).toHaveBeenCalledTimes(1);
155
+ });
156
+ });
157
+
104
158
  beforeEach(() => {
105
159
  mockSuccessfulHeadlessInitialization();
106
160
  prepareHeadlessState();
@@ -113,28 +167,33 @@ describe('c-quantic-breadcrumb-manager', () => {
113
167
  cleanup();
114
168
  });
115
169
 
116
- describe('facet breadcrumbs', () => {
170
+ describe('facet breadcrumbs rendering', () => {
117
171
  const exampleFacetBreadcrumbs = [
118
172
  {
119
173
  field: 'fieldOne',
120
- facetId: exampleFacetId,
121
- values: [{value: 'one'}, {value: 'two'}],
174
+ facetId: 'facetIdOne',
175
+ values: [{value: {value: 'one'}}, {value: {value: 'two'}}],
176
+ },
177
+ {
178
+ field: 'fieldTwo',
179
+ facetId: 'facetIdTwo',
180
+ values: [{value: {value: 'three'}}, {value: {value: 'four'}}],
122
181
  },
123
182
  ];
124
183
 
125
- beforeAll(() => {
184
+ beforeEach(() => {
126
185
  breadcrumbManagerState = {
127
186
  ...breadcrumbManagerState,
128
187
  facetBreadcrumbs: exampleFacetBreadcrumbs,
129
188
  hasBreadcrumbs: true,
130
189
  };
131
-
132
- storeState = {
133
- [exampleFacetId]: {
134
- facetId: exampleFacetId,
190
+ storeState = exampleFacetBreadcrumbs.reduce((acc, breadcrumb) => {
191
+ acc[breadcrumb.facetId] = {
192
+ facetId: breadcrumb.facetId,
135
193
  format: (value) => value,
136
- },
137
- };
194
+ };
195
+ return acc;
196
+ }, {});
138
197
  });
139
198
 
140
199
  it('should properly display the breadcrumb values', async () => {
@@ -161,32 +220,196 @@ describe('c-quantic-breadcrumb-manager', () => {
161
220
  );
162
221
  const values = exampleFacetBreadcrumb.values.map((item) => item.value);
163
222
  expect(labels).toEqual(values);
223
+
224
+ const breadcrumbClearAllFiltersButton =
225
+ element.shadowRoot.querySelector(
226
+ selectors.breadcrumbClearAllFiltersButton
227
+ );
228
+ expect(breadcrumbClearAllFiltersButton).not.toBeNull();
229
+ });
230
+ });
231
+
232
+ describe('when the number of selected values for one facet exceeds the collapse threshold', () => {
233
+ const testManyFacetBreadcrumbs = [
234
+ {
235
+ field: 'fieldOne',
236
+ facetId: 'facetIdOne',
237
+ values: [
238
+ {value: {value: 'one'}},
239
+ {value: {value: 'two'}},
240
+ {value: {value: 'three'}},
241
+ {value: {value: 'four'}},
242
+ {value: {value: 'five'}},
243
+ {value: {value: 'six'}},
244
+ ],
245
+ },
246
+ ];
247
+
248
+ beforeEach(() => {
249
+ breadcrumbManagerState = {
250
+ ...breadcrumbManagerState,
251
+ facetBreadcrumbs: testManyFacetBreadcrumbs,
252
+ hasBreadcrumbs: true,
253
+ };
254
+ storeState = testManyFacetBreadcrumbs.reduce((acc, breadcrumb) => {
255
+ acc[breadcrumb.facetId] = {
256
+ facetId: breadcrumb.facetId,
257
+ format: (value) => value,
258
+ };
259
+ return acc;
260
+ }, {});
261
+ });
262
+
263
+ it('should collapse the values and display a show more button', async () => {
264
+ const element = createTestComponent();
265
+ await flushPromises();
266
+
267
+ const facetBreadcrumbs = element.shadowRoot.querySelectorAll(
268
+ selectors.facetBreadcrumb
269
+ );
270
+ expect(facetBreadcrumbs.length).toBe(testManyFacetBreadcrumbs.length);
271
+
272
+ const firstFacetBreadcrumb = facetBreadcrumbs[0];
273
+ const facetBreadcrumbValues = Array.from(
274
+ firstFacetBreadcrumb.querySelectorAll(selectors.facetBreadcrumbValue)
275
+ );
276
+ expect(facetBreadcrumbValues.length).toBe(defaultCollapseThreshold);
277
+ facetBreadcrumbValues.forEach((facetBreadcrumbValue, index) => {
278
+ const facetValueLabel = facetBreadcrumbValue.label.value;
279
+ expect(facetValueLabel).toBe(
280
+ testManyFacetBreadcrumbs[0].values[index].value.value
281
+ );
282
+ });
283
+
284
+ const breadcrumbShowMoreButton = element.shadowRoot.querySelector(
285
+ selectors.breadcrumbShowMoreButton
286
+ );
287
+ expect(breadcrumbShowMoreButton).not.toBeNull();
288
+ });
289
+
290
+ it('should expand the values when the show more button is clicked', async () => {
291
+ const element = createTestComponent();
292
+ await flushPromises();
293
+
294
+ const facetBreadcrumbs = element.shadowRoot.querySelectorAll(
295
+ selectors.facetBreadcrumb
296
+ );
297
+ const firstFacetBreadcrumb = facetBreadcrumbs[0];
298
+
299
+ const facetBreadcrumbValues = Array.from(
300
+ firstFacetBreadcrumb.querySelectorAll(selectors.facetBreadcrumbValue)
301
+ );
302
+ expect(facetBreadcrumbValues.length).toBe(defaultCollapseThreshold);
303
+
304
+ const breadcrumbShowMoreButton = element.shadowRoot.querySelector(
305
+ selectors.breadcrumbShowMoreButton
306
+ );
307
+ expect(breadcrumbShowMoreButton).not.toBeNull();
308
+
309
+ breadcrumbShowMoreButton.click();
310
+ await flushPromises();
311
+
312
+ const facetBreadcrumbValuesAfterClick = Array.from(
313
+ firstFacetBreadcrumb.querySelectorAll(selectors.facetBreadcrumbValue)
314
+ );
315
+ expect(facetBreadcrumbValuesAfterClick.length).toBe(
316
+ testManyFacetBreadcrumbs[0].values.length
317
+ );
318
+ const breadcrumbShowMoreButtonAfterClick =
319
+ element.shadowRoot.querySelector(selectors.breadcrumbShowMoreButton);
320
+ expect(breadcrumbShowMoreButtonAfterClick).toBeNull();
321
+ });
322
+ });
323
+
324
+ describe('with a custom collapse threshold', () => {
325
+ const customCollapseThreshold = 3;
326
+ const testManyFacetBreadcrumbs = [
327
+ {
328
+ field: 'fieldOne',
329
+ facetId: 'facetIdOne',
330
+ values: [
331
+ {value: {value: 'one'}},
332
+ {value: {value: 'two'}},
333
+ {value: {value: 'three'}},
334
+ {value: {value: 'four'}},
335
+ {value: {value: 'five'}},
336
+ {value: {value: 'six'}},
337
+ ],
338
+ },
339
+ ];
340
+
341
+ beforeEach(() => {
342
+ breadcrumbManagerState = {
343
+ ...breadcrumbManagerState,
344
+ facetBreadcrumbs: testManyFacetBreadcrumbs,
345
+ hasBreadcrumbs: true,
346
+ };
347
+ storeState = testManyFacetBreadcrumbs.reduce((acc, breadcrumb) => {
348
+ acc[breadcrumb.facetId] = {
349
+ facetId: breadcrumb.facetId,
350
+ format: (value) => value,
351
+ };
352
+ return acc;
353
+ }, {});
354
+ });
355
+ it('should collapse the values over the custom collapse threshold and display a show more button', async () => {
356
+ const element = createTestComponent({
357
+ collapseThreshold: customCollapseThreshold,
358
+ });
359
+ await flushPromises();
360
+
361
+ const facetBreadcrumbs = element.shadowRoot.querySelectorAll(
362
+ selectors.facetBreadcrumb
363
+ );
364
+ expect(facetBreadcrumbs.length).toBe(testManyFacetBreadcrumbs.length);
365
+
366
+ const firstFacetBreadcrumb = facetBreadcrumbs[0];
367
+ const facetBreadcrumbValues = Array.from(
368
+ firstFacetBreadcrumb.querySelectorAll(selectors.facetBreadcrumbValue)
369
+ );
370
+ expect(facetBreadcrumbValues.length).toBe(customCollapseThreshold);
371
+ facetBreadcrumbValues.forEach((facetBreadcrumbValue, index) => {
372
+ const facetValueLabel = facetBreadcrumbValue.label.value;
373
+ expect(facetValueLabel).toBe(
374
+ testManyFacetBreadcrumbs[0].values[index].value.value
375
+ );
376
+ });
377
+
378
+ const breadcrumbShowMoreButton = element.shadowRoot.querySelector(
379
+ selectors.breadcrumbShowMoreButton
380
+ );
381
+ expect(breadcrumbShowMoreButton).not.toBeNull();
164
382
  });
165
383
  });
166
384
  });
167
385
 
168
386
  describe('category facet breadcrumbs', () => {
169
- const exampleCategoryFacetBreadcrumbs = [
387
+ const testCategoryFacetBreadcrumbs = [
170
388
  {
171
- field: exampleFacetId,
172
- facetId: exampleFacetId,
389
+ field: 'fieldOne',
390
+ facetId: 'facetIdOne',
173
391
  path: [{value: 'one'}, {value: 'two'}],
174
392
  },
393
+ {
394
+ field: 'fieldTwo',
395
+ facetId: 'facetIdTwo',
396
+ path: [{value: 'three'}, {value: 'four'}],
397
+ },
175
398
  ];
176
399
 
177
- beforeAll(() => {
400
+ beforeEach(() => {
178
401
  breadcrumbManagerState = {
179
402
  ...breadcrumbManagerState,
180
- categoryFacetBreadcrumbs: exampleCategoryFacetBreadcrumbs,
403
+ categoryFacetBreadcrumbs: testCategoryFacetBreadcrumbs,
181
404
  hasBreadcrumbs: true,
182
405
  };
183
-
184
- storeState = {
185
- [exampleFacetId]: {
186
- facetId: exampleFacetId,
406
+ storeState = testCategoryFacetBreadcrumbs.reduce((acc, breadcrumb) => {
407
+ acc[breadcrumb.facetId] = {
408
+ facetId: breadcrumb.facetId,
187
409
  format: (item) => item.value,
188
- },
189
- };
410
+ };
411
+ return acc;
412
+ }, {});
190
413
  });
191
414
 
192
415
  it('should properly display the breadcrumb values', async () => {
@@ -198,10 +421,10 @@ describe('c-quantic-breadcrumb-manager', () => {
198
421
  );
199
422
 
200
423
  expect(categoryFacetBreadcrumbs.length).toBe(
201
- exampleCategoryFacetBreadcrumbs.length
424
+ testCategoryFacetBreadcrumbs.length
202
425
  );
203
426
  categoryFacetBreadcrumbs.forEach((categoryFacetBreadcrumb, index) => {
204
- const exampleFacetBreadcrumb = exampleCategoryFacetBreadcrumbs[index];
427
+ const exampleFacetBreadcrumb = testCategoryFacetBreadcrumbs[index];
205
428
  const categoryFacetBreadcrumbValues = Array.from(
206
429
  categoryFacetBreadcrumb.querySelectorAll(
207
430
  selectors.categoryFacetBreadcrumbValue
@@ -217,30 +440,70 @@ describe('c-quantic-breadcrumb-manager', () => {
217
440
  expect(labels).toEqual([values.join(' / ')]);
218
441
  });
219
442
  });
443
+
444
+ describe('with a custom category divider', () => {
445
+ it('should display the breadcrumb values with the custom divider', async () => {
446
+ const customCategoryDivider = '*';
447
+ const element = createTestComponent({
448
+ categoryDivider: customCategoryDivider,
449
+ });
450
+ await flushPromises();
451
+
452
+ const categoryFacetBreadcrumbs = element.shadowRoot.querySelectorAll(
453
+ selectors.categoryFacetBreadcrumb
454
+ );
455
+
456
+ expect(categoryFacetBreadcrumbs.length).toBe(
457
+ testCategoryFacetBreadcrumbs.length
458
+ );
459
+
460
+ categoryFacetBreadcrumbs.forEach((categoryFacetBreadcrumb, index) => {
461
+ const exampleFacetBreadcrumb = testCategoryFacetBreadcrumbs[index];
462
+ const categoryFacetBreadcrumbValues = Array.from(
463
+ categoryFacetBreadcrumb.querySelectorAll(
464
+ selectors.categoryFacetBreadcrumbValue
465
+ )
466
+ );
467
+
468
+ expect(categoryFacetBreadcrumbValues.length).toBe(1);
469
+
470
+ const labels = categoryFacetBreadcrumbValues.map(
471
+ (facetBreadcrumbValue) => facetBreadcrumbValue.label
472
+ );
473
+ const values = exampleFacetBreadcrumb.path.map((item) => item.value);
474
+ expect(labels).toEqual([values.join(` ${customCategoryDivider} `)]);
475
+ });
476
+ });
477
+ });
220
478
  });
221
479
 
222
480
  describe('numeric facet breadcrumbs', () => {
223
- const exampleNumericFacetBreadcrumbs = [
481
+ const testNumericFacetBreadcrumbs = [
224
482
  {
225
483
  field: 'fieldOne',
226
- facetId: exampleFacetId,
484
+ facetId: 'facetIdOne',
227
485
  values: [{value: {start: 0, end: 1}}, {value: {start: 1, end: 2}}],
228
486
  },
487
+ {
488
+ field: 'fieldTwo',
489
+ facetId: 'facetIdTwo',
490
+ values: [{value: {start: 10, end: 11}}, {value: {start: 20, end: 21}}],
491
+ },
229
492
  ];
230
493
 
231
494
  beforeAll(() => {
232
495
  breadcrumbManagerState = {
233
496
  ...breadcrumbManagerState,
234
- numericFacetBreadcrumbs: exampleNumericFacetBreadcrumbs,
497
+ numericFacetBreadcrumbs: testNumericFacetBreadcrumbs,
235
498
  hasBreadcrumbs: true,
236
499
  };
237
-
238
- storeState = {
239
- [exampleFacetId]: {
240
- facetId: exampleFacetId,
500
+ storeState = testNumericFacetBreadcrumbs.reduce((acc, breadcrumb) => {
501
+ acc[breadcrumb.facetId] = {
502
+ facetId: breadcrumb.facetId,
241
503
  format: (item) => `${item.start} - ${item.end}`,
242
- },
243
- };
504
+ };
505
+ return acc;
506
+ }, {});
244
507
  });
245
508
 
246
509
  it('should properly display the breadcrumb values', async () => {
@@ -252,10 +515,10 @@ describe('c-quantic-breadcrumb-manager', () => {
252
515
  );
253
516
 
254
517
  expect(numericFacetBreadcrumbs.length).toBe(
255
- exampleNumericFacetBreadcrumbs.length
518
+ testNumericFacetBreadcrumbs.length
256
519
  );
257
520
  numericFacetBreadcrumbs.forEach((numericFacetBreadcrumb, index) => {
258
- const exampleFacetBreadcrumb = exampleNumericFacetBreadcrumbs[index];
521
+ const exampleFacetBreadcrumb = testNumericFacetBreadcrumbs[index];
259
522
  const facetBreadcrumbValues = Array.from(
260
523
  numericFacetBreadcrumb.querySelectorAll(
261
524
  selectors.numericFacetBreadcrumbValue
@@ -278,30 +541,38 @@ describe('c-quantic-breadcrumb-manager', () => {
278
541
  });
279
542
 
280
543
  describe('date facet breadcrumbs', () => {
281
- const exampleDateFacetBreadcrumbs = [
544
+ const testDateFacetBreadcrumbs = [
282
545
  {
283
546
  field: 'fieldOne',
284
- facetId: exampleFacetId,
547
+ facetId: 'facetIdOne',
285
548
  values: [
286
549
  {value: {start: 'yesterday', end: 'today'}},
287
550
  {value: {start: 'today', end: 'tomorrow'}},
288
551
  ],
289
552
  },
553
+ {
554
+ field: 'fieldTwo',
555
+ facetId: 'facetIdTwo',
556
+ values: [
557
+ {value: {start: 'last week', end: 'today'}},
558
+ {value: {start: 'tomorrow', end: 'next week'}},
559
+ ],
560
+ },
290
561
  ];
291
562
 
292
563
  beforeAll(() => {
293
564
  breadcrumbManagerState = {
294
565
  ...breadcrumbManagerState,
295
- dateFacetBreadcrumbs: exampleDateFacetBreadcrumbs,
566
+ dateFacetBreadcrumbs: testDateFacetBreadcrumbs,
296
567
  hasBreadcrumbs: true,
297
568
  };
298
-
299
- storeState = {
300
- [exampleFacetId]: {
301
- facetId: exampleFacetId,
569
+ storeState = testDateFacetBreadcrumbs.reduce((acc, breadcrumb) => {
570
+ acc[breadcrumb.facetId] = {
571
+ facetId: breadcrumb.facetId,
302
572
  format: (item) => `${item.start} - ${item.end}`,
303
- },
304
- };
573
+ };
574
+ return acc;
575
+ }, {});
305
576
  });
306
577
 
307
578
  it('should properly display the breadcrumb values', async () => {
@@ -312,12 +583,10 @@ describe('c-quantic-breadcrumb-manager', () => {
312
583
  selectors.dateFacetBreadcrumb
313
584
  );
314
585
 
315
- expect(dateFacetBreadcrumbs.length).toBe(
316
- exampleDateFacetBreadcrumbs.length
317
- );
586
+ expect(dateFacetBreadcrumbs.length).toBe(testDateFacetBreadcrumbs.length);
318
587
 
319
588
  dateFacetBreadcrumbs.forEach((dateFacetBreadcrumb, index) => {
320
- const exampleFacetBreadcrumb = exampleDateFacetBreadcrumbs[index];
589
+ const exampleFacetBreadcrumb = testDateFacetBreadcrumbs[index];
321
590
  const facetBreadcrumbValues = Array.from(
322
591
  dateFacetBreadcrumb.querySelectorAll(
323
592
  selectors.dateFacetBreadcrumbValue
@@ -0,0 +1,76 @@
1
+ import {BreadcrumbManagerObject} from './pageObject';
2
+ import {quanticBase} from '../../../../../../playwright/fixtures/baseFixture';
3
+ import {SearchObject} from '../../../../../../playwright/page-object/searchObject';
4
+ import {
5
+ searchRequestRegex,
6
+ insightSearchRequestRegex,
7
+ } from '../../../../../../playwright/utils/requests';
8
+ import {InsightSetupObject} from '../../../../../../playwright/page-object/insightSetupObject';
9
+ import {useCaseEnum} from '../../../../../../playwright/utils/useCase';
10
+
11
+ const breadcrumbManagerUrl = 's/quantic-breadcrumb-manager';
12
+
13
+ interface BreadcrumbManagerOptions {
14
+ categoryDivider: string;
15
+ collapseThreshold: number;
16
+ }
17
+
18
+ type QuanticBreadcrumbManagerE2EFixtures = {
19
+ breadcrumbManager: BreadcrumbManagerObject;
20
+ search: SearchObject;
21
+ options: Partial<BreadcrumbManagerOptions>;
22
+ };
23
+
24
+ type QuanticBreadcrumbManagerE2ESearchFixtures =
25
+ QuanticBreadcrumbManagerE2EFixtures & {
26
+ urlHash: string;
27
+ };
28
+
29
+ type QuanticBreadcrumbManagerE2eInsightFixtures =
30
+ QuanticBreadcrumbManagerE2ESearchFixtures & {
31
+ insightSetup: InsightSetupObject;
32
+ };
33
+
34
+ export const testSearch =
35
+ quanticBase.extend<QuanticBreadcrumbManagerE2ESearchFixtures>({
36
+ options: {},
37
+ urlHash: '',
38
+ search: async ({page}, use) => {
39
+ await use(new SearchObject(page, searchRequestRegex));
40
+ },
41
+ breadcrumbManager: async (
42
+ {page, options, configuration, search, urlHash},
43
+ use
44
+ ) => {
45
+ await page.goto(
46
+ urlHash ? `${breadcrumbManagerUrl}#${urlHash}` : breadcrumbManagerUrl
47
+ );
48
+ configuration.configure(options);
49
+ await search.waitForSearchResponse();
50
+ await use(new BreadcrumbManagerObject(page));
51
+ },
52
+ });
53
+
54
+ export const testInsight =
55
+ quanticBase.extend<QuanticBreadcrumbManagerE2eInsightFixtures>({
56
+ options: {},
57
+ search: async ({page}, use) => {
58
+ await use(new SearchObject(page, insightSearchRequestRegex));
59
+ },
60
+ insightSetup: async ({page}, use) => {
61
+ await use(new InsightSetupObject(page));
62
+ },
63
+ breadcrumbManager: async (
64
+ {page, options, search, configuration, insightSetup},
65
+ use
66
+ ) => {
67
+ await page.goto(breadcrumbManagerUrl);
68
+ configuration.configure({...options, useCase: useCaseEnum.insight});
69
+ await insightSetup.waitForInsightInterfaceInitialization();
70
+ await search.performSearch();
71
+ await search.waitForSearchResponse();
72
+ await use(new BreadcrumbManagerObject(page));
73
+ },
74
+ });
75
+
76
+ export {expect} from '@playwright/test';