@simplybusiness/mobius 3.3.2 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/cjs/components/Chopin/QuestionHelp/QuestionHelp.js +5 -10
  3. package/dist/cjs/components/Chopin/QuestionHelp/QuestionHelp.js.map +1 -1
  4. package/dist/cjs/components/Chopin/TradeSelector/Header/Header.d.ts +9 -0
  5. package/dist/cjs/components/Chopin/TradeSelector/Header/Header.js +14 -0
  6. package/dist/cjs/components/Chopin/TradeSelector/Header/Header.js.map +1 -0
  7. package/dist/cjs/components/Chopin/TradeSelector/Header/index.d.ts +1 -0
  8. package/dist/cjs/components/Chopin/TradeSelector/{Popover → Header}/index.js +1 -1
  9. package/dist/cjs/components/Chopin/TradeSelector/Header/index.js.map +1 -0
  10. package/dist/cjs/components/Chopin/TradeSelector/Listing/Listing.d.ts +12 -0
  11. package/dist/cjs/components/Chopin/TradeSelector/Listing/Listing.js +24 -0
  12. package/dist/cjs/components/Chopin/TradeSelector/Listing/Listing.js.map +1 -0
  13. package/dist/cjs/components/Chopin/TradeSelector/Listing/Listing.test.js +51 -0
  14. package/dist/cjs/components/Chopin/TradeSelector/Listing/Listing.test.js.map +1 -0
  15. package/dist/cjs/components/Chopin/TradeSelector/Listing/ListingItem.d.ts +10 -0
  16. package/dist/cjs/components/Chopin/TradeSelector/Listing/ListingItem.js +27 -0
  17. package/dist/cjs/components/Chopin/TradeSelector/Listing/ListingItem.js.map +1 -0
  18. package/dist/cjs/components/Chopin/TradeSelector/Listing/ListingItem.test.js +42 -0
  19. package/dist/cjs/components/Chopin/TradeSelector/Listing/ListingItem.test.js.map +1 -0
  20. package/dist/cjs/components/Chopin/TradeSelector/Listing/index.d.ts +1 -0
  21. package/dist/cjs/components/Chopin/TradeSelector/{ListBox → Listing}/index.js +1 -1
  22. package/dist/cjs/components/Chopin/TradeSelector/Listing/index.js.map +1 -0
  23. package/dist/cjs/components/Chopin/TradeSelector/SearchResults/SearchResults.d.ts +11 -11
  24. package/dist/cjs/components/Chopin/TradeSelector/SearchResults/SearchResults.js +92 -15
  25. package/dist/cjs/components/Chopin/TradeSelector/SearchResults/SearchResults.js.map +1 -1
  26. package/dist/cjs/components/Chopin/TradeSelector/SearchResults/SearchResults.test.js +96 -104
  27. package/dist/cjs/components/Chopin/TradeSelector/SearchResults/SearchResults.test.js.map +1 -1
  28. package/dist/cjs/components/Chopin/TradeSelector/TradeInput/TradeInput.d.ts +15 -0
  29. package/dist/cjs/components/Chopin/TradeSelector/TradeInput/TradeInput.js +37 -0
  30. package/dist/cjs/components/Chopin/TradeSelector/TradeInput/TradeInput.js.map +1 -0
  31. package/dist/cjs/components/Chopin/TradeSelector/TradeInput/TradeInput.test.js +57 -0
  32. package/dist/cjs/components/Chopin/TradeSelector/TradeInput/TradeInput.test.js.map +1 -0
  33. package/dist/cjs/components/Chopin/TradeSelector/TradeInput/index.d.ts +1 -0
  34. package/dist/cjs/components/Chopin/TradeSelector/{ComboBox → TradeInput}/index.js +1 -1
  35. package/dist/cjs/components/Chopin/TradeSelector/TradeInput/index.js.map +1 -0
  36. package/dist/cjs/components/Chopin/TradeSelector/TradeSelector.d.ts +2 -2
  37. package/dist/cjs/components/Chopin/TradeSelector/TradeSelector.js +62 -31
  38. package/dist/cjs/components/Chopin/TradeSelector/TradeSelector.js.map +1 -1
  39. package/dist/cjs/components/Chopin/TradeSelector/TradeSelector.test.js +152 -240
  40. package/dist/cjs/components/Chopin/TradeSelector/TradeSelector.test.js.map +1 -1
  41. package/dist/cjs/components/Chopin/TradeSelector/config/index.d.ts +9 -0
  42. package/dist/cjs/components/Chopin/TradeSelector/config/shared.d.ts +9 -0
  43. package/dist/cjs/components/Chopin/TradeSelector/config/shared.js +9 -0
  44. package/dist/cjs/components/Chopin/TradeSelector/config/shared.js.map +1 -1
  45. package/dist/cjs/components/Chopin/TradeSelector/jestHTMLDialogPolyfill.d.ts +1 -0
  46. package/dist/cjs/components/Chopin/TradeSelector/jestHTMLDialogPolyfill.js +17 -0
  47. package/dist/cjs/components/Chopin/TradeSelector/jestHTMLDialogPolyfill.js.map +1 -0
  48. package/dist/cjs/components/Chopin/TradeSelector/mockApiResults.d.ts +10 -0
  49. package/dist/cjs/components/Chopin/TradeSelector/mockApiResults.js +11 -1
  50. package/dist/cjs/components/Chopin/TradeSelector/mockApiResults.js.map +1 -1
  51. package/dist/cjs/components/Chopin/TradeSelector/types.d.ts +7 -5
  52. package/dist/cjs/components/Chopin/TradeSelector/useFetchTrades/index.d.ts +1 -0
  53. package/dist/cjs/components/Chopin/TradeSelector/{SelectedTrade → useFetchTrades}/index.js +1 -1
  54. package/dist/cjs/components/Chopin/TradeSelector/useFetchTrades/index.js.map +1 -0
  55. package/dist/cjs/components/Chopin/TradeSelector/useFetchTrades/useFetchTrades.d.ts +8 -0
  56. package/dist/cjs/components/Chopin/TradeSelector/useFetchTrades/useFetchTrades.js +62 -0
  57. package/dist/cjs/components/Chopin/TradeSelector/useFetchTrades/useFetchTrades.js.map +1 -0
  58. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelectorUrl/index.d.ts +1 -0
  59. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelectorUrl/index.js +18 -0
  60. package/dist/cjs/components/Chopin/TradeSelector/{useTradeSelector → useTradeSelectorUrl}/index.js.map +1 -1
  61. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelectorUrl/useTradeSelectorUrl.d.ts +6 -0
  62. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelectorUrl/useTradeSelectorUrl.js +20 -0
  63. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelectorUrl/useTradeSelectorUrl.js.map +1 -0
  64. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelectorUrl/useTradeSelectorUrl.test.js +29 -0
  65. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelectorUrl/useTradeSelectorUrl.test.js.map +1 -0
  66. package/dist/cjs/components/Chopin/index.d.ts +5 -5
  67. package/dist/cjs/components/Chopin/index.js +5 -5
  68. package/dist/cjs/components/Chopin/index.js.map +1 -1
  69. package/dist/cjs/hooks/useOnClickOutside/index.d.ts +1 -0
  70. package/dist/cjs/hooks/useOnClickOutside/index.js +18 -0
  71. package/dist/cjs/hooks/useOnClickOutside/index.js.map +1 -0
  72. package/dist/cjs/hooks/useOnClickOutside/useOnClickOutside.d.ts +2 -0
  73. package/dist/cjs/hooks/useOnClickOutside/useOnClickOutside.js +23 -0
  74. package/dist/cjs/hooks/useOnClickOutside/useOnClickOutside.js.map +1 -0
  75. package/dist/esm/components/Chopin/QuestionHelp/QuestionHelp.js +6 -11
  76. package/dist/esm/components/Chopin/QuestionHelp/QuestionHelp.js.map +1 -1
  77. package/dist/esm/components/Chopin/TradeSelector/Header/Header.js +10 -0
  78. package/dist/esm/components/Chopin/TradeSelector/Header/Header.js.map +1 -0
  79. package/dist/esm/components/Chopin/TradeSelector/Header/index.js +2 -0
  80. package/dist/esm/components/Chopin/TradeSelector/Header/index.js.map +1 -0
  81. package/dist/esm/components/Chopin/TradeSelector/Listing/Listing.js +17 -0
  82. package/dist/esm/components/Chopin/TradeSelector/Listing/Listing.js.map +1 -0
  83. package/dist/esm/components/Chopin/TradeSelector/Listing/Listing.test.js +26 -0
  84. package/dist/esm/components/Chopin/TradeSelector/Listing/Listing.test.js.map +1 -0
  85. package/dist/esm/components/Chopin/TradeSelector/Listing/ListingItem.js +21 -0
  86. package/dist/esm/components/Chopin/TradeSelector/Listing/ListingItem.js.map +1 -0
  87. package/dist/esm/components/Chopin/TradeSelector/Listing/ListingItem.test.js +37 -0
  88. package/dist/esm/components/Chopin/TradeSelector/Listing/ListingItem.test.js.map +1 -0
  89. package/dist/esm/components/Chopin/TradeSelector/Listing/index.js +2 -0
  90. package/dist/esm/components/Chopin/TradeSelector/Listing/index.js.map +1 -0
  91. package/dist/esm/components/Chopin/TradeSelector/SearchResults/SearchResults.js +90 -16
  92. package/dist/esm/components/Chopin/TradeSelector/SearchResults/SearchResults.js.map +1 -1
  93. package/dist/esm/components/Chopin/TradeSelector/SearchResults/SearchResults.test.js +75 -103
  94. package/dist/esm/components/Chopin/TradeSelector/SearchResults/SearchResults.test.js.map +1 -1
  95. package/dist/esm/components/Chopin/TradeSelector/TradeInput/TradeInput.js +30 -0
  96. package/dist/esm/components/Chopin/TradeSelector/TradeInput/TradeInput.js.map +1 -0
  97. package/dist/esm/components/Chopin/TradeSelector/TradeInput/TradeInput.test.js +52 -0
  98. package/dist/esm/components/Chopin/TradeSelector/TradeInput/TradeInput.test.js.map +1 -0
  99. package/dist/esm/components/Chopin/TradeSelector/TradeInput/index.js +2 -0
  100. package/dist/esm/components/Chopin/TradeSelector/TradeInput/index.js.map +1 -0
  101. package/dist/esm/components/Chopin/TradeSelector/TradeSelector.js +63 -32
  102. package/dist/esm/components/Chopin/TradeSelector/TradeSelector.js.map +1 -1
  103. package/dist/esm/components/Chopin/TradeSelector/TradeSelector.test.js +154 -242
  104. package/dist/esm/components/Chopin/TradeSelector/TradeSelector.test.js.map +1 -1
  105. package/dist/esm/components/Chopin/TradeSelector/config/shared.js +9 -0
  106. package/dist/esm/components/Chopin/TradeSelector/config/shared.js.map +1 -1
  107. package/dist/esm/components/Chopin/TradeSelector/jestHTMLDialogPolyfill.js +13 -0
  108. package/dist/esm/components/Chopin/TradeSelector/jestHTMLDialogPolyfill.js.map +1 -0
  109. package/dist/esm/components/Chopin/TradeSelector/mockApiResults.js +10 -0
  110. package/dist/esm/components/Chopin/TradeSelector/mockApiResults.js.map +1 -1
  111. package/dist/esm/components/Chopin/TradeSelector/useFetchTrades/index.js +2 -0
  112. package/dist/esm/components/Chopin/TradeSelector/useFetchTrades/index.js.map +1 -0
  113. package/dist/esm/components/Chopin/TradeSelector/useFetchTrades/useFetchTrades.js +55 -0
  114. package/dist/esm/components/Chopin/TradeSelector/useFetchTrades/useFetchTrades.js.map +1 -0
  115. package/dist/esm/components/Chopin/TradeSelector/useTradeSelectorUrl/index.js +2 -0
  116. package/dist/esm/components/Chopin/TradeSelector/{useTradeSelector → useTradeSelectorUrl}/index.js.map +1 -1
  117. package/dist/esm/components/Chopin/TradeSelector/useTradeSelectorUrl/useTradeSelectorUrl.js +16 -0
  118. package/dist/esm/components/Chopin/TradeSelector/useTradeSelectorUrl/useTradeSelectorUrl.js.map +1 -0
  119. package/dist/esm/components/Chopin/TradeSelector/useTradeSelectorUrl/useTradeSelectorUrl.test.js +27 -0
  120. package/dist/esm/components/Chopin/TradeSelector/useTradeSelectorUrl/useTradeSelectorUrl.test.js.map +1 -0
  121. package/dist/esm/components/Chopin/index.js +5 -5
  122. package/dist/esm/components/Chopin/index.js.map +1 -1
  123. package/dist/esm/hooks/useOnClickOutside/index.js +2 -0
  124. package/dist/esm/hooks/useOnClickOutside/index.js.map +1 -0
  125. package/dist/esm/hooks/useOnClickOutside/useOnClickOutside.js +19 -0
  126. package/dist/esm/hooks/useOnClickOutside/useOnClickOutside.js.map +1 -0
  127. package/dist/mobius.d.ts +38 -30
  128. package/package.json +5 -7
  129. package/src/components/Chopin/QuestionHelp/QuestionHelp.tsx +8 -20
  130. package/src/components/Chopin/TradeSelector/Header/Header.tsx +33 -0
  131. package/src/components/Chopin/TradeSelector/Header/index.tsx +1 -0
  132. package/src/components/Chopin/TradeSelector/Listing/Listing.test.tsx +42 -0
  133. package/src/components/Chopin/TradeSelector/Listing/Listing.tsx +51 -0
  134. package/src/components/Chopin/TradeSelector/Listing/ListingItem.test.tsx +54 -0
  135. package/src/components/Chopin/TradeSelector/Listing/ListingItem.tsx +50 -0
  136. package/src/components/Chopin/TradeSelector/Listing/index.tsx +1 -0
  137. package/src/components/Chopin/TradeSelector/SearchResults/SearchResults.test.tsx +90 -130
  138. package/src/components/Chopin/TradeSelector/SearchResults/SearchResults.tsx +169 -66
  139. package/src/components/Chopin/TradeSelector/TradeInput/TradeInput.test.tsx +74 -0
  140. package/src/components/Chopin/TradeSelector/TradeInput/TradeInput.tsx +94 -0
  141. package/src/components/Chopin/TradeSelector/TradeInput/index.tsx +1 -0
  142. package/src/components/Chopin/TradeSelector/TradeSelector.story.mdx +75 -49
  143. package/src/components/Chopin/TradeSelector/TradeSelector.test.tsx +228 -300
  144. package/src/components/Chopin/TradeSelector/TradeSelector.tsx +124 -93
  145. package/src/components/Chopin/TradeSelector/config/shared.ts +9 -0
  146. package/src/components/Chopin/TradeSelector/jestHTMLDialogPolyfill.ts +17 -0
  147. package/src/components/Chopin/TradeSelector/mockApiResults.ts +11 -0
  148. package/src/components/Chopin/TradeSelector/types.ts +24 -6
  149. package/src/components/Chopin/TradeSelector/useFetchTrades/index.ts +1 -0
  150. package/src/components/Chopin/TradeSelector/useFetchTrades/useFetchTrades.ts +67 -0
  151. package/src/components/Chopin/TradeSelector/useTradeSelectorUrl/index.ts +1 -0
  152. package/src/components/Chopin/TradeSelector/useTradeSelectorUrl/useTradeSelectorUrl.test.ts +37 -0
  153. package/src/components/Chopin/TradeSelector/useTradeSelectorUrl/useTradeSelectorUrl.ts +26 -0
  154. package/src/components/Chopin/index.tsx +5 -5
  155. package/src/components/Link/Link.story.mdx +14 -0
  156. package/src/hooks/useOnClickOutside/index.ts +1 -0
  157. package/src/hooks/useOnClickOutside/useOnClickOutside.ts +23 -0
  158. package/dist/cjs/components/Chopin/TradeSelector/ComboBox/ComboBox.d.ts +0 -9
  159. package/dist/cjs/components/Chopin/TradeSelector/ComboBox/ComboBox.js +0 -37
  160. package/dist/cjs/components/Chopin/TradeSelector/ComboBox/ComboBox.js.map +0 -1
  161. package/dist/cjs/components/Chopin/TradeSelector/ComboBox/ComboBox.test.js +0 -59
  162. package/dist/cjs/components/Chopin/TradeSelector/ComboBox/ComboBox.test.js.map +0 -1
  163. package/dist/cjs/components/Chopin/TradeSelector/ComboBox/index.d.ts +0 -1
  164. package/dist/cjs/components/Chopin/TradeSelector/ComboBox/index.js.map +0 -1
  165. package/dist/cjs/components/Chopin/TradeSelector/ListBox/ListBox.d.ts +0 -13
  166. package/dist/cjs/components/Chopin/TradeSelector/ListBox/ListBox.js +0 -16
  167. package/dist/cjs/components/Chopin/TradeSelector/ListBox/ListBox.js.map +0 -1
  168. package/dist/cjs/components/Chopin/TradeSelector/ListBox/ListBoxSection.d.ts +0 -8
  169. package/dist/cjs/components/Chopin/TradeSelector/ListBox/ListBoxSection.js +0 -15
  170. package/dist/cjs/components/Chopin/TradeSelector/ListBox/ListBoxSection.js.map +0 -1
  171. package/dist/cjs/components/Chopin/TradeSelector/ListBox/Option.d.ts +0 -9
  172. package/dist/cjs/components/Chopin/TradeSelector/ListBox/Option.js +0 -22
  173. package/dist/cjs/components/Chopin/TradeSelector/ListBox/Option.js.map +0 -1
  174. package/dist/cjs/components/Chopin/TradeSelector/ListBox/index.d.ts +0 -1
  175. package/dist/cjs/components/Chopin/TradeSelector/ListBox/index.js.map +0 -1
  176. package/dist/cjs/components/Chopin/TradeSelector/Popover/Popover.d.ts +0 -10
  177. package/dist/cjs/components/Chopin/TradeSelector/Popover/Popover.js +0 -24
  178. package/dist/cjs/components/Chopin/TradeSelector/Popover/Popover.js.map +0 -1
  179. package/dist/cjs/components/Chopin/TradeSelector/Popover/Popover.test.js +0 -18
  180. package/dist/cjs/components/Chopin/TradeSelector/Popover/Popover.test.js.map +0 -1
  181. package/dist/cjs/components/Chopin/TradeSelector/Popover/index.d.ts +0 -1
  182. package/dist/cjs/components/Chopin/TradeSelector/Popover/index.js.map +0 -1
  183. package/dist/cjs/components/Chopin/TradeSelector/SelectedTrade/SelectedTrade.d.ts +0 -5
  184. package/dist/cjs/components/Chopin/TradeSelector/SelectedTrade/SelectedTrade.js +0 -8
  185. package/dist/cjs/components/Chopin/TradeSelector/SelectedTrade/SelectedTrade.js.map +0 -1
  186. package/dist/cjs/components/Chopin/TradeSelector/SelectedTrade/SelectedTrade.test.js +0 -18
  187. package/dist/cjs/components/Chopin/TradeSelector/SelectedTrade/SelectedTrade.test.js.map +0 -1
  188. package/dist/cjs/components/Chopin/TradeSelector/SelectedTrade/index.d.ts +0 -1
  189. package/dist/cjs/components/Chopin/TradeSelector/SelectedTrade/index.js.map +0 -1
  190. package/dist/cjs/components/Chopin/TradeSelector/getItemsToDisplay/getItemsToDisplay.d.ts +0 -7
  191. package/dist/cjs/components/Chopin/TradeSelector/getItemsToDisplay/getItemsToDisplay.js +0 -27
  192. package/dist/cjs/components/Chopin/TradeSelector/getItemsToDisplay/getItemsToDisplay.js.map +0 -1
  193. package/dist/cjs/components/Chopin/TradeSelector/getItemsToDisplay/getItemsToDisplay.test.js +0 -76
  194. package/dist/cjs/components/Chopin/TradeSelector/getItemsToDisplay/getItemsToDisplay.test.js.map +0 -1
  195. package/dist/cjs/components/Chopin/TradeSelector/getItemsToDisplay/index.d.ts +0 -1
  196. package/dist/cjs/components/Chopin/TradeSelector/getItemsToDisplay/index.js +0 -18
  197. package/dist/cjs/components/Chopin/TradeSelector/getItemsToDisplay/index.js.map +0 -1
  198. package/dist/cjs/components/Chopin/TradeSelector/getTradesGroupedByType/getTradesGroupedByType.d.ts +0 -2
  199. package/dist/cjs/components/Chopin/TradeSelector/getTradesGroupedByType/getTradesGroupedByType.js +0 -17
  200. package/dist/cjs/components/Chopin/TradeSelector/getTradesGroupedByType/getTradesGroupedByType.js.map +0 -1
  201. package/dist/cjs/components/Chopin/TradeSelector/getTradesGroupedByType/getTradesGroupedByType.test.d.ts +0 -1
  202. package/dist/cjs/components/Chopin/TradeSelector/getTradesGroupedByType/getTradesGroupedByType.test.js +0 -42
  203. package/dist/cjs/components/Chopin/TradeSelector/getTradesGroupedByType/getTradesGroupedByType.test.js.map +0 -1
  204. package/dist/cjs/components/Chopin/TradeSelector/getTradesGroupedByType/index.d.ts +0 -1
  205. package/dist/cjs/components/Chopin/TradeSelector/getTradesGroupedByType/index.js +0 -18
  206. package/dist/cjs/components/Chopin/TradeSelector/getTradesGroupedByType/index.js.map +0 -1
  207. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelector/index.d.ts +0 -1
  208. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelector/index.js +0 -18
  209. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelector/useTradeSelector.d.ts +0 -17
  210. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelector/useTradeSelector.js +0 -68
  211. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelector/useTradeSelector.js.map +0 -1
  212. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelector/useTradeSelector.test.d.ts +0 -1
  213. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelector/useTradeSelector.test.js +0 -86
  214. package/dist/cjs/components/Chopin/TradeSelector/useTradeSelector/useTradeSelector.test.js.map +0 -1
  215. package/dist/esm/components/Chopin/TradeSelector/ComboBox/ComboBox.js +0 -31
  216. package/dist/esm/components/Chopin/TradeSelector/ComboBox/ComboBox.js.map +0 -1
  217. package/dist/esm/components/Chopin/TradeSelector/ComboBox/ComboBox.test.js +0 -54
  218. package/dist/esm/components/Chopin/TradeSelector/ComboBox/ComboBox.test.js.map +0 -1
  219. package/dist/esm/components/Chopin/TradeSelector/ComboBox/index.js +0 -2
  220. package/dist/esm/components/Chopin/TradeSelector/ComboBox/index.js.map +0 -1
  221. package/dist/esm/components/Chopin/TradeSelector/ListBox/ListBox.js +0 -13
  222. package/dist/esm/components/Chopin/TradeSelector/ListBox/ListBox.js.map +0 -1
  223. package/dist/esm/components/Chopin/TradeSelector/ListBox/ListBoxSection.js +0 -12
  224. package/dist/esm/components/Chopin/TradeSelector/ListBox/ListBoxSection.js.map +0 -1
  225. package/dist/esm/components/Chopin/TradeSelector/ListBox/Option.js +0 -16
  226. package/dist/esm/components/Chopin/TradeSelector/ListBox/Option.js.map +0 -1
  227. package/dist/esm/components/Chopin/TradeSelector/ListBox/index.js +0 -2
  228. package/dist/esm/components/Chopin/TradeSelector/ListBox/index.js.map +0 -1
  229. package/dist/esm/components/Chopin/TradeSelector/Popover/Popover.js +0 -21
  230. package/dist/esm/components/Chopin/TradeSelector/Popover/Popover.js.map +0 -1
  231. package/dist/esm/components/Chopin/TradeSelector/Popover/Popover.test.js +0 -16
  232. package/dist/esm/components/Chopin/TradeSelector/Popover/Popover.test.js.map +0 -1
  233. package/dist/esm/components/Chopin/TradeSelector/Popover/index.js +0 -2
  234. package/dist/esm/components/Chopin/TradeSelector/Popover/index.js.map +0 -1
  235. package/dist/esm/components/Chopin/TradeSelector/SelectedTrade/SelectedTrade.js +0 -4
  236. package/dist/esm/components/Chopin/TradeSelector/SelectedTrade/SelectedTrade.js.map +0 -1
  237. package/dist/esm/components/Chopin/TradeSelector/SelectedTrade/SelectedTrade.test.js +0 -16
  238. package/dist/esm/components/Chopin/TradeSelector/SelectedTrade/SelectedTrade.test.js.map +0 -1
  239. package/dist/esm/components/Chopin/TradeSelector/SelectedTrade/index.js +0 -2
  240. package/dist/esm/components/Chopin/TradeSelector/SelectedTrade/index.js.map +0 -1
  241. package/dist/esm/components/Chopin/TradeSelector/getItemsToDisplay/getItemsToDisplay.js +0 -23
  242. package/dist/esm/components/Chopin/TradeSelector/getItemsToDisplay/getItemsToDisplay.js.map +0 -1
  243. package/dist/esm/components/Chopin/TradeSelector/getItemsToDisplay/getItemsToDisplay.test.js +0 -74
  244. package/dist/esm/components/Chopin/TradeSelector/getItemsToDisplay/getItemsToDisplay.test.js.map +0 -1
  245. package/dist/esm/components/Chopin/TradeSelector/getItemsToDisplay/index.js +0 -2
  246. package/dist/esm/components/Chopin/TradeSelector/getItemsToDisplay/index.js.map +0 -1
  247. package/dist/esm/components/Chopin/TradeSelector/getTradesGroupedByType/getTradesGroupedByType.js +0 -13
  248. package/dist/esm/components/Chopin/TradeSelector/getTradesGroupedByType/getTradesGroupedByType.js.map +0 -1
  249. package/dist/esm/components/Chopin/TradeSelector/getTradesGroupedByType/getTradesGroupedByType.test.js +0 -40
  250. package/dist/esm/components/Chopin/TradeSelector/getTradesGroupedByType/getTradesGroupedByType.test.js.map +0 -1
  251. package/dist/esm/components/Chopin/TradeSelector/getTradesGroupedByType/index.js +0 -2
  252. package/dist/esm/components/Chopin/TradeSelector/getTradesGroupedByType/index.js.map +0 -1
  253. package/dist/esm/components/Chopin/TradeSelector/useTradeSelector/index.js +0 -2
  254. package/dist/esm/components/Chopin/TradeSelector/useTradeSelector/useTradeSelector.js +0 -65
  255. package/dist/esm/components/Chopin/TradeSelector/useTradeSelector/useTradeSelector.js.map +0 -1
  256. package/dist/esm/components/Chopin/TradeSelector/useTradeSelector/useTradeSelector.test.js +0 -84
  257. package/dist/esm/components/Chopin/TradeSelector/useTradeSelector/useTradeSelector.test.js.map +0 -1
  258. package/src/components/Chopin/TradeSelector/ComboBox/ComboBox.test.tsx +0 -85
  259. package/src/components/Chopin/TradeSelector/ComboBox/ComboBox.tsx +0 -74
  260. package/src/components/Chopin/TradeSelector/ComboBox/index.tsx +0 -1
  261. package/src/components/Chopin/TradeSelector/ListBox/ListBox.tsx +0 -36
  262. package/src/components/Chopin/TradeSelector/ListBox/ListBoxSection.tsx +0 -34
  263. package/src/components/Chopin/TradeSelector/ListBox/Option.tsx +0 -35
  264. package/src/components/Chopin/TradeSelector/ListBox/index.tsx +0 -1
  265. package/src/components/Chopin/TradeSelector/Popover/Popover.test.tsx +0 -28
  266. package/src/components/Chopin/TradeSelector/Popover/Popover.tsx +0 -42
  267. package/src/components/Chopin/TradeSelector/Popover/index.tsx +0 -1
  268. package/src/components/Chopin/TradeSelector/SelectedTrade/SelectedTrade.test.tsx +0 -24
  269. package/src/components/Chopin/TradeSelector/SelectedTrade/SelectedTrade.tsx +0 -20
  270. package/src/components/Chopin/TradeSelector/SelectedTrade/index.tsx +0 -1
  271. package/src/components/Chopin/TradeSelector/getItemsToDisplay/getItemsToDisplay.test.ts +0 -97
  272. package/src/components/Chopin/TradeSelector/getItemsToDisplay/getItemsToDisplay.ts +0 -36
  273. package/src/components/Chopin/TradeSelector/getItemsToDisplay/index.ts +0 -1
  274. package/src/components/Chopin/TradeSelector/getTradesGroupedByType/getTradesGroupedByType.test.ts +0 -49
  275. package/src/components/Chopin/TradeSelector/getTradesGroupedByType/getTradesGroupedByType.ts +0 -19
  276. package/src/components/Chopin/TradeSelector/getTradesGroupedByType/index.ts +0 -1
  277. package/src/components/Chopin/TradeSelector/useTradeSelector/index.ts +0 -1
  278. package/src/components/Chopin/TradeSelector/useTradeSelector/useTradeSelector.test.ts +0 -107
  279. package/src/components/Chopin/TradeSelector/useTradeSelector/useTradeSelector.ts +0 -82
  280. /package/dist/cjs/components/Chopin/TradeSelector/{ComboBox/ComboBox.test.d.ts → Listing/Listing.test.d.ts} +0 -0
  281. /package/dist/cjs/components/Chopin/TradeSelector/{Popover/Popover.test.d.ts → Listing/ListingItem.test.d.ts} +0 -0
  282. /package/dist/cjs/components/Chopin/TradeSelector/{SelectedTrade/SelectedTrade.test.d.ts → TradeInput/TradeInput.test.d.ts} +0 -0
  283. /package/dist/cjs/components/Chopin/TradeSelector/{getItemsToDisplay/getItemsToDisplay.test.d.ts → useTradeSelectorUrl/useTradeSelectorUrl.test.d.ts} +0 -0
