@coveo/quantic 3.33.0 → 3.33.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.
Files changed (296) hide show
  1. package/README.md +15 -15
  2. package/force-app/main/default/lwc/quanticAriaLive/__tests__/quanticAriaLive.test.js +106 -0
  3. package/force-app/main/default/lwc/quanticBreadcrumbManager/__tests__/quanticBreadcrumbManager.test.js +752 -0
  4. package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/fixture.ts +76 -0
  5. package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/pageObject.ts +282 -0
  6. package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/quanticBreadcrumbManager.e2e.ts +167 -0
  7. package/force-app/main/default/lwc/quanticCarousel/__tests__/quanticCarousel.test.js +262 -0
  8. package/force-app/main/default/lwc/quanticCaseClassification/__tests__/quanticCaseClassification.test.js +819 -0
  9. package/force-app/main/default/lwc/quanticCaseClassification/e2e/data.ts +23 -0
  10. package/force-app/main/default/lwc/quanticCaseClassification/e2e/fixture.ts +51 -0
  11. package/force-app/main/default/lwc/quanticCaseClassification/e2e/pageObject.ts +152 -0
  12. package/force-app/main/default/lwc/quanticCaseClassification/e2e/quanticCaseClassification.e2e.ts +269 -0
  13. package/force-app/main/default/lwc/quanticCategoryFacet/__tests__/quanticCategoryFacet.test.js +1183 -0
  14. package/force-app/main/default/lwc/quanticCategoryFacet/e2e/data.ts +27 -0
  15. package/force-app/main/default/lwc/quanticCategoryFacet/e2e/fixture.ts +75 -0
  16. package/force-app/main/default/lwc/quanticCategoryFacet/e2e/pageObject.ts +55 -0
  17. package/force-app/main/default/lwc/quanticCategoryFacet/e2e/quanticCategoryFacet.e2e.ts +199 -0
  18. package/force-app/main/default/lwc/quanticCitation/__tests__/quanticCitation.test.js +371 -0
  19. package/force-app/main/default/lwc/quanticColoredResultBadge/__tests__/quanticColoredResultBadge.test.js +212 -0
  20. package/force-app/main/default/lwc/quanticDateFacet/__tests__/quanticDateFacet.test.js +688 -0
  21. package/force-app/main/default/lwc/quanticDateFacet/e2e/data.ts +24 -0
  22. package/force-app/main/default/lwc/quanticDateFacet/e2e/fixture.ts +68 -0
  23. package/force-app/main/default/lwc/quanticDateFacet/e2e/pageObject.ts +27 -0
  24. package/force-app/main/default/lwc/quanticDateFacet/e2e/quanticDateFacet.e2e.ts +145 -0
  25. package/force-app/main/default/lwc/quanticDidYouMean/__tests__/quanticDidYouMean.test.js +348 -0
  26. package/force-app/main/default/lwc/quanticDidYouMean/e2e/data.ts +48 -0
  27. package/force-app/main/default/lwc/quanticDidYouMean/e2e/fixture.ts +80 -0
  28. package/force-app/main/default/lwc/quanticDidYouMean/e2e/pageObject.ts +173 -0
  29. package/force-app/main/default/lwc/quanticDidYouMean/e2e/quanticDidYouMean.e2e.ts +219 -0
  30. package/force-app/main/default/lwc/quanticDocumentSuggestion/__tests__/quanticDocumentSuggestion.test.js +404 -0
  31. package/force-app/main/default/lwc/quanticDocumentSuggestion/e2e/fixture.ts +38 -0
  32. package/force-app/main/default/lwc/quanticDocumentSuggestion/e2e/pageObject.ts +52 -0
  33. package/force-app/main/default/lwc/quanticDocumentSuggestion/e2e/quanticDocumentSuggestion.e2e.ts +102 -0
  34. package/force-app/main/default/lwc/quanticFacet/__tests__/quanticFacet.test.js +1105 -0
  35. package/force-app/main/default/lwc/quanticFacet/e2e/data.ts +21 -0
  36. package/force-app/main/default/lwc/quanticFacet/e2e/fixture.ts +73 -0
  37. package/force-app/main/default/lwc/quanticFacet/e2e/pageObject.ts +67 -0
  38. package/force-app/main/default/lwc/quanticFacet/e2e/quanticFacet.e2e.ts +208 -0
  39. package/force-app/main/default/lwc/quanticFacetCaption/__tests__/quanticFacetCaption.test.js +28 -0
  40. package/force-app/main/default/lwc/quanticFacetManager/__tests__/quanticFacetManager.test.js +178 -0
  41. package/force-app/main/default/lwc/quanticFacetManager/e2e/fixture.ts +64 -0
  42. package/force-app/main/default/lwc/quanticFacetManager/e2e/pageObject.ts +23 -0
  43. package/force-app/main/default/lwc/quanticFacetManager/e2e/quanticFacetManager.e2e.ts +82 -0
  44. package/force-app/main/default/lwc/quanticFeedback/__tests__/quanticFeedback.test.js +392 -0
  45. package/force-app/main/default/lwc/quanticFeedbackModal/__tests__/quanticFeedbackModal.test.js +448 -0
  46. package/force-app/main/default/lwc/quanticFeedbackModalQna/__tests__/quanticFeedbackModalQna.test.js +298 -0
  47. package/force-app/main/default/lwc/quanticFoldedResultList/__tests__/quanticFoldedResultList.test.js +323 -0
  48. package/force-app/main/default/lwc/quanticFoldedResultList/e2e/fixture.ts +70 -0
  49. package/force-app/main/default/lwc/quanticFoldedResultList/e2e/pageObject.ts +81 -0
  50. package/force-app/main/default/lwc/quanticFoldedResultList/e2e/quanticFoldedResultList.e2e.ts +69 -0
  51. package/force-app/main/default/lwc/quanticGeneratedAnswer/__tests__/quanticGeneratedAnswer.test.js +1158 -0
  52. package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/data.ts +56 -0
  53. package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/fixture.ts +185 -0
  54. package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/pageObject.ts +451 -0
  55. package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/quanticGeneratedAnswer.e2e.ts +337 -0
  56. package/force-app/main/default/lwc/quanticGeneratedAnswerContent/__tests__/quanticGeneratedAnswerContent.test.js +151 -0
  57. package/force-app/main/default/lwc/quanticHeading/__tests__/quanticHeading.test.js +71 -0
  58. package/force-app/main/default/lwc/quanticHeadlessLoader/__tests__/quanticHeadlessLoader.test.js +651 -0
  59. package/force-app/main/default/lwc/quanticInsightInterface/__tests__/quanticInsightInterface.test.js +194 -0
  60. package/force-app/main/default/lwc/quanticInsightSummary/__tests__/quanticInsightSummary.test.js +230 -0
  61. package/force-app/main/default/lwc/quanticModal/__tests__/quanticModal.test.js +205 -0
  62. package/force-app/main/default/lwc/quanticNotifications/__tests__/quanticNotifications.test.js +309 -0
  63. package/force-app/main/default/lwc/quanticNotifications/e2e/fixture.ts +58 -0
  64. package/force-app/main/default/lwc/quanticNotifications/e2e/pageObject.ts +55 -0
  65. package/force-app/main/default/lwc/quanticNotifications/e2e/quanticNotifications.e2e.ts +47 -0
  66. package/force-app/main/default/lwc/quanticNumericFacet/__tests__/quanticNumericFacet.test.js +953 -0
  67. package/force-app/main/default/lwc/quanticNumericFacet/e2e/data.ts +28 -0
  68. package/force-app/main/default/lwc/quanticNumericFacet/e2e/fixture.ts +71 -0
  69. package/force-app/main/default/lwc/quanticNumericFacet/e2e/pageObject.ts +59 -0
  70. package/force-app/main/default/lwc/quanticNumericFacet/e2e/quanticNumericFacet.e2e.ts +164 -0
  71. package/force-app/main/default/lwc/quanticPager/__tests__/quanticPager.test.js +430 -0
  72. package/force-app/main/default/lwc/quanticPager/e2e/fixture.ts +65 -0
  73. package/force-app/main/default/lwc/quanticPager/e2e/pageObject.ts +69 -0
  74. package/force-app/main/default/lwc/quanticPager/e2e/quanticPager.e2e.ts +106 -0
  75. package/force-app/main/default/lwc/quanticPlaceholder/__tests__/quanticPlaceholder.test.js +47 -0
  76. package/force-app/main/default/lwc/quanticQuickviewContent/__tests__/data/defaultTestCase.json +13 -0
  77. package/force-app/main/default/lwc/quanticQuickviewContent/__tests__/data/youtubeTestCase.json +14 -0
  78. package/force-app/main/default/lwc/quanticQuickviewContent/__tests__/quanticQuickviewContent.test.js +82 -0
  79. package/force-app/main/default/lwc/quanticRadioButtonsGroup/__tests__/quanticRadioButtonsGroup.test.js +273 -0
  80. package/force-app/main/default/lwc/quanticRecentQueriesList/__tests__/quanticRecentQueriesList.test.js +448 -0
  81. package/force-app/main/default/lwc/quanticRecentQueriesList/e2e/fixture.ts +42 -0
  82. package/force-app/main/default/lwc/quanticRecentQueriesList/e2e/pageObject.ts +55 -0
  83. package/force-app/main/default/lwc/quanticRecentQueriesList/e2e/quanticRecentQueriesList.e2e.ts +93 -0
  84. package/force-app/main/default/lwc/quanticRecentResultsList/__tests__/quanticRecentResultsList.test.js +516 -0
  85. package/force-app/main/default/lwc/quanticRecentResultsList/e2e/fixture.ts +42 -0
  86. package/force-app/main/default/lwc/quanticRecentResultsList/e2e/pageObject.ts +61 -0
  87. package/force-app/main/default/lwc/quanticRecentResultsList/e2e/quanticRecentResultsList.e2e.ts +48 -0
  88. package/force-app/main/default/lwc/quanticRecommendationList/__tests__/quanticRecommendationList.test.js +491 -0
  89. package/force-app/main/default/lwc/quanticRecommendationList/e2e/fixture.ts +35 -0
  90. package/force-app/main/default/lwc/quanticRecommendationList/e2e/pageObject.ts +52 -0
  91. package/force-app/main/default/lwc/quanticRecommendationList/e2e/quanticRecommendationList.e2e.ts +53 -0
  92. package/force-app/main/default/lwc/quanticRefineModalContent/__tests__/quanticRefineModalContent.test.js +747 -0
  93. package/force-app/main/default/lwc/quanticRefineToggle/__tests__/quanticRefineToggle.test.js +542 -0
  94. package/force-app/main/default/lwc/quanticResultAction/__tests__/quanticResultAction.test.js +262 -0
  95. package/force-app/main/default/lwc/quanticResultActionBar/__tests__/quanticResultActionBar.test.js +141 -0
  96. package/force-app/main/default/lwc/quanticResultChildren/__tests__/quanticResultChildren.test.js +340 -0
  97. package/force-app/main/default/lwc/quanticResultCopyToClipboard/__tests__/quanticResultCopyToClipboard.test.js +300 -0
  98. package/force-app/main/default/lwc/quanticResultCopyToClipboard/e2e/fixture.ts +46 -0
  99. package/force-app/main/default/lwc/quanticResultCopyToClipboard/e2e/pageObject.ts +49 -0
  100. package/force-app/main/default/lwc/quanticResultCopyToClipboard/e2e/quanticResultCopyToClipboard.e2e.ts +40 -0
  101. package/force-app/main/default/lwc/quanticResultDate/__tests__/quanticResultDate.test.js +144 -0
  102. package/force-app/main/default/lwc/quanticResultField/__tests__/quanticResultField.test.js +120 -0
  103. package/force-app/main/default/lwc/quanticResultHighlightedTextField/__tests__/quanticResultHighlightedTextField.test.js +209 -0
  104. package/force-app/main/default/lwc/quanticResultLink/__tests__/quanticResultLink.test.js +261 -0
  105. package/force-app/main/default/lwc/quanticResultList/__tests__/quanticResultList.test.js +342 -0
  106. package/force-app/main/default/lwc/quanticResultList/e2e/fixture.ts +66 -0
  107. package/force-app/main/default/lwc/quanticResultList/e2e/pageObject.ts +81 -0
  108. package/force-app/main/default/lwc/quanticResultList/e2e/quanticResultList.e2e.ts +69 -0
  109. package/force-app/main/default/lwc/quanticResultMultiValueText/__tests__/quanticResultMultiValueText.test.js +235 -0
  110. package/force-app/main/default/lwc/quanticResultNumber/__tests__/quanticResultNumber.test.js +144 -0
  111. package/force-app/main/default/lwc/quanticResultPrintableUri/__tests__/quanticResultPrintableUri.test.js +324 -0
  112. package/force-app/main/default/lwc/quanticResultQuickview/__tests__/quanticResultQuickview.test.js +301 -0
  113. package/force-app/main/default/lwc/quanticResultQuickview/e2e/fixture.ts +81 -0
  114. package/force-app/main/default/lwc/quanticResultQuickview/e2e/pageObject.ts +38 -0
  115. package/force-app/main/default/lwc/quanticResultQuickview/e2e/quanticResultQuickView.e2e.ts +66 -0
  116. package/force-app/main/default/lwc/quanticResultTemplate/__tests__/quanticResultTemplate.test.js +90 -0
  117. package/force-app/main/default/lwc/quanticResultText/__tests__/quanticResultText.test.js +155 -0
  118. package/force-app/main/default/lwc/quanticResultsPerPage/__tests__/quanticResultsPerPage.test.js +464 -0
  119. package/force-app/main/default/lwc/quanticResultsPerPage/e2e/fixture.ts +74 -0
  120. package/force-app/main/default/lwc/quanticResultsPerPage/e2e/pageObject.ts +85 -0
  121. package/force-app/main/default/lwc/quanticResultsPerPage/e2e/quanticResultsPerPage.e2e.ts +97 -0
  122. package/force-app/main/default/lwc/quanticSearchBox/__tests__/quanticSearchBox.test.js +487 -0
  123. package/force-app/main/default/lwc/quanticSearchBox/e2e/fixture.ts +84 -0
  124. package/force-app/main/default/lwc/quanticSearchBox/e2e/pageObject.ts +45 -0
  125. package/force-app/main/default/lwc/quanticSearchBox/e2e/quanticSearchBox.e2e.ts +159 -0
  126. package/force-app/main/default/lwc/quanticSearchBoxInput/__tests__/quanticSearchBoxInput.test.js +743 -0
  127. package/force-app/main/default/lwc/quanticSearchBoxSuggestionsList/__tests__/quanticSearchBoxSuggestionsList.test.js +571 -0
  128. package/force-app/main/default/lwc/quanticSearchBoxSuggestionsList/e2e/fixture.ts +110 -0
  129. package/force-app/main/default/lwc/quanticSearchBoxSuggestionsList/e2e/pageObject.ts +113 -0
  130. package/force-app/main/default/lwc/quanticSearchBoxSuggestionsList/e2e/quanticSearchBoxSuggestionsList.e2e.ts +299 -0
  131. package/force-app/main/default/lwc/quanticSmartSnippet/__tests__/quanticSmartSnippet.test.js +341 -0
  132. package/force-app/main/default/lwc/quanticSmartSnippet/e2e/data.ts +21 -0
  133. package/force-app/main/default/lwc/quanticSmartSnippet/e2e/fixture.ts +91 -0
  134. package/force-app/main/default/lwc/quanticSmartSnippet/e2e/pageObject.ts +196 -0
  135. package/force-app/main/default/lwc/quanticSmartSnippet/e2e/quanticSmartSnippet.e2e.ts +192 -0
  136. package/force-app/main/default/lwc/quanticSmartSnippetAnswer/__tests__/quanticSmartSnippetAnswer.test.js +126 -0
  137. package/force-app/main/default/lwc/quanticSmartSnippetSource/__tests__/quanticSmartSnippetSource.test.js +290 -0
  138. package/force-app/main/default/lwc/quanticSmartSnippetSuggestions/__tests__/quanticSmartSnippetSuggestions.test.js +329 -0
  139. package/force-app/main/default/lwc/quanticSmartSnippetSuggestions/e2e/data.ts +31 -0
  140. package/force-app/main/default/lwc/quanticSmartSnippetSuggestions/e2e/fixture.ts +93 -0
  141. package/force-app/main/default/lwc/quanticSmartSnippetSuggestions/e2e/pageObject.ts +160 -0
  142. package/force-app/main/default/lwc/quanticSmartSnippetSuggestions/e2e/quanticSmartSnippetSuggestions.e2e.ts +127 -0
  143. package/force-app/main/default/lwc/quanticSort/__tests__/quanticSort.test.js +416 -0
  144. package/force-app/main/default/lwc/quanticSort/e2e/fixture.ts +61 -0
  145. package/force-app/main/default/lwc/quanticSort/e2e/pageObject.ts +89 -0
  146. package/force-app/main/default/lwc/quanticSort/e2e/quanticSort.e2e.ts +91 -0
  147. package/force-app/main/default/lwc/quanticSourceCitations/__tests__/quanticSourceCitations.test.js +136 -0
  148. package/force-app/main/default/lwc/quanticStandaloneSearchBox/__tests__/quanticStandaloneSearchBox.test.js +387 -0
  149. package/force-app/main/default/lwc/quanticStandaloneSearchBox/e2e/fixture.ts +53 -0
  150. package/force-app/main/default/lwc/quanticStandaloneSearchBox/e2e/pageObject.ts +54 -0
  151. package/force-app/main/default/lwc/quanticStandaloneSearchBox/e2e/quanticStandaloneSearchBox.e2e.ts +72 -0
  152. package/force-app/main/default/lwc/quanticStatefulButton/__tests__/quanticStatefulButton.test.js +222 -0
  153. package/force-app/main/default/lwc/quanticSummary/__tests__/quanticSummary.test.js +244 -0
  154. package/force-app/main/default/lwc/quanticTab/__tests__/quanticTab.test.js +333 -0
  155. package/force-app/main/default/lwc/quanticTab/e2e/fixture.ts +56 -0
  156. package/force-app/main/default/lwc/quanticTab/e2e/pageObject.ts +68 -0
  157. package/force-app/main/default/lwc/quanticTab/e2e/quanticTab.e2e.ts +72 -0
  158. package/force-app/main/default/lwc/quanticTabBar/__tests__/quanticTabBar.test.js +331 -0
  159. package/force-app/main/default/lwc/quanticTabBar/e2e/fixture.ts +61 -0
  160. package/force-app/main/default/lwc/quanticTabBar/e2e/pageObject.ts +80 -0
  161. package/force-app/main/default/lwc/quanticTabBar/e2e/quanticTabBar.e2e.ts +171 -0
  162. package/force-app/main/default/lwc/quanticTimeframeFacet/__tests__/quanticTimeframeFacet.test.js +1037 -0
  163. package/force-app/main/default/lwc/quanticTimeframeFacet/e2e/fixture.ts +58 -0
  164. package/force-app/main/default/lwc/quanticTimeframeFacet/e2e/pageObject.ts +43 -0
  165. package/force-app/main/default/lwc/quanticTimeframeFacet/e2e/quanticTimeframeFacet.e2e.ts +160 -0
  166. package/force-app/main/default/lwc/quanticTooltip/__tests__/quanticTooltip.test.js +107 -0
  167. package/force-app/main/default/lwc/quanticUserAction/__tests__/quanticUserAction.test.js +427 -0
  168. package/force-app/main/default/lwc/quanticUserActionsSession/__tests__/quanticUserActionsSession.test.js +269 -0
  169. package/force-app/main/default/lwc/quanticUserActionsTimeline/__tests__/data/userActionsState.json +89 -0
  170. package/force-app/main/default/lwc/quanticUserActionsTimeline/__tests__/quanticUserActionsTimeline.test.js +511 -0
  171. package/force-app/main/default/lwc/quanticUserActionsToggle/__tests__/quanticUserActionsToggle.test.js +229 -0
  172. package/force-app/main/default/lwc/quanticUserActionsToggle/e2e/data.ts +32 -0
  173. package/force-app/main/default/lwc/quanticUserActionsToggle/e2e/fixture.ts +32 -0
  174. package/force-app/main/default/lwc/quanticUserActionsToggle/e2e/pageObject.ts +71 -0
  175. package/force-app/main/default/lwc/quanticUserActionsToggle/e2e/quanticUserActionsToggle.e2e.ts +39 -0
  176. package/force-app/main/default/lwc/quanticUtils/__tests__/citationAnchoringUtils.test.js +84 -0
  177. package/force-app/main/default/lwc/quanticUtils/__tests__/facetDependenciesUtils.test.js +92 -0
  178. package/force-app/main/default/lwc/quanticUtils/__tests__/markdownUtils.test.js +71 -0
  179. package/force-app/main/default/lwc/quanticUtils/__tests__/quanticUtils.test.js +223 -0
  180. package/force-app/main/default/lwc/quanticViewedByCustomerBadge/__tests__/quanticViewedByCustomerBadge.test.js +131 -0
  181. package/force-app/main/default/staticresources/coveoheadless/case-assist/headless.js +2 -2
  182. package/force-app/main/default/staticresources/coveoheadless/definitions/app/case-assist-engine/case-assist-engine.d.ts +3 -3
  183. package/force-app/main/default/staticresources/coveoheadless/definitions/app/commerce-engine/commerce-engine.d.ts +16 -16
  184. package/force-app/main/default/staticresources/coveoheadless/definitions/app/common-reducers.d.ts +1 -1
  185. package/force-app/main/default/staticresources/coveoheadless/definitions/app/insight-engine/insight-engine.d.ts +5 -5
  186. package/force-app/main/default/staticresources/coveoheadless/definitions/app/recommendation-engine/recommendation-engine.d.ts +4 -4
  187. package/force-app/main/default/staticresources/coveoheadless/definitions/app/search-engine/search-engine.d.ts +4 -4
  188. package/force-app/main/default/staticresources/coveoheadless/definitions/app/store.d.ts +2 -2
  189. package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/facets/headless-core-commerce-facet.d.ts +1 -1
  190. package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/core/facets/range-facet/headless-core-range-facet.d.ts +1 -1
  191. package/force-app/main/default/staticresources/coveoheadless/definitions/features/actions-history/ipx-actions-history-actions.d.ts +1 -1
  192. package/force-app/main/default/staticresources/coveoheadless/definitions/features/advanced-search-queries/advanced-search-queries-slice.d.ts +1 -1
  193. package/force-app/main/default/staticresources/coveoheadless/definitions/features/attached-results/attached-results-slice.d.ts +1 -1
  194. package/force-app/main/default/staticresources/coveoheadless/definitions/features/case-assist-configuration/case-assist-configuration-slice.d.ts +1 -1
  195. package/force-app/main/default/staticresources/coveoheadless/definitions/features/case-context/case-context-slice.d.ts +1 -1
  196. package/force-app/main/default/staticresources/coveoheadless/definitions/features/case-field/case-field-actions.d.ts +1 -1
  197. package/force-app/main/default/staticresources/coveoheadless/definitions/features/case-field/case-field-slice.d.ts +1 -1
  198. package/force-app/main/default/staticresources/coveoheadless/definitions/features/case-input/case-input-slice.d.ts +1 -1
  199. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/configuration/configuration-slice.d.ts +1 -1
  200. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/context/cart/cart-actions.d.ts +2 -2
  201. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/context/cart/cart-slice.d.ts +1 -1
  202. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/context/context-slice.d.ts +1 -1
  203. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/did-you-mean/did-you-mean-slice.d.ts +1 -1
  204. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/facets/facet-search-set/commerce-facet-search-actions.d.ts +2 -2
  205. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/facets/facet-set/facet-set-slice.d.ts +1 -1
  206. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/facets/field-suggestions-order/field-suggestions-order-slice.d.ts +1 -1
  207. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/facets/numeric-facet/manual-numeric-facet-slice.d.ts +1 -1
  208. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/instant-products/instant-products-slice.d.ts +1 -1
  209. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/pagination/pagination-slice.d.ts +1 -1
  210. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/parameters/parameters-slice.d.ts +1 -1
  211. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/product/product-actions.d.ts +2 -2
  212. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/product-listing/product-listing-actions.d.ts +2 -2
  213. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/product-listing/product-listing-slice.d.ts +1 -1
  214. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/query/query-slice.d.ts +1 -1
  215. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/query-suggest/query-suggest-actions.d.ts +1 -1
  216. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/recent-queries/recent-queries-slice.d.ts +1 -1
  217. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/recommendations/recommendations-actions.d.ts +2 -2
  218. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/recommendations/recommendations-slice.d.ts +1 -1
  219. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/search/search-actions.d.ts +4 -4
  220. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/search/search-slice.d.ts +1 -1
  221. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/sort/sort-slice.d.ts +1 -1
  222. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/standalone-search-box-set/standalone-search-box-set-actions.d.ts +1 -1
  223. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/standalone-search-box-set/standalone-search-box-set-slice.d.ts +1 -1
  224. package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/triggers/triggers-slice.d.ts +1 -1
  225. package/force-app/main/default/staticresources/coveoheadless/definitions/features/configuration/configuration-slice.d.ts +1 -1
  226. package/force-app/main/default/staticresources/coveoheadless/definitions/features/context/context-slice.d.ts +1 -1
  227. package/force-app/main/default/staticresources/coveoheadless/definitions/features/debug/debug-slice.d.ts +1 -1
  228. package/force-app/main/default/staticresources/coveoheadless/definitions/features/debug/version-slice.d.ts +1 -1
  229. package/force-app/main/default/staticresources/coveoheadless/definitions/features/dictionary-field-context/dictionary-field-context-slice.d.ts +1 -1
  230. package/force-app/main/default/staticresources/coveoheadless/definitions/features/did-you-mean/did-you-mean-slice.d.ts +1 -1
  231. package/force-app/main/default/staticresources/coveoheadless/definitions/features/document-suggestion/document-suggestion-actions.d.ts +1 -1
  232. package/force-app/main/default/staticresources/coveoheadless/definitions/features/document-suggestion/document-suggestion-slice.d.ts +1 -1
  233. package/force-app/main/default/staticresources/coveoheadless/definitions/features/excerpt-length/excerpt-length-slice.d.ts +1 -1
  234. package/force-app/main/default/staticresources/coveoheadless/definitions/features/facet-options/facet-options-slice.d.ts +1 -1
  235. package/force-app/main/default/staticresources/coveoheadless/definitions/features/facets/automatic-facet-set/automatic-facet-set-slice.d.ts +1 -1
  236. package/force-app/main/default/staticresources/coveoheadless/definitions/features/facets/category-facet-set/category-facet-set-slice.d.ts +1 -1
  237. package/force-app/main/default/staticresources/coveoheadless/definitions/features/facets/facet-order/facet-order-slice.d.ts +1 -1
  238. package/force-app/main/default/staticresources/coveoheadless/definitions/features/facets/facet-search-set/category/category-facet-search-set-slice.d.ts +1 -1
  239. package/force-app/main/default/staticresources/coveoheadless/definitions/features/facets/facet-search-set/generic/generic-facet-search-actions.d.ts +2 -2
  240. package/force-app/main/default/staticresources/coveoheadless/definitions/features/facets/facet-search-set/specific/specific-facet-search-set-slice.d.ts +1 -1
  241. package/force-app/main/default/staticresources/coveoheadless/definitions/features/facets/facet-set/facet-set-controller-actions.d.ts +2 -2
  242. package/force-app/main/default/staticresources/coveoheadless/definitions/features/facets/facet-set/facet-set-slice.d.ts +1 -1
  243. package/force-app/main/default/staticresources/coveoheadless/definitions/features/facets/range-facets/date-facet-set/date-facet-controller-actions.d.ts +2 -2
  244. package/force-app/main/default/staticresources/coveoheadless/definitions/features/facets/range-facets/date-facet-set/date-facet-set-slice.d.ts +1 -1
  245. package/force-app/main/default/staticresources/coveoheadless/definitions/features/facets/range-facets/numeric-facet-set/numeric-facet-controller-actions.d.ts +2 -2
  246. package/force-app/main/default/staticresources/coveoheadless/definitions/features/facets/range-facets/numeric-facet-set/numeric-facet-set-slice.d.ts +1 -1
  247. package/force-app/main/default/staticresources/coveoheadless/definitions/features/fields/fields-actions.d.ts +1 -1
  248. package/force-app/main/default/staticresources/coveoheadless/definitions/features/fields/fields-slice.d.ts +1 -1
  249. package/force-app/main/default/staticresources/coveoheadless/definitions/features/folding/folding-actions.d.ts +1 -1
  250. package/force-app/main/default/staticresources/coveoheadless/definitions/features/folding/folding-slice.d.ts +1 -1
  251. package/force-app/main/default/staticresources/coveoheadless/definitions/features/folding/insight-folding-actions.d.ts +1 -1
  252. package/force-app/main/default/staticresources/coveoheadless/definitions/features/generated-answer/generated-answer-actions.d.ts +2 -2
  253. package/force-app/main/default/staticresources/coveoheadless/definitions/features/generated-answer/generated-answer-slice.d.ts +1 -1
  254. package/force-app/main/default/staticresources/coveoheadless/definitions/features/history/history-actions.d.ts +3 -3
  255. package/force-app/main/default/staticresources/coveoheadless/definitions/features/history/history-slice.d.ts +2 -2
  256. package/force-app/main/default/staticresources/coveoheadless/definitions/features/insight-configuration/insight-configuration-slice.d.ts +1 -1
  257. package/force-app/main/default/staticresources/coveoheadless/definitions/features/insight-interface/insight-interface-actions.d.ts +1 -1
  258. package/force-app/main/default/staticresources/coveoheadless/definitions/features/insight-interface/insight-interface-slice.d.ts +1 -1
  259. package/force-app/main/default/staticresources/coveoheadless/definitions/features/insight-search/insight-search-actions.d.ts +5 -5
  260. package/force-app/main/default/staticresources/coveoheadless/definitions/features/insight-search/legacy/insight-search-actions.d.ts +4 -4
  261. package/force-app/main/default/staticresources/coveoheadless/definitions/features/insight-user-actions/insight-user-actions-actions.d.ts +1 -1
  262. package/force-app/main/default/staticresources/coveoheadless/definitions/features/insight-user-actions/insight-user-actions-slice.d.ts +1 -1
  263. package/force-app/main/default/staticresources/coveoheadless/definitions/features/instant-results/instant-results-slice.d.ts +1 -1
  264. package/force-app/main/default/staticresources/coveoheadless/definitions/features/pagination/pagination-slice.d.ts +1 -1
  265. package/force-app/main/default/staticresources/coveoheadless/definitions/features/pipeline/pipeline-slice.d.ts +1 -1
  266. package/force-app/main/default/staticresources/coveoheadless/definitions/features/query/query-slice.d.ts +1 -1
  267. package/force-app/main/default/staticresources/coveoheadless/definitions/features/query-set/query-set-slice.d.ts +1 -1
  268. package/force-app/main/default/staticresources/coveoheadless/definitions/features/query-suggest/query-suggest-actions.d.ts +1 -1
  269. package/force-app/main/default/staticresources/coveoheadless/definitions/features/query-suggest/query-suggest-slice.d.ts +1 -1
  270. package/force-app/main/default/staticresources/coveoheadless/definitions/features/question-answering/question-answering-slice.d.ts +1 -1
  271. package/force-app/main/default/staticresources/coveoheadless/definitions/features/recent-queries/recent-queries-slice.d.ts +1 -1
  272. package/force-app/main/default/staticresources/coveoheadless/definitions/features/recent-results/recent-results-slice.d.ts +1 -1
  273. package/force-app/main/default/staticresources/coveoheadless/definitions/features/recommendation/recommendation-actions.d.ts +1 -1
  274. package/force-app/main/default/staticresources/coveoheadless/definitions/features/recommendation/recommendation-slice.d.ts +1 -1
  275. package/force-app/main/default/staticresources/coveoheadless/definitions/features/result-preview/result-preview-actions.d.ts +2 -2
  276. package/force-app/main/default/staticresources/coveoheadless/definitions/features/result-preview/result-preview-slice.d.ts +1 -1
  277. package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/legacy/search-actions.d.ts +5 -5
  278. package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/search-actions.d.ts +6 -6
  279. package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/search-slice.d.ts +1 -1
  280. package/force-app/main/default/staticresources/coveoheadless/definitions/features/search-hub/search-hub-slice.d.ts +1 -1
  281. package/force-app/main/default/staticresources/coveoheadless/definitions/features/sort-criteria/sort-criteria-slice.d.ts +1 -1
  282. package/force-app/main/default/staticresources/coveoheadless/definitions/features/standalone-search-box-set/standalone-search-box-set-actions.d.ts +1 -1
  283. package/force-app/main/default/staticresources/coveoheadless/definitions/features/standalone-search-box-set/standalone-search-box-set-slice.d.ts +1 -1
  284. package/force-app/main/default/staticresources/coveoheadless/definitions/features/static-filter-set/static-filter-set-slice.d.ts +1 -1
  285. package/force-app/main/default/staticresources/coveoheadless/definitions/features/tab-set/tab-set-slice.d.ts +1 -1
  286. package/force-app/main/default/staticresources/coveoheadless/definitions/features/triggers/triggers-slice.d.ts +1 -1
  287. package/force-app/main/default/staticresources/coveoheadless/definitions/ssr/commerce/factories/build-factory.d.ts +6 -1
  288. package/force-app/main/default/staticresources/coveoheadless/definitions/ssr/common/access-token-manager.d.ts +19 -0
  289. package/force-app/main/default/staticresources/coveoheadless/definitions/ssr-next/commerce/types/engine.d.ts +4 -2
  290. package/force-app/main/default/staticresources/coveoheadless/definitions/ssr-next/common/access-token-manager.d.ts +19 -0
  291. package/force-app/main/default/staticresources/coveoheadless/definitions/ssr-next/search/engine/search-engine.ssr.d.ts +2 -2
  292. package/force-app/main/default/staticresources/coveoheadless/definitions/test/mock-ssr-controller-definitions.d.ts +2 -2
  293. package/force-app/main/default/staticresources/coveoheadless/headless.js +2 -2
  294. package/force-app/main/default/staticresources/coveoheadless/insight/headless.js +2 -2
  295. package/force-app/main/default/staticresources/coveoheadless/recommendation/headless.js +2 -2
  296. package/package.json +46 -44
