@scality/data-browser-library 1.0.0-preview.11

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 (256) hide show
  1. package/dist/components/Editor.d.ts +12 -0
  2. package/dist/components/Editor.js +28 -0
  3. package/dist/components/__tests__/BucketCreate.test.d.ts +1 -0
  4. package/dist/components/__tests__/BucketCreate.test.js +408 -0
  5. package/dist/components/__tests__/BucketLifecycleFormPage.test.d.ts +1 -0
  6. package/dist/components/__tests__/BucketLifecycleFormPage.test.js +618 -0
  7. package/dist/components/__tests__/BucketLifecycleList.test.d.ts +1 -0
  8. package/dist/components/__tests__/BucketLifecycleList.test.js +325 -0
  9. package/dist/components/__tests__/BucketList.test.d.ts +1 -0
  10. package/dist/components/__tests__/BucketList.test.js +415 -0
  11. package/dist/components/__tests__/BucketNotificationCreatePage.test.d.ts +1 -0
  12. package/dist/components/__tests__/BucketNotificationCreatePage.test.js +316 -0
  13. package/dist/components/__tests__/BucketOverview.test.d.ts +1 -0
  14. package/dist/components/__tests__/BucketOverview.test.js +769 -0
  15. package/dist/components/__tests__/BucketPolicyPage.test.d.ts +1 -0
  16. package/dist/components/__tests__/BucketPolicyPage.test.js +268 -0
  17. package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +1 -0
  18. package/dist/components/__tests__/BucketReplicationFormPage.test.js +1757 -0
  19. package/dist/components/__tests__/BucketReplicationList.test.d.ts +1 -0
  20. package/dist/components/__tests__/BucketReplicationList.test.js +344 -0
  21. package/dist/components/__tests__/CreateFolderButton.test.d.ts +1 -0
  22. package/dist/components/__tests__/CreateFolderButton.test.js +147 -0
  23. package/dist/components/__tests__/DeleteBucketButton.test.d.ts +1 -0
  24. package/dist/components/__tests__/DeleteBucketButton.test.js +272 -0
  25. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.d.ts +1 -0
  26. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +196 -0
  27. package/dist/components/__tests__/DeleteObjectButton.test.d.ts +1 -0
  28. package/dist/components/__tests__/DeleteObjectButton.test.js +302 -0
  29. package/dist/components/__tests__/EmptyBucketButton.test.d.ts +1 -0
  30. package/dist/components/__tests__/EmptyBucketButton.test.js +302 -0
  31. package/dist/components/__tests__/MetadataSearch.test.d.ts +1 -0
  32. package/dist/components/__tests__/MetadataSearch.test.js +201 -0
  33. package/dist/components/__tests__/ObjectList.test.d.ts +1 -0
  34. package/dist/components/__tests__/ObjectList.test.js +283 -0
  35. package/dist/components/__tests__/UploadButton.test.d.ts +1 -0
  36. package/dist/components/__tests__/UploadButton.test.js +144 -0
  37. package/dist/components/buckets/BucketCreate.d.ts +49 -0
  38. package/dist/components/buckets/BucketCreate.js +237 -0
  39. package/dist/components/buckets/BucketDetails.d.ts +1 -0
  40. package/dist/components/buckets/BucketDetails.js +106 -0
  41. package/dist/components/buckets/BucketLifecycleFormPage.d.ts +15 -0
  42. package/dist/components/buckets/BucketLifecycleFormPage.js +1085 -0
  43. package/dist/components/buckets/BucketLifecycleList.d.ts +10 -0
  44. package/dist/components/buckets/BucketLifecycleList.js +270 -0
  45. package/dist/components/buckets/BucketList.d.ts +15 -0
  46. package/dist/components/buckets/BucketList.js +146 -0
  47. package/dist/components/buckets/BucketLocation.d.ts +3 -0
  48. package/dist/components/buckets/BucketLocation.js +16 -0
  49. package/dist/components/buckets/BucketOverview.d.ts +88 -0
  50. package/dist/components/buckets/BucketOverview.js +291 -0
  51. package/dist/components/buckets/BucketPage.d.ts +2 -0
  52. package/dist/components/buckets/BucketPage.js +47 -0
  53. package/dist/components/buckets/BucketPolicyButton.d.ts +7 -0
  54. package/dist/components/buckets/BucketPolicyButton.js +18 -0
  55. package/dist/components/buckets/BucketPolicyPage.d.ts +1 -0
  56. package/dist/components/buckets/BucketPolicyPage.js +236 -0
  57. package/dist/components/buckets/BucketReplicationFormPage.d.ts +1 -0
  58. package/dist/components/buckets/BucketReplicationFormPage.js +834 -0
  59. package/dist/components/buckets/BucketReplicationList.d.ts +11 -0
  60. package/dist/components/buckets/BucketReplicationList.js +189 -0
  61. package/dist/components/buckets/BucketVersioning.d.ts +4 -0
  62. package/dist/components/buckets/BucketVersioning.js +73 -0
  63. package/dist/components/buckets/DeleteBucketButton.d.ts +8 -0
  64. package/dist/components/buckets/DeleteBucketButton.js +78 -0
  65. package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +18 -0
  66. package/dist/components/buckets/DeleteBucketConfigRuleButton.js +53 -0
  67. package/dist/components/buckets/EmptyBucketButton.d.ts +5 -0
  68. package/dist/components/buckets/EmptyBucketButton.js +232 -0
  69. package/dist/components/buckets/EmptyBucketSummary.d.ts +9 -0
  70. package/dist/components/buckets/EmptyBucketSummary.js +60 -0
  71. package/dist/components/buckets/EmptyBucketSummaryList.d.ts +13 -0
  72. package/dist/components/buckets/EmptyBucketSummaryList.js +140 -0
  73. package/dist/components/buckets/__tests__/BucketVersioning.test.d.ts +1 -0
  74. package/dist/components/buckets/__tests__/BucketVersioning.test.js +163 -0
  75. package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +1 -0
  76. package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +234 -0
  77. package/dist/components/buckets/notifications/EventsSection.d.ts +1 -0
  78. package/dist/components/buckets/notifications/EventsSection.js +123 -0
  79. package/dist/components/buckets/notifications/events.d.ts +12 -0
  80. package/dist/components/buckets/notifications/events.js +27 -0
  81. package/dist/components/index.d.ts +21 -0
  82. package/dist/components/index.js +22 -0
  83. package/dist/components/layouts/ArrowNavigation.d.ts +4 -0
  84. package/dist/components/layouts/ArrowNavigation.js +16 -0
  85. package/dist/components/layouts/BrowserPageLayout.d.ts +12 -0
  86. package/dist/components/layouts/BrowserPageLayout.js +51 -0
  87. package/dist/components/objects/CreateFolderButton.d.ts +29 -0
  88. package/dist/components/objects/CreateFolderButton.js +118 -0
  89. package/dist/components/objects/DeleteObjectButton.d.ts +8 -0
  90. package/dist/components/objects/DeleteObjectButton.js +191 -0
  91. package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +2 -0
  92. package/dist/components/objects/ObjectDetails/ObjectMetadata.js +356 -0
  93. package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +3 -0
  94. package/dist/components/objects/ObjectDetails/ObjectSummary.js +241 -0
  95. package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +3 -0
  96. package/dist/components/objects/ObjectDetails/ObjectTags.js +272 -0
  97. package/dist/components/objects/ObjectDetails/index.d.ts +9 -0
  98. package/dist/components/objects/ObjectDetails/index.js +75 -0
  99. package/dist/components/objects/ObjectList.d.ts +40 -0
  100. package/dist/components/objects/ObjectList.js +453 -0
  101. package/dist/components/objects/ObjectLock/EditRetentionButton.d.ts +4 -0
  102. package/dist/components/objects/ObjectLock/EditRetentionButton.js +32 -0
  103. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.d.ts +3 -0
  104. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +211 -0
  105. package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +9 -0
  106. package/dist/components/objects/ObjectLock/ObjectLockSettings.js +158 -0
  107. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +8 -0
  108. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +39 -0
  109. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.d.ts +1 -0
  110. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +204 -0
  111. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.d.ts +1 -0
  112. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +374 -0
  113. package/dist/components/objects/ObjectPage.d.ts +1 -0
  114. package/dist/components/objects/ObjectPage.js +45 -0
  115. package/dist/components/objects/UploadButton.d.ts +34 -0
  116. package/dist/components/objects/UploadButton.js +229 -0
  117. package/dist/components/providers/DataBrowserProvider.d.ts +20 -0
  118. package/dist/components/providers/DataBrowserProvider.js +42 -0
  119. package/dist/components/search/MetadataSearch.d.ts +5 -0
  120. package/dist/components/search/MetadataSearch.js +162 -0
  121. package/dist/components/search/SearchHints.d.ts +8 -0
  122. package/dist/components/search/SearchHints.js +21 -0
  123. package/dist/components/ui/ArrayFieldActions.d.ts +36 -0
  124. package/dist/components/ui/ArrayFieldActions.js +43 -0
  125. package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +16 -0
  126. package/dist/components/ui/ConfirmDeleteRuleModal.js +43 -0
  127. package/dist/components/ui/DeleteObjectModalContent.d.ts +5 -0
  128. package/dist/components/ui/DeleteObjectModalContent.js +71 -0
  129. package/dist/components/ui/FilterFormSection.d.ts +44 -0
  130. package/dist/components/ui/FilterFormSection.js +159 -0
  131. package/dist/components/ui/Search.elements.d.ts +17 -0
  132. package/dist/components/ui/Search.elements.js +59 -0
  133. package/dist/components/ui/Table.elements.d.ts +36 -0
  134. package/dist/components/ui/Table.elements.js +87 -0
  135. package/dist/config/factory.d.ts +63 -0
  136. package/dist/config/factory.js +74 -0
  137. package/dist/config/types.d.ts +46 -0
  138. package/dist/config/types.js +0 -0
  139. package/dist/hooks/__tests__/useISVBucketDetection.test.d.ts +1 -0
  140. package/dist/hooks/__tests__/useISVBucketDetection.test.js +188 -0
  141. package/dist/hooks/__tests__/useIsBucketEmpty.test.d.ts +1 -0
  142. package/dist/hooks/__tests__/useIsBucketEmpty.test.js +122 -0
  143. package/dist/hooks/bucketConfiguration.d.ts +168 -0
  144. package/dist/hooks/bucketConfiguration.js +67 -0
  145. package/dist/hooks/bucketOperations.d.ts +36 -0
  146. package/dist/hooks/bucketOperations.js +12 -0
  147. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.d.ts +1 -0
  148. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +276 -0
  149. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.d.ts +1 -0
  150. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +259 -0
  151. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.d.ts +1 -0
  152. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +166 -0
  153. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.d.ts +1 -0
  154. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +200 -0
  155. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.d.ts +1 -0
  156. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +179 -0
  157. package/dist/hooks/factories/index.d.ts +18 -0
  158. package/dist/hooks/factories/index.js +5 -0
  159. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +13 -0
  160. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +76 -0
  161. package/dist/hooks/factories/useCreateS3LoginHook.d.ts +8 -0
  162. package/dist/hooks/factories/useCreateS3LoginHook.js +22 -0
  163. package/dist/hooks/factories/useCreateS3MutationHook.d.ts +5 -0
  164. package/dist/hooks/factories/useCreateS3MutationHook.js +50 -0
  165. package/dist/hooks/factories/useCreateS3QueryHook.d.ts +3 -0
  166. package/dist/hooks/factories/useCreateS3QueryHook.js +51 -0
  167. package/dist/hooks/index.d.ts +13 -0
  168. package/dist/hooks/index.js +13 -0
  169. package/dist/hooks/loginOperations.d.ts +21 -0
  170. package/dist/hooks/loginOperations.js +9 -0
  171. package/dist/hooks/objectOperations.d.ts +190 -0
  172. package/dist/hooks/objectOperations.js +67 -0
  173. package/dist/hooks/presignedOperations.d.ts +73 -0
  174. package/dist/hooks/presignedOperations.js +72 -0
  175. package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
  176. package/dist/hooks/useBatchObjectLegalHold.js +45 -0
  177. package/dist/hooks/useDeleteBucketConfigRule.d.ts +26 -0
  178. package/dist/hooks/useDeleteBucketConfigRule.js +46 -0
  179. package/dist/hooks/useEmptyBucket.d.ts +27 -0
  180. package/dist/hooks/useEmptyBucket.js +116 -0
  181. package/dist/hooks/useISVBucketDetection.d.ts +15 -0
  182. package/dist/hooks/useISVBucketDetection.js +27 -0
  183. package/dist/hooks/useIsBucketEmpty.d.ts +7 -0
  184. package/dist/hooks/useIsBucketEmpty.js +36 -0
  185. package/dist/hooks/useLoginMutation.d.ts +21 -0
  186. package/dist/hooks/useLoginMutation.js +9 -0
  187. package/dist/hooks/useS3Client.d.ts +1 -0
  188. package/dist/hooks/useS3Client.js +13 -0
  189. package/dist/hooks/useTableRowSelection.d.ts +9 -0
  190. package/dist/hooks/useTableRowSelection.js +45 -0
  191. package/dist/index.d.ts +6 -0
  192. package/dist/index.js +6 -0
  193. package/dist/schemas/bucketPolicySchema.json +321 -0
  194. package/dist/test/msw/handlers/deleteBucket.d.ts +1 -0
  195. package/dist/test/msw/handlers/deleteBucket.js +14 -0
  196. package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -0
  197. package/dist/test/msw/handlers/getBucketAcl.js +96 -0
  198. package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -0
  199. package/dist/test/msw/handlers/getBucketLocation.js +23 -0
  200. package/dist/test/msw/handlers/getBucketPolicy.d.ts +11 -0
  201. package/dist/test/msw/handlers/getBucketPolicy.js +72 -0
  202. package/dist/test/msw/handlers/headObject.d.ts +1 -0
  203. package/dist/test/msw/handlers/headObject.js +17 -0
  204. package/dist/test/msw/handlers/listBuckets.d.ts +1 -0
  205. package/dist/test/msw/handlers/listBuckets.js +24 -0
  206. package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -0
  207. package/dist/test/msw/handlers/listObjectVersions.js +83 -0
  208. package/dist/test/msw/handlers/listObjects.d.ts +1 -0
  209. package/dist/test/msw/handlers/listObjects.js +66 -0
  210. package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -0
  211. package/dist/test/msw/handlers/objectLegalHold.js +24 -0
  212. package/dist/test/msw/handlers/objectRetention.d.ts +1 -0
  213. package/dist/test/msw/handlers/objectRetention.js +27 -0
  214. package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -0
  215. package/dist/test/msw/handlers/putBucketAcl.js +18 -0
  216. package/dist/test/msw/handlers/putObject.d.ts +1 -0
  217. package/dist/test/msw/handlers/putObject.js +16 -0
  218. package/dist/test/msw/handlers.d.ts +4 -0
  219. package/dist/test/msw/handlers.js +109 -0
  220. package/dist/test/msw/index.d.ts +2 -0
  221. package/dist/test/msw/index.js +3 -0
  222. package/dist/test/msw/server.d.ts +4 -0
  223. package/dist/test/msw/server.js +20 -0
  224. package/dist/test/msw/utils.d.ts +2 -0
  225. package/dist/test/msw/utils.js +13 -0
  226. package/dist/test/setup.d.ts +1 -0
  227. package/dist/test/setup.js +90 -0
  228. package/dist/test/testUtils.d.ts +181 -0
  229. package/dist/test/testUtils.js +310 -0
  230. package/dist/test/utils/errorHandling.test.d.ts +1 -0
  231. package/dist/test/utils/errorHandling.test.js +423 -0
  232. package/dist/types/index.d.ts +51 -0
  233. package/dist/types/index.js +0 -0
  234. package/dist/utils/constants.d.ts +12 -0
  235. package/dist/utils/constants.js +9 -0
  236. package/dist/utils/deletion/index.d.ts +2 -0
  237. package/dist/utils/deletion/index.js +2 -0
  238. package/dist/utils/deletion/messages.d.ts +5 -0
  239. package/dist/utils/deletion/messages.js +29 -0
  240. package/dist/utils/deletion/types.d.ts +11 -0
  241. package/dist/utils/deletion/types.js +0 -0
  242. package/dist/utils/errorHandling.d.ts +63 -0
  243. package/dist/utils/errorHandling.js +84 -0
  244. package/dist/utils/hooks.d.ts +2 -0
  245. package/dist/utils/hooks.js +26 -0
  246. package/dist/utils/index.d.ts +4 -0
  247. package/dist/utils/index.js +4 -0
  248. package/dist/utils/proxyMiddleware.d.ts +18 -0
  249. package/dist/utils/proxyMiddleware.js +56 -0
  250. package/dist/utils/s3Client.d.ts +5 -0
  251. package/dist/utils/s3Client.js +36 -0
  252. package/dist/utils/s3RuleUtils.d.ts +53 -0
  253. package/dist/utils/s3RuleUtils.js +101 -0
  254. package/dist/utils/useFeatures.d.ts +1 -0
  255. package/dist/utils/useFeatures.js +7 -0
  256. package/package.json +84 -0
