passbolt-styleguide 3.3.2 → 3.4.0-alpha1

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 (203) hide show
  1. package/build/css/help.min.css +2 -2
  2. package/build/css/public.min.css +2 -2
  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 +4 -4
  6. package/build/css/themes/default/api_reports.min.css +4 -4
  7. package/build/css/themes/default/api_webinstaller.min.css +3 -3
  8. package/build/css/themes/default/ext_app.min.css +4 -4
  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 +9 -0
  15. package/build/css/themes/midgar/api_main.min.css +4 -4
  16. package/build/css/themes/midgar/api_reports.min.css +4 -4
  17. package/build/css/themes/midgar/ext_app.min.css +4 -4
  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/js/dist/api-app.js +1 -1
  23. package/build/js/dist/api-recover.js +1 -1
  24. package/build/js/dist/api-setup.js +1 -1
  25. package/build/js/dist/api-triage.js +1 -1
  26. package/build/js/dist/api-vendors.js +1 -1
  27. package/build/js/dist/api-vendors.js.LICENSE.txt +40 -4
  28. package/package.json +7 -6
  29. package/src/img/third_party/ChromeWebStore_black.svg +1 -0
  30. package/src/img/third_party/ChromeWebStore_white.svg +1 -0
  31. package/src/img/third_party/edge-addon-black.svg +1 -0
  32. package/src/img/third_party/edge-addon-white.svg +1 -0
  33. package/src/locales/de-DE/common.json +11 -11
  34. package/src/locales/en-UK/common.json +11 -12
  35. package/src/locales/fr/common.json +750 -0
  36. package/src/locales/fr-FR/common.json +11 -11
  37. package/src/locales/sv-SE/common.json +11 -11
  38. package/src/react-extension/ExtApp.js +9 -6
  39. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.js +1 -1
  40. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.stories.js +0 -1
  41. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.js +1 -1
  42. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.js +1 -1
  43. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.stories.js +5 -8
  44. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.js +1 -1
  45. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.data.js +4 -1
  46. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.js +4 -4
  47. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.js +1 -1
  48. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.js +1 -1
  49. package/src/react-extension/components/Administration/DisplayTestUserDirectoryAdministration/DisplayTestUserDirectoryAdministration.test.js +2 -3
  50. package/src/react-extension/components/Administration/DisplayTestUserDirectoryAdministration/DisplayTestUserDirectoryAdministration.test.stories.js +5 -9
  51. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.js +2 -2
  52. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.stories.js +0 -3
  53. package/src/react-extension/components/Authentication/AskForAuthenticationHelp/AskForAuthenticationHelp.js +1 -1
  54. package/src/react-extension/components/Authentication/AskForAuthenticationHelp/AskForAuthenticationHelp.test.stories.js +12 -15
  55. package/src/react-extension/components/Authentication/CheckMailBox/CheckMailBox.js +2 -2
  56. package/src/react-extension/components/Authentication/CheckMailBox/CheckMailBox.test.js +1 -1
  57. package/src/react-extension/components/Authentication/CheckMailBox/CheckMailbox.test.stories.js +12 -14
  58. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.stories.js +12 -15
  59. package/src/react-extension/components/Authentication/ChooseSecurityToken/ChooseSecurityToken.test.stories.js +12 -15
  60. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.stories.js +12 -15
  61. package/src/react-extension/components/Authentication/DisplayBrowserNotSupported/DisplayBrowserNotSupported.test.stories.js +12 -15
  62. package/src/react-extension/components/Authentication/DisplayExpiredTokenError/DisplayExpiredTokenError.test.stories.js +12 -15
  63. package/src/react-extension/components/Authentication/DisplayRequireInvitationError/DisplayRequireInvitationError.test.stories.js +12 -15
  64. package/src/react-extension/components/Authentication/DisplayUnexpectedError/DisplayUnexpectedError.test.stories.js +12 -15
  65. package/src/react-extension/components/Authentication/DownloadRecoveryKit/DownloadRecoveryKit.js +1 -1
  66. package/src/react-extension/components/Authentication/DownloadRecoveryKit/DownloadRecoveryKit.test.stories.js +12 -15
  67. package/src/react-extension/components/Authentication/EnterNameForm/EnterNameForm.test.stories.js +12 -15
  68. package/src/react-extension/components/Authentication/EnterUsernameForm/EnterUsernameForm.test.stories.js +12 -15
  69. package/src/react-extension/components/Authentication/HandleSessionExpired/HandleSessionExpired.test.data.js +14 -0
  70. package/src/react-extension/components/Authentication/HandleSessionExpired/HandleSessionExpired.test.js +65 -0
  71. package/src/react-extension/components/Authentication/HandleSessionExpired/HandleSessionExpired.test.page.js +38 -0
  72. package/src/react-extension/components/Authentication/ImportGpgKey/ImportGpgKey.test.stories.js +12 -15
  73. package/src/react-extension/components/Authentication/InstallExtension/InstallExtension.js +15 -6
  74. package/src/react-extension/components/Authentication/InstallExtension/InstallExtension.test.js +27 -0
  75. package/src/react-extension/components/Authentication/InstallExtension/InstallExtension.test.stories.js +12 -15
  76. package/src/react-extension/components/Authentication/IntroduceSetupExtension/IntroduceSetupExtension.test.stories.js +12 -15
  77. package/src/react-extension/components/Authentication/NotifyExpiredSession/NotifyExpiredSession.test.stories.js +8 -11
  78. package/src/react-extension/components/AuthenticationLogin/AcceptLoginServerKeyChange/AcceptLoginServerKeyChange.test.stories.js +12 -15
  79. package/src/react-extension/components/AuthenticationLogin/DisplayLoginError/DisplayLoginError.test.stories.js +12 -15
  80. package/src/react-extension/components/AuthenticationLogin/DisplayLoginInProgress/DisplayLoginProgress.test.stories.js +12 -15
  81. package/src/react-extension/components/AuthenticationLogin/Login/Login.test.stories.js +12 -15
  82. package/src/react-extension/components/AuthenticationPassphrase/InputPassphrase/InputPassphrase.test.stories.js +5 -11
  83. package/src/react-extension/components/AuthenticationRecover/RecoverAuthentication/RecoverAuthentication.js +1 -1
  84. package/src/react-extension/components/Common/Error/ShowErrorDetails/ShowErrorDetails.js +1 -1
  85. package/src/react-extension/components/Common/Icons/Icon.test.stories.js +3 -1
  86. package/src/react-extension/components/Common/Loading/LoadingSpinner/LoadingSpinner.js +2 -1
  87. package/src/react-extension/components/Common/Progress/DisplayProgress/DisplayProgress.js +1 -1
  88. package/src/react-extension/components/Common/Progress/DisplayProgress/DisplayProgress.test.js +1 -1
  89. package/src/react-extension/components/Common/Progress/DisplayProgress/DisplayProgress.test.stories.js +34 -0
  90. package/src/react-extension/components/Resource/CreateResource/CreateResource.test.stories.js +14 -4
  91. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayDragResource.js +68 -0
  92. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.js +9 -42
  93. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.test.page.js +4 -1
  94. package/src/react-extension/components/Resource/ExportResources/ExportResources.test.stories.js +5 -11
  95. package/src/react-extension/components/Resource/ExportResources/ExportResourcesCredentials.js +6 -10
  96. package/src/react-extension/components/Resource/ExportResources/ExportResourcesCredentials.test.stories.js +5 -11
  97. package/src/react-extension/components/Resource/FilterResourcesByBreadcrumb/FilterResourcesByBreadcrumb.test.stories.js +0 -1
  98. package/src/react-extension/components/Resource/FilterResourcesByFolders/DisplayDragFolderItem.js +109 -0
  99. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.js +40 -192
  100. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.test.data.js +10 -5
  101. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.test.js +9 -12
  102. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.test.page.js +5 -1
  103. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.test.stories.js +0 -1
  104. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItem.js +83 -58
  105. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItem.test.data.js +52 -59
  106. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItem.test.js +25 -20
  107. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItem.test.page.js +11 -5
  108. package/src/react-extension/components/Resource/FilterResourcesByShortcuts/FilterResourcesByShortcuts.test.stories.js +0 -1
  109. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.data.js +47 -0
  110. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.js +34 -3
  111. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.page.js +46 -9
  112. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.stories.js +0 -1
  113. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTagsList.js +124 -4
  114. package/src/react-extension/components/Resource/FilterResourcesByText/FilterResourcesByText.test.stories.js +0 -2
  115. package/src/react-extension/components/Resource/ImportResources/ImportResourcesKeyUnlock.js +6 -10
  116. package/src/react-extension/components/Resource/ImportResources/ImportResourcesKeyUnlock.test.stories.js +5 -11
  117. package/src/react-extension/components/Resource/ImportResources/ImportResourcesResult.js +3 -3
  118. package/src/react-extension/components/Resource/ImportResources/ImportResourcesResult.test.js +3 -3
  119. package/src/react-extension/components/Resource/ImportResources/ImportResourcesResult.test.stories.js +5 -11
  120. package/src/react-extension/components/ResourceComment/AddResourceComment/AddResourceComment.test.stories.js +8 -14
  121. package/src/react-extension/components/ResourceComment/ConfirmResourceCommentDeletion/ConfirmResourceCommentDeletion.test.stories.js +5 -11
  122. package/src/react-extension/components/ResourceComment/DisplayResourceCommentList/DisplayResourceCommentList.test.stories.js +8 -14
  123. package/src/react-extension/components/ResourceDescription/EditResourceDescription/EditResourceDescription.test.stories.js +8 -15
  124. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsActivity.test.stories.js +0 -1
  125. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsDescription.test.stories.js +0 -1
  126. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsTag.test.js +1 -1
  127. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsTag.test.stories.js +0 -1
  128. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.stories.js +0 -3
  129. package/src/react-extension/components/ResourceFolder/DefineResourceFolderMoveStrategy/DefineResourceFolderMoveStrategy.test.stories.js +0 -6
  130. package/src/react-extension/components/ResourceFolder/DeleteResourceFolder/DeleteResourceFolder.test.stories.js +0 -5
  131. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.stories.js +0 -7
  132. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsActivity.test.stories.js +0 -2
  133. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsInformation.test.stories.js +0 -2
  134. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsPermissions.test.stories.js +0 -2
  135. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePassphraseGenerator.test.stories.js +0 -1
  136. package/src/react-extension/components/ResourceTag/DeleteResourceTag/DeleteResourceTag.test.stories.js +0 -2
  137. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.stories.js +0 -4
  138. package/src/react-extension/components/ResourceTag/EditResourceTags/EditResourceTags.js +1 -1
  139. package/src/react-extension/components/Share/ShareDialog.test.stories.js +5 -9
  140. package/src/react-extension/components/User/ConfirmDisableUserMFA/ConfirmDisableUserMFA.test.stories.js +5 -9
  141. package/src/react-extension/components/User/CreateUser/CreateUser.test.stories.js +3 -1
  142. package/src/react-extension/components/User/DeleteUser/DeleteUser.test.stories.js +5 -8
  143. package/src/react-extension/components/User/DeleteUser/DeleteUserWithConflicts.test.stories.js +5 -8
  144. package/src/react-extension/components/User/EditUser/EditUser.test.stories.js +3 -1
  145. package/src/react-extension/components/User/FilterUsersByBreadcrumb/FilterUsersByBreadcrumb.test.stories.js +5 -8
  146. package/src/react-extension/components/User/FilterUsersByShortcut/FilterUsersByShortcut.test.stories.js +0 -1
  147. package/src/react-extension/components/User/FilterUsersByText/FilterUsersByText.test.stories.js +0 -2
  148. package/src/react-extension/components/UserDetails/DisplayUserDetailsGroups/DisplayUserDetailsGroups.test.stories.js +8 -11
  149. package/src/react-extension/components/UserDetails/DisplayUserDetailsInformation/DisplayUserDetailsInformation.test.stories.js +8 -11
  150. package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.test.stories.js +8 -12
  151. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.stories.js +5 -8
  152. package/src/react-extension/components/UserGroup/DeleteUserGroup/DeleteUserGroup.test.stories.js +5 -8
  153. package/src/react-extension/components/UserGroup/DeleteUserGroup/DeleteUserGroupWithConflicts.test.stories.js +5 -8
  154. package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsInformation/DisplayUserGroupDetailsInformation.test.stories.js +8 -11
  155. package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsMembers/DisplayUserGroupDetailsMembers.test.stories.js +8 -11
  156. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.stories.js +5 -8
  157. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.js +55 -2
  158. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.test.data.js +6 -0
  159. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.js +54 -6
  160. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.data.js +6 -0
  161. package/src/react-extension/components/UserSetting/ChangeUserSecurityToken/ChangeUserSecurityToken.js +1 -1
  162. package/src/react-extension/components/UserSetting/ChangeUserSecurityToken/ChangeUserSecurityToken.test.stories.js +5 -8
  163. package/src/react-extension/components/UserSetting/DisplayUserGpgInformation/DisplayUserGpgInformation.js +21 -6
  164. package/src/react-extension/components/UserSetting/DisplayUserGpgInformation/DisplayUserGpgInformation.test.stories.js +5 -8
  165. package/src/react-extension/components/UserSetting/DisplayUserProfile/DisplayUserProfile.test.stories.js +5 -8
  166. package/src/react-extension/components/UserSetting/DisplayUserSettingsWorkspaceBreadcrumb/DisplayUserSettingsWorkspaceBreadcrumb.test.stories.js +5 -8
  167. package/src/react-extension/components/UserSetting/DisplayUserTheme/DisplayUserTheme.test.stories.js +5 -8
  168. package/src/react-extension/components/UserSetting/EditUserProfile/EditUserProfile.test.stories.js +5 -8
  169. package/src/react-extension/components/UserSetting/NavigateIntoUserSettingsWorkspace/NavigateIntoUserSettingsWorkspace.test.stories.js +7 -10
  170. package/src/react-extension/components/UserSetting/UploadUserProfileAvatar/UploadUserProfileAvatar.js +2 -2
  171. package/src/react-extension/components/UserSetting/UploadUserProfileAvatar/UploadUserProfileAvatar.test.stories.js +5 -8
  172. package/src/react-extension/contexts/ApiAppContext.js +1 -1
  173. package/src/react-extension/contexts/ApiRecoverContext.js +1 -1
  174. package/src/react-extension/contexts/ApiSetupContext.js +1 -1
  175. package/src/react-extension/contexts/DragContext.js +122 -0
  176. package/src/react-extension/contexts/DragContext.test.js +53 -0
  177. package/src/react-extension/test/mock/components/Internationalisation/MockTranslationProvider.js +42 -7
  178. package/src/react-quickaccess/components/AnimatedSwitch/AnimatedSwitch.js +3 -3
  179. package/src/react-quickaccess/components/ExtensionSetup/SetupExtensionInProgress/SetupExtensionInProgressPage.test.stories.js +3 -4
  180. package/src/react-quickaccess/components/FilterResourcesByFavoritePage/FilterResourcesByFavoritePage.test.stories.js +6 -6
  181. package/src/react-quickaccess/components/FilterResourcesByGroupPage/FilterResourcesByGroupPage.test.stories.js +7 -3
  182. package/src/react-quickaccess/components/FilterResourcesByItemsIOwnPage/FilterResourcesByItemsIOwnPage.test.stories.js +6 -6
  183. package/src/react-quickaccess/components/FilterResourcesByRecentlyModifiedPage/FilterResourcesByRecentlyModifiedPage.test.stories.js +6 -6
  184. package/src/react-quickaccess/components/FilterResourcesBySharedWithMePage/FilterResourcesBySharedWithMePage.test.stories.js +6 -6
  185. package/src/react-quickaccess/components/FilterResourcesByTagPage/FilterResourcesByTagPage.test.stories.js +7 -3
  186. package/src/react-quickaccess/components/Header/Header.test.stories.js +3 -6
  187. package/src/react-quickaccess/components/HomePage/HomePage.test.stories.js +13 -9
  188. package/src/react-quickaccess/components/LoginPage/LoginPage.js +41 -5
  189. package/src/react-quickaccess/components/LoginPage/LoginPage.test.stories.js +3 -5
  190. package/src/react-quickaccess/components/MoreFiltersPage/MoreFiltersPage.test.stories.js +3 -5
  191. package/src/react-quickaccess/components/PassphraseDialog/PassphraseDialog.test.stories.js +5 -5
  192. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.stories.js +5 -5
  193. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.test.stories.js +5 -5
  194. package/src/react-quickaccess/components/ResourceViewPage/ResourceViewPage.test.stories.js +4 -2
  195. package/src/react-quickaccess/components/Search/Search.test.stories.js +3 -5
  196. package/src/react-web-integration/components/AskInFormMenuDisplay/AskInFormMenuDisplay.test.stories.js +6 -2
  197. package/src/react-web-integration/components/DisplayInFormMenu/DisplayInFormMenu.test.stories.js +9 -2
  198. package/src/react-web-integration/lib/InForm/InFormCallToActionField.js +3 -3
  199. package/src/react-web-integration/lib/InForm/InFormManager.js +12 -6
  200. package/src/react-web-integration/lib/InForm/InformMenuField.js +1 -1
  201. package/src/shared/lib/Browser/detectBrowserName.js +2 -1
  202. package/src/img/third_party/ChromeWebStore_black.png +0 -0
  203. package/src/img/third_party/ChromeWebStore_white.png +0 -0
