@urbanos/react-discovery-ui 2.1.43

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 (316) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +118 -0
  3. package/lib/ReactDiscoveryUI.js +103 -0
  4. package/lib/ReactDiscoveryUI.scss +13 -0
  5. package/lib/assets/arrow.svg +6 -0
  6. package/lib/assets/blk-database.svg +48 -0
  7. package/lib/assets/chart.svg +1 -0
  8. package/lib/assets/down.png +0 -0
  9. package/lib/assets/down.svg +1 -0
  10. package/lib/assets/folder_icon.png +0 -0
  11. package/lib/assets/folder_icon.svg +1 -0
  12. package/lib/assets/ic_arrow.svg +15 -0
  13. package/lib/assets/loadingicon.svg +57 -0
  14. package/lib/assets/no_image.png +0 -0
  15. package/lib/assets/plus.png +0 -0
  16. package/lib/assets/plus.svg +1 -0
  17. package/lib/assets/user.svg +1 -0
  18. package/lib/auth/auth0-client-provider.js +37 -0
  19. package/lib/auth/auth0-client-provider.test.js +33 -0
  20. package/lib/auth/auth0-wrapper.js +155 -0
  21. package/lib/auth/auth0-wrapper.test.js +100 -0
  22. package/lib/components/auth0-login-zone/auth0-login-zone.js +147 -0
  23. package/lib/components/auth0-login-zone/auth0-login-zone.test.js +177 -0
  24. package/lib/components/auth0-login-zone/index.js +9 -0
  25. package/lib/components/code-editor/code-editor.css +173 -0
  26. package/lib/components/code-editor/code-editor.js +64 -0
  27. package/lib/components/code-editor/index.js +9 -0
  28. package/lib/components/collapsable-box/collapsable-box.js +81 -0
  29. package/lib/components/collapsable-box/collapsable-box.scss +39 -0
  30. package/lib/components/collapsable-box/collapsable-box.test.js +87 -0
  31. package/lib/components/collapsable-box/index.js +9 -0
  32. package/lib/components/data-card/data-card.js +63 -0
  33. package/lib/components/data-card/data-card.scss +93 -0
  34. package/lib/components/data-card/data-card.test.js +74 -0
  35. package/lib/components/data-card/index.js +9 -0
  36. package/lib/components/data-view/data-view.js +194 -0
  37. package/lib/components/data-view/data-view.scss +39 -0
  38. package/lib/components/data-view/data-view.test.js +155 -0
  39. package/lib/components/data-view/index.js +9 -0
  40. package/lib/components/dataset-api-doc/api-example.js +120 -0
  41. package/lib/components/dataset-api-doc/api-example.scss +84 -0
  42. package/lib/components/dataset-api-doc/api-example.test.js +88 -0
  43. package/lib/components/dataset-api-doc/dataset-api-doc.js +117 -0
  44. package/lib/components/dataset-api-doc/dataset-api-doc.scss +8 -0
  45. package/lib/components/dataset-api-doc/dataset-api-doc.test.js +42 -0
  46. package/lib/components/dataset-api-doc/index.js +9 -0
  47. package/lib/components/dataset-details/dataset-details.js +64 -0
  48. package/lib/components/dataset-details/dataset-details.scss +58 -0
  49. package/lib/components/dataset-details/dataset-details.test.js +38 -0
  50. package/lib/components/dataset-details/index.js +9 -0
  51. package/lib/components/dataset-dictionary/dataset-dictionary.js +127 -0
  52. package/lib/components/dataset-dictionary/dataset-dictionary.scss +42 -0
  53. package/lib/components/dataset-dictionary/dataset-dictionary.test.js +286 -0
  54. package/lib/components/dataset-dictionary/index.js +9 -0
  55. package/lib/components/dataset-list/dataset-list.js +22 -0
  56. package/lib/components/dataset-list/dataset-list.scss +9 -0
  57. package/lib/components/dataset-list/dataset-list.test.js +16 -0
  58. package/lib/components/dataset-list/index.js +9 -0
  59. package/lib/components/dataset-metadata/dataset-metadata.js +169 -0
  60. package/lib/components/dataset-metadata/dataset-metadata.scss +34 -0
  61. package/lib/components/dataset-metadata/dataset-metadata.test.js +24 -0
  62. package/lib/components/dataset-metadata/index.js +9 -0
  63. package/lib/components/dataset-preview/connector.js +26 -0
  64. package/lib/components/dataset-preview/dataset-preview.js +58 -0
  65. package/lib/components/dataset-preview/dataset-preview.scss +24 -0
  66. package/lib/components/dataset-preview/dataset-preview.test.js +34 -0
  67. package/lib/components/dataset-preview/index.js +9 -0
  68. package/lib/components/dataset-quality/dataset-quality.js +56 -0
  69. package/lib/components/dataset-quality/dataset-quality.scss +24 -0
  70. package/lib/components/dataset-quality/dataset-quality.test.js +34 -0
  71. package/lib/components/dataset-quality/index.js +9 -0
  72. package/lib/components/dataset-recommendations/connector.js +24 -0
  73. package/lib/components/dataset-recommendations/dataset-recommendations.js +47 -0
  74. package/lib/components/dataset-recommendations/dataset-recommendations.scss +17 -0
  75. package/lib/components/dataset-recommendations/dataset-recommendations.test.js +37 -0
  76. package/lib/components/dataset-recommendations/index.js +9 -0
  77. package/lib/components/detail-toggle-icon/detail-toggle-icon.js +41 -0
  78. package/lib/components/detail-toggle-icon/detail-toggle-icon.scss +13 -0
  79. package/lib/components/detail-toggle-icon/detail-toggle-icon.test.js +20 -0
  80. package/lib/components/detail-toggle-icon/index.js +9 -0
  81. package/lib/components/facet-list/facet-list.js +47 -0
  82. package/lib/components/facet-list/facet-list.scss +19 -0
  83. package/lib/components/facet-list/facet-list.test.js +94 -0
  84. package/lib/components/facet-list/index.js +9 -0
  85. package/lib/components/facet-sidebar/facet-sidebar.js +101 -0
  86. package/lib/components/facet-sidebar/facet-sidebar.scss +129 -0
  87. package/lib/components/facet-sidebar/facet-sidebar.test.js +93 -0
  88. package/lib/components/facet-sidebar/index.js +9 -0
  89. package/lib/components/generic-elements/alert-component/alert-component.js +51 -0
  90. package/lib/components/generic-elements/alert-component/alert-component.scss +26 -0
  91. package/lib/components/generic-elements/alert-component/alert-component.test.js +26 -0
  92. package/lib/components/generic-elements/alert-component/index.js +9 -0
  93. package/lib/components/generic-elements/arrow-button/arrow-button.js +30 -0
  94. package/lib/components/generic-elements/arrow-button/index.js +9 -0
  95. package/lib/components/generic-elements/auto-anchoring-popover/index.js +61 -0
  96. package/lib/components/generic-elements/back-button/back-button.js +14 -0
  97. package/lib/components/generic-elements/back-button/back-button.scss +14 -0
  98. package/lib/components/generic-elements/back-button/index.js +9 -0
  99. package/lib/components/generic-elements/call-to-action-button/call-to-action-button.js +118 -0
  100. package/lib/components/generic-elements/call-to-action-button/call-to-action-button.scss +19 -0
  101. package/lib/components/generic-elements/call-to-action-button/call-to-action-button.test.js +68 -0
  102. package/lib/components/generic-elements/call-to-action-button/index.js +9 -0
  103. package/lib/components/generic-elements/chart-icon/index.js +23 -0
  104. package/lib/components/generic-elements/checkbox/checkbox.js +50 -0
  105. package/lib/components/generic-elements/checkbox/checkbox.scss +44 -0
  106. package/lib/components/generic-elements/checkbox/checkbox.test.js +71 -0
  107. package/lib/components/generic-elements/checkbox/index.js +9 -0
  108. package/lib/components/generic-elements/error-component/error-component.js +21 -0
  109. package/lib/components/generic-elements/error-component/error-component.scss +16 -0
  110. package/lib/components/generic-elements/error-component/error-component.test.js +12 -0
  111. package/lib/components/generic-elements/error-component/index.js +9 -0
  112. package/lib/components/generic-elements/folder-icon/index.js +23 -0
  113. package/lib/components/generic-elements/generated-link/generated-link.js +25 -0
  114. package/lib/components/generic-elements/generated-link/index.js +13 -0
  115. package/lib/components/generic-elements/loading-element/index.js +9 -0
  116. package/lib/components/generic-elements/loading-element/loading-element.js +22 -0
  117. package/lib/components/generic-elements/loading-element/loading-element.scss +6 -0
  118. package/lib/components/generic-elements/loading-element/loading-element.test.js +11 -0
  119. package/lib/components/generic-elements/paginator/index.js +9 -0
  120. package/lib/components/generic-elements/paginator/paginator.js +84 -0
  121. package/lib/components/generic-elements/paginator/paginator.scss +38 -0
  122. package/lib/components/generic-elements/paginator/paginator.test.js +140 -0
  123. package/lib/components/generic-elements/plus-icon/index.js +21 -0
  124. package/lib/components/generic-elements/save-indicator/index.js +9 -0
  125. package/lib/components/generic-elements/save-indicator/save-indicator.js +39 -0
  126. package/lib/components/generic-elements/save-indicator/save-indicator.scss +31 -0
  127. package/lib/components/generic-elements/save-indicator/save-indicator.test.js +89 -0
  128. package/lib/components/generic-elements/search/index.js +9 -0
  129. package/lib/components/generic-elements/search/search.js +93 -0
  130. package/lib/components/generic-elements/search/search.scss +90 -0
  131. package/lib/components/generic-elements/search/search.test.js +41 -0
  132. package/lib/components/generic-elements/select/index.js +9 -0
  133. package/lib/components/generic-elements/select/select.js +44 -0
  134. package/lib/components/generic-elements/select/select.scss +22 -0
  135. package/lib/components/generic-elements/select/select.test.js +34 -0
  136. package/lib/components/generic-elements/share-link/index.js +9 -0
  137. package/lib/components/generic-elements/share-link/share-link.js +23 -0
  138. package/lib/components/generic-elements/share-link/share-link.scss +17 -0
  139. package/lib/components/generic-elements/share-link/share-link.test.js +28 -0
  140. package/lib/components/generic-elements/sql-icon/index.js +20 -0
  141. package/lib/components/generic-elements/tab-button/index.js +9 -0
  142. package/lib/components/generic-elements/tab-button/tab-button.js +25 -0
  143. package/lib/components/generic-elements/tab-button/tab-button.scss +27 -0
  144. package/lib/components/generic-elements/visualize-button/index.js +9 -0
  145. package/lib/components/generic-elements/visualize-button/visualize-button.js +37 -0
  146. package/lib/components/generic-elements/visualize-button/visualize-button.scss +14 -0
  147. package/lib/components/login-zone/connector.js +25 -0
  148. package/lib/components/login-zone/index.js +9 -0
  149. package/lib/components/login-zone/login-svgs-and-text.js +39 -0
  150. package/lib/components/login-zone/login-zone.js +21 -0
  151. package/lib/components/login-zone/login-zone.scss +115 -0
  152. package/lib/components/login-zone/login-zone.test.js +17 -0
  153. package/lib/components/login-zone/login.js +48 -0
  154. package/lib/components/login-zone/logout.js +39 -0
  155. package/lib/components/network-loading-element/connector.js +17 -0
  156. package/lib/components/network-loading-element/index.js +9 -0
  157. package/lib/components/network-loading-element/network-loading-element.js +23 -0
  158. package/lib/components/network-loading-element/network-loading-element.scss +21 -0
  159. package/lib/components/network-loading-element/network-loading-element.test.js +34 -0
  160. package/lib/components/organization/index.js +9 -0
  161. package/lib/components/organization/organization.js +27 -0
  162. package/lib/components/organization/organization.scss +32 -0
  163. package/lib/components/protected-route/protected-route.js +101 -0
  164. package/lib/components/protected-route/protected-route.scss +4 -0
  165. package/lib/components/protected-route/protected-route.test.js +63 -0
  166. package/lib/components/query-form/index.js +9 -0
  167. package/lib/components/query-form/query-form.js +262 -0
  168. package/lib/components/query-form/query-form.scss +167 -0
  169. package/lib/components/query-form/query-form.test.js +248 -0
  170. package/lib/components/recommendation-list/index.js +9 -0
  171. package/lib/components/recommendation-list/recommendation-list.js +72 -0
  172. package/lib/components/recommendation-list/recommendation-list.scss +61 -0
  173. package/lib/components/recommendation-list/recommendation-list.test.js +38 -0
  174. package/lib/components/remote-toggle/__snapshots__/remote-toggle.test.js.snap +3 -0
  175. package/lib/components/remote-toggle/index.js +13 -0
  176. package/lib/components/remote-toggle/remote-toggle.js +35 -0
  177. package/lib/components/remote-toggle/remote-toggle.scss +0 -0
  178. package/lib/components/remote-toggle/remote-toggle.test.js +10 -0
  179. package/lib/components/share/index.js +9 -0
  180. package/lib/components/share/share.js +109 -0
  181. package/lib/components/share/share.scss +66 -0
  182. package/lib/components/streaming-api-doc/index.js +9 -0
  183. package/lib/components/streaming-api-doc/streaming-api-doc.js +76 -0
  184. package/lib/components/streaming-api-doc/streaming-api-doc.scss +23 -0
  185. package/lib/components/streaming-api-doc/streaming-api-doc.test.js +24 -0
  186. package/lib/components/tooltip/index.js +9 -0
  187. package/lib/components/tooltip/tooltip.js +17 -0
  188. package/lib/components/tooltip/tooltip.scss +16 -0
  189. package/lib/components/tooltip/tooltip.test.js +19 -0
  190. package/lib/components/visualization-list-menu-item/index.js +9 -0
  191. package/lib/components/visualization-list-menu-item/visualization-list-menu-item.js +53 -0
  192. package/lib/components/visualization-list-menu-item/visualization-list-menu-item.scss +21 -0
  193. package/lib/components/visualization-list-menu-item/visualization-list-menu-item.test.js +42 -0
  194. package/lib/components/visualization-save-menu-item/index.js +9 -0
  195. package/lib/components/visualization-save-menu-item/visualization-save-menu-item.js +101 -0
  196. package/lib/components/visualization-save-menu-item/visualization-save-menu-item.scss +37 -0
  197. package/lib/components/visualization-save-menu-item/visualization-save-menu-item.test.js +185 -0
  198. package/lib/components/visualizations/geojson/connector.js +29 -0
  199. package/lib/components/visualizations/geojson/geojson-visualization.js +151 -0
  200. package/lib/components/visualizations/geojson/geojson-visualization.scss +24 -0
  201. package/lib/components/visualizations/geojson/geojson-visualization.test.js +238 -0
  202. package/lib/components/visualizations/geojson/index.js +9 -0
  203. package/lib/pages/apikey-view/apiKey-view.test.js +204 -0
  204. package/lib/pages/apikey-view/apikey-view.js +166 -0
  205. package/lib/pages/apikey-view/apikey-view.scss +340 -0
  206. package/lib/pages/apikey-view/connector.js +31 -0
  207. package/lib/pages/apikey-view/index.js +9 -0
  208. package/lib/pages/chart-view/chart-view.js +92 -0
  209. package/lib/pages/chart-view/chart-view.scss +35 -0
  210. package/lib/pages/chart-view/chart-view.test.js +206 -0
  211. package/lib/pages/chart-view/connector.js +30 -0
  212. package/lib/pages/chart-view/index.js +9 -0
  213. package/lib/pages/dataset-detail-view/connector.js +38 -0
  214. package/lib/pages/dataset-detail-view/dataset-detail-view-connector.test.js +42 -0
  215. package/lib/pages/dataset-detail-view/dataset-detail-view.js +99 -0
  216. package/lib/pages/dataset-detail-view/dataset-detail-view.scss +190 -0
  217. package/lib/pages/dataset-detail-view/dataset-detail-view.test.js +305 -0
  218. package/lib/pages/dataset-detail-view/index.js +9 -0
  219. package/lib/pages/dataset-list-view/connector.js +30 -0
  220. package/lib/pages/dataset-list-view/dataset-list-view.js +132 -0
  221. package/lib/pages/dataset-list-view/dataset-list-view.scss +242 -0
  222. package/lib/pages/dataset-list-view/dataset-list-view.test.js +162 -0
  223. package/lib/pages/dataset-list-view/index.js +9 -0
  224. package/lib/pages/dataset-view/connector.js +55 -0
  225. package/lib/pages/dataset-view/dataset-view-connector.test.js +78 -0
  226. package/lib/pages/dataset-view/dataset-view.js +175 -0
  227. package/lib/pages/dataset-view/dataset-view.scss +95 -0
  228. package/lib/pages/dataset-view/dataset-view.test.js +157 -0
  229. package/lib/pages/dataset-view/index.js +9 -0
  230. package/lib/pages/login-view/connector.js +25 -0
  231. package/lib/pages/login-view/index.js +9 -0
  232. package/lib/pages/login-view/login-view.js +83 -0
  233. package/lib/pages/login-view/login-view.scss +62 -0
  234. package/lib/pages/login-view/login-view.test.js +23 -0
  235. package/lib/pages/oauth-error-view/index.js +9 -0
  236. package/lib/pages/oauth-error-view/oauth-error-view.js +25 -0
  237. package/lib/pages/oauth-error-view/oauth-error-view.scss +13 -0
  238. package/lib/pages/oauth-error-view/oauth-error-view.test.js +13 -0
  239. package/lib/pages/oauth-view/connector.js +22 -0
  240. package/lib/pages/oauth-view/index.js +9 -0
  241. package/lib/pages/oauth-view/oauth-view.js +124 -0
  242. package/lib/pages/oauth-view/oauth-view.scss +7 -0
  243. package/lib/pages/oauth-view/oauth-view.test.js +195 -0
  244. package/lib/pages/query-view/connector.js +40 -0
  245. package/lib/pages/query-view/index.js +9 -0
  246. package/lib/pages/query-view/query-view.js +80 -0
  247. package/lib/pages/query-view/query-view.scss +39 -0
  248. package/lib/pages/query-view/query-view.test.js +104 -0
  249. package/lib/pages/user-profile-view/connector.js +39 -0
  250. package/lib/pages/user-profile-view/index.js +9 -0
  251. package/lib/pages/user-profile-view/user-profile-view.js +154 -0
  252. package/lib/pages/user-profile-view/user-profile-view.scss +81 -0
  253. package/lib/pages/user-profile-view/user-profile-view.test.js +129 -0
  254. package/lib/pages/visualization-view/connector.js +52 -0
  255. package/lib/pages/visualization-view/index.js +9 -0
  256. package/lib/pages/visualization-view/visualization-view-connector.test.js +62 -0
  257. package/lib/pages/visualization-view/visualization-view.js +128 -0
  258. package/lib/pages/visualization-view/visualization-view.scss +115 -0
  259. package/lib/pages/visualization-view/visualization-view.test.js +188 -0
  260. package/lib/routes.js +18 -0
  261. package/lib/search-params/search-params-manager.js +171 -0
  262. package/lib/search-params/search-params-manager.test.js +490 -0
  263. package/lib/store/actions.js +428 -0
  264. package/lib/store/dataset-selectors.js +47 -0
  265. package/lib/store/dataset-selectors.test.js +154 -0
  266. package/lib/store/query-selectors.js +53 -0
  267. package/lib/store/query-selectors.test.js +153 -0
  268. package/lib/store/reducers/index.js +20 -0
  269. package/lib/store/reducers/query-reducer.js +52 -0
  270. package/lib/store/reducers/query-reducer.test.js +89 -0
  271. package/lib/store/reducers/reducers.js +196 -0
  272. package/lib/store/reducers/reducers.test.js +309 -0
  273. package/lib/store/reducers/visualization-reducer.js +167 -0
  274. package/lib/store/reducers/visualization-reducer.test.js +426 -0
  275. package/lib/store/sagas/api-invoker.js +79 -0
  276. package/lib/store/sagas/api-invoker.test.js +139 -0
  277. package/lib/store/sagas/apiKey-saga.js +81 -0
  278. package/lib/store/sagas/apiKey-saga.test.js +57 -0
  279. package/lib/store/sagas/dataset-download-saga.js +43 -0
  280. package/lib/store/sagas/dataset-list-saga.js +49 -0
  281. package/lib/store/sagas/dataset-list-saga.test.js +72 -0
  282. package/lib/store/sagas/dataset-preview-saga.js +44 -0
  283. package/lib/store/sagas/dataset-query-saga.js +43 -0
  284. package/lib/store/sagas/dataset-recommendation-saga.js +40 -0
  285. package/lib/store/sagas/dataset-saga.js +50 -0
  286. package/lib/store/sagas/freestyle-query-saga.js +127 -0
  287. package/lib/store/sagas/freestyle-query-saga.test.js +145 -0
  288. package/lib/store/sagas/index.js +44 -0
  289. package/lib/store/sagas/login-saga.js +85 -0
  290. package/lib/store/sagas/login-saga.test.js +84 -0
  291. package/lib/store/sagas/logout-saga.js +96 -0
  292. package/lib/store/sagas/oauth-saga.js +78 -0
  293. package/lib/store/sagas/oauth-saga.test.js +51 -0
  294. package/lib/store/sagas/process-login-saga.js +62 -0
  295. package/lib/store/sagas/process-login-saga.test.js +83 -0
  296. package/lib/store/sagas/visualization-saga.js +371 -0
  297. package/lib/store/sagas/visualization-saga.test.js +388 -0
  298. package/lib/store/selectors.js +83 -0
  299. package/lib/store/visualization-selectors.js +85 -0
  300. package/lib/store/visualization-selectors.test.js +195 -0
  301. package/lib/styles/mixins.scss +117 -0
  302. package/lib/styles/variables.scss +41 -0
  303. package/lib/utils/file-type-utils.js +18 -0
  304. package/lib/utils/file-type-utils.test.js +29 -0
  305. package/lib/utils/geojson-utils.js +70 -0
  306. package/lib/utils/geojson-utils.test.js +129 -0
  307. package/lib/utils/http-clients.js +218 -0
  308. package/lib/utils/http-clients.test.js +88 -0
  309. package/lib/utils/index.js +34 -0
  310. package/lib/utils/modified-date-string-builder.js +29 -0
  311. package/lib/utils/modified-date-string-builder.test.js +93 -0
  312. package/lib/utils/query-string-builder.js +38 -0
  313. package/lib/utils/query-string-builder.test.js +33 -0
  314. package/lib/utils/recommendation-utils.js +12 -0
  315. package/lib/utils/recommendation-utils.test.js +9 -0
  316. package/package.json +172 -0
