passbolt-styleguide 3.8.4 → 3.9.0-alpha2

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 (318) hide show
  1. package/build/css/help.min.css +3 -3
  2. package/build/css/public.min.css +3 -3
  3. package/build/css/themes/default/api_authentication.min.css +3 -3
  4. package/build/css/themes/default/api_cloud.min.css +3 -3
  5. package/build/css/themes/default/api_main.min.css +3 -3
  6. package/build/css/themes/default/api_reports.min.css +3 -3
  7. package/build/css/themes/default/api_webinstaller.min.css +3 -3
  8. package/build/css/themes/default/ext_app.min.css +3 -3
  9. package/build/css/themes/default/ext_authentication.min.css +3 -3
  10. package/build/css/themes/default/ext_external.min.css +2 -2
  11. package/build/css/themes/default/ext_in_form_cta.min.css +3 -3
  12. package/build/css/themes/default/ext_in_form_menu.min.css +3 -3
  13. package/build/css/themes/default/ext_quickaccess.min.css +3 -3
  14. package/build/css/themes/midgar/api_authentication.min.css +3 -3
  15. package/build/css/themes/midgar/api_main.min.css +3 -3
  16. package/build/css/themes/midgar/api_reports.min.css +3 -3
  17. package/build/css/themes/midgar/ext_app.min.css +3 -3
  18. package/build/css/themes/midgar/ext_authentication.min.css +3 -3
  19. package/build/css/themes/midgar/ext_in_form_cta.min.css +3 -3
  20. package/build/css/themes/midgar/ext_in_form_menu.min.css +3 -3
  21. package/build/css/themes/midgar/ext_quickaccess.min.css +3 -3
  22. package/build/css/themes/solarized_dark/api_authentication.min.css +1 -1
  23. package/build/css/themes/solarized_dark/api_main.min.css +1 -1
  24. package/build/css/themes/solarized_dark/api_reports.min.css +1 -1
  25. package/build/css/themes/solarized_dark/ext_app.min.css +1 -1
  26. package/build/css/themes/solarized_dark/ext_authentication.min.css +1 -1
  27. package/build/css/themes/solarized_dark/ext_in_form_cta.min.css +1 -1
  28. package/build/css/themes/solarized_dark/ext_in_form_menu.min.css +1 -1
  29. package/build/css/themes/solarized_dark/ext_quickaccess.min.css +1 -1
  30. package/build/css/themes/solarized_light/api_authentication.min.css +1 -1
  31. package/build/css/themes/solarized_light/api_main.min.css +1 -1
  32. package/build/css/themes/solarized_light/api_reports.min.css +1 -1
  33. package/build/css/themes/solarized_light/ext_app.min.css +1 -1
  34. package/build/css/themes/solarized_light/ext_authentication.min.css +1 -1
  35. package/build/css/themes/solarized_light/ext_in_form_cta.min.css +1 -1
  36. package/build/css/themes/solarized_light/ext_in_form_menu.min.css +1 -1
  37. package/build/css/themes/solarized_light/ext_quickaccess.min.css +1 -1
  38. package/build/js/dist/api-account-recovery.js +1 -1
  39. package/build/js/dist/api-app.js +1 -1
  40. package/build/js/dist/api-app.js.LICENSE.txt +75 -5
  41. package/build/js/dist/api-feedback.js +2 -0
  42. package/build/js/dist/api-feedback.js.LICENSE.txt +45 -0
  43. package/build/js/dist/api-recover.js +1 -1
  44. package/build/js/dist/api-setup.js +1 -1
  45. package/build/js/dist/api-triage.js +1 -1
  46. package/build/js/dist/api-vendors.js +1 -1
  47. package/build/js/dist/api-vendors.js.LICENSE.txt +19 -9
  48. package/build/js/dist/src/locales/de-DE/common.json +995 -0
  49. package/build/js/dist/src/locales/en-UK/common.json +1061 -0
  50. package/build/js/dist/src/locales/es-ES/common.json +995 -0
  51. package/build/js/dist/src/locales/fr-FR/common.json +995 -0
  52. package/build/js/dist/src/locales/ja-JP/common.json +980 -0
  53. package/build/js/dist/src/locales/lt-LT/common.json +1025 -0
  54. package/build/js/dist/src/locales/nl-NL/common.json +995 -0
  55. package/build/js/dist/src/locales/pl-PL/common.json +1025 -0
  56. package/build/js/dist/src/locales/sv-SE/common.json +995 -0
  57. package/package.json +18 -1
  58. package/src/img/controls/attention.svg +1 -0
  59. package/src/locales/en-UK/common.json +80 -16
  60. package/src/react-extension/ApiApp.js +17 -5
  61. package/src/react-extension/ApiFeedback.entry.js +24 -0
  62. package/src/react-extension/ExtApp.js +12 -5
  63. package/src/react-extension/ExtAuthenticationLogin.js +17 -15
  64. package/src/react-extension/ExtAuthenticationLogin.test.stories.js +59 -0
  65. package/src/react-extension/ExtBootstrapApp.js +1 -0
  66. package/src/react-extension/components/Administration/AdministrationWorkspace.js +24 -0
  67. package/src/react-extension/components/Administration/AdministrationWorkspace.test.data.js +3 -3
  68. package/src/react-extension/components/Administration/AdministrationWorkspace.test.js +13 -1
  69. package/src/react-extension/components/Administration/AdministrationWorkspace.test.page.js +7 -0
  70. package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.js +101 -0
  71. package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.test.data.js +23 -0
  72. package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.test.stories.js +27 -0
  73. package/src/react-extension/components/Administration/ConfirmSaveAccountRecoverySettings/ConfirmSaveAccountRecoverySettings.js +1 -1
  74. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.js +78 -2
  75. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.data.js +3 -1
  76. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.js +60 -0
  77. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.page.js +23 -4
  78. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationInternationalisationActions/DisplayAdministrationInternationalisationActions.js +125 -0
  79. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationMfaActions/DisplayAdministrationMfaActions.js +131 -0
  80. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSelfRegistrationActions/DisplayAdministrationSelfRegistrationActions.js +103 -0
  81. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSsoActions/DisplayAdministrationSsoActions.js +91 -0
  82. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSubscriptionActions/DisplayAdministrationSubscriptionActions.js +85 -0
  83. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationUserDirectoryActions/DisplayAdministrationUserDirectoryActions.js +228 -0
  84. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.js +4 -0
  85. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.test.js +9 -0
  86. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.js +3 -3
  87. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.test.data.js +14 -0
  88. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.test.page.js +0 -17
  89. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.js +18 -115
  90. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.data.js +11 -13
  91. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.js +38 -43
  92. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.page.js +47 -10
  93. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.stories.js +10 -43
  94. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.js +82 -367
  95. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.data.js +128 -42
  96. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.js +75 -121
  97. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.page.js +46 -16
  98. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.stories.js +18 -14
  99. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.js +103 -0
  100. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.js +53 -0
  101. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.page.js +81 -0
  102. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.stories.js +34 -0
  103. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.js +125 -0
  104. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.data.js +63 -0
  105. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.js +54 -0
  106. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.page.js +88 -0
  107. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.stories.js +35 -0
  108. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.js +381 -0
  109. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.data.js +69 -0
  110. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.js +332 -0
  111. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.page.js +247 -0
  112. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.stories.js +72 -0
  113. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.js +19 -19
  114. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.data.js +1717 -1729
  115. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.js +11 -3
  116. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.page.js +4 -1
  117. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.stories.js +11 -1784
  118. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.js +41 -140
  119. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.data.js +15 -3
  120. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.js +22 -49
  121. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.page.js +19 -11
  122. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.stories.js +9 -3
  123. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.js +5 -6
  124. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.data.js +1717 -1728
  125. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.js +11 -3
  126. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.page.js +4 -1
  127. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.stories.js +11 -1784
  128. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.js +362 -835
  129. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.data.js +427 -418
  130. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.js +134 -175
  131. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.page.js +108 -11
  132. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.stories.js +17 -25
  133. package/src/react-extension/components/Administration/EditSubscriptionKey/EditSubscriptionKey.js +4 -2
  134. package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.js +3 -3
  135. package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.test.js +1 -1
  136. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.js +32 -7
  137. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.data.js +0 -3
  138. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.js +145 -1
  139. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.page.js +52 -1
  140. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.stories.js +15 -0
  141. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.js +340 -0
  142. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.data.js +56 -0
  143. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.js +223 -0
  144. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.page.js +235 -0
  145. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.stories.js +55 -0
  146. package/src/react-extension/components/Administration/ManageSsoSettings/SsoProviders.data.js +34 -0
  147. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/GenerateOrganizationKey.js +12 -3
  148. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/GenerateOrganizationKey.test.js +27 -0
  149. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/SelectAccountRecoveryOrganizationKey.test.page.js +8 -0
  150. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.js +197 -0
  151. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.data.js +37 -0
  152. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.js +187 -0
  153. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.page.js +120 -0
  154. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.stories.js +31 -0
  155. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.js +9 -5
  156. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.data.js +4 -0
  157. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.js +11 -42
  158. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.page.js +1 -0
  159. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.js +9 -5
  160. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.data.js +4 -0
  161. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.js +16 -2
  162. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.page.js +17 -1
  163. package/src/react-extension/components/AuthenticationLogin/Login/Login.js +159 -61
  164. package/src/react-extension/components/AuthenticationLogin/Login/Login.test.data.js +14 -11
  165. package/src/react-extension/components/AuthenticationLogin/Login/Login.test.js +79 -0
  166. package/src/react-extension/components/AuthenticationLogin/Login/Login.test.page.js +16 -0
  167. package/src/react-extension/components/AuthenticationLogin/OrchestrateLogin/OrchestrateLoginBoxMain.js +2 -0
  168. package/src/react-extension/components/AuthenticationSetup/SetupAuthentication/SetupAuthentication.js +4 -0
  169. package/src/react-extension/components/Common/Error/ApiError/ApiError.js +119 -0
  170. package/src/react-extension/components/Common/Error/ApiError/ApiError.test.js +43 -0
  171. package/src/react-extension/components/Common/Error/ApiError/ApiError.test.page.js +108 -0
  172. package/src/react-extension/components/Common/Error/ApiError/ApiError.test.stories.js +39 -0
  173. package/src/react-extension/components/Common/Inputs/Autocomplete/Autocomplete.test.js +12 -0
  174. package/src/react-extension/components/Common/Inputs/Autocomplete/AutocompleteItem.js +2 -2
  175. package/src/react-extension/components/Common/Legacy/HandleLegacyAppjs.js +1 -1
  176. package/src/react-extension/components/Common/Navigation/Header/Logo.js +13 -1
  177. package/src/react-extension/components/Resource/CreateResource/CreateResource.js +103 -30
  178. package/src/react-extension/components/Resource/CreateResource/CreateResource.test.js +44 -10
  179. package/src/react-extension/components/Resource/CreateResource/CreateResource.test.page.js +35 -7
  180. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.js +3 -3
  181. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesListContextualMenu.js +6 -5
  182. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMenu.js +5 -4
  183. package/src/react-extension/components/Resource/EditResource/EditResource.js +95 -23
  184. package/src/react-extension/components/Resource/EditResource/EditResource.test.js +45 -13
  185. package/src/react-extension/components/Resource/EditResource/EditResource.test.page.js +35 -2
  186. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetails.js +2 -1
  187. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsInformation.js +3 -2
  188. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.js +23 -2
  189. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.js +8 -0
  190. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.page.js +26 -2
  191. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.js +22 -1
  192. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.js +8 -0
  193. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.page.js +25 -2
  194. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetails.js +2 -1
  195. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/GenerateResourcePassword.js +2 -1
  196. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.js +14 -1
  197. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.js +8 -0
  198. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.page.js +12 -0
  199. package/src/react-extension/components/User/CreateUser/CreateUser.js +42 -3
  200. package/src/react-extension/components/User/CreateUser/CreateUser.test.js +16 -0
  201. package/src/react-extension/components/User/CreateUser/CreateUser.test.page.js +26 -0
  202. package/src/react-extension/components/User/DisplayUserWorkspaceActions/DisplayUserWorkspaceActions.js +2 -1
  203. package/src/react-extension/components/User/DisplayUsersContextualMenu/DisplayUsersContextualMenu.js +5 -5
  204. package/src/react-extension/components/User/EditUser/EditUser.js +29 -2
  205. package/src/react-extension/components/User/EditUser/EditUser.test.js +12 -0
  206. package/src/react-extension/components/User/EditUser/EditUser.test.page.js +26 -0
  207. package/src/react-extension/components/UserDetails/DisplayUserDetails/DisplayUserDetails.js +2 -1
  208. package/src/react-extension/components/UserDetails/DisplayUserDetails/DisplayUserDetails.test.data.js +1332 -1331
  209. package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.js +2 -1
  210. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.js +19 -1
  211. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.js +9 -0
  212. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.page.js +12 -0
  213. package/src/react-extension/components/UserGroup/DisplayUserGroupDetails/DisplayUserGroupDetails.js +2 -1
  214. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.js +16 -1
  215. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.js +8 -0
  216. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.page.js +26 -1
  217. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.js +1 -1
  218. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.js +6 -4
  219. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.data.js +4 -1
  220. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.js +21 -11
  221. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.page.js +10 -1
  222. package/src/react-extension/contexts/AdminSmtpSettingsContext.js +2 -0
  223. package/src/react-extension/contexts/AdminSmtpSettingsContext.test.data.js +13 -0
  224. package/src/react-extension/contexts/AdminSmtpSettingsContext.test.js +3 -1
  225. package/src/react-extension/contexts/AdminSsoContext.js +558 -0
  226. package/src/react-extension/contexts/AdminSsoContext.test.data.js +51 -0
  227. package/src/react-extension/contexts/Administration/AdministrationInternationalizationContext/AdministrationInternationalizationContext.js +194 -0
  228. package/src/react-extension/contexts/Administration/AdministrationInternationalizationContext/AdministrationInternationalizationContext.test.js +111 -0
  229. package/src/react-extension/contexts/Administration/AdministrationMfa/AdministrationMfaContext.js +265 -0
  230. package/src/react-extension/contexts/Administration/AdministrationMfa/AdministrationMfaContext.test.js +178 -0
  231. package/src/react-extension/contexts/Administration/AdministrationSelfRegistration/AdministrationSelfRegistrationContext.js +453 -0
  232. package/src/react-extension/contexts/Administration/AdministrationSelfRegistration/AdministrationSelfRegistrationContext.test.js +218 -0
  233. package/src/react-extension/contexts/Administration/AdministrationSubscription/AdministrationSubscription.js +168 -0
  234. package/src/react-extension/contexts/Administration/AdministrationSubscription/AdministrationSubscription.test.js +73 -0
  235. package/src/react-extension/contexts/Administration/AdministrationUserDirectory/AdministrationUserDirectoryContext.js +353 -0
  236. package/src/react-extension/contexts/Administration/AdministrationUserDirectory/AdministrationUserDirectoryContext.test.js +220 -0
  237. package/src/react-extension/contexts/AdministrationWorkspaceContext.js +17 -178
  238. package/src/react-extension/contexts/AdministrationWorkspaceContext.test.js +0 -26
  239. package/src/react-extension/contexts/ApiAppContext.test.data.js +4 -2
  240. package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.js +54 -4
  241. package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.test.data.js +10 -1
  242. package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.test.js +92 -14
  243. package/src/react-extension/contexts/Authentication/AuthenticationSetupContext.js +1 -0
  244. package/src/react-extension/contexts/NavigationContext.js +34 -0
  245. package/src/react-extension/contexts/SsoContext.js +151 -0
  246. package/src/react-extension/contexts/SsoContext.test.data.js +36 -0
  247. package/src/react-extension/contexts/SsoContext.test.js +104 -0
  248. package/src/react-extension/lib/Domain/DomainUtil.js +70 -0
  249. package/src/react-extension/lib/Domain/DomainUtil.test.js +129 -0
  250. package/src/react-extension/lib/Domain/Domains.js +6113 -0
  251. package/src/react-extension/lib/Error/InputValidator.js +24 -0
  252. package/src/react-extension/lib/Map/DynamicRef.js +49 -0
  253. package/src/react-extension/lib/Map/DynamicRef.test.js +56 -0
  254. package/src/react-extension/lib/Map/MapObject.js +48 -0
  255. package/src/react-extension/lib/Map/MapObject.test.js +43 -0
  256. package/src/react-quickaccess/ExtQuickAccess.js +7 -4
  257. package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.js +3 -1
  258. package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.test.data.js +4 -0
  259. package/src/react-quickaccess/components/LoginPage/LoginPage.js +115 -4
  260. package/src/react-quickaccess/components/LoginPage/LoginPage.test.data.js +10 -0
  261. package/src/react-quickaccess/components/LoginPage/LoginPage.test.stories.js +30 -3
  262. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.js +33 -1
  263. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.data.js +25 -0
  264. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.js +60 -0
  265. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.page.js +60 -0
  266. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.js +33 -1
  267. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.test.js +36 -7
  268. package/src/react-quickaccess/components/ResourceViewPage/ResourceViewPage.js +3 -2
  269. package/src/react-quickaccess/contexts/SsoContext.js +150 -0
  270. package/src/react-web-integration/lib/InForm/InFormFieldSelector.js +5 -0
  271. package/src/shared/constants/inputs.const.js +30 -0
  272. package/src/shared/lib/Browser/clipBoard.js +45 -0
  273. package/src/shared/lib/Browser/clipBoard.test.js +59 -0
  274. package/src/shared/models/Mfa/Duo.js +36 -0
  275. package/src/shared/models/Mfa/Duo.test.js +59 -0
  276. package/src/shared/models/Mfa/MfaDTO.js +51 -0
  277. package/src/shared/models/Mfa/MfaDTO.test.js +48 -0
  278. package/src/shared/models/Mfa/MfaEnumeration.js +17 -0
  279. package/src/shared/models/Mfa/MfaModel.js +48 -0
  280. package/src/shared/models/Mfa/MfaModel.test.js +37 -0
  281. package/src/shared/models/Mfa/Yubikey.js +35 -0
  282. package/src/shared/models/Mfa/Yubikey.test.js +47 -0
  283. package/src/shared/models/selfRegistration/SelfRegistrationDomainsViewModel.js +55 -0
  284. package/src/shared/models/selfRegistration/SelfRegistrationDomainsViewModel.test.js +37 -0
  285. package/src/shared/models/selfRegistration/SelfRegistrationDto.js +42 -0
  286. package/src/shared/models/selfRegistration/SelfRegistrationDto.test.js +48 -0
  287. package/src/shared/models/selfRegistration/SelfRegistrationEnumeration.js +17 -0
  288. package/src/shared/models/subscription/SubscriptionDto.js +34 -0
  289. package/src/shared/models/subscription/SubscriptionDto.test.js +31 -0
  290. package/src/shared/models/subscription/SubscriptionModel.js +33 -0
  291. package/src/shared/models/subscription/SubscriptionModel.test.js +48 -0
  292. package/src/shared/models/user/UserModel.js +37 -0
  293. package/src/shared/models/userDirectory/UserDirectoryDTO.js +57 -0
  294. package/src/shared/models/userDirectory/UserDirectoryDTO.test.js +40 -0
  295. package/src/shared/models/userDirectory/UserDirectoryEnum.js +22 -0
  296. package/src/shared/models/userDirectory/UserDirectoryModel.js +64 -0
  297. package/src/shared/models/userDirectory/UserDirectoryModel.test.js +37 -0
  298. package/src/shared/services/actions/subscription/SubscriptionActionService.js +69 -0
  299. package/src/shared/services/actions/subscription/SubscriptionActionService.test.js +73 -0
  300. package/src/shared/services/api/Internationalisation/InternationalisationService.js +46 -0
  301. package/src/shared/services/api/Mfa/MfaService.js +54 -0
  302. package/src/shared/services/{accountRecovery → api/accountRecovery}/ApiAppAccountRecoveryUserService.js +2 -2
  303. package/src/shared/services/{accountRecovery → api/accountRecovery}/ExtAppAccountRecoveryUserService.js +0 -0
  304. package/src/shared/services/api/secrets/pownedService.js +64 -0
  305. package/src/shared/services/api/secrets/pownedService.test.js +63 -0
  306. package/src/shared/services/api/selfRegistration/selfRegistrationService.js +64 -0
  307. package/src/shared/services/api/user/UserService.js +45 -0
  308. package/src/shared/services/api/userDirectory/UserDirectoryService.js +108 -0
  309. package/src/shared/services/forms/Mfa/MfaFormService.js +195 -0
  310. package/src/shared/services/forms/Mfa/MfaFormService.test.js +341 -0
  311. package/src/shared/services/forms/selfRegistration/SelfRegistrationFormService.js +92 -0
  312. package/src/shared/services/forms/selfRegistration/SelfRegistrationFormService.test.js +101 -0
  313. package/src/shared/services/forms/userDirectory/UserDirectoryFormService.js +118 -0
  314. package/src/shared/services/forms/userDirectory/UserDirectoryFormService.test.js +128 -0
  315. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.js +0 -205
  316. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.test.data.js +0 -37
  317. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.test.js +0 -197
  318. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.test.page.js +0 -133