@@ -1,7 +1,5 @@
1
1
  import React from "react";
2
2
  import {MemoryRouter, Route} from "react-router-dom";
3
- import "../../../../css/themes/default/ext_authentication.css";
4
- import MockTranslationProvider from "../../../test/mock/components/Internationalisation/MockTranslationProvider";
5
3
  import {AuthenticationContext} from "../../../contexts/AuthenticationContext";
6
4
  import ChooseSecurityToken from "./ChooseSecurityToken";
7
5
 
@@ -16,21 +14,20 @@ const context = {
16
14
 
17
15
 
18
16
  const Template = args =>
19
- <MockTranslationProvider>
20
- <AuthenticationContext.Provider value={context}>
21
- <div id="container" className="container page login">
22
- <div className="content">
23
- <div className="login-form">
24
- <MemoryRouter initialEntries={['/']}>
25
- <Route component={routerProps => <ChooseSecurityToken {...args} {...routerProps}/>}></Route>
26
- </MemoryRouter>
27
- </div>
17
+ <AuthenticationContext.Provider value={context}>
18
+ <div id="container" className="container page login">
19
+ <div className="content">
20
+ <div className="login-form">
21
+ <MemoryRouter initialEntries={['/']}>
22
+ <Route component={routerProps => <ChooseSecurityToken {...args} {...routerProps}/>}></Route>
23
+ </MemoryRouter>
28
24
  </div>
29
25
  </div>
30
- </AuthenticationContext.Provider>
31
- </MockTranslationProvider>;
32
-
26
+ </div>
27
+ </AuthenticationContext.Provider>;
33
28
 
34
29
 
35
30
  export const Initial = Template.bind({});
36
-
31
+ Initial.parameters = {
32
+ css: "ext_authentication"
33
+ };
@@ -1,7 +1,5 @@
1
1
  import React from "react";
2
2
  import {MemoryRouter, Route} from "react-router-dom";
3
- import "../../../../css/themes/default/ext_authentication.css";
4
- import MockTranslationProvider from "../../../test/mock/components/Internationalisation/MockTranslationProvider";
5
3
  import {AuthenticationContext} from "../../../contexts/AuthenticationContext";
6
4
  import CreateGpgKey from "./CreateGpgKey";
7
5
 
@@ -16,21 +14,20 @@ const context = {
16
14
 
17
15
 
18
16
  const Template = args =>
19
- <MockTranslationProvider>
20
- <AuthenticationContext.Provider value={context}>
21
- <div id="container" className="container page login">
22
- <div className="content">
23
- <div className="login-form">
24
- <MemoryRouter initialEntries={['/']}>
25
- <Route component={routerProps => <CreateGpgKey {...args} {...routerProps}/>}></Route>
26
- </MemoryRouter>
27
- </div>
17
+ <AuthenticationContext.Provider value={context}>
18
+ <div id="container" className="container page login">
19
+ <div className="content">
20
+ <div className="login-form">
21
+ <MemoryRouter initialEntries={['/']}>
22
+ <Route component={routerProps => <CreateGpgKey {...args} {...routerProps}/>}></Route>
23
+ </MemoryRouter>
28
24
  </div>
29
25
  </div>
30
- </AuthenticationContext.Provider>
31
- </MockTranslationProvider>;
32
-
26
+ </div>
27
+ </AuthenticationContext.Provider>;
33
28
 
34
29
 
35
30
  export const Initial = Template.bind({});
36
-
31
+ Initial.parameters = {
32
+ css: "ext_authentication"
33
+ };
@@ -1,7 +1,5 @@
1
1
  import React from "react";
2
2
  import {MemoryRouter, Route} from "react-router-dom";
3
- import "../../../../css/themes/default/ext_authentication.css";
4
- import MockTranslationProvider from "../../../test/mock/components/Internationalisation/MockTranslationProvider";
5
3
  import {AuthenticationContext} from "../../../contexts/AuthenticationContext";
6
4
  import DisplayBrowserNotSupported from "./DisplayBrowserNotSupported";
7
5
 
@@ -16,21 +14,20 @@ const context = {
16
14
 
17
15
 
18
16
  const Template = args =>
19
- <MockTranslationProvider>
20
- <AuthenticationContext.Provider value={context}>
21
- <div id="container" className="container page login">
22
- <div className="content">
23
- <div className="login-form">
24
- <MemoryRouter initialEntries={['/']}>
25
- <Route component={routerProps => <DisplayBrowserNotSupported {...args} {...routerProps}/>}></Route>
26
- </MemoryRouter>
27
- </div>
17
+ <AuthenticationContext.Provider value={context}>
18
+ <div id="container" className="container page login">
19
+ <div className="content">
20
+ <div className="login-form">
21
+ <MemoryRouter initialEntries={['/']}>
22
+ <Route component={routerProps => <DisplayBrowserNotSupported {...args} {...routerProps}/>}></Route>
23
+ </MemoryRouter>
28
24
  </div>
29
25
  </div>
30
- </AuthenticationContext.Provider>
31
- </MockTranslationProvider>;
32
-
26
+ </div>
27
+ </AuthenticationContext.Provider>;
33
28
 
34
29
 
35
30
  export const Initial = Template.bind({});
36
-
31
+ Initial.parameters = {
32
+ css: "ext_authentication"
33
+ };
@@ -1,7 +1,5 @@
1
1
  import React from "react";
2
2
  import {MemoryRouter, Route} from "react-router-dom";
3
- import "../../../../css/themes/default/ext_authentication.css";
4
- import MockTranslationProvider from "../../../test/mock/components/Internationalisation/MockTranslationProvider";
5
3
  import {AuthenticationContext} from "../../../contexts/AuthenticationContext";
6
4
  import DisplayExpiredTokenError from "./DisplayExpiredTokenError";
7
5
 
@@ -16,21 +14,20 @@ const context = {
16
14
 
17
15
 
18
16
  const Template = args =>
19
- <MockTranslationProvider>
20
- <AuthenticationContext.Provider value={context}>
21
- <div id="container" className="container page login">
22
- <div className="content">
23
- <div className="login-form">
24
- <MemoryRouter initialEntries={['/']}>
25
- <Route component={routerProps => <DisplayExpiredTokenError {...args} {...routerProps}/>}></Route>
26
- </MemoryRouter>
27
- </div>
17
+ <AuthenticationContext.Provider value={context}>
18
+ <div id="container" className="container page login">
19
+ <div className="content">
20
+ <div className="login-form">
21
+ <MemoryRouter initialEntries={['/']}>
22
+ <Route component={routerProps => <DisplayExpiredTokenError {...args} {...routerProps}/>}></Route>
23
+ </MemoryRouter>
28
24
  </div>
29
25
  </div>
30
- </AuthenticationContext.Provider>
31
- </MockTranslationProvider>;
32
-
26
+ </div>
27
+ </AuthenticationContext.Provider>;
33
28
 
34
29
 
35
30
  export const Initial = Template.bind({});
36
-
31
+ Initial.parameters = {
32
+ css: "ext_authentication"
33
+ };
@@ -1,7 +1,5 @@
1
1
  import React from "react";
2
2
  import {MemoryRouter, Route} from "react-router-dom";
3
- import "../../../../css/themes/default/ext_authentication.css";
4
- import MockTranslationProvider from "../../../test/mock/components/Internationalisation/MockTranslationProvider";
5
3
  import {AuthenticationContext} from "../../../contexts/AuthenticationContext";
6
4
  import DisplayRequireInvitationError from "./DisplayRequireInvitationError";
7
5
 
@@ -16,21 +14,20 @@ const context = {
16
14
 
17
15
 
18
16
  const Template = args =>
19
- <MockTranslationProvider>
20
- <AuthenticationContext.Provider value={context}>
21
- <div id="container" className="container page login">
22
- <div className="content">
23
- <div className="login-form">
24
- <MemoryRouter initialEntries={['/']}>
25
- <Route component={routerProps => <DisplayRequireInvitationError {...args} {...routerProps}/>}></Route>
26
- </MemoryRouter>
27
- </div>
17
+ <AuthenticationContext.Provider value={context}>
18
+ <div id="container" className="container page login">
19
+ <div className="content">
20
+ <div className="login-form">
21
+ <MemoryRouter initialEntries={['/']}>
22
+ <Route component={routerProps => <DisplayRequireInvitationError {...args} {...routerProps}/>}></Route>
23
+ </MemoryRouter>
28
24
  </div>
29
25
  </div>
30
- </AuthenticationContext.Provider>
31
- </MockTranslationProvider>;
32
-
26
+ </div>
27
+ </AuthenticationContext.Provider>;
33
28
 
34
29
 
35
30
  export const Initial = Template.bind({});
36
-
31
+ Initial.parameters = {
32
+ css: "ext_authentication"
33
+ };
@@ -1,7 +1,5 @@
1
1
  import React from "react";
2
2
  import {MemoryRouter, Route} from "react-router-dom";
3
- import "../../../../css/themes/default/ext_authentication.css";
4
- import MockTranslationProvider from "../../../test/mock/components/Internationalisation/MockTranslationProvider";
5
3
  import {AuthenticationContext} from "../../../contexts/AuthenticationContext";
6
4
  import DisplayUnexpectedError from "./DisplayUnexpectedError";
7
5
 
@@ -16,21 +14,20 @@ const context = {
16
14
 
17
15
 
18
16
  const Template = args =>
19
- <MockTranslationProvider>
20
- <AuthenticationContext.Provider value={context}>
21
- <div id="container" className="container page login">
22
- <div className="content">
23
- <div className="login-form">
24
- <MemoryRouter initialEntries={['/']}>
25
- <Route component={routerProps => <DisplayUnexpectedError {...args} {...routerProps}/>}></Route>
26
- </MemoryRouter>
27
- </div>
17
+ <AuthenticationContext.Provider value={context}>
18
+ <div id="container" className="container page login">
19
+ <div className="content">
20
+ <div className="login-form">
21
+ <MemoryRouter initialEntries={['/']}>
22
+ <Route component={routerProps => <DisplayUnexpectedError {...args} {...routerProps}/>}></Route>
23
+ </MemoryRouter>
28
24
  </div>
29
25
  </div>
30
- </AuthenticationContext.Provider>
31
- </MockTranslationProvider>;
32
-
26
+ </div>
27
+ </AuthenticationContext.Provider>;
33
28
 
34
29
 
35
30
  export const Initial = Template.bind({});
36
-
31
+ Initial.parameters = {
32
+ css: "ext_authentication"
33
+ };
@@ -98,7 +98,7 @@ class DownloadRecoveryKit extends Component {
98
98
  className={`button primary big full-width`}
99
99
  onClick={this.handleNext}
100
100
  role="button">
101
- Next
101
+ <Trans>Next</Trans>
102
102
  </button>
103
103
  <a
104
104
  id="download-kit"
@@ -1,7 +1,5 @@
1
1
  import React from "react";
2
2
  import {MemoryRouter, Route} from "react-router-dom";
3
- import "../../../../css/themes/default/ext_authentication.css";
4
- import MockTranslationProvider from "../../../test/mock/components/Internationalisation/MockTranslationProvider";
5
3
  import {AuthenticationContext} from "../../../contexts/AuthenticationContext";
6
4
  import DownloadRecoveryKit from "./DownloadRecoveryKit";
7
5
 
@@ -16,21 +14,20 @@ const context = {
16
14
 
17
15
 
18
16
  const Template = args =>
19
- <MockTranslationProvider>
20
- <AuthenticationContext.Provider value={context}>
21
- <div id="container" className="container page login">
22
- <div className="content">
23
- <div className="login-form">
24
- <MemoryRouter initialEntries={['/']}>
25
- <Route component={routerProps => <DownloadRecoveryKit {...args} {...routerProps}/>}></Route>
26
- </MemoryRouter>
27
- </div>
17
+ <AuthenticationContext.Provider value={context}>
18
+ <div id="container" className="container page login">
19
+ <div className="content">
20
+ <div className="login-form">
21
+ <MemoryRouter initialEntries={['/']}>
22
+ <Route component={routerProps => <DownloadRecoveryKit {...args} {...routerProps}/>}></Route>
23
+ </MemoryRouter>
28
24
  </div>
29
25
  </div>
30
- </AuthenticationContext.Provider>
31
- </MockTranslationProvider>;
32
-
26
+ </div>
27
+ </AuthenticationContext.Provider>;
33
28
 
34
29
 
35
30
  export const Initial = Template.bind({});
36
-
31
+ Initial.parameters = {
32
+ css: "ext_authentication"
33
+ };
@@ -1,7 +1,5 @@
1
1
  import React from "react";
2
2
  import {MemoryRouter, Route} from "react-router-dom";
3
- import "../../../../css/themes/default/ext_authentication.css";
4
- import MockTranslationProvider from "../../../test/mock/components/Internationalisation/MockTranslationProvider";
5
3
  import {AuthenticationContext} from "../../../contexts/AuthenticationContext";
6
4
  import EnterNameForm from "./EnterNameForm";
7
5
 
@@ -16,21 +14,20 @@ const context = {
16
14
 
17
15
 
18
16
  const Template = args =>
19
- <MockTranslationProvider>
20
- <AuthenticationContext.Provider value={context}>
21
- <div id="container" className="container page login">
22
- <div className="content">
23
- <div className="login-form">
24
- <MemoryRouter initialEntries={['/']}>
25
- <Route component={routerProps => <EnterNameForm {...args} {...routerProps}/>}></Route>
26
- </MemoryRouter>
27
- </div>
17
+ <AuthenticationContext.Provider value={context}>
18
+ <div id="container" className="container page login">
19
+ <div className="content">
20
+ <div className="login-form">
21
+ <MemoryRouter initialEntries={['/']}>
22
+ <Route component={routerProps => <EnterNameForm {...args} {...routerProps}/>}></Route>
23
+ </MemoryRouter>
28
24
  </div>
29
25
  </div>
30
- </AuthenticationContext.Provider>
31
- </MockTranslationProvider>;
32
-
26
+ </div>
27
+ </AuthenticationContext.Provider>;
33
28
 
34
29
 
35
30
  export const Initial = Template.bind({});
36
-
31
+ Initial.parameters = {
32
+ css: "ext_authentication"
33
+ };
@@ -1,7 +1,5 @@
1
1
  import React from "react";
2
2
  import {MemoryRouter, Route} from "react-router-dom";
3
- import "../../../../css/themes/default/ext_authentication.css";
4
- import MockTranslationProvider from "../../../test/mock/components/Internationalisation/MockTranslationProvider";
5
3
  import {AuthenticationContext} from "../../../contexts/AuthenticationContext";
6
4
  import EnterUsernameForm from "./EnterUsernameForm";
7
5
 
@@ -16,21 +14,20 @@ const context = {
16
14
 
17
15
 
18
16
  const Template = args =>
19
- <MockTranslationProvider>
20
- <AuthenticationContext.Provider value={context}>
21
- <div id="container" className="container page login">
22
- <div className="content">
23
- <div className="login-form">
24
- <MemoryRouter initialEntries={['/']}>
25
- <Route component={routerProps => <EnterUsernameForm {...args} {...routerProps}/>}></Route>
26
- </MemoryRouter>
27
- </div>
17
+ <AuthenticationContext.Provider value={context}>
18
+ <div id="container" className="container page login">
19
+ <div className="content">
20
+ <div className="login-form">
21
+ <MemoryRouter initialEntries={['/']}>
22
+ <Route component={routerProps => <EnterUsernameForm {...args} {...routerProps}/>}></Route>
23
+ </MemoryRouter>
28
24
  </div>
29
25
  </div>
30
- </AuthenticationContext.Provider>
31
- </MockTranslationProvider>;
32
-
26
+ </div>
27
+ </AuthenticationContext.Provider>;
33
28
 
34
29
 
35
30
  export const Initial = Template.bind({});
36
-
31
+ Initial.parameters = {
32
+ css: "ext_authentication"
33
+ };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Default props
3
+ * @returns {{dialogContext: {open: jest.Mock}, context: {onCheckIsAuthenticatedRequested: jest.Mock}}}
4
+ */
5
+ export function defaultProps() {
6
+ return {
7
+ context: {
8
+ onCheckIsAuthenticatedRequested: jest.fn()
9
+ },
10
+ dialogContext: {
11
+ open: jest.fn()
12
+ }
13
+ };
14
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) 2020 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) 2020 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.3.1
13
+ */
14
+
15
+ /**
16
+ * Unit tests on SessionExpired in regard of specifications
17
+ */
18
+ import {defaultProps} from "./HandleSessionExpired.test.data";
19
+ import HandleSessionExpiredPage from "./HandleSessionExpired.test.page";
20
+ import NotifyExpiredSession from "../NotifyExpiredSession/NotifyExpiredSession";
21
+
22
+ beforeEach(() => {
23
+ jest.resetModules();
24
+ });
25
+
26
+ describe("As LU I should handle session expired", () => {
27
+ const props = defaultProps(); // The props to pass
28
+ const mockContextRequest = implementation => jest.spyOn(props.context, 'onCheckIsAuthenticatedRequested').mockImplementation(implementation);
29
+
30
+ /**
31
+ * I should see the session expired dialog
32
+ */
33
+ beforeEach(() => {
34
+ jest.useFakeTimers();
35
+ new HandleSessionExpiredPage(props);
36
+ });
37
+
38
+ afterEach(() => {
39
+ jest.clearAllTimers();
40
+ });
41
+
42
+ it('As LU I should have no change if the session is not expired', () => {
43
+ // Mock the request function to make it the expected result
44
+ const requestMockImpl = () => true;
45
+ mockContextRequest(requestMockImpl);
46
+ expect(props.context.onCheckIsAuthenticatedRequested).not.toBeCalled();
47
+ // Fast-forward until all timers have been executed
48
+ jest.runOnlyPendingTimers();
49
+ expect(props.context.onCheckIsAuthenticatedRequested).toHaveBeenCalled();
50
+ expect(props.dialogContext.open).not.toBeCalled();
51
+ });
52
+
53
+
54
+ it('As LU I should open a dialog if the session is expired', async () => {
55
+ const requestMockImpl = () => false;
56
+ mockContextRequest(requestMockImpl);
57
+ // Fast-forward until all timers have been executed
58
+ jest.runOnlyPendingTimers();
59
+ // Need 2 promises resolved to open the dialog
60
+ await Promise.resolve();
61
+ await Promise.resolve();
62
+ expect(props.context.onCheckIsAuthenticatedRequested).toHaveBeenCalled();
63
+ expect(props.dialogContext.open).toHaveBeenCalledWith(NotifyExpiredSession);
64
+ });
65
+ });
@@ -0,0 +1,38 @@
1
+
2
+ /**
3
+ * Passbolt ~ Open source password manager for teams
4
+ * Copyright (c) 2020 Passbolt SA (https://www.passbolt.com)
5
+ *
6
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
7
+ * For full copyright and license information, please see the LICENSE.txt
8
+ * Redistributions of files must retain the above copyright notice.
9
+ *
10
+ * @copyright Copyright (c) 2020 Passbolt SA (https://www.passbolt.com)
11
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
12
+ * @link https://www.passbolt.com Passbolt(tm)
13
+ * @since 3.3.1
14
+ */
15
+ import {render} from "@testing-library/react";
16
+ import React from "react";
17
+ import {BrowserRouter as Router} from "react-router-dom";
18
+ import MockTranslationProvider from "../../../test/mock/components/Internationalisation/MockTranslationProvider";
19
+ import HandleSessionExpired from "./HandleSessionExpired";
20
+
21
+ /**
22
+ * The HandleSessionExpired component represented as a page
23
+ */
24
+ export default class HandleSessionExpiredPage {
25
+ /**
26
+ * Default constructor
27
+ * @param props Props to attach
28
+ */
29
+ constructor(props) {
30
+ this._page = render(
31
+ <MockTranslationProvider>
32
+ <Router>
33
+ <HandleSessionExpired {...props}/>
34
+ </Router>
35
+ </MockTranslationProvider>
36
+ );
37
+ }
38
+ }
@@ -1,7 +1,5 @@
1
1
  import React from "react";
2
2
  import {MemoryRouter, Route} from "react-router-dom";
3
- import "../../../../css/themes/default/ext_authentication.css";
4
- import MockTranslationProvider from "../../../test/mock/components/Internationalisation/MockTranslationProvider";
5
3
  import {AuthenticationContext} from "../../../contexts/AuthenticationContext";
6
4
  import ImportGpgKey from "./ImportGpgKey";
7
5
 
@@ -16,21 +14,20 @@ const context = {
16
14
 
17
15
 
18
16
  const Template = args =>
19
- <MockTranslationProvider>
20
- <AuthenticationContext.Provider value={context}>
21
- <div id="container" className="container page login">
22
- <div className="content">
23
- <div className="login-form">
24
- <MemoryRouter initialEntries={['/']}>
25
- <Route component={routerProps => <ImportGpgKey {...args} {...routerProps}/>}></Route>
26
- </MemoryRouter>
27
- </div>
17
+ <AuthenticationContext.Provider value={context}>
18
+ <div id="container" className="container page login">
19
+ <div className="content">
20
+ <div className="login-form">
21
+ <MemoryRouter initialEntries={['/']}>
22
+ <Route component={routerProps => <ImportGpgKey {...args} {...routerProps}/>}></Route>
23
+ </MemoryRouter>
28
24
  </div>
29
25
  </div>
30
- </AuthenticationContext.Provider>
31
- </MockTranslationProvider>;
32
-
26
+ </div>
27
+ </AuthenticationContext.Provider>;
33
28
 
34
29
 
35
30
  export const Initial = Template.bind({});
36
-
31
+ Initial.parameters = {
32
+ css: "ext_authentication"
33
+ };
@@ -18,7 +18,8 @@ import PropTypes from "prop-types";
18
18
  import {Trans, withTranslation} from "react-i18next";
19
19
 
20
20
  const CHROME_STORE_BROWSER_EXTENSION_URL = "https://chrome.google.com/webstore/detail/passbolt-extension/didegimhafipceonhjepacocaffmoppf";
21
- const FIREFOX_STORE_BROWSER_EXTENSION_URL = "https://addons.mozilla.org/fr/firefox/addon/passbolt";
21
+ const FIREFOX_STORE_BROWSER_EXTENSION_URL = "https://addons.mozilla.org/firefox/addon/passbolt";
22
+ const EDGE_STORE_BROWSER_EXTENSION_URL = "https://microsoftedge.microsoft.com/addons/detail/passbolt-extension/ljeppgjhohmhpbdhjjjbiflabdgfkhpo";
22
23
 
23
24
  class InstallExtension extends Component {
24
25
  constructor(props) {
@@ -31,8 +32,11 @@ class InstallExtension extends Component {
31
32
  * Returns the default component state
32
33
  */
33
34
  getDefaultState() {
35
+ const currentTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? "dark" : "light";
36
+
34
37
  return {
35
- browserName: detectBrowserName()
38
+ browserName: detectBrowserName(),
39
+ theme: currentTheme
36
40
  };
37
41
  }
38
42
 
@@ -50,13 +54,16 @@ class InstallExtension extends Component {
50
54
  * @returns {string}
51
55
  */
52
56
  get browserStoreThumbnailUrl() {
57
+ const color = this.state.theme === "dark" ? "white" : "black";
58
+
53
59
  switch (this.state.browserName) {
54
- case BROWSER_NAMES.CHROME:
55
- return `${this.props.context.trustedDomain}/img/third_party/ChromeWebStore_black.png`; // @todo _white if theme midgar
56
60
  case BROWSER_NAMES.FIREFOX:
57
- return `${this.props.context.trustedDomain}/img/third_party/FirefoxAMO_black.svg`; // @todo _white if theme midgar
61
+ return `${this.props.context.trustedDomain}/img/third_party/FirefoxAMO_${color}.svg`;
62
+ case BROWSER_NAMES.EDGE:
63
+ return `${this.props.context.trustedDomain}/img/third_party/edge-addon-${color}.svg`;
64
+ case BROWSER_NAMES.CHROME:
58
65
  default:
59
- return `${this.props.context.trustedDomain}/img/third_party/ChromeWebStore_black.png`;
66
+ return `${this.props.context.trustedDomain}/img/third_party/ChromeWebStore_${color}.svg`;
60
67
  }
61
68
  }
62
69
 
@@ -72,6 +79,8 @@ class InstallExtension extends Component {
72
79
  return CHROME_STORE_BROWSER_EXTENSION_URL;
73
80
  case BROWSER_NAMES.FIREFOX:
74
81
  return FIREFOX_STORE_BROWSER_EXTENSION_URL;
82
+ case BROWSER_NAMES.EDGE:
83
+ return EDGE_STORE_BROWSER_EXTENSION_URL;
75
84
  default:
76
85
  return CHROME_STORE_BROWSER_EXTENSION_URL;
77
86
  }
@@ -19,6 +19,22 @@
19
19
  import InstallExtensionTestPage from "./InstallExtension.test.page";
20
20
  import {defaultProps} from "./InstallExtension.test.data";
21
21
 
22
+ beforeAll(() => {
23
+ Object.defineProperty(window, 'matchMedia', {
24
+ writable: true,
25
+ value: jest.fn().mockImplementation(query => ({
26
+ matches: false,
27
+ media: query,
28
+ onchange: null,
29
+ addListener: jest.fn(),
30
+ removeListener: jest.fn(),
31
+ addEventListener: jest.fn(),
32
+ removeEventListener: jest.fn(),
33
+ dispatchEvent: jest.fn(),
34
+ })),
35
+ });
36
+ });
37
+
22
38
  beforeEach(() => {
23
39
  jest.resetModules();
24
40
  });
@@ -68,6 +84,17 @@ describe("As AN I should see install extension page", () => {
68
84
  expect(page.linkContent).toBe('Refresh to detect extension');
69
85
  });
70
86
 
87
+ it('As AN I should see the install extension for Edge', () => {
88
+ Object.defineProperty(window, "navigator", {
89
+ value: {userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34"},
90
+ writable: true
91
+ });
92
+ window.chrome = {runtime: "true"};
93
+ page = new InstallExtensionTestPage();
94
+ // browser image
95
+ expect(page.browser.className).toBe("browser-webstore edge");
96
+ });
97
+
71
98
  it('As AN I should be able to refresh the page', async() => {
72
99
  Object.defineProperty(window, "location", {
73
100
  value: {reload: jest.fn()},