@@ -1,413 +1,341 @@
1
- import { render, screen, waitFor } from "@testing-library/react";
1
+ import {
2
+ fireEvent,
3
+ render,
4
+ screen,
5
+ waitFor,
6
+ waitForElementToBeRemoved,
7
+ } from "@testing-library/react";
2
8
  import userEvent from "@testing-library/user-event";
3
- import { TradeSelector, ERROR_MESSAGE_SERVICE_UNAVAIALBLE } from ".";
4
- import { useTradeSelector } from "./useTradeSelector";
9
+ import { ERROR_MESSAGE_SERVICE_UNAVAILABLE, TradeSelector } from ".";
10
+ import { getConfig } from "./config";
11
+ import { jestHTMLDialogPolyfill } from "./jestHTMLDialogPolyfill";
5
12
  import { exactResults, suggestedResults } from "./mockApiResults";
6
13
 
7
- const mockUseTradeSelector = useTradeSelector as jest.MockedFunction<
8
- typeof useTradeSelector
9
- >;
10
-
11
- jest.mock("./useTradeSelector");
14
+ jestHTMLDialogPolyfill();
12
15
 
13
16
  const mockedApiResults = [...exactResults, ...suggestedResults];
14
17
 
15
- const trade = {
16
- value: "Builder",
17
- vertical: "business",
18
- supported_verticals: ["contractors_combined"],
19
- label: "<strong>Builder</strong>",
20
- type: "exact",
21
- trade_detail: null,
22
- trade_type: null,
23
- blocked: false,
24
- };
18
+ const { defaultLabels } = getConfig();
25
19
 