@@ -0,0 +1,426 @@
1
+ import reducer from './visualization-reducer'
2
+ import { Link } from 'react-router-dom'
3
+ import {
4
+ visualizationLoad,
5
+ visualizationSave,
6
+ visualizationReset,
7
+ visualizationLoadSuccess,
8
+ visualizationLoadFailure,
9
+ visualizationSaveFailure,
10
+ visualizationSaveSuccess,
11
+ setChartInformation,
12
+ visualizationsLoadAll,
13
+ visualizationsLoadAllSuccess,
14
+ visualizationsLoadAllFailure,
15
+ visualizationDelete,
16
+ visualizationDeleteFailure,
17
+ visualizationDeleteSuccess
18
+ } from '../actions'
19
+
20
+ describe('Visualization Reducer', () => {
21
+ let newState, previousState
22
+
23
+ describe('VISUALIZATION_LOAD', () => {
24
+ beforeEach(() => {
25
+ previousState = {
26
+ visualization: { id: 'existing' },
27
+ loading: false,
28
+ loadSuccess: true,
29
+ loadFailure: true
30
+ }
31
+ newState = reducer(previousState, visualizationLoad('viz_id'))
32
+ })
33
+
34
+ it('sets `loading` state to true', () => {
35
+ expect(newState.loading).toBeTruthy()
36
+ })
37
+
38
+ it('sets `loadSuccess` state to false', () => {
39
+ expect(newState.loadSuccess).toBeFalsy()
40
+ })
41
+
42
+ it('sets `loadFailure` state to false', () => {
43
+ expect(newState.loadFailure).toBeFalsy()
44
+ })
45
+
46
+ it('does not modify other properties', () => {
47
+ const { loading: _cl, loadSuccess: _cs, loadFailure: _cf, ...previousOthers } = previousState
48
+ const { loading: _nl, loadSuccess: _ns, loadFailure: _nf, ...newOthers } = newState
49
+ expect(newOthers).toEqual(previousOthers)
50
+ })
51
+ })
52
+
53
+ describe('VISUALIZATION_SAVE', () => {
54
+ beforeEach(() => {
55
+ previousState = {
56
+ visualization: { id: 'existing' },
57
+ loading: true,
58
+ saving: false,
59
+ saveSuccess: true,
60
+ saveFailure: true
61
+ }
62
+ newState = reducer(previousState, visualizationSave('hello', 'world'))
63
+ })
64
+
65
+ it('sets `saving` state to true', () => {
66
+ expect(newState.saving).toBeTruthy()
67
+ })
68
+
69
+ it('sets `saveSuccess` state to false', () => {
70
+ expect(newState.saveSuccess).toBeFalsy()
71
+ })
72
+
73
+ it('sets `saveFailure` state to false', () => {
74
+ expect(newState.saveFailure).toBeFalsy()
75
+ })
76
+
77
+ it('does not modify other properties', () => {
78
+ const { saving: _cl, saveSuccess: _cs, saveFailure: _cf, ...previousOthers } = previousState
79
+ const { saving: _nl, saveSuccess: _ns, saveFailure: _nf, ...newOthers } = newState
80
+ expect(newOthers).toEqual(previousOthers)
81
+ })
82
+ })
83
+
84
+ describe('VISUALIZATION_SAVE_SUCCESS', () => {
85
+ const newVisualization = { id: 'new' }
86
+ beforeEach(() => {
87
+ previousState = {
88
+ visualization: { id: 'existing' },
89
+ loading: true,
90
+ saveSuccess: false,
91
+ saving: true,
92
+ saveFailure: true
93
+ }
94
+ newState = reducer(previousState, visualizationSaveSuccess(newVisualization))
95
+ })
96
+
97
+ it('sets `visualization` state to the visualization', () => {
98
+ expect(newState.visualization).toEqual(newVisualization)
99
+ })
100
+
101
+ it('sets `saving` state to false', () => {
102
+ expect(newState.saving).toBeFalsy()
103
+ })
104
+
105
+ it('sets `saveSuccess` state to true', () => {
106
+ expect(newState.saveSuccess).toBeTruthy()
107
+ })
108
+
109
+ it('sets `saveFailure` state to false', () => {
110
+ expect(newState.saveFailure).toBeFalsy()
111
+ })
112
+ })
113
+
114
+ describe('VISUALIZATION_LOAD_ALL', () => {
115
+ const newVisualizations = [{ title: 'title1', id: 'id1' }, { title: 'title2', id: 'id2' }]
116
+ beforeEach(() => {
117
+ previousState = {
118
+ loading: false,
119
+ loadSuccess: true,
120
+ loadFailure: false
121
+ }
122
+ newState = reducer(previousState, visualizationsLoadAll(newVisualizations))
123
+ })
124
+
125
+ it('sets loading to true', () => {
126
+ expect(newState.loading).toBeTruthy()
127
+ })
128
+
129
+ it('sets loadSuccess to false', () => {
130
+ expect(newState.loadSuccess).toBeFalsy()
131
+ })
132
+
133
+ it('sets loadFailure to false', () => {
134
+ expect(newState.loadFailure).toBeFalsy()
135
+ })
136
+ })
137
+
138
+ describe('VISUALIZATION_LOAD_ALL_SUCCESS', () => {
139
+ const newVisualizations = [
140
+ { title: 'title1', id: 'id1', created: '2019-12-12T14:33:08', updated: '2019-12-12T14:33:08' },
141
+ { title: 'title2', id: 'id2', created: '2019-12-09T15:40:15', updated: '2019-12-12T15:53:54' }
142
+ ]
143
+
144
+ beforeEach(() => {
145
+ previousState = {
146
+
147
+ loading: false,
148
+ loadSuccess: true,
149
+ loadFailure: false
150
+ }
151
+ newState = reducer(previousState, visualizationsLoadAllSuccess(newVisualizations))
152
+ })
153
+
154
+ it('sets loading to false', () => {
155
+ expect(newState.loading).toBeFalsy()
156
+ })
157
+
158
+ it('sets loadSuccess to true', () => {
159
+ expect(newState.loadSuccess).toBeTruthy()
160
+ })
161
+
162
+ it('sets loadFailure to false', () => {
163
+ expect(newState.loadFailure).toBeFalsy()
164
+ })
165
+
166
+ it('provides a link to each saved visualization in the title field', () => {
167
+ expect(newState.userVisualizations[0].title).toEqual(<Link to='/visualization/id1'>title1</Link>)
168
+ expect(newState.userVisualizations[1].title).toEqual(<Link to='/visualization/id2'>title2</Link>)
169
+ })
170
+ })
171
+
172
+ describe('VISUALIZATION_LOAD_ALL_FAILURE', () => {
173
+ const newVisualizations = [
174
+ { title: 'title1', id: 'id1', created: '2019-12-12T14:33:08', updated: '2019-12-12T14:33:08' },
175
+ { title: 'title2', id: 'id2', created: '2019-12-09T15:40:15', updated: '2019-12-12T15:53:54' }
176
+ ]
177
+
178
+ beforeEach(() => {
179
+ previousState = {
180
+ loading: false,
181
+ loadSuccess: true,
182
+ loadFailure: false
183
+ }
184
+ newState = reducer(previousState, visualizationsLoadAllFailure())
185
+ })
186
+
187
+ it('sets loading to false', () => {
188
+ expect(newState.loading).toBeFalsy()
189
+ })
190
+
191
+ it('sets loadSuccess to false', () => {
192
+ expect(newState.loadSuccess).toBeFalsy()
193
+ })
194
+
195
+ it('sets loadFailure to true', () => {
196
+ expect(newState.loadFailure).toBeTruthy()
197
+ })
198
+ })
199
+
200
+ describe('VISUALIZATION_LOAD_SUCCESS', () => {
201
+ const newVisualization = { id: 'new' }
202
+ beforeEach(() => {
203
+ previousState = {
204
+ visualization: { id: 'existing' },
205
+ loading: true,
206
+ loadSuccess: true,
207
+ loadFailure: true
208
+ }
209
+ newState = reducer(previousState, visualizationLoadSuccess(newVisualization))
210
+ })
211
+
212
+ it('sets `visualization` state to the visualization', () => {
213
+ expect(newState.visualization).toEqual(newVisualization)
214
+ })
215
+
216
+ it('sets `loading` state to false', () => {
217
+ expect(newState.loading).toBeFalsy()
218
+ })
219
+
220
+ it('sets `loadSuccess` state to true', () => {
221
+ expect(newState.loadSuccess).toBeTruthy()
222
+ })
223
+
224
+ it('sets `loadFailure` state to false', () => {
225
+ expect(newState.loadFailure).toBeFalsy()
226
+ })
227
+ })
228
+
229
+ describe('VISUALIZATION_SAVE_FAILURE', () => {
230
+ const errorMessage = 'bad stuff'
231
+ const previousVisualization = { id: 'existing' }
232
+
233
+ beforeEach(() => {
234
+ previousState = {
235
+ visualization: previousVisualization,
236
+ loading: true,
237
+ saving: true,
238
+ saveSuccess: true,
239
+ saveFailure: false
240
+ }
241
+ newState = reducer(previousState, visualizationSaveFailure(errorMessage))
242
+ })
243
+
244
+ it('does not modify the current visualization', () => {
245
+ expect(newState.visualization).toEqual(previousVisualization)
246
+ })
247
+
248
+ it('sets `saving` state to false', () => {
249
+ expect(newState.saving).toBeFalsy()
250
+ })
251
+
252
+ it('sets `saveSuccess` state to false', () => {
253
+ expect(newState.saveSuccess).toBeFalsy()
254
+ })
255
+
256
+ it('sets `saveFailure` state to true', () => {
257
+ expect(newState.saveFailure).toBeTruthy()
258
+ })
259
+ })
260
+
261
+ describe('VISUALIZATION_LOAD_FAILURE', () => {
262
+ const errorMessage = 'bad stuff'
263
+ const previousVisualization = { id: 'existing' }
264
+
265
+ beforeEach(() => {
266
+ previousState = {
267
+ visualization: previousVisualization,
268
+ loading: true,
269
+ loadSuccess: true,
270
+ loadFailure: false
271
+ }
272
+ newState = reducer(previousState, visualizationLoadFailure(errorMessage))
273
+ })
274
+
275
+ it('does not modify the current visualization', () => {
276
+ expect(newState.visualization).toEqual(previousVisualization)
277
+ })
278
+
279
+ it('sets `loading` state to false', () => {
280
+ expect(newState.loading).toBeFalsy()
281
+ })
282
+
283
+ it('sets `loadSuccess` state to false', () => {
284
+ expect(newState.loadSuccess).toBeFalsy()
285
+ })
286
+
287
+ it('sets `loadFailure` state to true', () => {
288
+ expect(newState.loadFailure).toBeTruthy()
289
+ })
290
+ })
291
+
292
+ describe('VISUALIZATION_RESET', () => {
293
+ beforeEach(() => {
294
+ previousState = {
295
+ visualization: { id: 'existing' },
296
+ loading: true,
297
+ loadSuccess: true,
298
+ loadFailure: true,
299
+ saving: true,
300
+ saveSuccess: true,
301
+ saveFailure: true
302
+ }
303
+ newState = reducer(previousState, visualizationReset())
304
+ })
305
+
306
+ it('sets `visualization` state to an empty object', () => {
307
+ expect(newState.visualization).toEqual({})
308
+ })
309
+
310
+ it('sets `loading` state to false', () => {
311
+ expect(newState.loading).toBeFalsy()
312
+ })
313
+
314
+ it('sets `loadFailure` state to false', () => {
315
+ expect(newState.loadFailure).toBeFalsy()
316
+ })
317
+
318
+ it('sets `loadSuccess` state to false', () => {
319
+ expect(newState.loadSuccess).toBeFalsy()
320
+ })
321
+
322
+ it('sets `saving` state to false', () => {
323
+ expect(newState.saving).toBeFalsy()
324
+ })
325
+
326
+ it('sets `saveFailure` state to false', () => {
327
+ expect(newState.saveFailure).toBeFalsy()
328
+ })
329
+
330
+ it('sets `saveSuccess` state to false', () => {
331
+ expect(newState.saveSuccess).toBeFalsy()
332
+ })
333
+ })
334
+
335
+ describe('SET_CHART_INFORMATION', () => {
336
+ beforeEach(() => {
337
+ previousState = {
338
+ visualization: { id: 'existing' },
339
+ loading: true,
340
+ saving: false,
341
+ saveSuccess: true,
342
+ saveFailure: true,
343
+ chart: {}
344
+ }
345
+ })
346
+
347
+ it('updates the chart value in the store', () => {
348
+ newState = reducer(previousState, setChartInformation({ data: [{ x: 1 }], frames: [], layout: {} }))
349
+
350
+ expect(newState.chart).toEqual({ data: [{ x: 1 }], frames: [], layout: {} })
351
+ })
352
+
353
+ it('gives sane defaults to the chart properties when they are not set', () => {
354
+ newState = reducer(previousState, setChartInformation({}))
355
+
356
+ expect(newState.chart).toEqual({ data: [], frames: [], layout: {} })
357
+ })
358
+
359
+ it('gives sane defaults to the chart properties when they are set to the wrong types', () => {
360
+ newState = reducer(previousState, setChartInformation({ data: [[]], frames: { more: 'stuff' }, layout: [] }))
361
+
362
+ expect(newState.chart).toEqual({ data: [], frames: [], layout: {} })
363
+ })
364
+ })
365
+
366
+ describe('VISUALIZATION_DELETE', () => {
367
+ beforeEach(() => {
368
+ previousState = {
369
+ deleting: false,
370
+ deleteSuccess: true,
371
+ deleteFailure: true
372
+ }
373
+ newState = reducer(previousState, visualizationDelete({ id: 'Frank' }))
374
+ })
375
+
376
+ it('sets `deleting` state to true', () => {
377
+ expect(newState.deleting).toBeTruthy()
378
+ })
379
+
380
+ it('sets `failure` state to false', () => {
381
+ expect(newState.deleteFailure).toBeFalsy()
382
+ })
383
+
384
+ it('sets `success` state to false', () => {
385
+ expect(newState.deleteSuccess).toBeFalsy()
386
+ })
387
+ })
388
+
389
+ describe('VISUALIZATION_DELETE_SUCCESS', () => {
390
+ beforeEach(() => {
391
+ previousState = {
392
+ deleting: true,
393
+ deleteSuccess: false,
394
+ deleteFailure: false
395
+ }
396
+ newState = reducer(previousState, visualizationDeleteSuccess())
397
+ })
398
+
399
+ it('sets `deleting` state to false', () => {
400
+ expect(newState.deleting).toBeFalsy()
401
+ })
402
+
403
+ it('sets `success` state to true', () => {
404
+ expect(newState.deleteSuccess).toBeTruthy()
405
+ })
406
+ })
407
+
408
+ describe('VISUALIZATION_DELETE_FAILURE', () => {
409
+ beforeEach(() => {
410
+ previousState = {
411
+ deleting: true,
412
+ deleteSuccess: false,
413
+ deleteFailure: false
414
+ }
415
+ newState = reducer(previousState, visualizationDeleteFailure())
416
+ })
417
+
418
+ it('sets `deleting` state to false', () => {
419
+ expect(newState.deleting).toBeFalsy()
420
+ })
421
+
422
+ it('sets `failure` state to true', () => {
423
+ expect(newState.deleteFailure).toBeTruthy()
424
+ })
425
+ })
426
+ })
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _effects = require("redux-saga/effects");
9
+ var _actions = require("../actions");
10
+ var _httpClients = require("../../utils/http-clients");
11
+ var _qs = _interopRequireDefault(require("qs"));
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { throw: 1, return: 2, break: 3, continue: 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, catch: function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
14
+ function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
15
+ function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
16
+ function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
17
+ function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
18
+ function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
19
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
20
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
21
+ function _OverloadYield(e, d) { this.v = e, this.k = d; }
22
+ var defaultParamFunction = function defaultParamFunction() {
23
+ return {};
24
+ };
25
+ var _default = exports.default = function _default(_ref) {
26
+ var endpoint = _ref.endpoint,
27
+ actionator = _ref.actionator,
28
+ _ref$errorAction = _ref.errorAction,
29
+ errorAction = _ref$errorAction === void 0 ? (0, _actions.displayError)() : _ref$errorAction,
30
+ _ref$queryParameterBu = _ref.queryParameterBuilder,
31
+ queryParameterBuilder = _ref$queryParameterBu === void 0 ? defaultParamFunction : _ref$queryParameterBu;
32
+ return /*#__PURE__*/_regeneratorRuntime().mark(function retrieveData(action) {
33
+ var query, response;
34
+ return _regeneratorRuntime().wrap(function retrieveData$(_context) {
35
+ while (1) switch (_context.prev = _context.next) {
36
+ case 0:
37
+ _context.prev = 0;
38
+ query = {
39
+ baseURL: window.DISC_API_URL,
40
+ params: queryParameterBuilder(action),
41
+ paramsSerializer: function paramsSerializer(params) {
42
+ return _qs.default.stringify(params, {
43
+ arrayFormat: 'brackets'
44
+ });
45
+ },
46
+ withCredentials: true
47
+ };
48
+ _context.next = 4;
49
+ return (0, _effects.call)(_httpClients.AuthenticatedHTTPClient.get, endpoint, query);
50
+ case 4:
51
+ response = _context.sent;
52
+ if (!(response.status === 200)) {
53
+ _context.next = 10;
54
+ break;
55
+ }
56
+ _context.next = 8;
57
+ return (0, _effects.put)(actionator(response.data));
58
+ case 8:
59
+ _context.next = 12;
60
+ break;
61
+ case 10:
62
+ _context.next = 12;
63
+ return (0, _effects.put)(errorAction);
64
+ case 12:
65
+ _context.next = 19;
66
+ break;
67
+ case 14:
68
+ _context.prev = 14;
69
+ _context.t0 = _context["catch"](0);
70
+ console.error(_context.t0);
71
+ _context.next = 19;
72
+ return (0, _effects.put)(errorAction);
73
+ case 19:
74
+ case "end":
75
+ return _context.stop();
76
+ }
77
+ }, retrieveData, null, [[0, 14]]);
78
+ });
79
+ };
@@ -0,0 +1,139 @@
1
+ import { DISPLAY_ERROR } from '../actions'
2
+ import apiInvoker from './api-invoker'
3
+ import { createStore, applyMiddleware } from 'redux'
4
+ import createSagaMiddleware from 'redux-saga'
5
+ import { AuthenticatedHTTPClient } from '../../utils/http-clients'
6
+
7
+ describe('api-invoker', () => {
8
+ const reducer = (state = [], action) => {
9
+ return [...state, action]
10
+ }
11
+
12
+ const fakeDataSetResponse = { name: 'I am a fake response' }
13
+ const errorAction = { type: 'CUSTOM_ERROR_ACTION' }
14
+
15
+ let store, sagaMiddleware, actionator
16
+
17
+ beforeEach(() => {
18
+ AuthenticatedHTTPClient.get = jest.fn()
19
+
20
+ window.DISC_API_URL = 'http://fake.com/'
21
+
22
+ sagaMiddleware = createSagaMiddleware()
23
+ store = createStore(reducer, applyMiddleware(sagaMiddleware))
24
+ actionator = jest.fn().mockReturnValue({ type: 'unused' })
25
+ })
26
+
27
+ afterEach(() => {
28
+ jest.resetAllMocks()
29
+ })
30
+
31
+ it('invokes axios with the correct object when no query parameter function is passed in', () => {
32
+ AuthenticatedHTTPClient.get.mockImplementationOnce(() => ({
33
+ status: 200,
34
+ data: []
35
+ }))
36
+ sagaMiddleware.run(apiInvoker({ endpoint: '/gohome', actionator }))
37
+
38
+ expect(AuthenticatedHTTPClient.get).toHaveBeenCalledWith('/gohome', {
39
+ baseURL: window.DISC_API_URL,
40
+ params: {},
41
+ paramsSerializer: expect.anything(),
42
+ withCredentials: true
43
+ })
44
+ })
45
+
46
+ it('passes query parameters when passed in', () => {
47
+ const mockQueryParam = { some: 'param' }
48
+ const queryParameterBuilder = jest.fn().mockReturnValue(mockQueryParam)
49
+ AuthenticatedHTTPClient.get.mockImplementationOnce(() => ({
50
+ status: 200,
51
+ data: []
52
+ }))
53
+ sagaMiddleware.run(
54
+ apiInvoker({ endpoint: 'my-url', actionator, queryParameterBuilder })
55
+ )
56
+
57
+ expect(AuthenticatedHTTPClient.get).toHaveBeenCalledWith('my-url', {
58
+ baseURL: window.DISC_API_URL,
59
+ params: mockQueryParam,
60
+ paramsSerializer: expect.anything(),
61
+ withCredentials: true
62
+ })
63
+ })
64
+
65
+ it('gets query parameters from the query param function', () => {
66
+ const mockEvent = { type: 'some type' }
67
+ const queryParameterBuilder = jest.fn()
68
+ AuthenticatedHTTPClient.get.mockImplementationOnce(() => ({
69
+ status: 200,
70
+ data: []
71
+ }))
72
+ sagaMiddleware.run(
73
+ apiInvoker({ endpoint: '', actionator, queryParameterBuilder }),
74
+ mockEvent
75
+ )
76
+
77
+ expect(queryParameterBuilder).toHaveBeenCalledWith(mockEvent)
78
+ })
79
+
80
+ it('calls actionator when successful', () => {
81
+ AuthenticatedHTTPClient.get.mockImplementationOnce(() => ({
82
+ status: 200,
83
+ data: fakeDataSetResponse
84
+ }))
85
+
86
+ sagaMiddleware.run(apiInvoker({ endpoint: '', actionator }))
87
+
88
+ expect(actionator).toHaveBeenCalledWith(fakeDataSetResponse)
89
+ })
90
+
91
+ it('dispatches a display error by default when the network fails with an error', () => {
92
+ console.error = jest.fn()
93
+ const expectedError = new Error('Network error')
94
+ AuthenticatedHTTPClient.get.mockImplementationOnce(() => {
95
+ throw expectedError
96
+ })
97
+
98
+ sagaMiddleware.run(apiInvoker({ endpoint: '', actionator }))
99
+
100
+ expect(console.error).toHaveBeenCalledWith(expectedError)
101
+ expect(store.getState()).toContainEqual({
102
+ type: DISPLAY_ERROR
103
+ })
104
+ })
105
+
106
+ it('dispatches a display error by default if the status code is not 200', () => {
107
+ AuthenticatedHTTPClient.get.mockImplementationOnce(() => ({
108
+ status: 421,
109
+ data: fakeDataSetResponse
110
+ }))
111
+
112
+ sagaMiddleware.run(apiInvoker({ endpoint: '', actionator }))
113
+
114
+ expect(store.getState()).toContainEqual({
115
+ type: DISPLAY_ERROR
116
+ })
117
+ })
118
+
119
+ it('dispatches provided errorAction when the network fails with an error', () => {
120
+ AuthenticatedHTTPClient.get.mockImplementationOnce(() => {
121
+ throw new Error('Network error')
122
+ })
123
+
124
+ sagaMiddleware.run(apiInvoker({ endpoint: '', actionator, errorAction }))
125
+
126
+ expect(store.getState()).toContainEqual(errorAction)
127
+ })
128
+
129
+ it('dispatches provided errorAction if the status code is not 200', () => {
130
+ AuthenticatedHTTPClient.get.mockImplementationOnce(() => ({
131
+ status: 421,
132
+ data: fakeDataSetResponse
133
+ }))
134
+
135
+ sagaMiddleware.run(apiInvoker({ endpoint: '', actionator, errorAction }))
136
+
137
+ expect(store.getState()).toContainEqual(errorAction)
138
+ })
139
+ })