@scality/data-browser-library 1.0.0-preview.9 → 1.0.1

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 (285) hide show
  1. package/dist/components/DataBrowserUI.d.ts +12 -0
  2. package/dist/components/DataBrowserUI.js +99 -0
  3. package/dist/components/Editor.d.ts +1 -1
  4. package/dist/components/Editor.js +3 -3
  5. package/dist/components/__tests__/BucketAccessor.test.js +214 -0
  6. package/dist/components/__tests__/BucketCorsPage.test.d.ts +1 -0
  7. package/dist/components/__tests__/BucketCorsPage.test.js +263 -0
  8. package/dist/components/__tests__/BucketCreate.test.js +271 -105
  9. package/dist/components/__tests__/BucketDetails.test.d.ts +1 -0
  10. package/dist/components/__tests__/BucketDetails.test.js +421 -0
  11. package/dist/components/__tests__/BucketLifecycleFormPage.test.d.ts +13 -0
  12. package/dist/components/__tests__/BucketLifecycleFormPage.test.js +178 -178
  13. package/dist/components/__tests__/BucketLifecycleList.test.js +85 -85
  14. package/dist/components/__tests__/BucketList.test.js +463 -239
  15. package/dist/components/__tests__/BucketNotificationFormPage.test.d.ts +1 -0
  16. package/dist/components/__tests__/BucketNotificationFormPage.test.js +348 -0
  17. package/dist/components/__tests__/BucketNotificationList.test.d.ts +1 -0
  18. package/dist/components/__tests__/BucketNotificationList.test.js +379 -0
  19. package/dist/components/__tests__/BucketOverview.test.js +281 -266
  20. package/dist/components/__tests__/BucketPolicyPage.test.js +151 -99
  21. package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +15 -0
  22. package/dist/components/__tests__/BucketReplicationFormPage.test.js +544 -544
  23. package/dist/components/__tests__/BucketReplicationList.test.js +106 -106
  24. package/dist/components/__tests__/CreateFolderButton.test.js +56 -56
  25. package/dist/components/__tests__/DeleteBucketButton.test.js +64 -64
  26. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +47 -47
  27. package/dist/components/__tests__/DeleteObjectButton.test.js +64 -64
  28. package/dist/components/__tests__/EmptyBucketButton.test.js +59 -59
  29. package/dist/components/__tests__/MetadataSearch.test.js +65 -65
  30. package/dist/components/__tests__/ObjectList.test.js +741 -240
  31. package/dist/components/__tests__/UploadButton.test.js +45 -45
  32. package/dist/components/breadcrumb/Breadcrumb.d.ts +6 -0
  33. package/dist/components/breadcrumb/Breadcrumb.js +37 -0
  34. package/dist/components/breadcrumb/DataBrowserBreadcrumb.d.ts +1 -0
  35. package/dist/components/breadcrumb/DataBrowserBreadcrumb.js +10 -0
  36. package/dist/components/breadcrumb/__tests__/Breadcrumb.test.d.ts +1 -0
  37. package/dist/components/breadcrumb/__tests__/Breadcrumb.test.js +196 -0
  38. package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.d.ts +1 -0
  39. package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.js +153 -0
  40. package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.d.ts +1 -0
  41. package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.js +134 -0
  42. package/dist/components/breadcrumb/index.d.ts +8 -0
  43. package/dist/components/breadcrumb/index.js +4 -0
  44. package/dist/components/breadcrumb/useBreadcrumbPaths.d.ts +2 -0
  45. package/dist/components/breadcrumb/useBreadcrumbPaths.js +82 -0
  46. package/dist/components/buckets/BucketAccessor.d.ts +2 -0
  47. package/dist/components/buckets/BucketAccessor.js +125 -0
  48. package/dist/components/buckets/BucketConfigEditButton.d.ts +8 -0
  49. package/dist/components/buckets/{BucketPolicyButton.js → BucketConfigEditButton.js} +9 -5
  50. package/dist/components/buckets/BucketCorsPage.d.ts +1 -0
  51. package/dist/components/buckets/BucketCorsPage.js +234 -0
  52. package/dist/components/buckets/BucketCreate.d.ts +3 -2
  53. package/dist/components/buckets/BucketCreate.js +89 -47
  54. package/dist/components/buckets/BucketDetails.d.ts +42 -0
  55. package/dist/components/buckets/BucketDetails.js +249 -85
  56. package/dist/components/buckets/BucketLifecycleFormPage.js +206 -190
  57. package/dist/components/buckets/BucketLifecycleList.d.ts +2 -2
  58. package/dist/components/buckets/BucketLifecycleList.js +47 -47
  59. package/dist/components/buckets/BucketList.d.ts +7 -8
  60. package/dist/components/buckets/BucketList.js +158 -101
  61. package/dist/components/buckets/BucketLocation.js +4 -4
  62. package/dist/components/buckets/BucketOverview.d.ts +22 -2
  63. package/dist/components/buckets/BucketOverview.js +394 -187
  64. package/dist/components/buckets/BucketPage.js +43 -21
  65. package/dist/components/buckets/BucketPolicyPage.js +155 -127
  66. package/dist/components/buckets/BucketReplicationFormPage.js +134 -133
  67. package/dist/components/buckets/BucketReplicationList.d.ts +2 -2
  68. package/dist/components/buckets/BucketReplicationList.js +42 -42
  69. package/dist/components/buckets/BucketVersioning.d.ts +4 -0
  70. package/dist/components/buckets/BucketVersioning.js +76 -0
  71. package/dist/components/buckets/DeleteBucketButton.js +8 -8
  72. package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +2 -2
  73. package/dist/components/buckets/DeleteBucketConfigRuleButton.js +2 -2
  74. package/dist/components/buckets/EmptyBucketButton.js +24 -24
  75. package/dist/components/buckets/EmptyBucketSummary.d.ts +2 -2
  76. package/dist/components/buckets/EmptyBucketSummary.js +1 -1
  77. package/dist/components/buckets/EmptyBucketSummaryList.d.ts +1 -1
  78. package/dist/components/buckets/EmptyBucketSummaryList.js +22 -22
  79. package/dist/components/buckets/__tests__/BucketVersioning.test.d.ts +1 -0
  80. package/dist/components/buckets/__tests__/BucketVersioning.test.js +163 -0
  81. package/dist/components/buckets/notifications/BucketNotificationFormPage.d.ts +1 -0
  82. package/dist/components/buckets/notifications/BucketNotificationFormPage.js +316 -0
  83. package/dist/components/buckets/notifications/BucketNotificationList.d.ts +10 -0
  84. package/dist/components/buckets/notifications/BucketNotificationList.js +267 -0
  85. package/dist/components/buckets/notifications/EventsSection.js +145 -29
  86. package/dist/components/buckets/notifications/__tests__/events.test.d.ts +1 -0
  87. package/dist/components/buckets/notifications/__tests__/events.test.js +56 -0
  88. package/dist/components/buckets/notifications/events.d.ts +71 -7
  89. package/dist/components/buckets/notifications/events.js +98 -16
  90. package/dist/components/index.d.ts +27 -20
  91. package/dist/components/index.js +17 -10
  92. package/dist/components/layouts/ArrowNavigation.d.ts +3 -0
  93. package/dist/components/layouts/ArrowNavigation.js +28 -0
  94. package/dist/components/layouts/BrowserPageLayout.d.ts +5 -1
  95. package/dist/components/layouts/BrowserPageLayout.js +10 -5
  96. package/dist/components/objects/CreateFolderButton.d.ts +2 -2
  97. package/dist/components/objects/CreateFolderButton.js +12 -12
  98. package/dist/components/objects/DeleteObjectButton.d.ts +1 -1
  99. package/dist/components/objects/DeleteObjectButton.js +19 -21
  100. package/dist/components/objects/GetPresignedUrlButton.d.ts +7 -0
  101. package/dist/components/objects/GetPresignedUrlButton.js +255 -0
  102. package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +2 -2
  103. package/dist/components/objects/ObjectDetails/ObjectMetadata.js +263 -230
  104. package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +2 -2
  105. package/dist/components/objects/ObjectDetails/ObjectSummary.js +540 -138
  106. package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +2 -2
  107. package/dist/components/objects/ObjectDetails/ObjectTags.js +95 -123
  108. package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.d.ts +1 -0
  109. package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.js +516 -0
  110. package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.d.ts +1 -0
  111. package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.js +1064 -0
  112. package/dist/components/objects/ObjectDetails/index.d.ts +18 -2
  113. package/dist/components/objects/ObjectDetails/index.js +152 -40
  114. package/dist/components/objects/ObjectList.d.ts +12 -10
  115. package/dist/components/objects/ObjectList.js +590 -263
  116. package/dist/components/objects/ObjectLock/EditRetentionButton.js +4 -4
  117. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +15 -15
  118. package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +1 -1
  119. package/dist/components/objects/ObjectLock/ObjectLockSettings.js +32 -31
  120. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +1 -1
  121. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +6 -6
  122. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +51 -51
  123. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +78 -78
  124. package/dist/components/objects/ObjectPage.js +12 -8
  125. package/dist/components/objects/UploadButton.d.ts +3 -3
  126. package/dist/components/objects/UploadButton.js +10 -10
  127. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.d.ts +1 -0
  128. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.js +531 -0
  129. package/dist/components/providers/DataBrowserProvider.d.ts +23 -12
  130. package/dist/components/providers/DataBrowserProvider.js +60 -38
  131. package/dist/components/providers/QueryProvider.d.ts +9 -0
  132. package/dist/components/providers/QueryProvider.js +21 -0
  133. package/dist/components/search/MetadataSearch.js +29 -28
  134. package/dist/components/search/SearchHints.js +1 -1
  135. package/dist/components/ui/ArrayFieldActions.js +12 -7
  136. package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +2 -2
  137. package/dist/components/ui/ConfirmDeleteRuleModal.js +6 -1
  138. package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
  139. package/dist/components/ui/DeleteObjectModalContent.js +12 -12
  140. package/dist/components/ui/FilterFormSection.d.ts +2 -2
  141. package/dist/components/ui/FilterFormSection.js +29 -29
  142. package/dist/components/ui/Search.elements.d.ts +2 -2
  143. package/dist/components/ui/Search.elements.js +7 -7
  144. package/dist/components/ui/Table.elements.d.ts +2 -1
  145. package/dist/components/ui/Table.elements.js +18 -12
  146. package/dist/config/__tests__/factory.test.d.ts +1 -0
  147. package/dist/config/__tests__/factory.test.js +311 -0
  148. package/dist/config/factory.d.ts +10 -56
  149. package/dist/config/factory.js +23 -71
  150. package/dist/config/types.d.ts +212 -34
  151. package/dist/contexts/DataBrowserUICustomizationContext.d.ts +27 -0
  152. package/dist/contexts/DataBrowserUICustomizationContext.js +13 -0
  153. package/dist/hooks/__tests__/useAccessibleBuckets.test.d.ts +1 -0
  154. package/dist/hooks/__tests__/useAccessibleBuckets.test.js +145 -0
  155. package/dist/hooks/__tests__/useISVBucketDetection.test.js +45 -45
  156. package/dist/hooks/__tests__/useIsBucketEmpty.test.js +27 -27
  157. package/dist/hooks/__tests__/useLoginMutation.test.d.ts +1 -0
  158. package/dist/hooks/__tests__/useLoginMutation.test.js +194 -0
  159. package/dist/hooks/bucketConfiguration.d.ts +8 -1
  160. package/dist/hooks/bucketConfiguration.js +52 -51
  161. package/dist/hooks/bucketOperations.d.ts +10 -1
  162. package/dist/hooks/bucketOperations.js +10 -9
  163. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +80 -80
  164. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +80 -80
  165. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +44 -44
  166. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +63 -63
  167. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +65 -65
  168. package/dist/hooks/factories/index.d.ts +4 -4
  169. package/dist/hooks/factories/index.js +2 -2
  170. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
  171. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +16 -13
  172. package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
  173. package/dist/hooks/factories/useCreateS3LoginHook.js +1 -1
  174. package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
  175. package/dist/hooks/factories/useCreateS3MutationHook.js +7 -2
  176. package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
  177. package/dist/hooks/factories/useCreateS3QueryHook.js +11 -6
  178. package/dist/hooks/index.d.ts +19 -12
  179. package/dist/hooks/index.js +16 -9
  180. package/dist/hooks/loginOperations.d.ts +1 -1
  181. package/dist/hooks/loginOperations.js +1 -1
  182. package/dist/hooks/objectOperations.d.ts +2 -2
  183. package/dist/hooks/objectOperations.js +50 -49
  184. package/dist/hooks/presignedOperations.d.ts +4 -4
  185. package/dist/hooks/presignedOperations.js +5 -5
  186. package/dist/hooks/useAccessibleBuckets.d.ts +11 -0
  187. package/dist/hooks/useAccessibleBuckets.js +115 -0
  188. package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
  189. package/dist/hooks/useBatchObjectLegalHold.js +48 -0
  190. package/dist/hooks/useBucketConfigEditor.d.ts +31 -0
  191. package/dist/hooks/useBucketConfigEditor.js +82 -0
  192. package/dist/hooks/useDataBrowserNavigate.d.ts +28 -0
  193. package/dist/hooks/useDataBrowserNavigate.js +24 -0
  194. package/dist/hooks/useDeleteBucketConfigRule.d.ts +2 -2
  195. package/dist/hooks/useDeleteBucketConfigRule.js +4 -4
  196. package/dist/hooks/useEmptyBucket.js +11 -11
  197. package/dist/hooks/useFeatures.d.ts +7 -0
  198. package/dist/hooks/useFeatures.js +8 -0
  199. package/dist/hooks/useISVBucketDetection.js +6 -6
  200. package/dist/hooks/useIsBucketEmpty.js +4 -4
  201. package/dist/hooks/useLimitedAccessFlow.d.ts +48 -0
  202. package/dist/hooks/useLimitedAccessFlow.js +23 -0
  203. package/dist/hooks/useS3Client.d.ts +6 -0
  204. package/dist/hooks/useS3Client.js +3 -2
  205. package/dist/hooks/useS3ConfigSwitch.d.ts +11 -0
  206. package/dist/hooks/useS3ConfigSwitch.js +37 -0
  207. package/dist/hooks/useSupportedNotificationEvents.d.ts +6 -0
  208. package/dist/hooks/useSupportedNotificationEvents.js +8 -0
  209. package/dist/index.d.ts +6 -6
  210. package/dist/index.js +2 -2
  211. package/dist/schemas/bucketPolicySchema.json +3 -13
  212. package/dist/test/msw/handlers/deleteBucket.d.ts +1 -1
  213. package/dist/test/msw/handlers/deleteBucket.js +20 -10
  214. package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -1
  215. package/dist/test/msw/handlers/getBucketAcl.js +29 -17
  216. package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -1
  217. package/dist/test/msw/handlers/getBucketLocation.js +29 -15
  218. package/dist/test/msw/handlers/getBucketPolicy.d.ts +1 -1
  219. package/dist/test/msw/handlers/getBucketPolicy.js +52 -32
  220. package/dist/test/msw/handlers/headObject.d.ts +1 -1
  221. package/dist/test/msw/handlers/headObject.js +31 -13
  222. package/dist/test/msw/handlers/listBuckets.d.ts +1 -1
  223. package/dist/test/msw/handlers/listBuckets.js +5 -3
  224. package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -1
  225. package/dist/test/msw/handlers/listObjectVersions.js +38 -26
  226. package/dist/test/msw/handlers/listObjects.d.ts +1 -1
  227. package/dist/test/msw/handlers/listObjects.js +35 -23
  228. package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -1
  229. package/dist/test/msw/handlers/objectLegalHold.js +32 -17
  230. package/dist/test/msw/handlers/objectRetention.d.ts +1 -1
  231. package/dist/test/msw/handlers/objectRetention.js +31 -17
  232. package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -1
  233. package/dist/test/msw/handlers/putBucketAcl.js +29 -14
  234. package/dist/test/msw/handlers/putObject.d.ts +1 -1
  235. package/dist/test/msw/handlers/putObject.js +27 -12
  236. package/dist/test/msw/handlers.d.ts +3 -3
  237. package/dist/test/msw/handlers.js +77 -54
  238. package/dist/test/msw/index.d.ts +2 -2
  239. package/dist/test/msw/index.js +1 -1
  240. package/dist/test/msw/server.d.ts +1 -1
  241. package/dist/test/msw/server.js +1 -1
  242. package/dist/test/msw/utils.js +2 -2
  243. package/dist/test/setup.d.ts +1 -1
  244. package/dist/test/setup.js +13 -30
  245. package/dist/test/testUtils.d.ts +85 -33
  246. package/dist/test/testUtils.js +176 -111
  247. package/dist/test/utils/errorHandling.test.js +119 -119
  248. package/dist/types/index.d.ts +49 -36
  249. package/dist/types/monaco.d.ts +13 -0
  250. package/dist/types/monaco.js +0 -0
  251. package/dist/utils/__tests__/proxyMiddleware.test.d.ts +1 -0
  252. package/dist/utils/__tests__/proxyMiddleware.test.js +579 -0
  253. package/dist/utils/__tests__/s3Client.test.d.ts +1 -0
  254. package/dist/utils/__tests__/s3Client.test.js +340 -0
  255. package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
  256. package/dist/utils/__tests__/s3ConfigIdentifier.test.js +437 -0
  257. package/dist/utils/constants.d.ts +10 -0
  258. package/dist/utils/constants.js +19 -9
  259. package/dist/utils/deletion/index.d.ts +2 -2
  260. package/dist/utils/deletion/index.js +1 -1
  261. package/dist/utils/deletion/messages.d.ts +1 -1
  262. package/dist/utils/deletion/messages.js +4 -4
  263. package/dist/utils/errorHandling.d.ts +3 -3
  264. package/dist/utils/errorHandling.js +6 -6
  265. package/dist/utils/hooks.js +8 -8
  266. package/dist/utils/index.d.ts +5 -4
  267. package/dist/utils/index.js +4 -2
  268. package/dist/utils/proxyMiddleware.d.ts +32 -13
  269. package/dist/utils/proxyMiddleware.js +90 -36
  270. package/dist/utils/s3Client.d.ts +14 -4
  271. package/dist/utils/s3Client.js +5 -26
  272. package/dist/utils/s3ConfigIdentifier.d.ts +79 -0
  273. package/dist/utils/s3ConfigIdentifier.js +57 -0
  274. package/dist/utils/s3RuleUtils.d.ts +5 -5
  275. package/dist/utils/s3RuleUtils.js +17 -17
  276. package/package.json +10 -8
  277. package/dist/components/__tests__/BucketNotificationCreatePage.test.js +0 -316
  278. package/dist/components/buckets/BucketPolicyButton.d.ts +0 -7
  279. package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +0 -1
  280. package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +0 -234
  281. package/dist/hooks/useLoginMutation.d.ts +0 -21
  282. package/dist/hooks/useLoginMutation.js +0 -9
  283. package/dist/utils/useFeatures.d.ts +0 -1
  284. package/dist/utils/useFeatures.js +0 -7
  285. /package/dist/components/__tests__/{BucketNotificationCreatePage.test.d.ts → BucketAccessor.test.d.ts} +0 -0