26
20
  describe("TradeSelector", () => {
27
21
  it("should render without errors", () => {
28
- mockUseTradeSelector.mockReturnValue({
29
- inputValue: "",
30
- isLoading: false,
31
- trades: [],
32
- onInputChange: () => {},
33
- onSelectionChange: () => {},
34
- error: undefined,
35
- selectedTrade: undefined,
36
- hasUserChangedMind: false,
37
- onUserChangedMind: () => {},
38
- });
39
-
40
22
  render(<TradeSelector />);
41
-
42
- const label = screen.getByText("What is your specific trade/profession?");
43
- const input = screen.getByRole("combobox");
44
- const placeholderText = "e.g. Cleaner, builder, consultant";
45
-
46
- expect(label).toBeInTheDocument();
47
- expect(input).toHaveAttribute("placeholder", placeholderText);
48
23
  });
49
24
 
50
- describe("given elementType", () => {
51
- it("is not applied as element attribute", () => {
52
- mockUseTradeSelector.mockReturnValue({
53
- inputValue: "",
54
- isLoading: false,
55
- trades: [],
56
- onInputChange: () => {},
57
- onSelectionChange: () => {},
58
- error: undefined,
59
- selectedTrade: undefined,
60
- hasUserChangedMind: false,
61
- onUserChangedMind: () => {},
62
- });
25
+ describe("given a minimum required user input", () => {
26
+ describe("when no results are returned", () => {
27
+ it("should display a link to view all trades", async () => {
28
+ global.fetch = jest.fn(() =>
29
+ Promise.resolve({
30
+ json: () => Promise.resolve({ results: [] }),
31
+ ok: true,
32
+ }),
33
+ ) as jest.Mock;
34
+
35
+ const userInput = "qwa";
36
+ render(<TradeSelector />);
63
37
 
64
- const { container } = render(<TradeSelector elementType="ul" />);
38
+ await userEvent.tab();
39
+ await userEvent.keyboard(userInput);
40
+ await waitFor(() => screen.getByText("View all trades"));
65
41
 
66
- expect(container.firstChild).not.toHaveAttribute("elementtype", "ul");
67
- });
68
- });
42
+ const noResultsLink = screen.getByText("View all trades");
69
43
 
70
- describe("given no results for user input (that meets minimum input requirements)", () => {
71
- it("should display a link to view all trades", async () => {
72
- const userInput = "qwa";
73
-
74
- mockUseTradeSelector.mockReturnValue({
75
- inputValue: userInput,
76
- isLoading: false,
77
- trades: [],
78
- onInputChange: () => {},
79
- onSelectionChange: () => {},
80
- error: undefined,
81
- selectedTrade: undefined,
82
- hasUserChangedMind: false,
83
- onUserChangedMind: () => {},
44
+ expect(noResultsLink).toBeInTheDocument();
45
+ expect(noResultsLink).toHaveAttribute(
46
+ "href",
47
+ "https://quote.simplybusiness.co.uk/trades?vertical=business",
48
+ );
84
49
  });
85
-
86
- render(<TradeSelector />);
87
-
88
- await userEvent.tab();
89
-
90
- await userEvent.keyboard(userInput);
91
-
92
- await userEvent.keyboard("[Alt][ArrowDown]");
93
-
94
- const noResultsLink = screen.getByText("View all trades");
95
-
96
- expect(noResultsLink).toBeInTheDocument();
97
-
98
- expect(noResultsLink).toHaveAttribute(
99
- "href",
100
- "https://quote.simplybusiness.co.uk/trades?vertical=business",
101
- );
102
50
  });
103
51
  });
104
52
 
105
53
  describe("given a set of results", () => {
106
54
  describe("containing both exact matches and suggested trades", () => {
107
55
  it("should display the results under their respective titles", async () => {
108
- const userInput = "swim";
109
-
110
- mockUseTradeSelector.mockReturnValue({
111
- inputValue: userInput,
112
- isLoading: false,
113
- trades: mockedApiResults,
114
- onInputChange: () => {},
115
- onSelectionChange: () => {},
116
- error: undefined,
117
- selectedTrade: undefined,
118
- hasUserChangedMind: false,
119
- onUserChangedMind: () => {},
120
- });
56
+ global.fetch = jest.fn(() =>
57
+ Promise.resolve({
58
+ json: () => Promise.resolve({ results: mockedApiResults }),
59
+ ok: true,
60
+ }),
61
+ ) as jest.Mock;
121
62
 
63
+ const userInput = "swim";
122
64
  render(<TradeSelector />);
123
65
 
124
66
  await userEvent.tab();
125
-
126
67
  await userEvent.keyboard(userInput);
68
+ await waitForElementToBeRemoved(() => screen.getByText("Loading..."));
127
69
 
128
- await userEvent.keyboard("[Alt][ArrowDown]");
129
-
130
- await waitFor(() => {
131
- const exactTitle = screen.getByText("Exact matches for your search");
132
- const suggestedTitle = screen.getByText(
133
- "Suggested matches for your search",
134
- );
135
- const groups = screen.getAllByRole("group");
136
- const exactResultExample = document.querySelector(
137
- '[data-key="Swim Shop"]',
138
- );
139
- const suggestedResultExample = document.querySelector(
140
- '[data-key="Teacher / tutor"]',
141
- );
142
- const EXPECTED_NUMBER_OF_GROUPS = 2;
70
+ const exactTitle = screen.queryByText(defaultLabels.exact);
71
+ const suggestedTitle = screen.queryByText(defaultLabels.suggested);
72
+ const exactResultExample = document.querySelector(
73
+ '[data-key="Swim Shop"]',
74
+ );
75
+ const suggestedResultExample = document.querySelector(
76
+ '[data-key="Teacher / tutor"]',
77
+ );
143
78
 
144
- expect(exactTitle).toBeInTheDocument();
145
- expect(suggestedTitle).toBeInTheDocument();
146
- expect(groups.length).toBe(EXPECTED_NUMBER_OF_GROUPS);
147
- expect(exactResultExample).toBeInTheDocument();
148
- expect(suggestedResultExample).toBeInTheDocument();
149
- });
79
+ expect(exactTitle).toBeInTheDocument();
80
+ expect(suggestedTitle).toBeInTheDocument();
81
+ expect(exactResultExample).toBeInTheDocument();
82
+ expect(suggestedResultExample).toBeInTheDocument();
150
83
  });
151
84
  });
152
85
 
153
86
  describe("containing only the exact matches", () => {
154
87
  it("should display the results under the title for exact matches", async () => {
155
- const userInput = "swim";
156
-
157
- mockUseTradeSelector.mockReturnValue({
158
- inputValue: userInput,
159
- isLoading: false,
160
- trades: exactResults,
161
- onInputChange: () => {},
162
- onSelectionChange: () => {},
163
- error: undefined,
164
- selectedTrade: undefined,
165
- hasUserChangedMind: false,
166
- onUserChangedMind: () => {},
167
- });
88
+ global.fetch = jest.fn(() =>
89
+ Promise.resolve({
90
+ json: () => Promise.resolve({ results: exactResults }),
91
+ ok: true,
92
+ }),
93
+ ) as jest.Mock;
168
94
 
95
+ const userInput = "swim";
169
96
  render(<TradeSelector />);
170
97
 
171
98
  await userEvent.tab();
172
-
173
99
  await userEvent.keyboard(userInput);
100
+ await waitForElementToBeRemoved(() => screen.getByText("Loading..."));
174
101
 
175
- await userEvent.keyboard("[Alt][ArrowDown]");
176
-
177
- await waitFor(() => {
178
- const exactTitle = screen.getByText("Exact matches for your search");
179
- const suggestedTitle = screen.queryByText(
180
- "Suggested matches for your search",
181
- );
182
- const groups = screen.getAllByRole("group");
183
- const exactResultExample = document.querySelector(
184
- '[data-key="Swim Shop"]',
185
- );
186
- const suggestedResultExample = document.querySelector(
187
- '[data-key="Teacher / tutor"]',
188
- );
189
- const EXPECTED_NUMBER_OF_GROUPS = 1;
102
+ const exactTitle = screen.queryByText(defaultLabels.exact);
103
+ const suggestedTitle = screen.queryByText(defaultLabels.suggested);
104
+ const exactResultExample = document.querySelector(
105
+ '[data-key="Swim Shop"]',
106
+ );
107
+ const suggestedResultExample = document.querySelector(
108
+ '[data-key="Teacher / tutor"]',
109
+ );
190
110
 
191
- expect(exactTitle).toBeInTheDocument();
192
- expect(suggestedTitle).not.toBeInTheDocument();
193
- expect(groups.length).toBe(EXPECTED_NUMBER_OF_GROUPS);
194
- expect(exactResultExample).toBeInTheDocument();
195
- expect(suggestedResultExample).toBeNull();
196
- });
111
+ expect(exactTitle).toBeInTheDocument();
112
+ expect(suggestedTitle).not.toBeInTheDocument();
113
+ expect(exactResultExample).toBeInTheDocument();
114
+ expect(suggestedResultExample).toBeNull();
197
115
  });
198
116
  });
199
117
  });
200
118
 
201
119
  describe("given the API is unavailable", () => {
202
- it("should show the error message", async () => {
203
- mockUseTradeSelector.mockReturnValue({
204
- inputValue: "",
205
- isLoading: false,
206
- trades: [],
207
- onInputChange: () => {},
208
- onSelectionChange: () => {},
209
- error: Error(ERROR_MESSAGE_SERVICE_UNAVAIALBLE),
210
- selectedTrade: undefined,
211
- hasUserChangedMind: false,
212
- onUserChangedMind: () => {},
213
- });
214
-
215
- render(<TradeSelector />);
120
+ const consoleError = console.error;
216
121
 
217
- expect(
218
- screen.getByText(ERROR_MESSAGE_SERVICE_UNAVAIALBLE),
219
- ).toBeInTheDocument();
122
+ beforeAll(() => {
123
+ console.error = jest.fn();
220
124
  });
221
- });
222
125
 
223
- describe("as well as an error message", () => {
224
- it("should not display the overlay component", async () => {
225
- const userInput = "swim";
126
+ afterAll(() => {
127
+ console.error = consoleError;
128
+ jest.resetAllMocks();
129
+ });
226
130
 
227
- mockUseTradeSelector.mockReturnValue({
228
- inputValue: userInput,
229
- isLoading: false,
230
- trades: mockedApiResults,
231
- onInputChange: () => {},
232
- onSelectionChange: () => {},
233
- error: Error(ERROR_MESSAGE_SERVICE_UNAVAIALBLE),
234
- selectedTrade: undefined,
235
- hasUserChangedMind: false,
236
- onUserChangedMind: () => {},
237
- });
131
+ it("should show the error message", async () => {
132
+ global.fetch = jest.fn(() =>
133
+ Promise.resolve({
134
+ json: () => Promise.resolve({ statusText: "Internal Server Error" }),
135
+ ok: false,
136
+ }),
137
+ ) as jest.Mock;
238
138
 
139
+ const userInput = "swim";
239
140
  render(<TradeSelector />);
240
141
 
241
142
  await userEvent.tab();
242
-
243
143
  await userEvent.keyboard(userInput);
144
+ await waitFor(() => screen.getByText(ERROR_MESSAGE_SERVICE_UNAVAILABLE));
244
145
 
245
- await userEvent.keyboard("[Alt][ArrowDown]");
246
-
247
- await waitFor(() => {
248
- const errorMessage = screen.getByText(
249
- ERROR_MESSAGE_SERVICE_UNAVAIALBLE,
250
- );
251
- const overlay = screen.queryByLabelText("Suggestions");
146
+ const errorMessage = screen.getByText(ERROR_MESSAGE_SERVICE_UNAVAILABLE);
147
+ const resultsOverlay = document.querySelector("dialog");
252
148
 
253
- expect(errorMessage).toBeInTheDocument();
254
- expect(overlay).not.toBeInTheDocument();
255
- });
149
+ expect(errorMessage).toBeInTheDocument();
150
+ expect(resultsOverlay).not.toBeInTheDocument();
256
151
  });
257
152
  });
258
153
 
259
154
  describe("when the user reduces the input value to a single character", () => {
260
155
  it("should not display the overlay component", async () => {
261
- const userInput = "s";
262
-
263
- mockUseTradeSelector.mockReturnValue({
264
- inputValue: userInput,
265
- isLoading: false,
266
- trades: mockedApiResults,
267
- onInputChange: () => {},
268
- onSelectionChange: () => {},
269
- error: undefined,
270
- selectedTrade: undefined,
271
- hasUserChangedMind: false,
272
- onUserChangedMind: () => {},
273
- });
156
+ global.fetch = jest.fn(() =>
157
+ Promise.resolve({
158
+ json: () => Promise.resolve({ results: mockedApiResults }),
159
+ ok: true,
160
+ }),
161
+ ) as jest.Mock;
274
162
 
163
+ const userInput = "swim";
275
164
  render(<TradeSelector />);
276
165
 
277
166
  await userEvent.tab();
278
-
279
167
  await userEvent.keyboard(userInput);
280
168
 
281
- await userEvent.keyboard("[Alt][ArrowDown]");
169
+ const resultsOverlay = document.querySelector("dialog");
282
170
 
283
- await waitFor(() => {
284
- const overlay = screen.queryByLabelText("Suggestions");
171
+ expect(resultsOverlay).toBeInTheDocument();
285
172
 
286
- expect(overlay).not.toBeInTheDocument();
287
- });
173
+ await userEvent.keyboard("{Backspace}{Backspace}{Backspace}");
174
+
175
+ expect(resultsOverlay).not.toBeInTheDocument();
288
176
  });
289
177
  });
290
178
 
291
179
  describe("given a user has selected a trade", () => {
292
180
  it("should display the selected trade and hide the input field", async () => {
293
- mockUseTradeSelector.mockReturnValue({
294
- inputValue: "",
295
- isLoading: false,
296
- trades: [],
297
- onInputChange: () => {},
298
- onSelectionChange: () => {},
299
- error: undefined,
300
- selectedTrade: trade.value,
301
- hasUserChangedMind: false,
302
- onUserChangedMind: () => {},
303
- });
181
+ global.fetch = jest.fn(() =>
182
+ Promise.resolve({
183
+ json: () => Promise.resolve({ results: mockedApiResults }),
184
+ ok: true,
185
+ }),
186
+ ) as jest.Mock;
304
187
 
305
- const expectedTrade = "Builder";
188
+ const userInput = "swim";
189
+ const expectedTrade = "Swim Shop";
190
+ const { container } = render(<TradeSelector />);
306
191
 
307
- render(<TradeSelector />);
192
+ await userEvent.tab();
193
+ await userEvent.keyboard(userInput);
194
+ await waitForElementToBeRemoved(() => screen.getByText("Loading..."));
308
195
 
309
- const partialText = screen.getByText(/You have selected/);
310
- const chosenTrade = screen.getByText(expectedTrade);
311
- const changeButton = screen.getByLabelText(
312
- "Change your selected profession",
196
+ const exactResultExample = document.querySelector(
197
+ `[data-key="${expectedTrade}"]`,
313
198
  );
314
199
 
315
- expect(partialText).toBeInTheDocument();
316
- expect(chosenTrade).toBeInTheDocument();
317
- expect(changeButton).toBeInTheDocument();
318
- });
319
- });
200
+ expect(exactResultExample).toBeInTheDocument();
320
201
 
321
- describe("clicking Change", () => {
322
- it("should display the input field with previously selected trade", async () => {
323
- mockUseTradeSelector.mockReturnValue({
324
- inputValue: "",
325
- isLoading: false,
326
- trades: [],
327
- onInputChange: () => {},
328
- onSelectionChange: () => {},
329
- error: undefined,
330
- selectedTrade: trade.value,
331
- hasUserChangedMind: false,
332
- onUserChangedMind: () => {},
333
- });
202
+ await fireEvent.click(
203
+ document.querySelector(`[data-key="${expectedTrade}"]`)!,
204
+ );
334
205
 
335
- const expectedTrade = "Builder";
206
+ const textElement = container.querySelector("p");
336
207
 
337
- render(<TradeSelector />);
208
+ expect(textElement).toHaveTextContent(
209
+ `You have selected ‘${expectedTrade}’ as your trade/profession. Change`,
210
+ );
211
+ });
212
+ });
338
213
 
339
- const changeButton = screen.getByLabelText(
340
- "Change your selected profession",
214
+ describe("given an initial trade", () => {
215
+ it("clicking Change should reveal result overlay", async () => {
216
+ global.fetch = jest.fn(() =>
217
+ Promise.resolve({
218
+ json: () => Promise.resolve({ results: mockedApiResults }),
219
+ ok: true,
220
+ }),
221
+ ) as jest.Mock;
222
+
223
+ const initialTrade = "Swim Shop";
224
+ const { container } = render(
225
+ <TradeSelector initialTrade={initialTrade} />,
341
226
  );
342
227
 
343
- await userEvent.click(changeButton);
228
+ const button = screen.getByText("Change");
344
229
 
345
- waitFor(() => {
346
- const inputField = screen.getByRole("combobox");
230
+ await userEvent.click(button);
231
+ await waitForElementToBeRemoved(() => screen.getByText("Loading..."));
347
232
 
348
- expect(inputField).toHaveDisplayValue(expectedTrade);
349
- });
233
+ const dialog = container.querySelector("dialog");
234
+
235
+ expect(dialog).toHaveClass("--is-open");
350
236
  });
351
237
  });
352
238
 
353
- describe("given a user has selected the wrong trade", () => {
354
- it("they should be able to choose a different trade", async () => {
355
- const onInputChangeMock = jest.fn();
356
-
357
- mockUseTradeSelector.mockReturnValue({
358
- inputValue: "Fitness instructor",
359
- isLoading: false,
360
- trades: [],
361
- onInputChange: onInputChangeMock,
362
- onSelectionChange: () => {},
363
- error: undefined,
364
- selectedTrade: trade.value,
365
- hasUserChangedMind: true,
366
- onUserChangedMind: () => {},
367
- });
239
+ describe("clicking Change", () => {
240
+ it("should display the input field with previously selected trade", async () => {
241
+ global.fetch = jest.fn(() =>
242
+ Promise.resolve({
243
+ json: () => Promise.resolve({ results: mockedApiResults }),
244
+ ok: true,
245
+ }),
246
+ ) as jest.Mock;
368
247
 
248
+ const userInput = "swim";
249
+ const expectedTrade = "Swim Shop";
369
250
  render(<TradeSelector />);
370
251
 
371
- const inputField = screen.getByRole("combobox");
252
+ await userEvent.tab();
253
+ await userEvent.keyboard(userInput);
254
+ await waitForElementToBeRemoved(() => screen.getByText("Loading..."));
255
+
256
+ const exactResultExample = document.querySelector(
257
+ `[data-key="${expectedTrade}"]`,
258
+ );
259
+
260
+ expect(exactResultExample).toBeInTheDocument();
372
261
 
373
- const newTrade = "Swimmer";
262
+ await fireEvent.click(
263
+ document.querySelector(`[data-key="${expectedTrade}"]`)!,
264
+ );
374
265
 
375
- await userEvent.type(inputField, newTrade);
266
+ const button = screen.getByText("Change");
376
267
 
377
- expect(onInputChangeMock).toHaveBeenCalledTimes(newTrade.length);
268
+ await userEvent.click(button);
269
+
270
+ waitFor(() => screen.getByRole("textbox"));
271
+
272
+ const inputField = screen.getByRole("textbox");
273
+
274
+ expect(inputField).toHaveValue(expectedTrade);
378
275
  });
379
276
  });
380
277
 
381
278
  describe("given hideLabel is set to true", () => {
382
279
  it("hides the label and the description and renders aria-label instead", () => {
383
- mockUseTradeSelector.mockReturnValue({
384
- inputValue: "",
385
- isLoading: false,
386
- trades: [],
387
- onInputChange: () => {},
388
- onSelectionChange: () => {},
389
- error: undefined,
390
- selectedTrade: undefined,
391
- hasUserChangedMind: false,
392
- onUserChangedMind: () => {},
393
- });
394
-
395
280
  render(<TradeSelector hideLabel />);
396
281
 
397
- const label = screen.queryByText(
398
- "What is your specific trade/profession?",
399
- );
282
+ const label = screen.queryByText(defaultLabels.input);
400
283
  const description = screen.queryByText(
401
284
  "Start typing to choose from over 1,000 options.",
402
285
  );
403
- const input = screen.getByRole("combobox");
286
+ const input = screen.getByRole("textbox");
404
287
 
405
288
  expect(label).not.toBeInTheDocument();
406
289
  expect(description).not.toBeInTheDocument();
407
- expect(input).toHaveAttribute(
408
- "aria-label",
409
- "What is your specific trade/profession?",
410
- );
290
+ expect(input).toHaveAttribute("aria-label", defaultLabels.input);
291
+ });
292
+ });
293
+
294
+ describe("API calls", () => {
295
+ global.fetch = jest.fn(() =>
296
+ Promise.resolve({
297
+ json: () => Promise.resolve({ results: mockedApiResults }),
298
+ ok: true,
299
+ }),
300
+ ) as jest.Mock;
301
+
302
+ describe("with no initial trade provided", () => {
303
+ it("should not call the API on render", async () => {
304
+ render(<TradeSelector />);
305
+
306
+ await waitFor(() => expect(global.fetch).not.toHaveBeenCalled());
307
+ });
308
+ });
309
+
310
+ describe("with initial trade provided", () => {
311
+ it("should not call the API on initial render", async () => {
312
+ render(<TradeSelector initialTrade="Builder" />);
313
+
314
+ await waitFor(() => expect(global.fetch).not.toHaveBeenCalled());
315
+ });
316
+ });
317
+
318
+ describe("with user input set above minimum length", () => {
319
+ it("should call the API", async () => {
320
+ const userInput = "swim";
321
+ const AbortSignalMock = expect.anything();
322
+
323
+ render(<TradeSelector />);
324
+
325
+ await userEvent.tab();
326
+ await userEvent.keyboard(userInput);
327
+ await waitFor(() => {
328
+ expect(global.fetch).toHaveBeenCalledWith(
329
+ expect.any(URL),
330
+ AbortSignalMock,
331
+ );
332
+ expect(
333
+ (global.fetch as jest.Mock).mock.calls[2][0].toString(),
334
+ ).toEqual(
335
+ `https://fns-staging.simplybusiness.co.uk/rambdas/trade-selector-chopin?q=${userInput}&site=simplybusiness_hoverla`,
336
+ );
337
+ });
338
+ });
411
339
  });
412
340
  });
413
341
  });