@coveo/quantic 3.11.1 → 3.12.1
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/force-app/main/default/lwc/quanticBreadcrumbManager/__tests__/quanticBreadcrumbManager.test.js +326 -57
- package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/fixture.ts +76 -0
- package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/pageObject.ts +282 -0
- package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/quanticBreadcrumbManager.e2e.ts +167 -0
- package/force-app/main/default/lwc/quanticBreadcrumbManager/quanticBreadcrumbManager.html +10 -10
- package/force-app/main/default/lwc/quanticPager/e2e/fixture.ts +4 -4
- package/force-app/main/default/lwc/quanticTab/__tests__/quanticTab.test.js +287 -0
- package/force-app/main/default/lwc/quanticTab/e2e/fixture.ts +62 -0
- package/force-app/main/default/lwc/quanticTab/e2e/pageObject.ts +67 -0
- package/force-app/main/default/lwc/quanticTab/e2e/quanticTab.e2e.ts +77 -0
- package/force-app/main/default/lwc/quanticTab/quanticTab.html +1 -1
- package/force-app/main/default/lwc/quanticTabBar/__tests__/quanticTabBar.test.js +331 -0
- package/force-app/main/default/lwc/quanticTabBar/e2e/fixture.ts +61 -0
- package/force-app/main/default/lwc/quanticTabBar/e2e/pageObject.ts +80 -0
- package/force-app/main/default/lwc/quanticTabBar/e2e/quanticTabBar.e2e.ts +173 -0
- package/force-app/main/default/lwc/quanticTabBar/quanticTabBar.html +30 -8
- package/force-app/main/default/lwc/quanticTabBar/quanticTabBar.js +5 -4
- package/force-app/main/default/lwc/quanticUtils/__tests__/markdownUtils.test.js +1 -1
- package/force-app/main/default/staticresources/coveoheadless/case-assist/headless.js +8 -6
- package/force-app/main/default/staticresources/coveoheadless/definitions/api/commerce/common/request.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/api/knowledge/stream-answer-api.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/api/search/search-api-params.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/api/service/case-assist/case-assist-params.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/api/service/insight/insight-params.d.ts +2 -2
- package/force-app/main/default/staticresources/coveoheadless/definitions/app/commerce-ssr-engine/types/common.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/app/commerce-ssr-engine/types/kind.d.ts +3 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/app/ssr-engine/types/common.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/app/undoable.d.ts +0 -3
- package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/sub-controller/headless-sub-controller.ssr.d.ts +2 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/core/context/example-deleteme-headless-case-context.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/actions-history/ipx-actions-history-actions.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/analytics/analytics-utils.d.ts +3 -3
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/parameters/parameters-serializer.d.ts +2 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/generated-answer/generated-answer-analytics-actions.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/history/history-actions.d.ts +3 -3
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/pipeline/select-pipeline.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/query/query-selectors.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/question-answering/question-answering-document-id.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/legacy/search-actions.d.ts +42 -42
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/legacy/search-request.d.ts +44 -44
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/search-actions.d.ts +42 -43
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/search-mappings.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/search-request.d.ts +44 -44
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/search-hub/search-hub-selectors.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/selectors/commerce-selectors.index.d.ts +2 -2
- package/force-app/main/default/staticresources/coveoheadless/definitions/test/mock-search-request.d.ts +44 -44
- package/force-app/main/default/staticresources/coveoheadless/definitions/tsdoc-metadata.json +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/utils/compare-utils.d.ts +2 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/utils/errors.d.ts +3 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/utils/utils.d.ts +0 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/utils/validate-payload.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/headless.js +10 -8
- package/force-app/main/default/staticresources/coveoheadless/insight/headless.js +9 -7
- package/force-app/main/default/staticresources/coveoheadless/recommendation/headless.js +8 -6
- package/force-app/main/default/staticresources/marked/marked.min.js +3 -3
- package/package.json +6 -10
- /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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
|
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:
|
|
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
|
-
|
|
184
|
+
beforeEach(() => {
|
|
126
185
|
breadcrumbManagerState = {
|
|
127
186
|
...breadcrumbManagerState,
|
|
128
187
|
facetBreadcrumbs: exampleFacetBreadcrumbs,
|
|
129
188
|
hasBreadcrumbs: true,
|
|
130
189
|
};
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
|
387
|
+
const testCategoryFacetBreadcrumbs = [
|
|
170
388
|
{
|
|
171
|
-
field:
|
|
172
|
-
facetId:
|
|
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
|
-
|
|
400
|
+
beforeEach(() => {
|
|
178
401
|
breadcrumbManagerState = {
|
|
179
402
|
...breadcrumbManagerState,
|
|
180
|
-
categoryFacetBreadcrumbs:
|
|
403
|
+
categoryFacetBreadcrumbs: testCategoryFacetBreadcrumbs,
|
|
181
404
|
hasBreadcrumbs: true,
|
|
182
405
|
};
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
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
|
-
|
|
424
|
+
testCategoryFacetBreadcrumbs.length
|
|
202
425
|
);
|
|
203
426
|
categoryFacetBreadcrumbs.forEach((categoryFacetBreadcrumb, index) => {
|
|
204
|
-
const exampleFacetBreadcrumb =
|
|
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
|
|
481
|
+
const testNumericFacetBreadcrumbs = [
|
|
224
482
|
{
|
|
225
483
|
field: 'fieldOne',
|
|
226
|
-
facetId:
|
|
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:
|
|
497
|
+
numericFacetBreadcrumbs: testNumericFacetBreadcrumbs,
|
|
235
498
|
hasBreadcrumbs: true,
|
|
236
499
|
};
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
-
|
|
518
|
+
testNumericFacetBreadcrumbs.length
|
|
256
519
|
);
|
|
257
520
|
numericFacetBreadcrumbs.forEach((numericFacetBreadcrumb, index) => {
|
|
258
|
-
const exampleFacetBreadcrumb =
|
|
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
|
|
544
|
+
const testDateFacetBreadcrumbs = [
|
|
282
545
|
{
|
|
283
546
|
field: 'fieldOne',
|
|
284
|
-
facetId:
|
|
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:
|
|
566
|
+
dateFacetBreadcrumbs: testDateFacetBreadcrumbs,
|
|
296
567
|
hasBreadcrumbs: true,
|
|
297
568
|
};
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
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 =
|
|
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';
|