@@ -0,0 +1,348 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { fireEvent, render, screen, waitFor } from "@testing-library/react";
3
+ import user_event from "@testing-library/user-event";
4
+ import { MemoryRouter, Route, Routes } from "react-router";
5
+ import { useGetBucketNotification, useSetBucketNotification } from "../../hooks/index.js";
6
+ import { createTestWrapper } from "../../test/testUtils.js";
7
+ import { BucketNotificationFormPage } from "../buckets/notifications/BucketNotificationFormPage.js";
8
+ jest.mock('../../hooks', ()=>({
9
+ useGetBucketNotification: jest.fn(),
10
+ useSetBucketNotification: jest.fn()
11
+ }));
12
+ const mockUseGetBucketNotification = jest.mocked(useGetBucketNotification);
13
+ const mockUseSetBucketNotification = jest.mocked(useSetBucketNotification);
14
+ const mockNavigate = jest.fn();
15
+ jest.mock('react-router', ()=>({
16
+ ...jest.requireActual('react-router'),
17
+ useNavigate: ()=>mockNavigate
18
+ }));
19
+ const renderCreatePage = (bucketName = 'test-bucket')=>{
20
+ const Wrapper = createTestWrapper();
21
+ return render(/*#__PURE__*/ jsx(MemoryRouter, {
22
+ initialEntries: [
23
+ `/buckets/${bucketName}/notifications/create`
24
+ ],
25
+ children: /*#__PURE__*/ jsx(Wrapper, {
26
+ children: /*#__PURE__*/ jsx(Routes, {
27
+ children: /*#__PURE__*/ jsx(Route, {
28
+ path: "/buckets/:bucketName/notifications/create",
29
+ element: /*#__PURE__*/ jsx(BucketNotificationFormPage, {})
30
+ })
31
+ })
32
+ })
33
+ }));
34
+ };
35
+ const renderEditPage = (bucketName = 'test-bucket', ruleId = 'existing-rule')=>{
36
+ const Wrapper = createTestWrapper();
37
+ return render(/*#__PURE__*/ jsx(MemoryRouter, {
38
+ initialEntries: [
39
+ `/buckets/${bucketName}/notifications/edit/${ruleId}`
40
+ ],
41
+ children: /*#__PURE__*/ jsx(Wrapper, {
42
+ children: /*#__PURE__*/ jsx(Routes, {
43
+ children: /*#__PURE__*/ jsx(Route, {
44
+ path: "/buckets/:bucketName/notifications/edit/:ruleId",
45
+ element: /*#__PURE__*/ jsx(BucketNotificationFormPage, {})
46
+ })
47
+ })
48
+ })
49
+ }));
50
+ };
51
+ describe('BucketNotificationFormPage', ()=>{
52
+ const mockMutate = jest.fn();
53
+ beforeEach(()=>{
54
+ jest.clearAllMocks();
55
+ mockNavigate.mockClear();
56
+ mockUseGetBucketNotification.mockReturnValue({
57
+ data: void 0,
58
+ status: 'success'
59
+ });
60
+ mockUseSetBucketNotification.mockReturnValue({
61
+ mutate: mockMutate,
62
+ isPending: false
63
+ });
64
+ });
65
+ describe('Create Mode', ()=>{
66
+ it('renders create notification form with all fields', ()=>{
67
+ renderCreatePage();
68
+ expect(screen.getByText('Create Bucket Notification')).toBeInTheDocument();
69
+ expect(screen.getByLabelText(/rule name/i)).toBeInTheDocument();
70
+ expect(screen.getByText('Events')).toBeInTheDocument();
71
+ expect(screen.getByLabelText(/destination queue/i)).toBeInTheDocument();
72
+ expect(screen.getByLabelText(/prefix/i)).toBeInTheDocument();
73
+ expect(screen.getByLabelText(/suffix/i)).toBeInTheDocument();
74
+ });
75
+ it('disables create button when form is pristine', ()=>{
76
+ renderCreatePage();
77
+ expect(screen.getByRole('button', {
78
+ name: /create/i
79
+ })).toBeDisabled();
80
+ });
81
+ it('shows validation error when rule name is empty', async ()=>{
82
+ renderCreatePage();
83
+ const ruleNameInput = screen.getByLabelText(/rule name/i);
84
+ await user_event.type(ruleNameInput, 'a');
85
+ await user_event.clear(ruleNameInput);
86
+ await waitFor(()=>{
87
+ expect(screen.getByText(/this field is required/i)).toBeInTheDocument();
88
+ });
89
+ });
90
+ it('shows validation error when rule name already exists', async ()=>{
91
+ const existingConfig = {
92
+ QueueConfigurations: [
93
+ {
94
+ Id: 'existing-rule',
95
+ QueueArn: 'arn:aws:sqs:us-east-1:123:queue',
96
+ Events: [
97
+ 's3:ObjectCreated:*'
98
+ ]
99
+ }
100
+ ]
101
+ };
102
+ mockUseGetBucketNotification.mockReturnValue({
103
+ data: existingConfig,
104
+ status: 'success'
105
+ });
106
+ renderCreatePage();
107
+ const ruleNameInput = screen.getByLabelText(/rule name/i);
108
+ await user_event.type(ruleNameInput, 'existing-rule');
109
+ await waitFor(()=>{
110
+ expect(screen.getByText(/a rule with this name already exists/i)).toBeInTheDocument();
111
+ });
112
+ });
113
+ it('shows validation error when queue ARN is invalid', async ()=>{
114
+ renderCreatePage();
115
+ const queueArnInput = screen.getByLabelText(/destination queue/i);
116
+ await user_event.type(queueArnInput, 'invalid-arn');
117
+ await waitFor(()=>{
118
+ expect(screen.getByText(/must be a valid arn/i)).toBeInTheDocument();
119
+ });
120
+ });
121
+ it('enables create button when form is valid', async ()=>{
122
+ renderCreatePage();
123
+ await user_event.type(screen.getByLabelText(/rule name/i), 'test-rule');
124
+ await user_event.type(screen.getByLabelText(/destination queue/i), 'arn:aws:sqs:us-east-1:123:queue');
125
+ const checkbox = screen.getByRole('checkbox', {
126
+ name: /s3:ObjectCreated:\*/i
127
+ });
128
+ fireEvent.click(checkbox);
129
+ await waitFor(()=>{
130
+ expect(screen.getByRole('button', {
131
+ name: /create/i
132
+ })).toBeEnabled();
133
+ });
134
+ });
135
+ it('creates notification with all fields and navigates on success', async ()=>{
136
+ renderCreatePage();
137
+ await user_event.type(screen.getByLabelText(/rule name/i), 'test-rule');
138
+ await user_event.type(screen.getByLabelText(/destination queue/i), 'arn:aws:sqs:us-east-1:123:my-queue');
139
+ fireEvent.click(screen.getByRole('checkbox', {
140
+ name: /s3:ObjectCreated:Put/i
141
+ }));
142
+ await user_event.type(screen.getByLabelText(/prefix/i), 'uploads/');
143
+ await user_event.type(screen.getByLabelText(/suffix/i), '.jpg');
144
+ mockMutate.mockImplementation((_, options)=>{
145
+ options?.onSuccess?.();
146
+ });
147
+ const createButton = screen.getByRole('button', {
148
+ name: /create/i
149
+ });
150
+ await waitFor(()=>expect(createButton).toBeEnabled());
151
+ fireEvent.click(createButton);
152
+ await waitFor(()=>{
153
+ expect(mockMutate).toHaveBeenCalledWith({
154
+ Bucket: 'test-bucket',
155
+ NotificationConfiguration: {
156
+ QueueConfigurations: [
157
+ {
158
+ Id: 'test-rule',
159
+ QueueArn: 'arn:aws:sqs:us-east-1:123:my-queue',
160
+ Events: [
161
+ 's3:ObjectCreated:Put'
162
+ ],
163
+ Filter: {
164
+ Key: {
165
+ FilterRules: [
166
+ {
167
+ Name: 'prefix',
168
+ Value: 'uploads/'
169
+ },
170
+ {
171
+ Name: 'suffix',
172
+ Value: '.jpg'
173
+ }
174
+ ]
175
+ }
176
+ }
177
+ }
178
+ ]
179
+ }
180
+ }, expect.any(Object));
181
+ expect(mockNavigate).toHaveBeenCalledWith('/buckets/test-bucket?tab=notification');
182
+ });
183
+ });
184
+ it('handles cancel button click and navigates back', ()=>{
185
+ renderCreatePage();
186
+ const cancelButton = screen.getByRole('button', {
187
+ name: /cancel/i
188
+ });
189
+ fireEvent.click(cancelButton);
190
+ expect(mockNavigate).toHaveBeenCalledWith('/buckets/test-bucket?tab=notification');
191
+ });
192
+ it('shows loading state while fetching notification data', ()=>{
193
+ mockUseGetBucketNotification.mockReturnValue({
194
+ data: void 0,
195
+ status: 'pending'
196
+ });
197
+ renderCreatePage();
198
+ expect(screen.getByText(/loading/i)).toBeInTheDocument();
199
+ });
200
+ it('shows error message when notification data fails to load', ()=>{
201
+ mockUseGetBucketNotification.mockReturnValue({
202
+ data: void 0,
203
+ status: 'error',
204
+ error: new Error('Failed to fetch notification configuration')
205
+ });
206
+ renderCreatePage();
207
+ expect(screen.getByText(/failed to fetch notification configuration/i)).toBeInTheDocument();
208
+ });
209
+ it('shows generic error message when error is not an Error instance', ()=>{
210
+ mockUseGetBucketNotification.mockReturnValue({
211
+ data: void 0,
212
+ status: 'error',
213
+ error: 'Unknown error'
214
+ });
215
+ renderCreatePage();
216
+ expect(screen.getByText(/failed to load notification configuration/i)).toBeInTheDocument();
217
+ });
218
+ });
219
+ describe('Edit Mode', ()=>{
220
+ const existingConfig = {
221
+ QueueConfigurations: [
222
+ {
223
+ Id: 'existing-rule',
224
+ QueueArn: 'arn:aws:sqs:us-east-1:123:existing-queue',
225
+ Events: [
226
+ 's3:ObjectCreated:Put',
227
+ 's3:ObjectRemoved:Delete'
228
+ ],
229
+ Filter: {
230
+ Key: {
231
+ FilterRules: [
232
+ {
233
+ Name: 'prefix',
234
+ Value: 'data/'
235
+ },
236
+ {
237
+ Name: 'suffix',
238
+ Value: '.json'
239
+ }
240
+ ]
241
+ }
242
+ }
243
+ }
244
+ ]
245
+ };
246
+ beforeEach(()=>{
247
+ mockUseGetBucketNotification.mockReturnValue({
248
+ data: existingConfig,
249
+ status: 'success'
250
+ });
251
+ });
252
+ it('renders edit notification form with correct title', ()=>{
253
+ renderEditPage();
254
+ expect(screen.getByText('Edit Bucket Notification')).toBeInTheDocument();
255
+ });
256
+ it('displays rule name as read-only text in edit mode', ()=>{
257
+ renderEditPage();
258
+ expect(screen.getByText('existing-rule')).toBeInTheDocument();
259
+ expect(screen.queryByRole('textbox', {
260
+ name: /rule name/i
261
+ })).not.toBeInTheDocument();
262
+ });
263
+ it('pre-fills form with existing rule data', async ()=>{
264
+ renderEditPage();
265
+ await waitFor(()=>{
266
+ expect(screen.getByLabelText(/destination queue/i)).toHaveValue('arn:aws:sqs:us-east-1:123:existing-queue');
267
+ expect(screen.getByLabelText(/prefix/i)).toHaveValue('data/');
268
+ expect(screen.getByLabelText(/suffix/i)).toHaveValue('.json');
269
+ });
270
+ });
271
+ it('shows Save button instead of Create in edit mode', ()=>{
272
+ renderEditPage();
273
+ expect(screen.getByRole('button', {
274
+ name: /save/i
275
+ })).toBeInTheDocument();
276
+ expect(screen.queryByRole('button', {
277
+ name: /create/i
278
+ })).not.toBeInTheDocument();
279
+ });
280
+ it('updates notification and navigates on success', async ()=>{
281
+ renderEditPage();
282
+ await waitFor(()=>{
283
+ expect(screen.getByLabelText(/destination queue/i)).toHaveValue('arn:aws:sqs:us-east-1:123:existing-queue');
284
+ });
285
+ const queueInput = screen.getByLabelText(/destination queue/i);
286
+ await user_event.clear(queueInput);
287
+ await user_event.type(queueInput, 'arn:aws:sqs:us-east-1:123:updated-queue');
288
+ mockMutate.mockImplementation((_, options)=>{
289
+ options?.onSuccess?.();
290
+ });
291
+ const saveButton = screen.getByRole('button', {
292
+ name: /save/i
293
+ });
294
+ await waitFor(()=>expect(saveButton).toBeEnabled());
295
+ fireEvent.click(saveButton);
296
+ await waitFor(()=>{
297
+ expect(mockMutate).toHaveBeenCalledWith(expect.objectContaining({
298
+ Bucket: 'test-bucket',
299
+ NotificationConfiguration: {
300
+ QueueConfigurations: [
301
+ expect.objectContaining({
302
+ Id: 'existing-rule',
303
+ QueueArn: 'arn:aws:sqs:us-east-1:123:updated-queue'
304
+ })
305
+ ]
306
+ }
307
+ }), expect.any(Object));
308
+ expect(mockNavigate).toHaveBeenCalledWith('/buckets/test-bucket?tab=notification');
309
+ });
310
+ });
311
+ it('shows error message when rule not found', ()=>{
312
+ mockUseGetBucketNotification.mockReturnValue({
313
+ data: {
314
+ QueueConfigurations: []
315
+ },
316
+ status: 'success'
317
+ });
318
+ renderEditPage('test-bucket', 'non-existent-rule');
319
+ expect(screen.getByText(/notification rule not found/i)).toBeInTheDocument();
320
+ });
321
+ it('shows error message when rule exists but has no Id', ()=>{
322
+ mockUseGetBucketNotification.mockReturnValue({
323
+ data: {
324
+ QueueConfigurations: [
325
+ {
326
+ Id: void 0,
327
+ QueueArn: 'arn:aws:sqs:us-east-1:123:queue',
328
+ Events: [
329
+ 's3:ObjectCreated:*'
330
+ ]
331
+ }
332
+ ]
333
+ },
334
+ status: 'success'
335
+ });
336
+ renderEditPage('test-bucket', 'undefined');
337
+ expect(screen.getByText(/notification rule not found/i)).toBeInTheDocument();
338
+ });
339
+ it('handles cancel button click in edit mode', ()=>{
340
+ renderEditPage();
341
+ const cancelButton = screen.getByRole('button', {
342
+ name: /cancel/i
343
+ });
344
+ fireEvent.click(cancelButton);
345
+ expect(mockNavigate).toHaveBeenCalledWith('/buckets/test-bucket?tab=notification');
346
+ });
347
+ });
348
+ });