@digitaldefiance/express-suite-react-components 5.0.2 → 5.0.3

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 (311) hide show
  1. package/package.json +5 -4
  2. package/src/auth/AdminRoute.d.ts +8 -0
  3. package/src/auth/AdminRoute.d.ts.map +1 -0
  4. package/src/auth/AdminRoute.js +28 -0
  5. package/src/auth/Private.d.ts +6 -0
  6. package/src/auth/Private.d.ts.map +1 -0
  7. package/src/auth/Private.js +14 -0
  8. package/src/auth/PrivateRoute.d.ts +8 -0
  9. package/src/auth/PrivateRoute.d.ts.map +1 -0
  10. package/src/auth/PrivateRoute.js +23 -0
  11. package/src/auth/UnAuth.d.ts +6 -0
  12. package/src/auth/UnAuth.d.ts.map +1 -0
  13. package/src/auth/UnAuth.js +14 -0
  14. package/src/auth/UnAuthRoute.d.ts +8 -0
  15. package/src/auth/UnAuthRoute.d.ts.map +1 -0
  16. package/src/auth/UnAuthRoute.js +22 -0
  17. package/src/auth/{index.ts → index.d.ts} +3 -2
  18. package/src/auth/index.d.ts.map +1 -0
  19. package/src/auth/index.js +12 -0
  20. package/src/components/ApiAccess.d.ts +16 -0
  21. package/src/components/ApiAccess.d.ts.map +1 -0
  22. package/src/components/ApiAccess.js +77 -0
  23. package/src/components/BackupCodeLoginForm.d.ts +43 -0
  24. package/src/components/BackupCodeLoginForm.d.ts.map +1 -0
  25. package/src/components/BackupCodeLoginForm.js +139 -0
  26. package/src/components/BackupCodesForm.d.ts +26 -0
  27. package/src/components/BackupCodesForm.d.ts.map +1 -0
  28. package/src/components/BackupCodesForm.js +120 -0
  29. package/src/components/CategoryMenu.d.ts +17 -0
  30. package/src/components/CategoryMenu.d.ts.map +1 -0
  31. package/src/components/CategoryMenu.js +65 -0
  32. package/src/components/ChangePasswordForm.d.ts +26 -0
  33. package/src/components/ChangePasswordForm.d.ts.map +1 -0
  34. package/src/components/ChangePasswordForm.js +78 -0
  35. package/src/components/ConfirmationDialog.d.ts +13 -0
  36. package/src/components/ConfirmationDialog.d.ts.map +1 -0
  37. package/src/components/ConfirmationDialog.js +10 -0
  38. package/src/components/CurrencyCodeSelector.d.ts +9 -0
  39. package/src/components/CurrencyCodeSelector.d.ts.map +1 -0
  40. package/src/components/CurrencyCodeSelector.js +31 -0
  41. package/src/components/CurrencyInput.d.ts +13 -0
  42. package/src/components/CurrencyInput.d.ts.map +1 -0
  43. package/src/components/CurrencyInput.js +22 -0
  44. package/src/components/DashboardPage.d.ts +8 -0
  45. package/src/components/DashboardPage.d.ts.map +1 -0
  46. package/src/components/DashboardPage.js +10 -0
  47. package/src/components/DropdownMenu.d.ts +13 -0
  48. package/src/components/DropdownMenu.d.ts.map +1 -0
  49. package/src/components/DropdownMenu.js +63 -0
  50. package/src/components/ExpirationSecondsSelector.d.ts +13 -0
  51. package/src/components/ExpirationSecondsSelector.d.ts.map +1 -0
  52. package/src/components/ExpirationSecondsSelector.js +32 -0
  53. package/src/components/FakeEmailAdminPanel.d.ts +23 -0
  54. package/src/components/FakeEmailAdminPanel.d.ts.map +1 -0
  55. package/src/components/FakeEmailAdminPanel.js +147 -0
  56. package/src/components/Flag.d.ts +20 -0
  57. package/src/components/Flag.d.ts.map +1 -0
  58. package/src/components/Flag.js +43 -0
  59. package/src/components/ForgotPasswordForm.d.ts +18 -0
  60. package/src/components/ForgotPasswordForm.d.ts.map +1 -0
  61. package/src/components/ForgotPasswordForm.js +61 -0
  62. package/src/components/LoginForm.d.ts +44 -0
  63. package/src/components/LoginForm.d.ts.map +1 -0
  64. package/src/components/LoginForm.js +123 -0
  65. package/src/components/LogoutPage.d.ts +8 -0
  66. package/src/components/LogoutPage.d.ts.map +1 -0
  67. package/src/components/LogoutPage.js +16 -0
  68. package/src/components/RegisterForm.d.ts +100 -0
  69. package/src/components/RegisterForm.d.ts.map +1 -0
  70. package/src/components/RegisterForm.js +306 -0
  71. package/src/components/ResetPasswordForm.d.ts +23 -0
  72. package/src/components/ResetPasswordForm.d.ts.map +1 -0
  73. package/src/components/ResetPasswordForm.js +78 -0
  74. package/src/components/SideMenu.d.ts +8 -0
  75. package/src/components/SideMenu.d.ts.map +1 -0
  76. package/src/components/SideMenu.js +25 -0
  77. package/src/components/SideMenuListItem.d.ts +13 -0
  78. package/src/components/SideMenuListItem.d.ts.map +1 -0
  79. package/src/components/SideMenuListItem.js +44 -0
  80. package/src/components/T.d.ts +7 -0
  81. package/src/components/T.d.ts.map +1 -0
  82. package/src/components/T.js +13 -0
  83. package/src/components/TDiv.d.ts +9 -0
  84. package/src/components/TDiv.d.ts.map +1 -0
  85. package/src/components/TDiv.js +14 -0
  86. package/src/components/TImgAlt.d.ts +10 -0
  87. package/src/components/TImgAlt.d.ts.map +1 -0
  88. package/src/components/TImgAlt.js +14 -0
  89. package/src/components/TopMenu.d.ts +50 -0
  90. package/src/components/TopMenu.d.ts.map +1 -0
  91. package/src/components/TopMenu.js +79 -0
  92. package/src/components/TotpSetupForm.d.ts +24 -0
  93. package/src/components/TotpSetupForm.d.ts.map +1 -0
  94. package/src/components/TotpSetupForm.js +82 -0
  95. package/src/components/TotpVerificationForm.d.ts +23 -0
  96. package/src/components/TotpVerificationForm.d.ts.map +1 -0
  97. package/src/components/TotpVerificationForm.js +66 -0
  98. package/src/components/TranslatedTitle.d.ts +8 -0
  99. package/src/components/TranslatedTitle.d.ts.map +1 -0
  100. package/src/components/TranslatedTitle.js +15 -0
  101. package/src/components/UserLanguageSelector.d.ts +4 -0
  102. package/src/components/UserLanguageSelector.d.ts.map +1 -0
  103. package/src/components/UserLanguageSelector.js +31 -0
  104. package/src/components/UserMenu.d.ts +4 -0
  105. package/src/components/UserMenu.d.ts.map +1 -0
  106. package/src/components/UserMenu.js +12 -0
  107. package/src/components/UserSettingsForm.d.ts +113 -0
  108. package/src/components/UserSettingsForm.d.ts.map +1 -0
  109. package/src/components/UserSettingsForm.js +269 -0
  110. package/src/components/VerifyEmailPage.d.ts +24 -0
  111. package/src/components/VerifyEmailPage.d.ts.map +1 -0
  112. package/src/components/VerifyEmailPage.js +81 -0
  113. package/src/components/{index.ts → index.d.ts} +1 -1
  114. package/src/components/index.d.ts.map +1 -0
  115. package/src/components/index.js +35 -0
  116. package/src/contexts/AuthProvider.d.ts +186 -0
  117. package/src/contexts/AuthProvider.d.ts.map +1 -0
  118. package/src/contexts/AuthProvider.js +515 -0
  119. package/src/contexts/I18nProvider.d.ts +27 -0
  120. package/src/contexts/I18nProvider.d.ts.map +1 -0
  121. package/src/contexts/I18nProvider.js +60 -0
  122. package/src/contexts/MenuContext.d.ts +28 -0
  123. package/src/contexts/MenuContext.d.ts.map +1 -0
  124. package/src/contexts/MenuContext.js +292 -0
  125. package/src/contexts/SuiteConfigProvider.d.ts +44 -0
  126. package/src/contexts/SuiteConfigProvider.d.ts.map +1 -0
  127. package/src/contexts/SuiteConfigProvider.js +43 -0
  128. package/src/contexts/ThemeProvider.d.ts +15 -0
  129. package/src/contexts/ThemeProvider.d.ts.map +1 -0
  130. package/src/contexts/ThemeProvider.js +36 -0
  131. package/src/contexts/{index.ts → index.d.ts} +1 -0
  132. package/src/contexts/index.d.ts.map +1 -0
  133. package/src/contexts/index.js +8 -0
  134. package/src/hooks/{index.ts → index.d.ts} +1 -0
  135. package/src/hooks/index.d.ts.map +1 -0
  136. package/src/hooks/index.js +9 -0
  137. package/src/hooks/useAuthenticatedApi.d.ts +34 -0
  138. package/src/hooks/useAuthenticatedApi.d.ts.map +1 -0
  139. package/src/hooks/useAuthenticatedApi.js +46 -0
  140. package/src/hooks/useBackupCodes.d.ts +15 -0
  141. package/src/hooks/useBackupCodes.d.ts.map +1 -0
  142. package/src/hooks/useBackupCodes.js +74 -0
  143. package/src/hooks/useEmailVerification.d.ts +10 -0
  144. package/src/hooks/useEmailVerification.d.ts.map +1 -0
  145. package/src/hooks/useEmailVerification.js +40 -0
  146. package/src/hooks/useExpiringValue.d.ts +14 -0
  147. package/src/hooks/useExpiringValue.d.ts.map +1 -0
  148. package/src/hooks/useExpiringValue.js +53 -0
  149. package/src/hooks/useLocalStorage.d.ts +2 -0
  150. package/src/hooks/useLocalStorage.d.ts.map +1 -0
  151. package/src/hooks/useLocalStorage.js +15 -0
  152. package/src/hooks/useUserSettings.d.ts +48 -0
  153. package/src/hooks/useUserSettings.d.ts.map +1 -0
  154. package/src/hooks/useUserSettings.js +171 -0
  155. package/src/{index.ts → index.d.ts} +1 -1
  156. package/src/index.d.ts.map +1 -0
  157. package/src/index.js +12 -0
  158. package/src/interfaces/IAppConfig.d.ts +8 -0
  159. package/src/interfaces/IAppConfig.d.ts.map +1 -0
  160. package/src/interfaces/IAppConfig.js +2 -0
  161. package/src/interfaces/ICategoryConfig.d.ts +41 -0
  162. package/src/interfaces/ICategoryConfig.d.ts.map +1 -0
  163. package/src/interfaces/ICategoryConfig.js +2 -0
  164. package/src/interfaces/IMenuConfig.d.ts +28 -0
  165. package/src/interfaces/IMenuConfig.d.ts.map +1 -0
  166. package/src/interfaces/IMenuConfig.js +2 -0
  167. package/src/interfaces/IMenuOption.d.ts +82 -0
  168. package/src/interfaces/IMenuOption.d.ts.map +1 -0
  169. package/src/interfaces/IMenuOption.js +2 -0
  170. package/src/interfaces/{index.ts → index.d.ts} +1 -0
  171. package/src/interfaces/index.d.ts.map +1 -0
  172. package/src/interfaces/index.js +7 -0
  173. package/src/services/__mocks__/authService.d.ts +21 -0
  174. package/src/services/__mocks__/authService.d.ts.map +1 -0
  175. package/src/services/__mocks__/authService.js +15 -0
  176. package/src/services/api.d.ts +3 -0
  177. package/src/services/api.d.ts.map +1 -0
  178. package/src/services/api.js +14 -0
  179. package/src/services/authService.d.ts +126 -0
  180. package/src/services/authService.d.ts.map +1 -0
  181. package/src/services/authService.js +471 -0
  182. package/src/services/authenticatedApi.d.ts +3 -0
  183. package/src/services/authenticatedApi.d.ts.map +1 -0
  184. package/src/services/authenticatedApi.js +18 -0
  185. package/src/services/index.d.ts +4 -0
  186. package/src/services/index.d.ts.map +1 -0
  187. package/src/services/index.js +6 -0
  188. package/src/types/MenuType.d.ts +11 -0
  189. package/src/types/MenuType.d.ts.map +1 -0
  190. package/src/types/MenuType.js +12 -0
  191. package/src/types/expirationSeconds.d.ts +3 -0
  192. package/src/types/expirationSeconds.d.ts.map +1 -0
  193. package/src/types/expirationSeconds.js +17 -0
  194. package/src/types/index.d.ts +2 -0
  195. package/src/types/index.d.ts.map +1 -0
  196. package/src/types/index.js +4 -0
  197. package/src/types/translation.d.ts +10 -0
  198. package/src/types/translation.d.ts.map +1 -0
  199. package/src/types/translation.js +9 -0
  200. package/src/wrappers/BackupCodeLoginWrapper.d.ts +8 -0
  201. package/src/wrappers/BackupCodeLoginWrapper.d.ts.map +1 -0
  202. package/src/wrappers/BackupCodeLoginWrapper.js +20 -0
  203. package/src/wrappers/BackupCodesWrapper.d.ts +7 -0
  204. package/src/wrappers/BackupCodesWrapper.d.ts.map +1 -0
  205. package/src/wrappers/BackupCodesWrapper.js +17 -0
  206. package/src/wrappers/ChangePasswordFormWrapper.d.ts +8 -0
  207. package/src/wrappers/ChangePasswordFormWrapper.d.ts.map +1 -0
  208. package/src/wrappers/ChangePasswordFormWrapper.js +21 -0
  209. package/src/wrappers/ForgotPasswordFormWrapper.d.ts +8 -0
  210. package/src/wrappers/ForgotPasswordFormWrapper.d.ts.map +1 -0
  211. package/src/wrappers/ForgotPasswordFormWrapper.js +29 -0
  212. package/src/wrappers/LoginFormWrapper.d.ts +21 -0
  213. package/src/wrappers/LoginFormWrapper.d.ts.map +1 -0
  214. package/src/wrappers/LoginFormWrapper.js +72 -0
  215. package/src/wrappers/LogoutPageWrapper.d.ts +9 -0
  216. package/src/wrappers/LogoutPageWrapper.d.ts.map +1 -0
  217. package/src/wrappers/LogoutPageWrapper.js +21 -0
  218. package/src/wrappers/RegisterFormWrapper.d.ts +20 -0
  219. package/src/wrappers/RegisterFormWrapper.d.ts.map +1 -0
  220. package/src/wrappers/RegisterFormWrapper.js +51 -0
  221. package/src/wrappers/ResetPasswordFormWrapper.d.ts +9 -0
  222. package/src/wrappers/ResetPasswordFormWrapper.d.ts.map +1 -0
  223. package/src/wrappers/ResetPasswordFormWrapper.js +34 -0
  224. package/src/wrappers/UserSettingsFormWrapper.d.ts +29 -0
  225. package/src/wrappers/UserSettingsFormWrapper.d.ts.map +1 -0
  226. package/src/wrappers/UserSettingsFormWrapper.js +95 -0
  227. package/src/wrappers/VerifyEmailPageWrapper.d.ts +8 -0
  228. package/src/wrappers/VerifyEmailPageWrapper.d.ts.map +1 -0
  229. package/src/wrappers/VerifyEmailPageWrapper.js +21 -0
  230. package/src/wrappers/{index.tsx → index.d.ts} +1 -10
  231. package/src/wrappers/index.d.ts.map +1 -0
  232. package/src/wrappers/index.js +24 -0
  233. package/LICENSE +0 -21
  234. package/src/auth/AdminRoute.tsx +0 -54
  235. package/src/auth/Private.tsx +0 -17
  236. package/src/auth/PrivateRoute.tsx +0 -28
  237. package/src/auth/UnAuth.tsx +0 -16
  238. package/src/auth/UnAuthRoute.tsx +0 -30
  239. package/src/components/ApiAccess.tsx +0 -175
  240. package/src/components/BackupCodeLoginForm.tsx +0 -489
  241. package/src/components/BackupCodesForm.tsx +0 -287
  242. package/src/components/CategoryMenu.tsx +0 -155
  243. package/src/components/ChangePasswordForm.tsx +0 -273
  244. package/src/components/ConfirmationDialog.tsx +0 -48
  245. package/src/components/CurrencyCodeSelector.tsx +0 -60
  246. package/src/components/CurrencyInput.tsx +0 -80
  247. package/src/components/DashboardPage.tsx +0 -24
  248. package/src/components/DropdownMenu.tsx +0 -105
  249. package/src/components/ExpirationSecondsSelector.tsx +0 -60
  250. package/src/components/FakeEmailAdminPanel.tsx +0 -374
  251. package/src/components/Flag.tsx +0 -52
  252. package/src/components/ForgotPasswordForm.tsx +0 -174
  253. package/src/components/LoginForm.tsx +0 -468
  254. package/src/components/LogoutPage.tsx +0 -21
  255. package/src/components/RegisterForm.tsx +0 -1169
  256. package/src/components/ResetPasswordForm.tsx +0 -247
  257. package/src/components/SideMenu.tsx +0 -46
  258. package/src/components/SideMenuListItem.tsx +0 -75
  259. package/src/components/T.tsx +0 -24
  260. package/src/components/TDiv.tsx +0 -26
  261. package/src/components/TImgAlt.tsx +0 -28
  262. package/src/components/TopMenu.tsx +0 -252
  263. package/src/components/TotpSetupForm.tsx +0 -188
  264. package/src/components/TotpVerificationForm.tsx +0 -148
  265. package/src/components/TranslatedTitle.tsx +0 -31
  266. package/src/components/UserLanguageSelector.tsx +0 -45
  267. package/src/components/UserMenu.tsx +0 -15
  268. package/src/components/UserSettingsForm.tsx +0 -904
  269. package/src/components/VerifyEmailPage.tsx +0 -222
  270. package/src/components/__tests__/RegisterForm.totp.spec.tsx +0 -377
  271. package/src/components/__tests__/TotpSetupForm.spec.tsx +0 -258
  272. package/src/components/__tests__/TotpVerificationForm.spec.tsx +0 -259
  273. package/src/components/__tests__/UserSettingsForm.totp.spec.tsx +0 -396
  274. package/src/contexts/AuthProvider.spec.tsx +0 -1284
  275. package/src/contexts/AuthProvider.tsx +0 -977
  276. package/src/contexts/I18nProvider.tsx +0 -164
  277. package/src/contexts/MenuContext.tsx +0 -426
  278. package/src/contexts/SuiteConfigProvider.tsx +0 -93
  279. package/src/contexts/ThemeProvider.tsx +0 -67
  280. package/src/hooks/useAuthenticatedApi.tsx +0 -67
  281. package/src/hooks/useBackupCodes.ts +0 -105
  282. package/src/hooks/useEmailVerification.ts +0 -54
  283. package/src/hooks/useExpiringValue.ts +0 -78
  284. package/src/hooks/useLocalStorage.ts +0 -18
  285. package/src/hooks/useUserSettings.ts +0 -271
  286. package/src/interfaces/IAppConfig.ts +0 -7
  287. package/src/interfaces/ICategoryConfig.ts +0 -41
  288. package/src/interfaces/IMenuConfig.ts +0 -28
  289. package/src/interfaces/IMenuOption.ts +0 -79
  290. package/src/services/__mocks__/authService.ts +0 -14
  291. package/src/services/__tests__/authService.totp.property.spec.ts +0 -360
  292. package/src/services/__tests__/authService.totp.spec.ts +0 -439
  293. package/src/services/api.ts +0 -13
  294. package/src/services/authService.ts +0 -692
  295. package/src/services/authenticatedApi.ts +0 -17
  296. package/src/services/index.ts +0 -3
  297. package/src/types/MenuType.ts +0 -15
  298. package/src/types/expirationSeconds.ts +0 -18
  299. package/src/types/index.ts +0 -1
  300. package/src/types/translation.ts +0 -20
  301. package/src/wrappers/BackupCodeLoginWrapper.tsx +0 -34
  302. package/src/wrappers/BackupCodesWrapper.tsx +0 -28
  303. package/src/wrappers/ChangePasswordFormWrapper.tsx +0 -34
  304. package/src/wrappers/ForgotPasswordFormWrapper.tsx +0 -45
  305. package/src/wrappers/LoginFormWrapper.tsx +0 -108
  306. package/src/wrappers/LogoutPageWrapper.tsx +0 -30
  307. package/src/wrappers/RegisterFormWrapper.tsx +0 -109
  308. package/src/wrappers/ResetPasswordFormWrapper.tsx +0 -57
  309. package/src/wrappers/UserSettingsFormWrapper.tsx +0 -140
  310. package/src/wrappers/VerifyEmailPageWrapper.tsx +0 -27
  311. package/src/wrappers/__tests__/LoginFormWrapper.totp.spec.tsx +0 -339