@@ -1,55 +1,141 @@
1
-
2
1
  /**
3
- * Returns the default app context for the unit test
4
- * @param appContext An existing app context
5
- * @returns {any}
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 3.8.0
6
13
  */
7
- export function defaultAppContext(appContext) {
8
- const defaultAppContext = {
9
- };
10
- return Object.assign(defaultAppContext, appContext || {});
11
- }
14
+
15
+ import {defaultAppContext} from "../../../contexts/ApiAppContext.test.data";
12
16
 
13
17
  /**
14
- * Default props
15
- * @returns {{resource: {id: string, name: string}}}
18
+ * Default props.
19
+ * @param {Object} props The props to override
20
+ * @returns {object}
16
21
  */
17
- export function defaultProps() {
18
- return {
22
+ export function defaultProps(data = {}) {
23
+ const defaultProps = {
24
+ context: defaultAppContext(data?.context),
19
25
  administrationWorkspaceContext: {
20
- must: {
21
- save: false
22
- },
23
- onResetActionsSettings: jest.fn(),
24
- can: {
25
- save: false
26
- },
27
- onSaveEnabled: jest.fn(),
28
- onGetMfaRequested: () => mockMfaSettings,
29
- onSaveMfaRequested: jest.fn()
30
- }
26
+ setDisplayAdministrationWorkspaceAction: jest.fn(),
27
+ resetDisplayAdministrationWorkspaceAction: jest.fn()
28
+ },
29
+ actionFeedbackContext: {
30
+ displaySuccess: () => jest.fn(),
31
+ displayError: jest.fn()
32
+ },
31
33
  };
34
+ return Object.assign(defaultProps, data);
32
35
  }
33
36
 
37
+ /**
38
+ * Mock settings result from server
39
+ * @returns {object}
40
+ */
34
41
  export const mockMfaSettings = {
35
- "header": {
36
- "id": "eae592b6-19d5-4b07-9103-49d04b135093",
37
- "status": "success",
38
- "servertime": 1604490709,
39
- "title": "app_orgsettings_get_success",
40
- "action": "6d616537-c449-589d-bebe-b2d5883e9d35",
41
- "message": "The operation was successful.",
42
- "url": "\/mfa\/settings.json?api-version=v2",
43
- "code": 200
42
+ "providers": [
43
+ "totp",
44
+ "yubikey",
45
+ "duo"
46
+ ],
47
+ "yubikey": {
48
+ "clientId": "80412",
49
+ "secretKey": "pas6lyijz2AIhX3D9eLIYAxv63lt@"
44
50
  },
45
- "body": {
46
- "providers": [
47
- "totp",
48
- "yubikey"
49
- ],
50
- "yubikey": {
51
- "clientId": "43664",
52
- "secretKey": "a6zf3pavrJEjvmXm6dfkm8jfkNY="
53
- }
51
+ "duo": {
52
+ "hostName": "api-123456af.duosecurity.com",
53
+ "integrationKey": "PAGI605APMFKP8YSME6T",
54
+ "salt": "salt1".repeat(8),
55
+ "secretKey": "PACNkhAAlVLH0m8d3efssULkizlEtunMhIsOTCLT"
54
56
  }
55
57
  };
58
+
59
+ export const mockDefaultMfaModel = {
60
+ "duoHostname": "",
61
+ "duoIntegrationKey": "",
62
+ "duoSalt": "",
63
+ "duoSecretKey": "",
64
+ "duoToggle": false,
65
+ "totpProviderToggle": false,
66
+ "yubikeyClientIdentifier": "",
67
+ "yubikeySecretKey": "",
68
+ "yubikeyToggle": false,
69
+ };
70
+
71
+
72
+ /**
73
+ * Mock settings model for UI
74
+ * @returns {object}
75
+ */
76
+ export const mockModel = {
77
+ totpProviderToggle: true,
78
+ yubikeyToggle: true,
79
+ duoToggle: true,
80
+ yubikeyClientIdentifier: "80412",
81
+ yubikeySecretKey: "pas6lyijz2AIhX3D9eLIYAxv63lt@",
82
+ duoHostname: "api-123456af.duosecurity.com",
83
+ duoIntegrationKey: "PAGI605APMFKP8YSME6T",
84
+ duoSalt: "salt1".repeat(8),
85
+ duoSecretKey: "PACNkhAAlVLH0m8d3efssULkizlEtunMhIsOTCLT"
86
+ };
87
+
88
+ /**
89
+ * Default mfa settings.
90
+ * @param {Object} data The settings to override
91
+ * @returns {object}
92
+ */
93
+ export function defaultMfaSettings(data = {}) {
94
+ return {
95
+ ...mockMfaSettings,
96
+ ...data
97
+ };
98
+ }
99
+
100
+ /**
101
+ * mock for yubikey errors.
102
+ * @param {Object} data The settings to override
103
+ * @returns {object}
104
+ */
105
+ export function mockYubikeyError(data = {}) {
106
+ return {
107
+ ...{
108
+ "yubikeyClientIdentifierError": "A client identifier is required.",
109
+ "yubikeySecretKeyError": "A secret key is required.",
110
+ },
111
+ ...data
112
+ };
113
+ }
114
+
115
+ /**
116
+ * mock for duo errors.
117
+ * @param {Object} data The settings to override
118
+ * @returns {object}
119
+ */
120
+ export function mockDuoError(data = {}) {
121
+ return {
122
+ ...{
123
+ "duoHostnameError": "A hostname is required.",
124
+ "duoIntegrationKeyError": "An integration key is required.",
125
+ "duoSaltError": "A salt is required.",
126
+ "duoSecretKeyError": "A secret key is required.",
127
+ },
128
+ ...data
129
+ };
130
+ }
131
+ /**
132
+ * mfa settings for UI.
133
+ * @param {Object} data The settings to override
134
+ * @returns {object}
135
+ */
136
+ export function defaultSettingsModel(data = {}) {
137
+ return {
138
+ ...mockModel,
139
+ ...data
140
+ };
141
+ }
@@ -15,12 +15,16 @@
15
15
  /**
16
16
  * Unit tests on DisplayMfaAdministration in regard of specifications
17
17
  */
18
- import {defaultAppContext, defaultProps, mockMfaSettings} from "./DisplayMfaAdministration.test.data";
18
+ import {defaultProps, mockMfaSettings} from "./DisplayMfaAdministration.test.data";
19
+ import {defaultAppContext} from "../../../contexts/ApiAppContext.test.data";
19
20
  import DisplayMfaAdministrationPage from "./DisplayMfaAdministration.test.page";
20
21
  import {waitFor} from "@testing-library/react";
21
22
  import {ActionFeedbackContext} from "../../../contexts/ActionFeedbackContext";
23
+ import {mockApiResponse} from '../../../../../test/mocks/mockApiResponse';
24
+ import {enableFetchMocks} from 'jest-fetch-mock';
22
25
 
23
26
  beforeEach(() => {
27
+ enableFetchMocks();
24
28
  jest.resetModules();
25
29
  });
26
30
 
@@ -34,116 +38,87 @@ describe("See the MFA settings", () => {
34
38
  * I should see the MFA provider activation state on the administration settings page
35
39
  */
36
40
  beforeEach(() => {
41
+ fetch.doMockOnceIf(/mfa\/settings*/, () => mockApiResponse(mockMfaSettings));
37
42
  page = new DisplayMfaAdministrationPage(context, props);
38
43
  });
39
44
 
40
45
  it('As AD I should see if all fields is available for my Passbolt instance on the administration settings page', async() => {
41
- await waitFor(() => {
42
- });
46
+ await waitFor(() => {});
47
+
48
+ expect.assertions(10);
49
+
43
50
  expect(page.exists()).toBeTruthy();
44
51
  // check fields in the form
45
52
  expect(page.totp.checked).toBeTruthy();
46
53
  expect(page.yubikey.checked).toBeTruthy();
47
- expect(page.duo.checked).toBe(false);
54
+ expect(page.duo.checked).toBeTruthy();
48
55
  await page.checkDuo();
49
56
 
50
- expect(page.yubikeyClientIdentifier.value).toBe(mockMfaSettings.body.yubikey.clientId);
51
- expect(page.yubikeySecretKey.value).toBe(mockMfaSettings.body.yubikey.secretKey);
52
- expect(page.duoHostname.value).toBe("");
53
- expect(page.duoIntegrationKey.value).toBe("");
54
- expect(page.duoSalt.value).toBe("");
55
- expect(page.duoSecretKey.value).toBe("");
57
+ expect(page.yubikeyClientIdentifier.value).toBe(mockMfaSettings.yubikey.clientId);
58
+ expect(page.yubikeySecretKey.value).toBe(mockMfaSettings.yubikey.secretKey);
59
+ expect(page.duoHostname).toBe(null);
60
+ expect(page.duoIntegrationKey).toBe(null);
61
+ expect(page.duoSalt).toBe(null);
62
+ expect(page.duoSecretKey).toBe(null);
56
63
  });
57
64
 
58
65
  it('As AD I should save mfa on the administration settings page', async() => {
59
- await waitFor(() => {});
60
- await page.checkYubikey();
61
- expect(props.administrationWorkspaceContext.onSaveEnabled).toHaveBeenCalled();
62
- const propsUpdated = {
63
- administrationWorkspaceContext: {
64
- must: {
65
- save: true
66
- },
67
- onResetActionsSettings: jest.fn(),
68
- can: {
69
- save: true
70
- },
71
- onSaveEnabled: jest.fn(),
72
- onGetMfaRequested: () => mockMfaSettings,
73
- onSaveMfaRequested: jest.fn()
74
- }
75
- };
66
+ //button should be disable by default
67
+ expect(page.isSaveButtonEnabled()).toBeFalsy();
68
+ //Call to save the settings
69
+ fetch.doMockOnceIf(/mfa\/settings*/, () => mockApiResponse({}));
70
+ //Call to API to retrieve the settings
71
+ fetch.doMockOnceIf(/mfa\/settings*/, () => mockApiResponse(mockMfaSettings));
76
72
  jest.spyOn(ActionFeedbackContext._currentValue, 'displaySuccess').mockImplementation(() => {});
77
73
 
78
- const result = {
79
- "duo": null,
80
- "providers": ["totp"],
81
- "yubikey": null,
82
- };
83
- page.rerender(context, propsUpdated);
74
+
75
+ await page.checkYubikey();
76
+ await page.saveSettings();
77
+
84
78
  await waitFor(() => {});
85
- expect(propsUpdated.administrationWorkspaceContext.onSaveMfaRequested).toHaveBeenCalledWith(result);
79
+
80
+ expect.assertions(3);
86
81
  expect(ActionFeedbackContext._currentValue.displaySuccess).toHaveBeenCalledWith("The multi factor authentication settings for the organization were updated.");
87
- expect(propsUpdated.administrationWorkspaceContext.onResetActionsSettings).toHaveBeenCalled();
82
+ // We expect the button to be disable
83
+ expect(page.isSaveButtonEnabled()).toBeFalsy();
88
84
  });
89
85
 
90
- it('As AD I should see a processing feedback while submitting the form', async() => {
91
- await waitFor(() => {});
86
+ it('As AD I should see an error toaster if the submit operation fails for an unexpected reason', async() => {
87
+ //button should be disable by default
88
+ expect(page.isSaveButtonEnabled()).toBeFalsy();
92
89
  await page.checkYubikey();
93
90
 
94
- const propsUpdated = {
95
- administrationWorkspaceContext: {
96
- must: {
97
- save: true
98
- },
99
- onResetActionsSettings: jest.fn(),
100
- can: {
101
- save: true
102
- },
103
- onSaveEnabled: jest.fn(),
104
- onGetMfaRequested: () => mockMfaSettings,
105
- onSaveMfaRequested: jest.fn()
106
- }
107
- };
108
- // Mock the request function to make it the expected result
109
- let updateResolve;
110
- const requestMockImpl = jest.fn(() => new Promise(resolve => {
111
- updateResolve = resolve;
112
- }));
113
- jest.spyOn(propsUpdated.administrationWorkspaceContext, 'onSaveMfaRequested').mockImplementation(requestMockImpl);
114
-
115
- page.rerender(context, propsUpdated);
116
- // API calls are made on submit, wait they are resolved.
117
- await waitFor(() => {
118
- expect(page.totp.getAttribute("disabled")).not.toBeNull();
119
- expect(page.yubikey.getAttribute("disabled")).not.toBeNull();
120
- expect(page.duo.getAttribute("disabled")).not.toBeNull();
121
- updateResolve();
122
- });
123
- });
91
+ // Mock the request function to make it return an error.
92
+ const error = {message: "The service is unavailable"};
93
+
94
+ fetch.doMockOnceIf(/mfa\/settings*/, () => Promise.reject(error));
95
+
96
+ jest.spyOn(ActionFeedbackContext._currentValue, 'displayError').mockImplementation(() => {});
97
+ await page.saveSettings();
124
98
 
125
- it('As AD I shouldn’t be able to submit the form if there is an invalid field', async() => {
126
99
  await waitFor(() => {});
127
- await page.checkDuo();
128
- page.fillYubikeyClientIdentifier("");
100
+
101
+ expect.assertions(2);
102
+ // Throw general error message
103
+ expect(ActionFeedbackContext._currentValue.displayError).toHaveBeenCalledWith("The service is unavailable");
104
+ });
105
+
106
+ it('As AD I should see an error message if inputs are empty', async() => {
107
+ //button should be disable by default
108
+ expect(page.isSaveButtonEnabled()).toBeFalsy();
129
109
  page.fillYubikeySecret("");
110
+ page.fillYubikeyClientIdentifier("");
111
+ page.fillSecretKey("");
112
+ page.fillIntegrationKey("");
113
+ page.fillDuoHostname("");
114
+ page.fillDuoSalt("");
115
+
116
+ await page.saveSettings();
130
117
 
131
- const propsUpdated = {
132
- administrationWorkspaceContext: {
133
- must: {
134
- save: true
135
- },
136
- onResetActionsSettings: jest.fn(),
137
- can: {
138
- save: true
139
- },
140
- onSaveEnabled: jest.fn()
141
- }
142
- };
143
-
144
- page.rerender(context, propsUpdated);
145
118
  await waitFor(() => {});
146
- // Throw error message
119
+
120
+ expect.assertions(7);
121
+ // Throw general error message
147
122
  expect(page.yubikeyClientIdentifierErrorMessage).toBe("A client identifier is required.");
148
123
  expect(page.yubikeySecretKeyErrorMessage).toBe("A secret key is required.");
149
124
  expect(page.duoHostnameErrorMessage).toBe("A hostname is required.");
@@ -152,56 +127,35 @@ describe("See the MFA settings", () => {
152
127
  expect(page.duoSecretKeyErrorMessage).toBe("A secret key is required.");
153
128
  });
154
129
 
155
- it('As AD I should see an error toaster if the submit operation fails for an unexpected reason', async() => {
156
- await waitFor(() => {});
157
- await page.checkYubikey();
158
-
159
- const propsUpdated = {
160
- administrationWorkspaceContext: {
161
- must: {
162
- save: true
163
- },
164
- onResetActionsSettings: jest.fn(),
165
- can: {
166
- save: true
167
- },
168
- onSaveEnabled: jest.fn(),
169
- onGetMfaRequested: () => mockMfaSettings,
170
- onSaveMfaRequested: jest.fn()
171
- }
172
- };
173
130
 
174
- // Mock the request function to make it return an error.
175
- const error = {message: "The service is unavailable"};
176
- jest.spyOn(propsUpdated.administrationWorkspaceContext, 'onSaveMfaRequested').mockImplementation(() => Promise.reject(error));
177
- jest.spyOn(ActionFeedbackContext._currentValue, 'displayError').mockImplementation(() => {});
178
-
179
- page.rerender(context, propsUpdated);
180
- await waitFor(() => {});
181
- // Throw general error message
182
- expect(ActionFeedbackContext._currentValue.displayError).toHaveBeenCalledWith("The service is unavailable");
131
+ it('As AD I should not be able to click on save if there is no change', async() => {
132
+ expect.assertions(2);
133
+ //button should be disable by default
134
+ expect(page.isSaveButtonEnabled()).toBeFalsy();
135
+ await page.checkYubikey();
136
+ //We set the value by default
137
+ await page.checkYubikey();
138
+ //button should be disable by default
139
+ expect(page.isSaveButtonEnabled()).toBeFalsy();
183
140
  });
184
141
 
185
142
  it('As AD I want to see the passwords I entered in the MFA administration settings forms', async() => {
186
- await page.checkDuo();
187
-
188
143
  await page.toggleObfuscate(page.duoSecretKeyButton);
189
144
  await page.toggleObfuscate(page.duoSaltKeyButton);
190
145
  await page.toggleObfuscate(page.yubikeySecretKeyButton);
191
146
 
147
+ expect.assertions(3);
148
+
192
149
  expect(page.isObfuscated(page.yubikeySecretKeyButton)).toBeFalsy();
193
150
  expect(page.isObfuscated(page.duoSecretKeyButton)).toBeFalsy();
194
151
  expect(page.isObfuscated(page.duoSaltKeyButton)).toBeFalsy();
195
152
  });
196
- });
197
-
198
- describe('As AD I see all fields disabled if mfa setting are not yet fetched', () => {
199
- /**
200
- * Given the mfa settings
201
- * And the mfa settings are not loaded yet
202
- */
203
153
 
204
154
  it('I should see all fields disabled”', () => {
155
+ fetch.doMockOnceIf(/mfa\/settings*/, () => mockApiResponse(mockMfaSettings));
156
+
157
+ expect.assertions(3);
158
+
205
159
  page = new DisplayMfaAdministrationPage(context, props);
206
160
  expect(page.totp.getAttribute("disabled")).not.toBeNull();
207
161
  expect(page.yubikey.getAttribute("disabled")).not.toBeNull();
@@ -16,6 +16,8 @@ import AppContext from "../../../contexts/AppContext";
16
16
  import React from "react";
17
17
  import DisplayMfaAdministration from "./DisplayMfaAdministration";
18
18
  import MockTranslationProvider from "../../../test/mock/components/Internationalisation/MockTranslationProvider";
19
+ import {AdminMfaContextProvider} from "../../../contexts/Administration/AdministrationMfa/AdministrationMfaContext";
20
+ import DisplayAdministrationMfaActions from "../DisplayAdministrationWorkspaceActions/DisplayAdministrationMfaActions/DisplayAdministrationMfaActions";
19
21
 
20
22
  /**
21
23
  * The DisplayMfaAdministration component represented as a page
@@ -30,17 +32,10 @@ export default class DisplayMfaAdministrationPage {
30
32
  this._page = render(
31
33
  <MockTranslationProvider>
32
34
  <AppContext.Provider value={appContext}>
33
- <DisplayMfaAdministration {...props}/>
34
- </AppContext.Provider>
35
- </MockTranslationProvider>
36
- );
37
- }
38
-
39
- rerender(appContext, props) {
40
- this._page.rerender(
41
- <MockTranslationProvider>
42
- <AppContext.Provider value={appContext}>
43
- <DisplayMfaAdministration {...props}/>
35
+ <AdminMfaContextProvider {...props}>
36
+ <DisplayAdministrationMfaActions />
37
+ <DisplayMfaAdministration {...props}/>
38
+ </AdminMfaContextProvider>
44
39
  </AppContext.Provider>
45
40
  </MockTranslationProvider>
46
41
  );
@@ -180,6 +175,14 @@ export default class DisplayMfaAdministrationPage {
180
175
  return this._page.container.querySelector('.duo_secret_key.error-message').textContent;
181
176
  }
182
177
 
178
+ /**
179
+ * Returns the HTMLElement button of the toolbar that is the "Save Settings"
180
+ * @returns {HTMLElement}
181
+ */
182
+ get toolbarActionsSaveButton() {
183
+ return this._page.container.querySelectorAll(".actions-wrapper .actions a")[0];
184
+ }
185
+
183
186
  /**
184
187
  * Returns true if the page object exists in the container
185
188
  */
@@ -211,16 +214,26 @@ export default class DisplayMfaAdministrationPage {
211
214
  this.fillInput(this.yubikeySecretKey, data);
212
215
  }
213
216
 
214
- /** fill the duo secret element with data */
215
- fillDuoSecret(data) {
216
- this.fillInput(this.duoSecretKey, data);
217
- }
218
-
219
217
  /** fill the duo salt element with data */
220
218
  fillDuoSalt(data) {
221
219
  this.fillInput(this.duoSalt, data);
222
220
  }
223
221
 
222
+ /** fill the duo hostname element with data */
223
+ fillDuoHostname(data) {
224
+ this.fillInput(this.duoHostname, data);
225
+ }
226
+
227
+ /** fill the duo integration key with data */
228
+ fillIntegrationKey(data) {
229
+ this.fillInput(this.duoIntegrationKey, data);
230
+ }
231
+
232
+ /** fill the duo secret key with data */
233
+ fillSecretKey(data) {
234
+ this.fillInput(this.duoSecretKey, data);
235
+ }
236
+
224
237
  /** Click on the duo element */
225
238
  async checkDuo() {
226
239
  await this.click(this.duo);
@@ -243,4 +256,21 @@ export default class DisplayMfaAdministrationPage {
243
256
  isObfuscated(component) {
244
257
  return component.getAttribute('type') === "password";
245
258
  }
259
+
260
+ /**
261
+ * Returns true if the save button in the toolbar is enabled.
262
+ * @returns {boolean}
263
+ */
264
+ isSaveButtonEnabled() {
265
+ return !this.toolbarActionsSaveButton.className.toString().includes("disabled");
266
+ }
267
+
268
+ /**
269
+ * Simulates a click on the "Save settings" button.
270
+ * To work properly, the form needs to be valid otherwise the sate doesn't change and this blocks the test.
271
+ * @returns {Promise<void>}
272
+ */
273
+ async saveSettings() {
274
+ await this.click(this.toolbarActionsSaveButton);
275
+ }
246
276
  }
@@ -1,30 +1,34 @@
1
1
  import React from "react";
2
2
  import PropTypes from "prop-types";
3
3
  import DisplayMfaAdministration from "./DisplayMfaAdministration";
4
-
4
+ import {AdminMfaContextProvider} from "../../../contexts/Administration/AdministrationMfa/AdministrationMfaContext";
5
+ import {defaultProps, mockMfaSettings} from "./DisplayMfaAdministration.test.data";
6
+ import {mockApiResponse} from '../../../../../test/mocks/mockApiResponse';
7
+ import MockFetch from '../../../test/mock/MockFetch';
5
8
 
6
9
  export default {
7
10
  title: 'Components/Administration/DisplayMfaAdministration',
8
11
  component: DisplayMfaAdministration
9
12
  };
10
13
 
14
+
15
+ const mockFetch = new MockFetch();
16
+ mockFetch.addGetFetchRequest(/mfa\/settings/, async() => mockApiResponse(mockMfaSettings));
17
+
18
+
11
19
  const Template = args =>
12
- <div className="page administration"><div className="grid grid-responsive-12">
13
- <DisplayMfaAdministration {...args}/>
14
- </div>
15
- </div>;
20
+ <AdminMfaContextProvider{...args}>
21
+ <div className="panel middle">
22
+ <div className="grid grid-responsive-12">
23
+ <DisplayMfaAdministration {...args}/>
24
+ </div>
25
+ </div>
26
+ </AdminMfaContextProvider>;
16
27
 
17
28
  Template.propTypes = {
18
29
  context: PropTypes.object,
19
30
  };
20
31
 
21
32
  export const Initial = Template.bind({});
22
- Initial.args = {
23
- administrationWorkspaceContext: {
24
- onGetMfaRequested: () => ({
25
- body: {
26
- providers: []
27
- }
28
- })
29
- }
30
- };
33
+ Initial.args = defaultProps();
34
+