@coveo/quantic 3.16.0 → 3.16.1-pre.9c01cf606f

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 (109) hide show
  1. package/force-app/main/default/staticresources/coveoheadless/case-assist/headless.js +2 -2
  2. package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/recent-queries-list/headless-recent-queries-list.d.ts +5 -0
  3. package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/recent-queries-list/headless-recent-queries-list.d.ts +5 -0
  4. package/force-app/main/default/staticresources/coveoheadless/headless.js +10 -10
  5. package/force-app/main/default/staticresources/coveoheadless/insight/headless.js +2 -2
  6. package/force-app/main/default/staticresources/coveoheadless/recommendation/headless.js +2 -2
  7. package/package.json +5 -3
  8. package/force-app/main/default/lwc/quanticBreadcrumbManager/__tests__/quanticBreadcrumbManager.test.js +0 -604
  9. package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/fixture.ts +0 -76
  10. package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/pageObject.ts +0 -282
  11. package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/quanticBreadcrumbManager.e2e.ts +0 -167
  12. package/force-app/main/default/lwc/quanticCarousel/__tests__/quanticCarousel.test.js +0 -262
  13. package/force-app/main/default/lwc/quanticCaseClassification/__tests__/quanticCaseClassification.test.js +0 -819
  14. package/force-app/main/default/lwc/quanticCaseClassification/e2e/data.ts +0 -23
  15. package/force-app/main/default/lwc/quanticCaseClassification/e2e/fixture.ts +0 -51
  16. package/force-app/main/default/lwc/quanticCaseClassification/e2e/pageObject.ts +0 -152
  17. package/force-app/main/default/lwc/quanticCaseClassification/e2e/quanticCaseClassification.e2e.ts +0 -269
  18. package/force-app/main/default/lwc/quanticCategoryFacet/__tests__/quanticCategoryFacet.test.js +0 -327
  19. package/force-app/main/default/lwc/quanticCitation/__tests__/quanticCitation.test.js +0 -269
  20. package/force-app/main/default/lwc/quanticColoredResultBadge/__tests__/quanticColoredResultBadge.test.js +0 -212
  21. package/force-app/main/default/lwc/quanticDateFacet/__tests__/quanticDateFacet.test.js +0 -321
  22. package/force-app/main/default/lwc/quanticDidYouMean/__tests__/quanticDidYouMean.test.js +0 -199
  23. package/force-app/main/default/lwc/quanticFacet/__tests__/quanticFacet.test.js +0 -341
  24. package/force-app/main/default/lwc/quanticFacetCaption/__tests__/quanticFacetCaption.test.js +0 -28
  25. package/force-app/main/default/lwc/quanticFacetManager/__tests__/quanticFacetManager.test.js +0 -178
  26. package/force-app/main/default/lwc/quanticFacetManager/e2e/fixture.ts +0 -63
  27. package/force-app/main/default/lwc/quanticFacetManager/e2e/pageObject.ts +0 -23
  28. package/force-app/main/default/lwc/quanticFacetManager/e2e/quanticFacetManager.e2e.ts +0 -82
  29. package/force-app/main/default/lwc/quanticFeedback/__tests__/quanticFeedback.test.js +0 -392
  30. package/force-app/main/default/lwc/quanticFeedbackModal/__tests__/quanticFeedbackModal.test.js +0 -448
  31. package/force-app/main/default/lwc/quanticFeedbackModalQna/__tests__/quanticFeedbackModalQna.test.js +0 -298
  32. package/force-app/main/default/lwc/quanticGeneratedAnswer/__tests__/quanticGeneratedAnswer.test.js +0 -814
  33. package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/data.ts +0 -56
  34. package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/fixture.ts +0 -87
  35. package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/pageObject.ts +0 -283
  36. package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/quanticGeneratedAnswer.e2e.ts +0 -199
  37. package/force-app/main/default/lwc/quanticGeneratedAnswerContent/__tests__/quanticGeneratedAnswerContent.test.js +0 -151
  38. package/force-app/main/default/lwc/quanticHeading/__tests__/quanticHeading.test.js +0 -71
  39. package/force-app/main/default/lwc/quanticHeadlessLoader/__tests__/quanticHeadlessLoader.test.js +0 -651
  40. package/force-app/main/default/lwc/quanticNotifications/__tests__/quanticNotifications.test.js +0 -335
  41. package/force-app/main/default/lwc/quanticNumericFacet/__tests__/quanticNumericFacet.test.js +0 -343
  42. package/force-app/main/default/lwc/quanticPager/e2e/fixture.ts +0 -63
  43. package/force-app/main/default/lwc/quanticPager/e2e/pageObject.ts +0 -69
  44. package/force-app/main/default/lwc/quanticPager/e2e/quanticPager.e2e.ts +0 -101
  45. package/force-app/main/default/lwc/quanticQuickviewContent/__tests__/data/defaultTestCase.json +0 -13
  46. package/force-app/main/default/lwc/quanticQuickviewContent/__tests__/data/youtubeTestCase.json +0 -14
  47. package/force-app/main/default/lwc/quanticQuickviewContent/__tests__/quanticQuickviewContent.test.js +0 -82
  48. package/force-app/main/default/lwc/quanticRadioButtonsGroup/__tests__/quanticRadioButtonsGroup.test.js +0 -273
  49. package/force-app/main/default/lwc/quanticRefineModalContent/__tests__/quanticRefineModalContent.test.js +0 -501
  50. package/force-app/main/default/lwc/quanticResultAction/__tests__/quanticResultAction.test.js +0 -262
  51. package/force-app/main/default/lwc/quanticResultActionBar/__tests__/quanticResultActionBar.test.js +0 -141
  52. package/force-app/main/default/lwc/quanticResultChildren/__tests__/quanticResultChildren.test.js +0 -340
  53. package/force-app/main/default/lwc/quanticResultDate/__tests__/quanticResultDate.test.js +0 -144
  54. package/force-app/main/default/lwc/quanticResultField/__tests__/quanticResultField.test.js +0 -120
  55. package/force-app/main/default/lwc/quanticResultHighlightedTextField/__tests__/quanticResultHighlightedTextField.test.js +0 -209
  56. package/force-app/main/default/lwc/quanticResultLink/__tests__/quanticResultLink.test.js +0 -261
  57. package/force-app/main/default/lwc/quanticResultMultiValueText/__tests__/quanticResultMultiValueText.test.js +0 -235
  58. package/force-app/main/default/lwc/quanticResultNumber/__tests__/quanticResultNumber.test.js +0 -144
  59. package/force-app/main/default/lwc/quanticResultPrintableUri/__tests__/quanticResultPrintableUri.test.js +0 -324
  60. package/force-app/main/default/lwc/quanticResultQuickview/__tests__/quanticResultQuickview.test.js +0 -171
  61. package/force-app/main/default/lwc/quanticResultText/__tests__/quanticResultText.test.js +0 -155
  62. package/force-app/main/default/lwc/quanticResultsPerPage/__tests__/quanticResultsPerPage.test.js +0 -404
  63. package/force-app/main/default/lwc/quanticResultsPerPage/e2e/fixture.ts +0 -74
  64. package/force-app/main/default/lwc/quanticResultsPerPage/e2e/pageObject.ts +0 -85
  65. package/force-app/main/default/lwc/quanticResultsPerPage/e2e/quanticResultsPerPage.e2e.ts +0 -97
  66. package/force-app/main/default/lwc/quanticSearchBox/__tests__/quanticSearchBox.test.js +0 -168
  67. package/force-app/main/default/lwc/quanticSearchBoxInput/__tests__/quanticSearchBoxInput.test.js +0 -823
  68. package/force-app/main/default/lwc/quanticSmartSnippet/__tests__/quanticSmartSnippet.test.js +0 -341
  69. package/force-app/main/default/lwc/quanticSmartSnippet/e2e/data.ts +0 -21
  70. package/force-app/main/default/lwc/quanticSmartSnippet/e2e/fixture.ts +0 -91
  71. package/force-app/main/default/lwc/quanticSmartSnippet/e2e/pageObject.ts +0 -196
  72. package/force-app/main/default/lwc/quanticSmartSnippet/e2e/quanticSmartSnippet.e2e.ts +0 -168
  73. package/force-app/main/default/lwc/quanticSmartSnippetAnswer/__tests__/quanticSmartSnippetAnswer.test.js +0 -126
  74. package/force-app/main/default/lwc/quanticSmartSnippetSource/__tests__/quanticSmartSnippetSource.test.js +0 -290
  75. package/force-app/main/default/lwc/quanticSmartSnippetSuggestions/__tests__/quanticSmartSnippetSuggestions.test.js +0 -329
  76. package/force-app/main/default/lwc/quanticSmartSnippetSuggestions/e2e/data.ts +0 -31
  77. package/force-app/main/default/lwc/quanticSmartSnippetSuggestions/e2e/fixture.ts +0 -93
  78. package/force-app/main/default/lwc/quanticSmartSnippetSuggestions/e2e/pageObject.ts +0 -160
  79. package/force-app/main/default/lwc/quanticSmartSnippetSuggestions/e2e/quanticSmartSnippetSuggestions.e2e.ts +0 -127
  80. package/force-app/main/default/lwc/quanticSort/__tests__/quanticSort.test.js +0 -416
  81. package/force-app/main/default/lwc/quanticSort/e2e/fixture.ts +0 -61
  82. package/force-app/main/default/lwc/quanticSort/e2e/pageObject.ts +0 -89
  83. package/force-app/main/default/lwc/quanticSort/e2e/quanticSort.e2e.ts +0 -91
  84. package/force-app/main/default/lwc/quanticSourceCitations/__tests__/quanticSourceCitations.test.js +0 -123
  85. package/force-app/main/default/lwc/quanticStandaloneSearchBox/__tests__/quanticStandaloneSearchBox.test.js +0 -186
  86. package/force-app/main/default/lwc/quanticStatefulButton/__tests__/quanticStatefulButton.test.js +0 -222
  87. package/force-app/main/default/lwc/quanticTab/__tests__/quanticTab.test.js +0 -287
  88. package/force-app/main/default/lwc/quanticTab/e2e/fixture.ts +0 -62
  89. package/force-app/main/default/lwc/quanticTab/e2e/pageObject.ts +0 -67
  90. package/force-app/main/default/lwc/quanticTab/e2e/quanticTab.e2e.ts +0 -77
  91. package/force-app/main/default/lwc/quanticTabBar/__tests__/quanticTabBar.test.js +0 -331
  92. package/force-app/main/default/lwc/quanticTabBar/e2e/fixture.ts +0 -61
  93. package/force-app/main/default/lwc/quanticTabBar/e2e/pageObject.ts +0 -80
  94. package/force-app/main/default/lwc/quanticTabBar/e2e/quanticTabBar.e2e.ts +0 -173
  95. package/force-app/main/default/lwc/quanticTimeframeFacet/__tests__/quanticTimeframeFacet.test.js +0 -339
  96. package/force-app/main/default/lwc/quanticTooltip/__tests__/quanticTooltip.test.js +0 -107
  97. package/force-app/main/default/lwc/quanticUserAction/__tests__/quanticUserAction.test.js +0 -427
  98. package/force-app/main/default/lwc/quanticUserActionsSession/__tests__/quanticUserActionsSession.test.js +0 -269
  99. package/force-app/main/default/lwc/quanticUserActionsTimeline/__tests__/data/userActionsState.json +0 -89
  100. package/force-app/main/default/lwc/quanticUserActionsTimeline/__tests__/quanticUserActionsTimeline.test.js +0 -511
  101. package/force-app/main/default/lwc/quanticUserActionsToggle/__tests__/quanticUserActionsToggle.test.js +0 -229
  102. package/force-app/main/default/lwc/quanticUserActionsToggle/e2e/data.ts +0 -32
  103. package/force-app/main/default/lwc/quanticUserActionsToggle/e2e/fixture.ts +0 -32
  104. package/force-app/main/default/lwc/quanticUserActionsToggle/e2e/pageObject.ts +0 -71
  105. package/force-app/main/default/lwc/quanticUserActionsToggle/e2e/quanticUserActionsToggle.e2e.ts +0 -39
  106. package/force-app/main/default/lwc/quanticUtils/__tests__/facetDependenciesUtils.test.js +0 -92
  107. package/force-app/main/default/lwc/quanticUtils/__tests__/markdownUtils.test.js +0 -71
  108. package/force-app/main/default/lwc/quanticUtils/__tests__/quanticUtils.test.js +0 -223
  109. package/force-app/main/default/lwc/quanticViewedByCustomerBadge/__tests__/quanticViewedByCustomerBadge.test.js +0 -131