@@ -1,439 +0,0 @@
1
- /**
2
- * Unit Tests for AuthService TOTP Methods
3
- *
4
- * Tests each TOTP method calls the correct endpoint, returns the correct
5
- * shape on success, and extracts errors on failure.
6
- *
7
- * Validates: Requirements 11.1, 11.2, 11.3, 11.4, 11.5
8
- *
9
- * @module services/__tests__/authService.totp.spec
10
- */
11
-
12
- import { describe, it, expect, beforeEach, jest } from '@jest/globals';
13
- import axios, { AxiosError, AxiosHeaders } from 'axios';
14
-
15
- // ─── Mocks ──────────────────────────────────────────────────────────────────
16
-
17
- const mockPost = jest.fn() as jest.MockedFunction<typeof axios.prototype.post>;
18
- const mockGet = jest.fn() as jest.MockedFunction<typeof axios.prototype.get>;
19
-
20
- const mockAxiosInstance = {
21
- post: mockPost,
22
- get: mockGet,
23
- interceptors: {
24
- request: { use: jest.fn() },
25
- response: { use: jest.fn() },
26
- },
27
- };
28
-
29
- jest.mock('../api', () => ({
30
- createApiClient: jest.fn(() => mockAxiosInstance),
31
- }));
32
-
33
- jest.mock('../authenticatedApi', () => ({
34
- createAuthenticatedApiClient: jest.fn(() => mockAxiosInstance),
35
- }));
36
-
37
- jest.mock('@digitaldefiance/ecies-lib', () => ({
38
- EciesCryptoCore: jest.fn().mockImplementation(() => ({})),
39
- ECIESService: jest.fn().mockImplementation(() => ({})),
40
- hexToUint8Array: jest.fn(),
41
- uint8ArrayToHex: jest.fn(),
42
- }));
43
-
44
- jest.mock('@digitaldefiance/suite-core-lib', () => ({
45
- getSuiteCoreTranslation: jest.fn((key: string) => key),
46
- SuiteCoreStringKey: {
47
- Common_UnexpectedError: 'common_unexpectedError',
48
- Registration_Error: 'registration_error',
49
- Registration_Success: 'registration_success',
50
- Validation_UsernameOrEmailRequired: 'validation_usernameOrEmailRequired',
51
- Validation_InvalidToken: 'validation_invalidToken',
52
- Error_Login_DirectChallengeNotEnabled:
53
- 'error_login_directChallengeNotEnabled',
54
- Error_Login_PasswordLoginNotEnabled: 'error_login_passwordLoginNotEnabled',
55
- },
56
- Constants: {},
57
- }));
58
-
59
- // Import AuthService after mocks are set up
60
- import { AuthService } from '../authService';
61
-
62
- // ─── Helpers ────────────────────────────────────────────────────────────────
63
-
64
- /**
65
- * Build a realistic AxiosError with the given status code and response data.
66
- */
67
- function buildAxiosError(
68
- status: number,
69
- data: Record<string, unknown>,
70
- ): AxiosError {
71
- const headers = new AxiosHeaders();
72
- const config = { headers } as import('axios').InternalAxiosRequestConfig;
73
- const response = {
74
- data,
75
- status,
76
- statusText: 'Error',
77
- headers: {},
78
- config,
79
- };
80
-
81
- return new AxiosError(
82
- `Request failed with status code ${status}`,
83
- AxiosError.ERR_BAD_RESPONSE,
84
- config,
85
- undefined,
86
- response,
87
- );
88
- }
89
-
90
- // ─── Tests ──────────────────────────────────────────────────────────────────
91
-
92
- describe('AuthService TOTP - Unit Tests', () => {
93
- let authService: AuthService;
94
-
95
- beforeEach(() => {
96
- mockPost.mockReset();
97
- mockGet.mockReset();
98
-
99
- const mockConstants =
100
- {} as import('@digitaldefiance/suite-core-lib').IConstants;
101
- const mockEciesConfig =
102
- {} as import('@digitaldefiance/ecies-lib').IECIESConfig;
103
-
104
- authService = new AuthService(
105
- mockConstants,
106
- 'http://localhost:3000',
107
- mockEciesConfig,
108
- 'test.example.com',
109
- );
110
- });
111
-
112
- // ─── setupTotp ──────────────────────────────────────────────────────────
113
- // Validates: Requirement 11.1
114
-
115
- describe('setupTotp', () => {
116
- it('calls POST /user/totp/setup and returns { provisioningUri, secret } on success', async () => {
117
- mockPost.mockResolvedValueOnce({
118
- data: {
119
- provisioningUri: 'otpauth://totp/Issuer:user@example.com?secret=ABCDEF',
120
- secret: 'ABCDEF',
121
- },
122
- status: 200,
123
- });
124
-
125
- const result = await authService.setupTotp();
126
-
127
- expect(mockPost).toHaveBeenCalledWith('/user/totp/setup');
128
- expect(result).toEqual({
129
- provisioningUri: 'otpauth://totp/Issuer:user@example.com?secret=ABCDEF',
130
- secret: 'ABCDEF',
131
- });
132
- });
133
-
134
- it('returns { error } when the backend returns a non-2xx response with message', async () => {
135
- mockPost.mockRejectedValueOnce(
136
- buildAxiosError(409, { message: 'TOTP is already active' }),
137
- );
138
-
139
- const result = await authService.setupTotp();
140
-
141
- expect(result).toEqual({ error: 'TOTP is already active' });
142
- });
143
-
144
- it('returns { error } when the backend returns a non-2xx response with error string', async () => {
145
- mockPost.mockRejectedValueOnce(
146
- buildAxiosError(500, { error: 'Internal server error' }),
147
- );
148
-
149
- const result = await authService.setupTotp();
150
-
151
- expect(result).toEqual({ error: 'Internal server error' });
152
- });
153
-
154
- it('returns fallback error when a non-Axios error is thrown', async () => {
155
- mockPost.mockRejectedValueOnce(new Error('Network failure'));
156
-
157
- const result = await authService.setupTotp();
158
-
159
- expect(result).toHaveProperty('error');
160
- expect(typeof (result as { error: string }).error).toBe('string');
161
- expect((result as { error: string }).error.length).toBeGreaterThan(0);
162
- });
163
- });
164
-
165
- // ─── confirmTotp ────────────────────────────────────────────────────────
166
- // Validates: Requirement 11.2
167
-
168
- describe('confirmTotp', () => {
169
- it('calls POST /user/totp/confirm with { code } and returns { success: true } on success', async () => {
170
- mockPost.mockResolvedValueOnce({
171
- data: { message: 'TOTP confirmed' },
172
- status: 200,
173
- });
174
-
175
- const result = await authService.confirmTotp('123456');
176
-
177
- expect(mockPost).toHaveBeenCalledWith('/user/totp/confirm', {
178
- code: '123456',
179
- });
180
- expect(result).toEqual({ success: true });
181
- });
182
-
183
- it('returns { error } when the backend returns a non-2xx response', async () => {
184
- mockPost.mockRejectedValueOnce(
185
- buildAxiosError(400, { message: 'Invalid TOTP code' }),
186
- );
187
-
188
- const result = await authService.confirmTotp('000000');
189
-
190
- expect(result).toEqual({ error: 'Invalid TOTP code' });
191
- });
192
-
193
- it('returns { error } when no pending secret exists', async () => {
194
- mockPost.mockRejectedValueOnce(
195
- buildAxiosError(400, {
196
- message: 'TOTP setup has not been initiated',
197
- }),
198
- );
199
-
200
- const result = await authService.confirmTotp('123456');
201
-
202
- expect(result).toEqual({
203
- error: 'TOTP setup has not been initiated',
204
- });
205
- });
206
-
207
- it('returns fallback error when a non-Axios error is thrown', async () => {
208
- mockPost.mockRejectedValueOnce(new Error('Network failure'));
209
-
210
- const result = await authService.confirmTotp('123456');
211
-
212
- expect(result).toHaveProperty('error');
213
- expect(typeof (result as { error: string }).error).toBe('string');
214
- });
215
- });
216
-
217
- // ─── disableTotp ────────────────────────────────────────────────────────
218
- // Validates: Requirement 11.3
219
-
220
- describe('disableTotp', () => {
221
- it('calls POST /user/totp/disable with { code } and returns { success: true } on success', async () => {
222
- mockPost.mockResolvedValueOnce({
223
- data: { message: 'TOTP disabled' },
224
- status: 200,
225
- });
226
-
227
- const result = await authService.disableTotp('654321');
228
-
229
- expect(mockPost).toHaveBeenCalledWith('/user/totp/disable', {
230
- code: '654321',
231
- });
232
- expect(result).toEqual({ success: true });
233
- });
234
-
235
- it('returns { error } when the backend returns a non-2xx response', async () => {
236
- mockPost.mockRejectedValueOnce(
237
- buildAxiosError(400, { message: 'Invalid TOTP code' }),
238
- );
239
-
240
- const result = await authService.disableTotp('000000');
241
-
242
- expect(result).toEqual({ error: 'Invalid TOTP code' });
243
- });
244
-
245
- it('returns { error } when TOTP is not currently active', async () => {
246
- mockPost.mockRejectedValueOnce(
247
- buildAxiosError(409, {
248
- message: 'TOTP is not currently active',
249
- }),
250
- );
251
-
252
- const result = await authService.disableTotp('123456');
253
-
254
- expect(result).toEqual({
255
- error: 'TOTP is not currently active',
256
- });
257
- });
258
-
259
- it('returns fallback error when a non-Axios error is thrown', async () => {
260
- mockPost.mockRejectedValueOnce(new Error('Network failure'));
261
-
262
- const result = await authService.disableTotp('123456');
263
-
264
- expect(result).toHaveProperty('error');
265
- expect(typeof (result as { error: string }).error).toBe('string');
266
- });
267
- });
268
-
269
- // ─── resetTotp ──────────────────────────────────────────────────────────
270
- // Validates: Requirement 15.7 (resetTotp method)
271
-
272
- describe('resetTotp', () => {
273
- it('calls POST /user/totp/reset with { code } and returns { provisioningUri, secret } on success', async () => {
274
- mockPost.mockResolvedValueOnce({
275
- data: {
276
- provisioningUri: 'otpauth://totp/Issuer:user@example.com?secret=NEWKEY',
277
- secret: 'NEWKEY',
278
- },
279
- status: 200,
280
- });
281
-
282
- const result = await authService.resetTotp('123456');
283
-
284
- expect(mockPost).toHaveBeenCalledWith('/user/totp/reset', {
285
- code: '123456',
286
- });
287
- expect(result).toEqual({
288
- provisioningUri: 'otpauth://totp/Issuer:user@example.com?secret=NEWKEY',
289
- secret: 'NEWKEY',
290
- });
291
- });
292
-
293
- it('returns { error } when the backend returns a non-2xx response', async () => {
294
- mockPost.mockRejectedValueOnce(
295
- buildAxiosError(400, { message: 'Invalid TOTP code' }),
296
- );
297
-
298
- const result = await authService.resetTotp('000000');
299
-
300
- expect(result).toEqual({ error: 'Invalid TOTP code' });
301
- });
302
-
303
- it('returns { error } when TOTP is not currently active', async () => {
304
- mockPost.mockRejectedValueOnce(
305
- buildAxiosError(409, {
306
- message: 'TOTP is not currently active',
307
- }),
308
- );
309
-
310
- const result = await authService.resetTotp('123456');
311
-
312
- expect(result).toEqual({
313
- error: 'TOTP is not currently active',
314
- });
315
- });
316
-
317
- it('returns fallback error when a non-Axios error is thrown', async () => {
318
- mockPost.mockRejectedValueOnce(new Error('Network failure'));
319
-
320
- const result = await authService.resetTotp('123456');
321
-
322
- expect(result).toHaveProperty('error');
323
- expect(typeof (result as { error: string }).error).toBe('string');
324
- });
325
- });
326
-
327
- // ─── verifyTotpLogin ───────────────────────────────────────────────────
328
- // Validates: Requirement 11.4
329
-
330
- describe('verifyTotpLogin', () => {
331
- it('calls POST /user/totp/verify with { code } and Authorization header, returns { token, user } on success', async () => {
332
- const mockUser = { id: 'user-123', username: 'testuser' };
333
- mockPost.mockResolvedValueOnce({
334
- data: {
335
- token: 'full-jwt-token',
336
- user: mockUser,
337
- },
338
- status: 200,
339
- });
340
-
341
- const result = await authService.verifyTotpLogin(
342
- 'pending-totp-token',
343
- '123456',
344
- );
345
-
346
- expect(mockPost).toHaveBeenCalledWith(
347
- '/user/totp/verify',
348
- { code: '123456' },
349
- { headers: { Authorization: 'Bearer pending-totp-token' } },
350
- );
351
- expect(result).toEqual({
352
- token: 'full-jwt-token',
353
- user: mockUser,
354
- });
355
- });
356
-
357
- it('returns { error } when the backend returns a non-2xx response', async () => {
358
- mockPost.mockRejectedValueOnce(
359
- buildAxiosError(400, { message: 'Invalid TOTP code' }),
360
- );
361
-
362
- const result = await authService.verifyTotpLogin(
363
- 'pending-totp-token',
364
- '000000',
365
- );
366
-
367
- expect(result).toEqual({ error: 'Invalid TOTP code' });
368
- });
369
-
370
- it('returns { error } when the pending token is expired', async () => {
371
- mockPost.mockRejectedValueOnce(
372
- buildAxiosError(401, { message: 'Token expired' }),
373
- );
374
-
375
- const result = await authService.verifyTotpLogin(
376
- 'expired-token',
377
- '123456',
378
- );
379
-
380
- expect(result).toEqual({ error: 'Token expired' });
381
- });
382
-
383
- it('returns { error } when the pending token is invalid', async () => {
384
- mockPost.mockRejectedValueOnce(
385
- buildAxiosError(401, { message: 'Invalid token' }),
386
- );
387
-
388
- const result = await authService.verifyTotpLogin(
389
- 'invalid-token',
390
- '123456',
391
- );
392
-
393
- expect(result).toEqual({ error: 'Invalid token' });
394
- });
395
-
396
- it('returns fallback error when a non-Axios error is thrown', async () => {
397
- mockPost.mockRejectedValueOnce(new Error('Network failure'));
398
-
399
- const result = await authService.verifyTotpLogin(
400
- 'pending-totp-token',
401
- '123456',
402
- );
403
-
404
- expect(result).toHaveProperty('error');
405
- expect(typeof (result as { error: string }).error).toBe('string');
406
- });
407
- });
408
-
409
- // ─── Error extraction edge cases ─────────────────────────────────────
410
- // Validates: Requirement 11.5
411
-
412
- describe('error extraction edge cases', () => {
413
- it('extracts error from response.data.error when it is an object with message', async () => {
414
- mockPost.mockRejectedValueOnce(
415
- buildAxiosError(500, {
416
- error: { message: 'Decryption failed', statusCode: 500 },
417
- }),
418
- );
419
-
420
- const result = await authService.setupTotp();
421
-
422
- expect(result).toEqual({ error: 'Decryption failed' });
423
- });
424
-
425
- it('prefers error string over message when both are present', async () => {
426
- mockPost.mockRejectedValueOnce(
427
- buildAxiosError(400, {
428
- error: 'Specific error',
429
- message: 'General message',
430
- }),
431
- );
432
-
433
- const result = await authService.confirmTotp('123456');
434
-
435
- // extractErrorMessage checks error (string) first, then error.message, then message
436
- expect(result).toEqual({ error: 'Specific error' });
437
- });
438
- });
439
- });
@@ -1,13 +0,0 @@
1
- import axios from 'axios';
2
-
3
- export function createApiClient(baseURL: string) {
4
- const api = axios.create({ baseURL });
5
-
6
- api.interceptors.request.use((config) => {
7
- const languageCode = localStorage.getItem('languageCode') ?? 'en-US';
8
- config.headers['Accept-Language'] = languageCode;
9
- return config;
10
- });
11
-
12
- return api;
13
- }