@@ -0,0 +1,491 @@
1
+ /* eslint-disable jest/no-conditional-expect */
2
+ /* eslint-disable no-import-assign */
3
+ // @ts-ignore
4
+ import QuanticRecommendationList from 'c/quanticRecommendationList';
5
+ import {cleanup, flushPromises, buildCreateTestComponent} from 'c/testUtils';
6
+ import * as mockHeadlessLoader from 'c/quanticHeadlessLoader';
7
+
8
+ const recommendationsArray = [
9
+ {
10
+ title: 'Title 1',
11
+ clickUri: 'https://example.com/1',
12
+ excerpt: 'Excerpt 1',
13
+ },
14
+ {
15
+ title: 'Title 2',
16
+ clickUri: 'https://example.com/2',
17
+ excerpt: 'Excerpt 2',
18
+ },
19
+ ];
20
+
21
+ jest.mock('c/quanticHeadlessLoader');
22
+ jest.mock('c/quanticUtils', () => ({
23
+ ...jest.requireActual('c/quanticUtils'),
24
+ AriaLiveRegion: jest.fn(() => ({
25
+ dispatchMessage: jest.fn(),
26
+ })),
27
+ }));
28
+
29
+ jest.mock(
30
+ '@salesforce/label/c.quantic_InvalidPositiveIntegerProperty',
31
+ () => ({
32
+ default:
33
+ 'The value of the {{0}} property must be an integer greater than 0.',
34
+ }),
35
+ {
36
+ virtual: true,
37
+ }
38
+ );
39
+
40
+ let isInitialized = false;
41
+ let consoleErrorSpy;
42
+ const initialRecommendationListState = {
43
+ isLoading: false,
44
+ recommendations: recommendationsArray,
45
+ error: null,
46
+ searchResponseId: '123',
47
+ };
48
+
49
+ let recommendationListState = initialRecommendationListState;
50
+
51
+ const functionMocks = {
52
+ buildRecommendationList: jest.fn(() => ({
53
+ state: recommendationListState,
54
+ subscribe: functionMocks.subscribe,
55
+ })),
56
+ buildResultTemplatesManager: jest.fn(() => ({
57
+ registerTemplates: functionMocks.registerTemplates,
58
+ })),
59
+ loadFieldActions: jest.fn(() => ({
60
+ registerFieldsToInclude: functionMocks.registerFieldsToInclude,
61
+ })),
62
+ subscribe: jest.fn((callback) => {
63
+ callback();
64
+ return functionMocks.unsubscribe;
65
+ }),
66
+ unsubscribe: jest.fn(() => {}),
67
+ dispatch: jest.fn(() => {}),
68
+ registerTemplates: jest.fn(() => {
69
+ return {
70
+ content: jest.fn(),
71
+ conditions: [],
72
+ };
73
+ }),
74
+ registerFieldsToInclude: jest.fn((fieldsToInclude) => {
75
+ return {
76
+ fieldsToInclude,
77
+ };
78
+ }),
79
+ };
80
+
81
+ const exampleEngine = {
82
+ id: 'exampleEngineId',
83
+ dispatch: functionMocks.dispatch,
84
+ };
85
+ const defaultFieldsToInclude = 'field1,field2';
86
+
87
+ const defaultOptions = {
88
+ engineId: exampleEngine.id,
89
+ recommendation: 'recommendation',
90
+ numberOfRecommendations: 10,
91
+ label: 'Top documents for you',
92
+ variant: 'grid',
93
+ recommendationsPerRow: 3,
94
+ fieldsToInclude: defaultFieldsToInclude,
95
+ };
96
+
97
+ const selectors = {
98
+ initializationError: 'c-quantic-component-error',
99
+ gridContainer: '[data-testid="recommendations__grid"]',
100
+ carouselContainer: '[data-testid="recommendations__carousel"]',
101
+ recommendationListItem: '[data-testid="recommendations__item"]',
102
+ recommendationListResult: 'c-quantic-result',
103
+ placeholder: 'c-quantic-placeholder',
104
+ quanticHeading: 'c-quantic-heading',
105
+ };
106
+
107
+ const createTestComponent = buildCreateTestComponent(
108
+ QuanticRecommendationList,
109
+ 'c-quantic-recommendation-list',
110
+ defaultOptions
111
+ );
112
+
113
+ function prepareHeadlessState() {
114
+ // @ts-ignore
115
+ mockHeadlessLoader.getHeadlessBundle = () => {
116
+ return {
117
+ buildRecommendationList: functionMocks.buildRecommendationList,
118
+ buildResultTemplatesManager: functionMocks.buildResultTemplatesManager,
119
+ loadFieldActions: functionMocks.loadFieldActions,
120
+ };
121
+ };
122
+ }
123
+
124
+ function mockSuccessfulHeadlessInitialization() {
125
+ // @ts-ignore
126
+ mockHeadlessLoader.initializeWithHeadless = (element, _, initialize) => {
127
+ if (element instanceof QuanticRecommendationList && !isInitialized) {
128
+ isInitialized = true;
129
+ initialize(exampleEngine);
130
+ }
131
+ };
132
+ }
133
+
134
+ function mockErroneousHeadlessInitialization() {
135
+ // @ts-ignore
136
+ mockHeadlessLoader.initializeWithHeadless = (element) => {
137
+ if (element instanceof QuanticRecommendationList) {
138
+ element.setInitializationError();
139
+ }
140
+ };
141
+ }
142
+
143
+ describe('c-quantic-recommendation-list', () => {
144
+ beforeEach(() => {
145
+ mockSuccessfulHeadlessInitialization();
146
+ prepareHeadlessState();
147
+ });
148
+
149
+ afterEach(() => {
150
+ cleanup();
151
+ isInitialized = false;
152
+ recommendationListState = initialRecommendationListState;
153
+ });
154
+
155
+ describe('when the component is loading', () => {
156
+ it('should display the placeholder component when loading', async () => {
157
+ recommendationListState = {
158
+ isLoading: true,
159
+ recommendations: [],
160
+ error: null,
161
+ searchResponseId: null,
162
+ };
163
+ const element = createTestComponent();
164
+ await flushPromises();
165
+
166
+ const loadingPlaceholder = element.shadowRoot.querySelector(
167
+ selectors.placeholder
168
+ );
169
+
170
+ expect(loadingPlaceholder).not.toBeNull();
171
+ });
172
+
173
+ it('should not display the placeholder component when there is an error in the state', async () => {
174
+ recommendationListState = {
175
+ isLoading: true,
176
+ recommendations: [],
177
+ error: {
178
+ statusCode: 500,
179
+ message: 'Error loading recommendations',
180
+ },
181
+ searchResponseId: null,
182
+ };
183
+ const element = createTestComponent();
184
+ await flushPromises();
185
+
186
+ const loadingPlaceholder = element.shadowRoot.querySelector(
187
+ selectors.placeholder
188
+ );
189
+
190
+ expect(loadingPlaceholder).toBeNull();
191
+ });
192
+ });
193
+
194
+ describe('controller initialization', () => {
195
+ it('should build the RecommendationList controller and subscribe to its state', async () => {
196
+ createTestComponent();
197
+ await flushPromises();
198
+
199
+ expect(functionMocks.buildRecommendationList).toHaveBeenCalledTimes(1);
200
+ expect(functionMocks.buildRecommendationList).toHaveBeenCalledWith(
201
+ exampleEngine,
202
+ {
203
+ options: {
204
+ id: defaultOptions.recommendation,
205
+ numberOfRecommendations: defaultOptions.numberOfRecommendations,
206
+ },
207
+ }
208
+ );
209
+ expect(functionMocks.subscribe).toHaveBeenCalledTimes(1);
210
+ });
211
+
212
+ it('should build the ResultTemplatesManager controller', async () => {
213
+ createTestComponent();
214
+ await flushPromises();
215
+
216
+ expect(functionMocks.buildResultTemplatesManager).toHaveBeenCalledTimes(
217
+ 1
218
+ );
219
+ expect(functionMocks.buildResultTemplatesManager).toHaveBeenCalledWith(
220
+ exampleEngine
221
+ );
222
+ });
223
+
224
+ it('should dispatch quantic__registerrecommendationtemplates event', async () => {
225
+ const mockEventHandler = jest.fn();
226
+ document.addEventListener(
227
+ 'quantic__registerrecommendationtemplates',
228
+ // @ts-ignore
229
+ (event) => mockEventHandler(event.detail),
230
+ {once: true}
231
+ );
232
+ createTestComponent();
233
+
234
+ await flushPromises();
235
+
236
+ expect(mockEventHandler).toHaveBeenCalledTimes(1);
237
+ expect(mockEventHandler).toHaveBeenCalledWith({
238
+ registerTemplates: functionMocks.registerTemplates,
239
+ });
240
+ });
241
+
242
+ it('should register the fields to include', async () => {
243
+ const expectedFormattedFieldsToInclude = ['field1', 'field2'];
244
+ createTestComponent();
245
+ await flushPromises();
246
+
247
+ expect(functionMocks.loadFieldActions).toHaveBeenCalledTimes(1);
248
+ expect(functionMocks.loadFieldActions).toHaveBeenCalledWith(
249
+ exampleEngine
250
+ );
251
+ expect(functionMocks.dispatch).toHaveBeenCalledTimes(1);
252
+ expect(functionMocks.dispatch).toHaveBeenCalledWith(
253
+ functionMocks.registerFieldsToInclude(expectedFormattedFieldsToInclude)
254
+ );
255
+ });
256
+
257
+ describe('with custom #numberOfRecommendations option', () => {
258
+ it('should build the buildRecommendationList controller with the custom number of recommendation value', async () => {
259
+ createTestComponent({
260
+ ...defaultOptions,
261
+ numberOfRecommendations: 5,
262
+ });
263
+ await flushPromises();
264
+
265
+ expect(functionMocks.buildRecommendationList).toHaveBeenCalledTimes(1);
266
+ expect(functionMocks.buildRecommendationList).toHaveBeenCalledWith(
267
+ exampleEngine,
268
+ {
269
+ options: {
270
+ id: defaultOptions.recommendation,
271
+ numberOfRecommendations: 5,
272
+ },
273
+ }
274
+ );
275
+ });
276
+ });
277
+
278
+ describe('when invalid property values are passed', () => {
279
+ const expectedInvalidPropertyErrorMessage =
280
+ 'The value of the recommendationsPerRow property must be an integer greater than 0.';
281
+
282
+ beforeEach(() => {
283
+ consoleErrorSpy = jest.spyOn(console, 'error');
284
+ });
285
+
286
+ afterEach(() => {
287
+ consoleErrorSpy.mockRestore();
288
+ });
289
+
290
+ it('should diplay an error message when recommendationsPerRow is not a number', async () => {
291
+ const element = createTestComponent({
292
+ ...defaultOptions,
293
+ recommendationsPerRow: 'invalid',
294
+ });
295
+ await flushPromises();
296
+
297
+ const initializationError = element.shadowRoot.querySelector(
298
+ selectors.initializationError
299
+ );
300
+
301
+ expect(initializationError).not.toBeNull();
302
+ expect(console.error).toHaveBeenCalledTimes(1);
303
+ expect(console.error).toHaveBeenCalledWith(
304
+ expectedInvalidPropertyErrorMessage
305
+ );
306
+ });
307
+
308
+ it('should diplay an error message when recommendationsPerRow is a negative number', async () => {
309
+ const element = createTestComponent({
310
+ ...defaultOptions,
311
+ recommendationsPerRow: -1,
312
+ });
313
+ await flushPromises();
314
+
315
+ const initializationError = element.shadowRoot.querySelector(
316
+ selectors.initializationError
317
+ );
318
+
319
+ expect(initializationError).not.toBeNull();
320
+ expect(console.error).toHaveBeenCalledTimes(1);
321
+ expect(console.error).toHaveBeenCalledWith(
322
+ expectedInvalidPropertyErrorMessage
323
+ );
324
+ });
325
+ });
326
+ });
327
+
328
+ describe('when an initialization error occurs', () => {
329
+ beforeEach(() => {
330
+ mockErroneousHeadlessInitialization();
331
+ });
332
+
333
+ it('should display the error component', async () => {
334
+ const element = createTestComponent();
335
+ await flushPromises();
336
+
337
+ const initializationError = element.shadowRoot.querySelector(
338
+ selectors.initializationError
339
+ );
340
+
341
+ expect(initializationError).not.toBeNull();
342
+ });
343
+ });
344
+
345
+ describe('when the component is initialized successfully', () => {
346
+ beforeEach(() => {
347
+ mockSuccessfulHeadlessInitialization();
348
+ prepareHeadlessState();
349
+ });
350
+
351
+ describe('when there are no recommendations', () => {
352
+ it('should not display a recommendation list', async () => {
353
+ recommendationListState = {
354
+ isLoading: false,
355
+ recommendations: [],
356
+ error: null,
357
+ searchResponseId: null,
358
+ };
359
+ const element = createTestComponent();
360
+ await flushPromises();
361
+
362
+ const recommendationContainer = element.shadowRoot.querySelector(
363
+ selectors.gridContainer
364
+ );
365
+
366
+ expect(recommendationContainer).toBeNull();
367
+ const recommendationListElements = element.shadowRoot.querySelectorAll(
368
+ selectors.recommendationListItem
369
+ );
370
+ expect(recommendationListElements.length).toBe(0);
371
+ });
372
+ });
373
+
374
+ describe('when there are recommendations', () => {
375
+ describe('when the variant value is #grid', () => {
376
+ it('should properly display the recommendations as a grid', async () => {
377
+ const element = createTestComponent({
378
+ ...defaultOptions,
379
+ variant: 'grid',
380
+ });
381
+ await flushPromises();
382
+
383
+ const recommendationContainer = element.shadowRoot.querySelector(
384
+ selectors.gridContainer
385
+ );
386
+ const recommendationItems = element.shadowRoot.querySelectorAll(
387
+ selectors.recommendationListResult
388
+ );
389
+
390
+ expect(recommendationContainer).not.toBeNull();
391
+ expect(recommendationItems.length).toBe(recommendationsArray.length);
392
+ recommendationItems.forEach((item, index) => {
393
+ expect(item.result).toEqual(
394
+ expect.objectContaining(recommendationsArray[index])
395
+ );
396
+ expect(item.engineId).toBe(defaultOptions.engineId);
397
+ expect(item.resultTemplatesManager).toEqual(
398
+ functionMocks.buildResultTemplatesManager()
399
+ );
400
+ });
401
+ });
402
+
403
+ describe('with a custom #recommendationsPerRow option', () => {
404
+ const customRecommendationsPerRow = 2;
405
+ it('should set the width of the recommendation items based on the number of #recommendationsPerRow value', async () => {
406
+ const expectedRecommendationWidth = `${100 / customRecommendationsPerRow}%`;
407
+ const element = createTestComponent({
408
+ ...defaultOptions,
409
+ variant: 'grid',
410
+ recommendationsPerRow: customRecommendationsPerRow,
411
+ });
412
+ await flushPromises();
413
+
414
+ expect(element.style._values['--recommendationItemWidth']).toBe(
415
+ expectedRecommendationWidth
416
+ );
417
+ });
418
+ });
419
+ });
420
+
421
+ describe('when the variant value is #carousel', () => {
422
+ it('should properly display the recommendations as a carousel', async () => {
423
+ const element = createTestComponent({
424
+ ...defaultOptions,
425
+ variant: 'carousel',
426
+ });
427
+ await flushPromises();
428
+
429
+ const recommendationContainer = element.shadowRoot.querySelector(
430
+ selectors.carouselContainer
431
+ );
432
+
433
+ expect(recommendationContainer).not.toBeNull();
434
+ expect(recommendationContainer.label).toBe(defaultOptions.label);
435
+ expect(recommendationContainer.itemsPerPage).toBe(
436
+ defaultOptions.recommendationsPerRow
437
+ );
438
+
439
+ const recommendationItems = element.shadowRoot.querySelectorAll(
440
+ selectors.recommendationListResult
441
+ );
442
+
443
+ recommendationItems.forEach((item, index) => {
444
+ expect(item.result).toEqual(
445
+ expect.objectContaining(recommendationsArray[index])
446
+ );
447
+ expect(item.engineId).toBe(defaultOptions.engineId);
448
+ expect(item.resultTemplatesManager).toEqual(
449
+ functionMocks.buildResultTemplatesManager()
450
+ );
451
+ });
452
+ });
453
+
454
+ describe('with a custom #recommendationsPerRow option', () => {
455
+ const customRecommendationsPerRow = 2;
456
+ it('should pass the #recommendationsPerRow value to the carousel #itemsPerPage property', async () => {
457
+ const element = createTestComponent({
458
+ ...defaultOptions,
459
+ variant: 'carousel',
460
+ recommendationsPerRow: customRecommendationsPerRow,
461
+ });
462
+ await flushPromises();
463
+ const carousel = element.shadowRoot.querySelector(
464
+ selectors.carouselContainer
465
+ );
466
+
467
+ expect(carousel).not.toBeNull();
468
+ expect(carousel.itemsPerPage).toBe(customRecommendationsPerRow);
469
+ });
470
+ });
471
+ });
472
+
473
+ it('should properly pass the custom #label to the heading', async () => {
474
+ const customLabel = 'Custom label';
475
+ const element = createTestComponent({
476
+ ...defaultOptions,
477
+ variant: 'carousel',
478
+ label: customLabel,
479
+ });
480
+ await flushPromises();
481
+
482
+ const headingElement = element.shadowRoot.querySelector(
483
+ selectors.quanticHeading
484
+ );
485
+
486
+ expect(headingElement).not.toBeNull();
487
+ expect(headingElement.label).toBe(customLabel);
488
+ });
489
+ });
490
+ });
491
+ });
@@ -0,0 +1,35 @@
1
+ import {RecommendationListObject} from './pageObject';
2
+ import {SearchObject} from '../../../../../../playwright/page-object/searchObject';
3
+ import {quanticBase} from '../../../../../../playwright/fixtures/baseFixture';
4
+ import {searchRequestRegex} from '../../../../../../playwright/utils/requests';
5
+
6
+ const pageUrl = 's/quantic-recommendation-list';
7
+
8
+ interface RecommendationListOptions {
9
+ numberOfRecommendations: number;
10
+ recommendationsPerRow: number;
11
+ variant: string;
12
+ fieldsToInclude: string;
13
+ }
14
+
15
+ type QuanticRecommendationListE2EFixtures = {
16
+ recommendationList: RecommendationListObject;
17
+ search: SearchObject;
18
+ options: Partial<RecommendationListOptions>;
19
+ };
20
+
21
+ export const test = quanticBase.extend<QuanticRecommendationListE2EFixtures>({
22
+ options: {},
23
+ search: async ({page}, use) => {
24
+ await use(new SearchObject(page, searchRequestRegex));
25
+ },
26
+ recommendationList: async ({page, options, configuration, search}, use) => {
27
+ await page.goto(pageUrl);
28
+ configuration.configure(options);
29
+ await search.waitForSearchResponse();
30
+
31
+ await use(new RecommendationListObject(page));
32
+ },
33
+ });
34
+
35
+ export {expect} from '@playwright/test';
@@ -0,0 +1,52 @@
1
+ import type {Locator, Page, Request} from '@playwright/test';
2
+ import {isUaClickEvent} from '../../../../../../playwright/utils/requests';
3
+
4
+ export class RecommendationListObject {
5
+ constructor(public page: Page) {
6
+ this.page = page;
7
+ }
8
+
9
+ get recommendationList(): Locator {
10
+ return this.page.locator('c-quantic-recommendation-list');
11
+ }
12
+
13
+ get recommendationLinks(): Locator {
14
+ return this.page.locator('c-quantic-result-link a');
15
+ }
16
+
17
+ getRecommendationLinkByIndex(index: number): Locator {
18
+ return this.recommendationLinks.nth(index);
19
+ }
20
+
21
+ async captureRecommendationListClickEventWorkaround(): Promise<void> {
22
+ // Hack(?) to have the request payload in the analytics click event.
23
+ // Without this the payload is not available in the request.
24
+ return this.page.route('*analytics*', (route) => {
25
+ route.continue();
26
+ });
27
+ }
28
+
29
+ async waitForRecommendationListClickEvent(
30
+ customChecker?: Function
31
+ ): Promise<Request> {
32
+ const uaRequest = this.page.waitForRequest((request) => {
33
+ if (isUaClickEvent(request)) {
34
+ const requestBody = request.postDataJSON?.();
35
+ const requestData = JSON.parse(requestBody.clickEvent);
36
+ const customData = requestData?.customData;
37
+
38
+ const actionCauseMatches =
39
+ requestData?.actionCause === 'recommendationOpen';
40
+
41
+ return (
42
+ actionCauseMatches &&
43
+ (customChecker
44
+ ? customChecker(requestData.customData, customData)
45
+ : true)
46
+ );
47
+ }
48
+ return false;
49
+ });
50
+ return uaRequest;
51
+ }
52
+ }
@@ -0,0 +1,53 @@
1
+ import {test, expect} from './fixture';
2
+
3
+ const testFieldsToInclude = 'foo,bar,baz';
4
+
5
+ test.describe('quantic recommendation list', () => {
6
+ test.describe('when clicking a recommendation', () => {
7
+ test('should log recommendation open analytics', async ({
8
+ recommendationList,
9
+ }) => {
10
+ await recommendationList.captureRecommendationListClickEventWorkaround();
11
+
12
+ const recommendationClickAnalyticsPromise =
13
+ recommendationList.waitForRecommendationListClickEvent();
14
+
15
+ const firstRecommendationLink =
16
+ recommendationList.getRecommendationLinkByIndex(0);
17
+ firstRecommendationLink.scrollIntoViewIfNeeded();
18
+ await firstRecommendationLink.evaluate((el) =>
19
+ el.setAttribute('href', '#')
20
+ );
21
+ await firstRecommendationLink.click();
22
+
23
+ await recommendationClickAnalyticsPromise;
24
+ });
25
+ });
26
+
27
+ test.describe('when getting new recommendations', () => {
28
+ test.use({
29
+ options: {
30
+ fieldsToInclude: testFieldsToInclude,
31
+ },
32
+ });
33
+
34
+ test('should perform a search request with the correct fieldsToInclude', async ({
35
+ recommendationList,
36
+ search,
37
+ }) => {
38
+ const expectedFieldsToInclude = testFieldsToInclude.split(',');
39
+ const expectedRecommendationValue = 'Recommendation';
40
+ const searchRequestPromise = search.waitForSearchRequest();
41
+ await search.performRecommendationSearch();
42
+ const requestBody = (await searchRequestPromise).postDataJSON();
43
+ expect(requestBody?.fieldsToInclude).toBeDefined();
44
+ expect(requestBody).toEqual(
45
+ expect.objectContaining({
46
+ fieldsToInclude: expect.arrayContaining(expectedFieldsToInclude),
47
+ recommendation: expectedRecommendationValue,
48
+ })
49
+ );
50
+ await expect(recommendationList.recommendationList).toBeVisible();
51
+ });
52
+ });
53
+ });