@@ -0,0 +1,316 @@
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-dom";
5
+ import { createTestWrapper } from "../../test/testUtils.js";
6
+ import { BucketNotificationCreatePage } from "../buckets/notifications/BucketNotificationCreatePage.js";
7
+ import { useGetBucketNotification, useSetBucketNotification } from "../../hooks/index.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-dom", ()=>({
16
+ ...jest.requireActual("react-router-dom"),
17
+ useNavigate: ()=>mockNavigate
18
+ }));
19
+ const renderBucketNotificationCreatePage = (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(BucketNotificationCreatePage, {})
30
+ })
31
+ })
32
+ })
33
+ }));
34
+ };
35
+ describe("BucketNotificationCreatePage", ()=>{
36
+ const mockMutate = jest.fn();
37
+ beforeEach(()=>{
38
+ jest.clearAllMocks();
39
+ mockNavigate.mockClear();
40
+ mockUseGetBucketNotification.mockReturnValue({
41
+ data: void 0
42
+ });
43
+ mockUseSetBucketNotification.mockReturnValue({
44
+ mutate: mockMutate,
45
+ isPending: false
46
+ });
47
+ });
48
+ it("renders create notification form with all fields", ()=>{
49
+ renderBucketNotificationCreatePage();
50
+ expect(screen.getByText("Create Bucket Notification")).toBeInTheDocument();
51
+ expect(screen.getByLabelText(/rule name/i)).toBeInTheDocument();
52
+ expect(screen.getByText("Events")).toBeInTheDocument();
53
+ expect(screen.getByLabelText(/destination queue/i)).toBeInTheDocument();
54
+ expect(screen.getByLabelText(/prefix/i)).toBeInTheDocument();
55
+ expect(screen.getByLabelText(/suffix/i)).toBeInTheDocument();
56
+ });
57
+ it("disables create button when form is pristine", ()=>{
58
+ renderBucketNotificationCreatePage();
59
+ expect(screen.getByRole("button", {
60
+ name: /create/i
61
+ })).toBeDisabled();
62
+ });
63
+ it("shows validation error when rule name is empty", async ()=>{
64
+ renderBucketNotificationCreatePage();
65
+ const ruleNameInput = screen.getByLabelText(/rule name/i);
66
+ await user_event.type(ruleNameInput, "a");
67
+ await user_event.clear(ruleNameInput);
68
+ await waitFor(()=>{
69
+ expect(screen.getByText(/this field is required/i)).toBeInTheDocument();
70
+ });
71
+ });
72
+ it("shows validation error when rule name already exists", async ()=>{
73
+ const existingConfig = {
74
+ QueueConfigurations: [
75
+ {
76
+ Id: "existing-rule",
77
+ QueueArn: "arn:aws:sqs:us-east-1:123:queue",
78
+ Events: [
79
+ "s3:ObjectCreated:*"
80
+ ]
81
+ }
82
+ ]
83
+ };
84
+ mockUseGetBucketNotification.mockReturnValue({
85
+ data: existingConfig
86
+ });
87
+ renderBucketNotificationCreatePage();
88
+ const ruleNameInput = screen.getByLabelText(/rule name/i);
89
+ await user_event.type(ruleNameInput, "existing-rule");
90
+ await waitFor(()=>{
91
+ expect(screen.getByText(/a rule with this name already exists/i)).toBeInTheDocument();
92
+ });
93
+ });
94
+ it("shows validation error when queue ARN is invalid", async ()=>{
95
+ renderBucketNotificationCreatePage();
96
+ const queueArnInput = screen.getByLabelText(/destination queue/i);
97
+ await user_event.type(queueArnInput, "invalid-arn");
98
+ await waitFor(()=>{
99
+ expect(screen.getByText(/must be a valid arn/i)).toBeInTheDocument();
100
+ });
101
+ });
102
+ it("shows validation error when no event is selected", async ()=>{
103
+ renderBucketNotificationCreatePage();
104
+ const ruleNameInput = screen.getByLabelText(/rule name/i);
105
+ await user_event.type(ruleNameInput, "test-rule");
106
+ const queueArnInput = screen.getByLabelText(/destination queue/i);
107
+ await user_event.type(queueArnInput, "arn:aws:sqs:us-east-1:123:queue");
108
+ await waitFor(()=>{
109
+ expect(screen.getByRole("button", {
110
+ name: /create/i
111
+ })).toBeDisabled();
112
+ });
113
+ });
114
+ it("enables create button when form is valid", async ()=>{
115
+ renderBucketNotificationCreatePage();
116
+ await user_event.type(screen.getByLabelText(/rule name/i), "test-rule");
117
+ await user_event.type(screen.getByLabelText(/destination queue/i), "arn:aws:sqs:us-east-1:123:queue");
118
+ const checkbox = screen.getByRole("checkbox", {
119
+ name: /s3:ObjectCreated:\*/i
120
+ });
121
+ fireEvent.click(checkbox);
122
+ await waitFor(()=>{
123
+ expect(screen.getByRole("button", {
124
+ name: /create/i
125
+ })).toBeEnabled();
126
+ });
127
+ });
128
+ it("creates notification with all fields and navigates on success", async ()=>{
129
+ renderBucketNotificationCreatePage();
130
+ await user_event.type(screen.getByLabelText(/rule name/i), "test-rule");
131
+ await user_event.type(screen.getByLabelText(/destination queue/i), "arn:aws:sqs:us-east-1:123:my-queue");
132
+ fireEvent.click(screen.getByRole("checkbox", {
133
+ name: /s3:ObjectCreated:Put/i
134
+ }));
135
+ await user_event.type(screen.getByLabelText(/prefix/i), "uploads/");
136
+ await user_event.type(screen.getByLabelText(/suffix/i), ".jpg");
137
+ mockMutate.mockImplementation((_, options)=>{
138
+ options?.onSuccess?.();
139
+ });
140
+ const createButton = screen.getByRole("button", {
141
+ name: /create/i
142
+ });
143
+ await waitFor(()=>expect(createButton).toBeEnabled());
144
+ fireEvent.click(createButton);
145
+ await waitFor(()=>{
146
+ expect(mockMutate).toHaveBeenCalledWith({
147
+ Bucket: "test-bucket",
148
+ NotificationConfiguration: {
149
+ QueueConfigurations: [
150
+ {
151
+ Id: "test-rule",
152
+ QueueArn: "arn:aws:sqs:us-east-1:123:my-queue",
153
+ Events: [
154
+ "s3:ObjectCreated:Put"
155
+ ],
156
+ Filter: {
157
+ Key: {
158
+ FilterRules: [
159
+ {
160
+ Name: "prefix",
161
+ Value: "uploads/"
162
+ },
163
+ {
164
+ Name: "suffix",
165
+ Value: ".jpg"
166
+ }
167
+ ]
168
+ }
169
+ }
170
+ }
171
+ ]
172
+ }
173
+ }, expect.any(Object));
174
+ expect(mockNavigate).toHaveBeenCalledWith("/buckets/test-bucket");
175
+ });
176
+ });
177
+ it("creates notification without filters when not provided", async ()=>{
178
+ renderBucketNotificationCreatePage();
179
+ await user_event.type(screen.getByLabelText(/rule name/i), "test-rule");
180
+ await user_event.type(screen.getByLabelText(/destination queue/i), "arn:aws:sqs:us-east-1:123:my-queue");
181
+ fireEvent.click(screen.getByRole("checkbox", {
182
+ name: /s3:ObjectRemoved:\*/i
183
+ }));
184
+ mockMutate.mockImplementation((_, options)=>{
185
+ options?.onSuccess?.();
186
+ });
187
+ const createButton = screen.getByRole("button", {
188
+ name: /create/i
189
+ });
190
+ await waitFor(()=>expect(createButton).toBeEnabled());
191
+ fireEvent.click(createButton);
192
+ await waitFor(()=>{
193
+ expect(mockMutate).toHaveBeenCalledWith({
194
+ Bucket: "test-bucket",
195
+ NotificationConfiguration: {
196
+ QueueConfigurations: [
197
+ {
198
+ Id: "test-rule",
199
+ QueueArn: "arn:aws:sqs:us-east-1:123:my-queue",
200
+ Events: [
201
+ "s3:ObjectRemoved:*"
202
+ ]
203
+ }
204
+ ]
205
+ }
206
+ }, expect.any(Object));
207
+ });
208
+ });
209
+ it("preserves existing queue configurations when creating new notification", async ()=>{
210
+ const existingConfig = {
211
+ QueueConfigurations: [
212
+ {
213
+ Id: "existing-rule",
214
+ QueueArn: "arn:aws:sqs:us-east-1:123:existing-queue",
215
+ Events: [
216
+ "s3:ObjectCreated:*"
217
+ ]
218
+ }
219
+ ]
220
+ };
221
+ mockUseGetBucketNotification.mockReturnValue({
222
+ data: existingConfig
223
+ });
224
+ renderBucketNotificationCreatePage();
225
+ await user_event.type(screen.getByLabelText(/rule name/i), "new-rule");
226
+ await user_event.type(screen.getByLabelText(/destination queue/i), "arn:aws:sqs:us-east-1:123:new-queue");
227
+ fireEvent.click(screen.getByRole("checkbox", {
228
+ name: /^s3:ObjectRemoved:Delete$/i
229
+ }));
230
+ mockMutate.mockImplementation((_, options)=>{
231
+ options?.onSuccess?.();
232
+ });
233
+ const createButton = screen.getByRole("button", {
234
+ name: /create/i
235
+ });
236
+ await waitFor(()=>expect(createButton).toBeEnabled());
237
+ fireEvent.click(createButton);
238
+ await waitFor(()=>{
239
+ const call = mockMutate.mock.calls[0][0];
240
+ expect(call.NotificationConfiguration.QueueConfigurations).toHaveLength(2);
241
+ expect(call.NotificationConfiguration.QueueConfigurations[0]).toEqual(existingConfig.QueueConfigurations[0]);
242
+ expect(call.NotificationConfiguration.QueueConfigurations[1]).toMatchObject({
243
+ Id: "new-rule",
244
+ QueueArn: "arn:aws:sqs:us-east-1:123:new-queue",
245
+ Events: [
246
+ "s3:ObjectRemoved:Delete"
247
+ ]
248
+ });
249
+ });
250
+ });
251
+ it("displays error message when creation fails", async ()=>{
252
+ renderBucketNotificationCreatePage();
253
+ await user_event.type(screen.getByLabelText(/rule name/i), "test-rule");
254
+ await user_event.type(screen.getByLabelText(/destination queue/i), "arn:aws:sqs:us-east-1:123:my-queue");
255
+ fireEvent.click(screen.getByRole("checkbox", {
256
+ name: /s3:ObjectCreated:\*/i
257
+ }));
258
+ const error = new Error("Access Denied");
259
+ mockMutate.mockImplementation((_, options)=>{
260
+ options?.onError?.(error);
261
+ });
262
+ const createButton = screen.getByRole("button", {
263
+ name: /create/i
264
+ });
265
+ await waitFor(()=>expect(createButton).toBeEnabled());
266
+ fireEvent.click(createButton);
267
+ await waitFor(()=>{
268
+ expect(mockNavigate).not.toHaveBeenCalled();
269
+ });
270
+ });
271
+ it("handles cancel button click and navigates back", ()=>{
272
+ renderBucketNotificationCreatePage();
273
+ const cancelButton = screen.getByRole("button", {
274
+ name: /cancel/i
275
+ });
276
+ fireEvent.click(cancelButton);
277
+ expect(mockNavigate).toHaveBeenCalledWith("/buckets/test-bucket");
278
+ });
279
+ it("allows selecting multiple events", async ()=>{
280
+ renderBucketNotificationCreatePage();
281
+ await user_event.type(screen.getByLabelText(/rule name/i), "multi-event");
282
+ await user_event.type(screen.getByLabelText(/destination queue/i), "arn:aws:sqs:us-east-1:123:queue");
283
+ fireEvent.click(screen.getByRole("checkbox", {
284
+ name: /^s3:ObjectCreated:Put$/i
285
+ }));
286
+ fireEvent.click(screen.getByRole("checkbox", {
287
+ name: /^s3:ObjectCreated:Copy$/i
288
+ }));
289
+ fireEvent.click(screen.getByRole("checkbox", {
290
+ name: /^s3:ObjectRemoved:Delete$/i
291
+ }));
292
+ mockMutate.mockImplementation((_, options)=>{
293
+ options?.onSuccess?.();
294
+ });
295
+ const createButton = screen.getByRole("button", {
296
+ name: /create/i
297
+ });
298
+ await waitFor(()=>expect(createButton).toBeEnabled());
299
+ fireEvent.click(createButton);
300
+ await waitFor(()=>{
301
+ expect(mockMutate).toHaveBeenCalledWith(expect.objectContaining({
302
+ NotificationConfiguration: {
303
+ QueueConfigurations: [
304
+ expect.objectContaining({
305
+ Events: expect.arrayContaining([
306
+ "s3:ObjectCreated:Put",
307
+ "s3:ObjectCreated:Copy",
308
+ "s3:ObjectRemoved:Delete"
309
+ ])
310
+ })
311
+ ]
312
+ }
313
+ }), expect.any(Object));
314
+ });
315
+ });
316
+ });
@@ -0,0 +1 @@
1
+ export {};