@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,272 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { fireEvent, render, screen, waitFor } from "@testing-library/react";
3
+ import { createTestWrapper } from "../../test/testUtils.js";
4
+ import { DeleteBucketButton } from "../buckets/DeleteBucketButton.js";
5
+ import { useIsBucketEmpty } from "../../hooks/useIsBucketEmpty.js";
6
+ import { useDeleteBucket } from "../../hooks/bucketOperations.js";
7
+ jest.mock("../../hooks/useIsBucketEmpty");
8
+ jest.mock("../../hooks/bucketOperations");
9
+ const mockUseIsBucketEmpty = jest.mocked(useIsBucketEmpty);
10
+ const mockUseDeleteBucket = jest.mocked(useDeleteBucket);
11
+ const renderDeleteBucketButton = (props = {})=>{
12
+ const Wrapper = createTestWrapper();
13
+ return render(/*#__PURE__*/ jsx(Wrapper, {
14
+ children: /*#__PURE__*/ jsx(DeleteBucketButton, {
15
+ bucketName: "test-bucket",
16
+ ...props
17
+ })
18
+ }));
19
+ };
20
+ const mockDeleteBucket = jest.fn();
21
+ const mockHookDefaults = ()=>{
22
+ mockUseIsBucketEmpty.mockReturnValue({
23
+ isEmpty: true,
24
+ isLoading: false,
25
+ error: null
26
+ });
27
+ mockUseDeleteBucket.mockReturnValue({
28
+ mutate: mockDeleteBucket,
29
+ status: "idle"
30
+ });
31
+ };
32
+ describe("DeleteBucketButton", ()=>{
33
+ beforeEach(()=>{
34
+ jest.clearAllMocks();
35
+ mockHookDefaults();
36
+ });
37
+ it("renders delete button with correct label", ()=>{
38
+ renderDeleteBucketButton();
39
+ expect(screen.getByRole("button", {
40
+ name: /delete bucket/i
41
+ })).toBeInTheDocument();
42
+ });
43
+ it("enables button when bucket is empty", ()=>{
44
+ mockUseIsBucketEmpty.mockReturnValue({
45
+ isEmpty: true,
46
+ isLoading: false,
47
+ error: null
48
+ });
49
+ renderDeleteBucketButton();
50
+ const button = screen.getByRole("button", {
51
+ name: /delete bucket/i
52
+ });
53
+ expect(button).not.toBeDisabled();
54
+ });
55
+ it("disables button when bucket is not empty", ()=>{
56
+ mockUseIsBucketEmpty.mockReturnValue({
57
+ isEmpty: false,
58
+ isLoading: false,
59
+ error: null
60
+ });
61
+ renderDeleteBucketButton();
62
+ const button = screen.getByRole("button", {
63
+ name: /delete bucket/i
64
+ });
65
+ expect(button).toBeDisabled();
66
+ });
67
+ it("disables button when checking if bucket is empty", ()=>{
68
+ mockUseIsBucketEmpty.mockReturnValue({
69
+ isEmpty: null,
70
+ isLoading: true,
71
+ error: null
72
+ });
73
+ renderDeleteBucketButton();
74
+ const button = screen.getByRole("button", {
75
+ name: /delete bucket/i
76
+ });
77
+ expect(button).toBeDisabled();
78
+ });
79
+ it("disables button when disabled prop is true", ()=>{
80
+ renderDeleteBucketButton({
81
+ disabled: true
82
+ });
83
+ const button = screen.getByRole("button", {
84
+ name: /delete bucket/i
85
+ });
86
+ expect(button).toBeDisabled();
87
+ });
88
+ it("shows tooltip when bucket is not empty", ()=>{
89
+ mockUseIsBucketEmpty.mockReturnValue({
90
+ isEmpty: false,
91
+ isLoading: false,
92
+ error: null
93
+ });
94
+ renderDeleteBucketButton();
95
+ expect(screen.getByRole("button", {
96
+ name: /delete bucket/i
97
+ })).toBeInTheDocument();
98
+ });
99
+ it("shows checking tooltip when loading", ()=>{
100
+ mockUseIsBucketEmpty.mockReturnValue({
101
+ isEmpty: null,
102
+ isLoading: true,
103
+ error: null
104
+ });
105
+ renderDeleteBucketButton();
106
+ expect(screen.getByRole("button", {
107
+ name: /delete bucket/i
108
+ })).toBeInTheDocument();
109
+ });
110
+ it("opens confirmation modal when button is clicked", ()=>{
111
+ renderDeleteBucketButton();
112
+ const button = screen.getByRole("button", {
113
+ name: /delete bucket/i
114
+ });
115
+ fireEvent.click(button);
116
+ expect(screen.getByText("Confirmation")).toBeInTheDocument();
117
+ expect(screen.getByText(/are you sure you want to delete bucket: test-bucket/i)).toBeInTheDocument();
118
+ });
119
+ it("shows cancel and delete buttons in modal", ()=>{
120
+ renderDeleteBucketButton();
121
+ const button = screen.getByRole("button", {
122
+ name: /delete bucket/i
123
+ });
124
+ fireEvent.click(button);
125
+ expect(screen.getByRole("button", {
126
+ name: /cancel/i
127
+ })).toBeInTheDocument();
128
+ expect(screen.getByRole("button", {
129
+ name: /^delete$/i
130
+ })).toBeInTheDocument();
131
+ });
132
+ it("closes modal when cancel is clicked", ()=>{
133
+ renderDeleteBucketButton();
134
+ const deleteButton = screen.getByRole("button", {
135
+ name: /delete bucket/i
136
+ });
137
+ fireEvent.click(deleteButton);
138
+ const cancelButton = screen.getByRole("button", {
139
+ name: /cancel/i
140
+ });
141
+ fireEvent.click(cancelButton);
142
+ expect(screen.queryByText("Confirmation")).not.toBeInTheDocument();
143
+ });
144
+ it("calls delete mutation when delete is confirmed", ()=>{
145
+ renderDeleteBucketButton();
146
+ const deleteButton = screen.getByRole("button", {
147
+ name: /delete bucket/i
148
+ });
149
+ fireEvent.click(deleteButton);
150
+ const confirmButton = screen.getByRole("button", {
151
+ name: /^delete$/i
152
+ });
153
+ fireEvent.click(confirmButton);
154
+ expect(mockDeleteBucket).toHaveBeenCalledWith({
155
+ Bucket: "test-bucket"
156
+ }, expect.objectContaining({
157
+ onSuccess: expect.any(Function),
158
+ onError: expect.any(Function)
159
+ }));
160
+ });
161
+ it("calls onDeleteSuccess callback when delete succeeds", ()=>{
162
+ const onDeleteSuccess = jest.fn();
163
+ renderDeleteBucketButton({
164
+ onDeleteSuccess
165
+ });
166
+ const deleteButton = screen.getByRole("button", {
167
+ name: /delete bucket/i
168
+ });
169
+ fireEvent.click(deleteButton);
170
+ const confirmButton = screen.getByRole("button", {
171
+ name: /^delete$/i
172
+ });
173
+ fireEvent.click(confirmButton);
174
+ const successCallback = mockDeleteBucket.mock.calls[0][1].onSuccess;
175
+ successCallback();
176
+ expect(onDeleteSuccess).toHaveBeenCalledWith("test-bucket");
177
+ });
178
+ it("calls onDeleteError callback when delete fails", ()=>{
179
+ const onDeleteError = jest.fn();
180
+ const testError = new Error("Delete failed");
181
+ renderDeleteBucketButton({
182
+ onDeleteError
183
+ });
184
+ const deleteButton = screen.getByRole("button", {
185
+ name: /delete bucket/i
186
+ });
187
+ fireEvent.click(deleteButton);
188
+ const confirmButton = screen.getByRole("button", {
189
+ name: /^delete$/i
190
+ });
191
+ fireEvent.click(confirmButton);
192
+ const errorCallback = mockDeleteBucket.mock.calls[0][1].onError;
193
+ errorCallback(testError);
194
+ expect(onDeleteError).toHaveBeenCalledWith(testError);
195
+ });
196
+ it("handles non-Error objects in onError callback", ()=>{
197
+ const onDeleteError = jest.fn();
198
+ renderDeleteBucketButton({
199
+ onDeleteError
200
+ });
201
+ const deleteButton = screen.getByRole("button", {
202
+ name: /delete bucket/i
203
+ });
204
+ fireEvent.click(deleteButton);
205
+ const confirmButton = screen.getByRole("button", {
206
+ name: /^delete$/i
207
+ });
208
+ fireEvent.click(confirmButton);
209
+ const errorCallback = mockDeleteBucket.mock.calls[0][1].onError;
210
+ errorCallback("string error");
211
+ expect(onDeleteError).toHaveBeenCalledWith(new Error("Delete failed"));
212
+ });
213
+ it("closes modal when delete succeeds", async ()=>{
214
+ renderDeleteBucketButton();
215
+ const deleteButton = screen.getByRole("button", {
216
+ name: /delete bucket/i
217
+ });
218
+ fireEvent.click(deleteButton);
219
+ expect(screen.getByText("Confirmation")).toBeInTheDocument();
220
+ const confirmButton = screen.getByRole("button", {
221
+ name: /^delete$/i
222
+ });
223
+ fireEvent.click(confirmButton);
224
+ const successCallback = mockDeleteBucket.mock.calls[0][1].onSuccess;
225
+ successCallback();
226
+ await waitFor(()=>{
227
+ expect(screen.queryByText("Confirmation")).not.toBeInTheDocument();
228
+ });
229
+ });
230
+ it("shows loading state in delete button when deletion is pending", ()=>{
231
+ mockUseDeleteBucket.mockReturnValue({
232
+ mutate: mockDeleteBucket,
233
+ status: "pending"
234
+ });
235
+ renderDeleteBucketButton();
236
+ const deleteButton = screen.getByRole("button", {
237
+ name: /delete bucket/i
238
+ });
239
+ fireEvent.click(deleteButton);
240
+ const confirmButton = screen.getByRole("button", {
241
+ name: /^delete$/i
242
+ });
243
+ expect(confirmButton).toBeDisabled();
244
+ });
245
+ it("works without optional callbacks", ()=>{
246
+ expect(()=>{
247
+ renderDeleteBucketButton();
248
+ const deleteButton = screen.getByRole("button", {
249
+ name: /delete bucket/i
250
+ });
251
+ fireEvent.click(deleteButton);
252
+ const confirmButton = screen.getByRole("button", {
253
+ name: /^delete$/i
254
+ });
255
+ fireEvent.click(confirmButton);
256
+ const successCallback = mockDeleteBucket.mock.calls[0][1].onSuccess;
257
+ const errorCallback = mockDeleteBucket.mock.calls[0][1].onError;
258
+ successCallback();
259
+ errorCallback(new Error("test"));
260
+ }).not.toThrow();
261
+ });
262
+ it("displays correct bucket name in confirmation message", ()=>{
263
+ renderDeleteBucketButton({
264
+ bucketName: "my-special-bucket"
265
+ });
266
+ const deleteButton = screen.getByRole("button", {
267
+ name: /delete bucket/i
268
+ });
269
+ fireEvent.click(deleteButton);
270
+ expect(screen.getByText(/are you sure you want to delete bucket: my-special-bucket/i)).toBeInTheDocument();
271
+ });
272
+ });
@@ -0,0 +1,196 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { fireEvent, render, screen, waitFor } from "@testing-library/react";
3
+ import { MemoryRouter } from "react-router-dom";
4
+ import { createTestWrapper } from "../../test/testUtils.js";
5
+ import { DeleteBucketConfigRuleButton } from "../buckets/DeleteBucketConfigRuleButton.js";
6
+ const mockLifecycleRules = [
7
+ {
8
+ ID: "rule-1",
9
+ Status: "Enabled",
10
+ Expiration: {
11
+ Days: 30
12
+ }
13
+ },
14
+ {
15
+ ID: "rule-2",
16
+ Status: "Disabled",
17
+ NoncurrentVersionExpiration: {
18
+ NoncurrentDays: 90
19
+ }
20
+ }
21
+ ];
22
+ describe("DeleteBucketConfigRuleButton", ()=>{
23
+ let mockUpdate;
24
+ let mockDelete;
25
+ const renderButton = (props = {})=>{
26
+ const defaultProps = {
27
+ bucketName: "test-bucket",
28
+ ruleId: "rule-1",
29
+ rules: mockLifecycleRules,
30
+ ruleType: "lifecycle",
31
+ updateMutation: {
32
+ mutate: mockUpdate,
33
+ status: "idle"
34
+ },
35
+ deleteMutation: {
36
+ mutate: mockDelete,
37
+ status: "idle"
38
+ },
39
+ buildUpdateInput: (remainingRules)=>({
40
+ LifecycleConfiguration: {
41
+ Rules: remainingRules
42
+ }
43
+ }),
44
+ invalidationKeys: [
45
+ "GetBucketLifecycle"
46
+ ],
47
+ successMessage: "Rule deleted successfully",
48
+ errorMessage: "Failed to delete rule"
49
+ };
50
+ const Wrapper = createTestWrapper();
51
+ return render(/*#__PURE__*/ jsx(MemoryRouter, {
52
+ children: /*#__PURE__*/ jsx(Wrapper, {
53
+ children: /*#__PURE__*/ jsx(DeleteBucketConfigRuleButton, {
54
+ ...defaultProps,
55
+ ...props
56
+ })
57
+ })
58
+ }));
59
+ };
60
+ beforeEach(()=>{
61
+ jest.clearAllMocks();
62
+ mockUpdate = jest.fn();
63
+ mockDelete = jest.fn();
64
+ });
65
+ it("renders delete button", ()=>{
66
+ renderButton();
67
+ const deleteButton = screen.getByRole("button", {
68
+ name: /delete rule/i
69
+ });
70
+ expect(deleteButton).toBeInTheDocument();
71
+ });
72
+ it("opens confirmation modal when clicked", ()=>{
73
+ renderButton();
74
+ const deleteButton = screen.getByRole("button", {
75
+ name: /delete rule/i
76
+ });
77
+ fireEvent.click(deleteButton);
78
+ expect(screen.getByText(/are you sure you want to delete the lifecycle rule/i)).toBeInTheDocument();
79
+ expect(screen.getByText(/rule-1/)).toBeInTheDocument();
80
+ });
81
+ it("closes modal when cancel is clicked", ()=>{
82
+ renderButton();
83
+ fireEvent.click(screen.getByRole("button", {
84
+ name: /delete rule/i
85
+ }));
86
+ expect(screen.getByText(/are you sure/i)).toBeInTheDocument();
87
+ fireEvent.click(screen.getByRole("button", {
88
+ name: /cancel/i
89
+ }));
90
+ expect(screen.queryByText(/are you sure/i)).not.toBeInTheDocument();
91
+ });
92
+ it("calls update when deleting a rule with remaining rules", async ()=>{
93
+ renderButton();
94
+ fireEvent.click(screen.getByRole("button", {
95
+ name: /delete rule/i
96
+ }));
97
+ fireEvent.click(screen.getByRole("button", {
98
+ name: /^delete$/i
99
+ }));
100
+ await waitFor(()=>{
101
+ expect(mockUpdate).toHaveBeenCalled();
102
+ const callArgs = mockUpdate.mock.calls[0][0];
103
+ expect(callArgs.Bucket).toBe("test-bucket");
104
+ expect(callArgs.LifecycleConfiguration.Rules).toHaveLength(1);
105
+ expect(callArgs.LifecycleConfiguration.Rules[0].ID).toBe("rule-2");
106
+ });
107
+ });
108
+ it("calls delete when deleting the last rule", async ()=>{
109
+ renderButton({
110
+ rules: [
111
+ mockLifecycleRules[0]
112
+ ]
113
+ });
114
+ fireEvent.click(screen.getByRole("button", {
115
+ name: /delete rule/i
116
+ }));
117
+ fireEvent.click(screen.getByRole("button", {
118
+ name: /^delete$/i
119
+ }));
120
+ await waitFor(()=>{
121
+ expect(mockDelete).toHaveBeenCalledWith({
122
+ Bucket: "test-bucket"
123
+ }, expect.any(Object));
124
+ });
125
+ });
126
+ it("closes modal after successful deletion", async ()=>{
127
+ mockUpdate.mockImplementation((_, options)=>{
128
+ options.onSuccess();
129
+ });
130
+ renderButton();
131
+ fireEvent.click(screen.getByRole("button", {
132
+ name: /delete rule/i
133
+ }));
134
+ fireEvent.click(screen.getByRole("button", {
135
+ name: /^delete$/i
136
+ }));
137
+ await waitFor(()=>{
138
+ expect(screen.queryByText(/are you sure/i)).not.toBeInTheDocument();
139
+ });
140
+ });
141
+ it("closes modal after failed deletion", async ()=>{
142
+ const consoleError = jest.spyOn(console, "error").mockImplementation(()=>{});
143
+ mockUpdate.mockImplementation((_, options)=>{
144
+ options.onError(new Error("Delete failed"));
145
+ });
146
+ renderButton();
147
+ fireEvent.click(screen.getByRole("button", {
148
+ name: /delete rule/i
149
+ }));
150
+ fireEvent.click(screen.getByRole("button", {
151
+ name: /^delete$/i
152
+ }));
153
+ await waitFor(()=>{
154
+ expect(mockUpdate).toHaveBeenCalled();
155
+ });
156
+ await waitFor(()=>{
157
+ expect(screen.queryByText(/are you sure/i)).not.toBeInTheDocument();
158
+ });
159
+ consoleError.mockRestore();
160
+ });
161
+ it("disables buttons while deletion is in progress", ()=>{
162
+ renderButton({
163
+ updateMutation: {
164
+ mutate: mockUpdate,
165
+ status: "pending"
166
+ }
167
+ });
168
+ fireEvent.click(screen.getByRole("button", {
169
+ name: /delete rule/i
170
+ }));
171
+ const cancelButton = screen.getByRole("button", {
172
+ name: /cancel/i
173
+ });
174
+ const confirmButton = screen.getByRole("button", {
175
+ name: /^delete$/i
176
+ });
177
+ expect(cancelButton).toBeDisabled();
178
+ expect(confirmButton).toBeDisabled();
179
+ });
180
+ it("stops event propagation when delete button is clicked", ()=>{
181
+ renderButton();
182
+ const deleteButton = screen.getByRole("button", {
183
+ name: /delete rule/i
184
+ });
185
+ const mockStopPropagation = jest.fn();
186
+ const clickEvent = new MouseEvent("click", {
187
+ bubbles: true
188
+ });
189
+ Object.defineProperty(clickEvent, "stopPropagation", {
190
+ value: mockStopPropagation,
191
+ writable: true
192
+ });
193
+ deleteButton.dispatchEvent(clickEvent);
194
+ expect(mockStopPropagation).toHaveBeenCalled();
195
+ });
196
+ });