@@ -1,814 +0,0 @@
1
- /* eslint-disable no-import-assign */
2
- // @ts-ignore
3
- import {createElement} from 'lwc';
4
- import QuanticGeneratedAnswer from 'c/quanticGeneratedAnswer';
5
- import * as mockHeadlessLoader from 'c/quanticHeadlessLoader';
6
-
7
- let mockAnswerHeight = 250;
8
- let mockedConsoleWarn;
9
-
10
- const exampleItemOne = document.createElement('div');
11
- exampleItemOne.innerText = 'Custom error message';
12
- const exampleAssignedElements = [exampleItemOne];
13
-
14
- jest.mock('c/quanticHeadlessLoader');
15
- jest.mock('c/quanticUtils', () => ({
16
- AriaLiveRegion: jest.fn(() => ({
17
- dispatchMessage: jest.fn(),
18
- })),
19
- loadMarkdownDependencies: jest.fn(
20
- () =>
21
- new Promise((resolve) => {
22
- resolve();
23
- })
24
- ),
25
- getAbsoluteHeight: jest.fn(() => {
26
- return mockAnswerHeight;
27
- }),
28
- I18nUtils: {
29
- format: jest.fn(),
30
- },
31
- }));
32
-
33
- /** @type {Object} */
34
- const defaultOptions = {
35
- fieldsToIncludeInCitations: 'sfid,sfkbid,sfkavid',
36
- answerConfigurationId: undefined,
37
- withToggle: false,
38
- collapsible: false,
39
- maxCollapsedHeight: 250,
40
- };
41
-
42
- function createTestComponent(options = defaultOptions, assignedElements = []) {
43
- mockSlotAssignedNodes(assignedElements);
44
- const element = createElement('c-quantic-generated-answer', {
45
- is: QuanticGeneratedAnswer,
46
- });
47
- for (const [key, value] of Object.entries(options)) {
48
- element[key] = value;
49
- }
50
-
51
- document.body.appendChild(element);
52
- return element;
53
- }
54
-
55
- const selectors = {
56
- initializationError: 'c-quantic-component-error',
57
- generatedAnswerCard: '[data-testid="generated-answer__card"]',
58
- generatedAnswer: '[data-testid="generated-answer__answer"]',
59
- generatedAnswerBadge: '[data-testid="generated-answer__badge"]',
60
- generatedAnswerRetryButton: '[data-testid="generated-answer__retry-button"]',
61
- generatedAnswerActions: '[data-testid="generated-answer__actions"]',
62
- generatedAnswerToggleButton: 'c-quantic-generated-answer-toggle',
63
- generatedAnswerContent: 'c-quantic-generated-answer-content',
64
- generatingMessageWhenAnswerCollapsed:
65
- '[data-testid="generated-answer__collapse-generating-message"]',
66
- generatedAnswerCollapseToggle:
67
- '[data-testid="generated-answer__answer-toggle"]',
68
- generatedAnswerDisclaimer: '[data-testid="generated-answer__disclaimer"]',
69
- generatedAnswerNoAnswerCard:
70
- '[data-testid="generated-answer__no-answer-card"]',
71
- };
72
-
73
- const initialSearchStatusState = {
74
- hasError: false,
75
- };
76
- let searchStatusState = initialSearchStatusState;
77
-
78
- const initialGeneratedAnswerState = {isVisible: true, cannotAnswer: false};
79
- let generatedAnswerState = initialGeneratedAnswerState;
80
-
81
- const functionsMocks = {
82
- buildGeneratedAnswer: jest.fn(() => ({
83
- state: generatedAnswerState,
84
- subscribe: functionsMocks.generatedAnswerStateSubscriber,
85
- retry: functionsMocks.retry,
86
- })),
87
- buildSearchStatus: jest.fn(() => ({
88
- state: searchStatusState,
89
- subscribe: functionsMocks.searchStatusStateSubscriber,
90
- })),
91
- generatedAnswerStateSubscriber: jest.fn((cb) => {
92
- cb();
93
- return functionsMocks.generatedAnswerStateUnsubscriber;
94
- }),
95
- searchStatusStateSubscriber: jest.fn((cb) => {
96
- cb();
97
- return functionsMocks.searchStatusStateUnsubscriber;
98
- }),
99
- generatedAnswerStateUnsubscriber: jest.fn(),
100
- searchStatusStateUnsubscriber: jest.fn(),
101
- retry: jest.fn(),
102
- };
103
-
104
- /**
105
- * Mocks the return value of the assignedNodes method.
106
- * @param {Array<Element>} assignedElements
107
- */
108
- function mockSlotAssignedNodes(assignedElements) {
109
- HTMLSlotElement.prototype.assignedNodes = function () {
110
- return assignedElements;
111
- };
112
- }
113
-
114
- // Helper function to wait until the microtask queue is empty.
115
- function flushPromises() {
116
- // eslint-disable-next-line @lwc/lwc/no-async-operation
117
- return new Promise((resolve) => setTimeout(resolve, 0));
118
- }
119
-
120
- const exampleEngine = {
121
- id: 'dummy engine',
122
- };
123
- let isInitialized = false;
124
- const defaultAnswerHeight = 250;
125
-
126
- function prepareHeadlessState() {
127
- // @ts-ignore
128
- mockHeadlessLoader.getHeadlessBundle = () => {
129
- return {
130
- buildGeneratedAnswer: functionsMocks.buildGeneratedAnswer,
131
- buildSearchStatus: functionsMocks.buildSearchStatus,
132
- };
133
- };
134
- }
135
-
136
- function mockSuccessfulHeadlessInitialization() {
137
- // @ts-ignore
138
- mockHeadlessLoader.initializeWithHeadless = (element, _, initialize) => {
139
- if (element instanceof QuanticGeneratedAnswer && !isInitialized) {
140
- isInitialized = true;
141
- initialize(exampleEngine);
142
- }
143
- };
144
- }
145
-
146
- function mockErroneousHeadlessInitialization() {
147
- // @ts-ignore
148
- mockHeadlessLoader.initializeWithHeadless = (element) => {
149
- if (element instanceof QuanticGeneratedAnswer) {
150
- element.setInitializationError();
151
- }
152
- };
153
- }
154
-
155
- function cleanup() {
156
- // The jsdom instance is shared across test cases in a single file so reset the DOM
157
- while (document.body.firstChild) {
158
- document.body.removeChild(document.body.firstChild);
159
- }
160
- jest.clearAllMocks();
161
- isInitialized = false;
162
- }
163
-
164
- describe('c-quantic-generated-answer', () => {
165
- beforeEach(() => {
166
- mockedConsoleWarn = jest.spyOn(console, 'warn').mockImplementation();
167
- });
168
-
169
- afterEach(() => {
170
- cleanup();
171
- });
172
-
173
- describe('when an initialization error occurs', () => {
174
- beforeEach(() => {
175
- mockErroneousHeadlessInitialization();
176
- });
177
-
178
- it('should display the initialization error component', async () => {
179
- const element = createTestComponent();
180
- await flushPromises();
181
-
182
- const initializationError = element.shadowRoot.querySelector(
183
- selectors.initializationError
184
- );
185
-
186
- expect(initializationError).not.toBeNull();
187
- });
188
- });
189
-
190
- describe('when an RGA retryable error occurs', () => {
191
- beforeEach(() => {
192
- searchStatusState = {...initialSearchStatusState, hasError: false};
193
- generatedAnswerState = {
194
- ...initialGeneratedAnswerState,
195
- error: {
196
- isRetryable: true,
197
- },
198
- };
199
- mockSuccessfulHeadlessInitialization();
200
- prepareHeadlessState();
201
- });
202
-
203
- afterAll(() => {
204
- generatedAnswerState = initialGeneratedAnswerState;
205
- searchStatusState = initialSearchStatusState;
206
- });
207
-
208
- it('should display retry prompt', async () => {
209
- const element = createTestComponent();
210
- await flushPromises();
211
-
212
- const generatedAnswerCard = element.shadowRoot.querySelector(
213
- selectors.generatedAnswerCard
214
- );
215
- const generatedAnswerRetryButton = element.shadowRoot.querySelector(
216
- selectors.generatedAnswerRetryButton
217
- );
218
-
219
- expect(generatedAnswerCard).not.toBeNull();
220
- expect(generatedAnswerRetryButton).not.toBeNull();
221
- });
222
-
223
- describe('when the retry button is clicked', () => {
224
- it('should call the retry method of the generated answer controller controller', async () => {
225
- const element = createTestComponent();
226
- await flushPromises();
227
-
228
- const generatedAnswerRetryButton = element.shadowRoot.querySelector(
229
- selectors.generatedAnswerRetryButton
230
- );
231
-
232
- expect(generatedAnswerRetryButton).not.toBeNull();
233
- generatedAnswerRetryButton.click();
234
- expect(functionsMocks.retry).toHaveBeenCalledTimes(1);
235
- });
236
- });
237
- });
238
-
239
- describe('controller initialization', () => {
240
- beforeEach(() => {
241
- mockSuccessfulHeadlessInitialization();
242
- prepareHeadlessState();
243
- });
244
-
245
- it('should build the generated answer and search status controllers with the proper parameters', async () => {
246
- createTestComponent();
247
- await flushPromises();
248
-
249
- expect(functionsMocks.buildGeneratedAnswer).toHaveBeenCalledTimes(1);
250
- expect(functionsMocks.buildGeneratedAnswer).toHaveBeenCalledWith(
251
- exampleEngine,
252
- {
253
- initialState: {
254
- isVisible: true,
255
- responseFormat: {
256
- contentFormat: ['text/markdown', 'text/plain'],
257
- },
258
- },
259
- fieldsToIncludeInCitations:
260
- defaultOptions.fieldsToIncludeInCitations.split(','),
261
- }
262
- );
263
- expect(functionsMocks.buildSearchStatus).toHaveBeenCalledTimes(1);
264
- expect(functionsMocks.buildSearchStatus).toHaveBeenCalledWith(
265
- exampleEngine
266
- );
267
- });
268
-
269
- it('should subscribe to the headless generated answer and search status state changes', async () => {
270
- createTestComponent();
271
- await flushPromises();
272
-
273
- expect(
274
- functionsMocks.generatedAnswerStateSubscriber
275
- ).toHaveBeenCalledTimes(1);
276
- expect(functionsMocks.searchStatusStateSubscriber).toHaveBeenCalledTimes(
277
- 1
278
- );
279
- });
280
-
281
- describe('when the answer configuration id property is passed to the component', () => {
282
- it('should initialize the controller with the correct answer configuration id value', async () => {
283
- const exampleAnswerConfigValue = 'exampleAnswerConfig';
284
- createTestComponent({
285
- ...defaultOptions,
286
- answerConfigurationId: exampleAnswerConfigValue,
287
- });
288
- await flushPromises();
289
-
290
- expect(functionsMocks.buildGeneratedAnswer).toHaveBeenCalledTimes(1);
291
- expect(functionsMocks.buildGeneratedAnswer).toHaveBeenCalledWith(
292
- exampleEngine,
293
- expect.objectContaining({
294
- answerConfigurationId: exampleAnswerConfigValue,
295
- })
296
- );
297
- });
298
- });
299
-
300
- describe('when the answer configuration id property is not passed to the component', () => {
301
- it('should initialize the controller without the answer configuration id value', async () => {
302
- createTestComponent();
303
- await flushPromises();
304
-
305
- expect(functionsMocks.buildGeneratedAnswer).toHaveBeenCalledTimes(1);
306
- expect(functionsMocks.buildGeneratedAnswer).toHaveBeenCalledWith(
307
- exampleEngine,
308
- expect.not.objectContaining({
309
- answerConfigurationId: expect.any(String),
310
- })
311
- );
312
- });
313
- });
314
- });
315
-
316
- describe('the rendering of the generated answer', () => {
317
- describe('when the answer is streaming', () => {
318
- const exampleAnswer = 'answer being generated';
319
- const exampleAnswerContentFormat = 'text/markdown';
320
- beforeEach(() => {
321
- generatedAnswerState = {
322
- ...initialGeneratedAnswerState,
323
- isStreaming: true,
324
- answer: exampleAnswer,
325
- answerContentFormat: exampleAnswerContentFormat,
326
- };
327
- mockSuccessfulHeadlessInitialization();
328
- prepareHeadlessState();
329
- });
330
-
331
- afterAll(() => {
332
- generatedAnswerState = initialGeneratedAnswerState;
333
- });
334
-
335
- it('should display the generated answer card', async () => {
336
- const element = createTestComponent();
337
- await flushPromises();
338
-
339
- const generatedAnswerCard = element.shadowRoot.querySelector(
340
- selectors.generatedAnswerCard
341
- );
342
- const generatedAnswerBadge = element.shadowRoot.querySelector(
343
- selectors.generatedAnswerBadge
344
- );
345
-
346
- expect(generatedAnswerCard).not.toBeNull();
347
- expect(generatedAnswerBadge).not.toBeNull();
348
- });
349
-
350
- describe('when the property withToggle is set to true', () => {
351
- it('should display the generated answer toggle button', async () => {
352
- const element = createTestComponent({
353
- ...defaultOptions,
354
- withToggle: true,
355
- });
356
- await flushPromises();
357
-
358
- const generatedAnswerToggleButton = element.shadowRoot.querySelector(
359
- selectors.generatedAnswerToggleButton
360
- );
361
-
362
- expect(generatedAnswerToggleButton).not.toBeNull();
363
- });
364
- });
365
-
366
- describe('when the property collapsible is set to true', () => {
367
- describe('when the answer is shorter than the maximum answer height', () => {
368
- beforeEach(() => {
369
- mockAnswerHeight = defaultAnswerHeight - 100;
370
- });
371
-
372
- it('should not display the generating answer message', async () => {
373
- const element = createTestComponent({
374
- ...defaultOptions,
375
- collapsible: true,
376
- });
377
- await flushPromises();
378
-
379
- const generatingMessageWhenAnswerCollapsed =
380
- element.shadowRoot.querySelector(
381
- selectors.generatingMessageWhenAnswerCollapsed
382
- );
383
-
384
- expect(generatingMessageWhenAnswerCollapsed).toBeNull();
385
- });
386
- });
387
-
388
- describe('when the answer is longer than the maximum answer height', () => {
389
- beforeEach(() => {
390
- mockAnswerHeight = defaultAnswerHeight + 100;
391
- });
392
-
393
- it('should display the generating answer message', async () => {
394
- const element = createTestComponent({
395
- ...defaultOptions,
396
- collapsible: true,
397
- });
398
- await flushPromises();
399
-
400
- const generatingMessageWhenAnswerCollapsed =
401
- element.shadowRoot.querySelector(
402
- selectors.generatingMessageWhenAnswerCollapsed
403
- );
404
-
405
- expect(generatingMessageWhenAnswerCollapsed).not.toBeNull();
406
- });
407
-
408
- it('should not display the generated answer collapse toggle', async () => {
409
- const element = createTestComponent({
410
- ...defaultOptions,
411
- collapsible: true,
412
- });
413
- await flushPromises();
414
-
415
- const generatedAnswerCollapseToggle =
416
- element.shadowRoot.querySelector(
417
- selectors.generatedAnswerCollapseToggle
418
- );
419
-
420
- expect(generatedAnswerCollapseToggle).toBeNull();
421
- });
422
- });
423
- });
424
-
425
- it('should display the generated answer content', async () => {
426
- const element = createTestComponent();
427
- await flushPromises();
428
-
429
- const generatedAnswerContent = element.shadowRoot.querySelector(
430
- selectors.generatedAnswerContent
431
- );
432
-
433
- expect(generatedAnswerContent).not.toBeNull();
434
- expect(generatedAnswerContent.isStreaming).toBe(true);
435
- expect(generatedAnswerContent.answer).toBe(exampleAnswer);
436
- expect(generatedAnswerContent.answerContentFormat).toBe(
437
- exampleAnswerContentFormat
438
- );
439
- });
440
-
441
- it('should not display the generated answer actions', async () => {
442
- const element = createTestComponent();
443
- await flushPromises();
444
-
445
- const generatedAnswerActions = element.shadowRoot.querySelector(
446
- selectors.generatedAnswerActions
447
- );
448
-
449
- expect(generatedAnswerActions).toBeNull();
450
- });
451
-
452
- it('should not display the generated answer disclaimer', async () => {
453
- const element = createTestComponent();
454
- await flushPromises();
455
-
456
- const generatedAnswerDisclaimer = element.shadowRoot.querySelector(
457
- selectors.generatedAnswerDisclaimer
458
- );
459
-
460
- expect(generatedAnswerDisclaimer).toBeNull();
461
- });
462
- });
463
-
464
- describe('when the answer is ready', () => {
465
- const exampleAnswer = 'answer generated successfully';
466
- const exampleAnswerContentFormat = 'text/markdown';
467
- beforeEach(() => {
468
- generatedAnswerState = {
469
- ...initialGeneratedAnswerState,
470
- isStreaming: false,
471
- answer: exampleAnswer,
472
- answerContentFormat: exampleAnswerContentFormat,
473
- };
474
- mockSuccessfulHeadlessInitialization();
475
- prepareHeadlessState();
476
- });
477
-
478
- afterAll(() => {
479
- generatedAnswerState = initialGeneratedAnswerState;
480
- });
481
-
482
- it('should display the generated answer card', async () => {
483
- const element = createTestComponent();
484
- await flushPromises();
485
-
486
- const generatedAnswerCard = element.shadowRoot.querySelector(
487
- selectors.generatedAnswerCard
488
- );
489
- const generatedAnswerBadge = element.shadowRoot.querySelector(
490
- selectors.generatedAnswerBadge
491
- );
492
-
493
- expect(generatedAnswerCard).not.toBeNull();
494
- expect(generatedAnswerBadge).not.toBeNull();
495
- });
496
-
497
- describe('when the property withToggle is set to true', () => {
498
- it('should display the generated answer toggle button', async () => {
499
- const element = createTestComponent({
500
- ...defaultOptions,
501
- withToggle: true,
502
- });
503
- await flushPromises();
504
-
505
- const generatedAnswerToggleButton = element.shadowRoot.querySelector(
506
- selectors.generatedAnswerToggleButton
507
- );
508
-
509
- expect(generatedAnswerToggleButton).not.toBeNull();
510
- });
511
- });
512
-
513
- describe('when the property collapsible is set to true', () => {
514
- describe('when the answer is shorter than the maximum answer height', () => {
515
- beforeEach(() => {
516
- mockAnswerHeight = defaultAnswerHeight - 100;
517
- });
518
-
519
- it('should not display the generating answer message', async () => {
520
- const element = createTestComponent({
521
- ...defaultOptions,
522
- collapsible: true,
523
- });
524
- await flushPromises();
525
-
526
- const generatingMessageWhenAnswerCollapsed =
527
- element.shadowRoot.querySelector(
528
- selectors.generatingMessageWhenAnswerCollapsed
529
- );
530
-
531
- expect(generatingMessageWhenAnswerCollapsed).toBeNull();
532
- });
533
-
534
- it('should not display the generated answer collapse toggle', async () => {
535
- const element = createTestComponent({
536
- ...defaultOptions,
537
- collapsible: true,
538
- });
539
- await flushPromises();
540
-
541
- const generatedAnswerCollapseToggle =
542
- element.shadowRoot.querySelector(
543
- selectors.generatedAnswerCollapseToggle
544
- );
545
-
546
- expect(generatedAnswerCollapseToggle).toBeNull();
547
- });
548
- });
549
-
550
- describe('when the answer is longer than the maximum answer height', () => {
551
- beforeEach(() => {
552
- mockAnswerHeight = defaultAnswerHeight + 100;
553
- });
554
-
555
- it('should not display the generating answer message', async () => {
556
- const element = createTestComponent({
557
- ...defaultOptions,
558
- collapsible: true,
559
- });
560
- await flushPromises();
561
-
562
- const generatingMessageWhenAnswerCollapsed =
563
- element.shadowRoot.querySelector(
564
- selectors.generatingMessageWhenAnswerCollapsed
565
- );
566
-
567
- expect(generatingMessageWhenAnswerCollapsed).toBeNull();
568
- });
569
-
570
- it('should display the generated answer collapse toggle', async () => {
571
- const element = createTestComponent({
572
- ...defaultOptions,
573
- collapsible: true,
574
- });
575
- await flushPromises();
576
-
577
- const generatedAnswerCollapseToggle =
578
- element.shadowRoot.querySelector(
579
- selectors.generatedAnswerCollapseToggle
580
- );
581
-
582
- expect(generatedAnswerCollapseToggle).not.toBeNull();
583
- });
584
- });
585
-
586
- describe('when the property maxCollapsedHeight is set to a custom value', () => {
587
- // The valid range is between 150 and 500 pixels.
588
- describe('when the maxCollapsedHeight value is within the valid range and the answer exceeds it', () => {
589
- it('should display the generated answer as collapsed and set the maxHeight of the generated answer to the given custom value', async () => {
590
- const expectedMaxCollapsibleAnswerHeight = 300;
591
- mockAnswerHeight = 350;
592
- const element = createTestComponent({
593
- ...defaultOptions,
594
- collapsible: true,
595
- maxCollapsedHeight: expectedMaxCollapsibleAnswerHeight,
596
- });
597
- await flushPromises();
598
-
599
- const generatedAnswer = element.shadowRoot.querySelector(
600
- selectors.generatedAnswer
601
- );
602
- expect(generatedAnswer).not.toBeNull();
603
-
604
- const generatedAnswerCollapseToggle =
605
- element.shadowRoot.querySelector(
606
- selectors.generatedAnswerCollapseToggle
607
- );
608
- expect(generatedAnswerCollapseToggle).not.toBeNull();
609
-
610
- const maxHeightValue =
611
- generatedAnswer.style.getPropertyValue('--maxHeight');
612
- expect(maxHeightValue).toEqual(
613
- `${expectedMaxCollapsibleAnswerHeight}px`
614
- );
615
-
616
- expect(mockedConsoleWarn).not.toHaveBeenCalled();
617
- });
618
- });
619
-
620
- describe('when the maxCollapsedHeight value is greater than the valid range', () => {
621
- it('should set the generated answer height with the fallback default value and log a warning in the console', async () => {
622
- const exampleMaxCollapsedHeightValue = 550;
623
- const element = createTestComponent({
624
- ...defaultOptions,
625
- collapsible: true,
626
- maxCollapsedHeight: exampleMaxCollapsedHeightValue,
627
- });
628
- await flushPromises();
629
-
630
- const generatedAnswer = element.shadowRoot.querySelector(
631
- selectors.generatedAnswer
632
- );
633
- expect(generatedAnswer).not.toBeNull();
634
-
635
- const generatedAnswerCollapseToggle =
636
- element.shadowRoot.querySelector(
637
- selectors.generatedAnswerCollapseToggle
638
- );
639
- expect(generatedAnswerCollapseToggle).not.toBeNull();
640
-
641
- const maxHeightValue =
642
- generatedAnswer.style.getPropertyValue('--maxHeight');
643
- expect(maxHeightValue).toEqual(`${defaultAnswerHeight}px`);
644
-
645
- expect(mockedConsoleWarn).toHaveBeenCalledTimes(1);
646
- expect(mockedConsoleWarn).toHaveBeenCalledWith(
647
- `Cannot set max-collapsed-height to (${exampleMaxCollapsedHeightValue}) it accepts a range between 150 and 500. The default value of 250px will be used.`
648
- );
649
- });
650
- });
651
-
652
- describe('when the maxCollapsedHeight value is smaller than the valid range', () => {
653
- it('should set the generated answer height with the fallback default value and log a warning in the console', async () => {
654
- const exampleMaxCollapsedHeightValue = 100;
655
- const element = createTestComponent({
656
- ...defaultOptions,
657
- collapsible: true,
658
- maxCollapsedHeight: exampleMaxCollapsedHeightValue,
659
- });
660
- await flushPromises();
661
-
662
- const generatedAnswer = element.shadowRoot.querySelector(
663
- selectors.generatedAnswer
664
- );
665
- expect(generatedAnswer).not.toBeNull();
666
-
667
- const generatedAnswerCollapseToggle =
668
- element.shadowRoot.querySelector(
669
- selectors.generatedAnswerCollapseToggle
670
- );
671
- expect(generatedAnswerCollapseToggle).not.toBeNull();
672
-
673
- const maxHeightValue =
674
- generatedAnswer.style.getPropertyValue('--maxHeight');
675
-
676
- expect(maxHeightValue).toEqual(`${defaultAnswerHeight}px`);
677
-
678
- expect(mockedConsoleWarn).toHaveBeenCalledTimes(1);
679
- expect(mockedConsoleWarn).toHaveBeenCalledWith(
680
- `Cannot set max-collapsed-height to (${exampleMaxCollapsedHeightValue}) it accepts a range between 150 and 500. The default value of 250px will be used.`
681
- );
682
- });
683
- });
684
- });
685
- });
686
-
687
- it('should display the generated answer content', async () => {
688
- const element = createTestComponent();
689
- await flushPromises();
690
-
691
- const generatedAnswerContent = element.shadowRoot.querySelector(
692
- selectors.generatedAnswerContent
693
- );
694
-
695
- expect(generatedAnswerContent).not.toBeNull();
696
- expect(generatedAnswerContent.isStreaming).toBe(false);
697
- expect(generatedAnswerContent.answer).toBe(exampleAnswer);
698
- expect(generatedAnswerContent.answerContentFormat).toBe(
699
- exampleAnswerContentFormat
700
- );
701
- });
702
-
703
- it('should display the generated answer actions', async () => {
704
- const element = createTestComponent();
705
- await flushPromises();
706
-
707
- const generatedAnswerActions = element.shadowRoot.querySelector(
708
- selectors.generatedAnswerActions
709
- );
710
-
711
- expect(generatedAnswerActions).not.toBeNull();
712
- });
713
-
714
- it('should not display the generated answer disclaimer', async () => {
715
- const element = createTestComponent();
716
- await flushPromises();
717
-
718
- const generatedAnswerDisclaimer = element.shadowRoot.querySelector(
719
- selectors.generatedAnswerDisclaimer
720
- );
721
-
722
- expect(generatedAnswerDisclaimer).not.toBeNull();
723
- });
724
- });
725
-
726
- describe('when the answer cannot be generated after a query is executed', () => {
727
- const exampleEmptyAnswer = '';
728
- const exampleAnswerContentFormat = 'text/markdown';
729
- beforeEach(() => {
730
- generatedAnswerState = {
731
- ...initialGeneratedAnswerState,
732
- isStreaming: false,
733
- answer: exampleEmptyAnswer,
734
- answerContentFormat: exampleAnswerContentFormat,
735
- cannotAnswer: true,
736
- };
737
- searchStatusState = {
738
- ...initialSearchStatusState,
739
- hasResults: true,
740
- };
741
- mockSuccessfulHeadlessInitialization();
742
- prepareHeadlessState();
743
- });
744
-
745
- afterAll(() => {
746
- generatedAnswerState = initialGeneratedAnswerState;
747
- });
748
-
749
- describe('when no custom error message slot is provided', () => {
750
- it('should not display the generated answer card', async () => {
751
- const element = createTestComponent();
752
- await flushPromises();
753
-
754
- const generatedAnswerCard = element.shadowRoot.querySelector(
755
- selectors.generatedAnswerCard
756
- );
757
- expect(generatedAnswerCard).toBeNull();
758
-
759
- const generatedAnswerCardNoAnswer = element.shadowRoot.querySelector(
760
- selectors.generatedAnswerNoAnswerCard
761
- );
762
- expect(generatedAnswerCardNoAnswer).toBeNull();
763
- });
764
- });
765
-
766
- describe('when a custom error message slot is provided', () => {
767
- it('should properly display the no generated answer card', async () => {
768
- const element = createTestComponent(
769
- defaultOptions,
770
- exampleAssignedElements
771
- );
772
- await flushPromises();
773
-
774
- const generatedAnswerCard = element.shadowRoot.querySelector(
775
- selectors.generatedAnswerCard
776
- );
777
- expect(generatedAnswerCard).toBeNull();
778
-
779
- const generatedAnswerCardNoAnswer = element.shadowRoot.querySelector(
780
- selectors.generatedAnswerNoAnswerCard
781
- );
782
- expect(generatedAnswerCardNoAnswer).not.toBeNull();
783
- });
784
- });
785
-
786
- describe('when no results are returned', () => {
787
- beforeEach(() => {
788
- searchStatusState = {
789
- ...initialSearchStatusState,
790
- hasResults: false,
791
- };
792
- });
793
-
794
- it('should not display the generated answer or the no generated answer card', async () => {
795
- const element = createTestComponent(
796
- defaultOptions,
797
- exampleAssignedElements
798
- );
799
- await flushPromises();
800
-
801
- const generatedAnswerCard = element.shadowRoot.querySelector(
802
- selectors.generatedAnswerCard
803
- );
804
- expect(generatedAnswerCard).toBeNull();
805
-
806
- const generatedAnswerCardNoAnswer = element.shadowRoot.querySelector(
807
- selectors.generatedAnswerNoAnswerCard
808
- );
809
- expect(generatedAnswerCardNoAnswer).toBeNull();
810
- });
811
- });
812
- });
813
- });
814
- });