@scality/data-browser-library 1.0.0-preview.8 → 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 (303) 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.d.ts +1 -0
  9. package/dist/components/__tests__/BucketCreate.test.js +574 -0
  10. package/dist/components/__tests__/BucketDetails.test.d.ts +1 -0
  11. package/dist/components/__tests__/BucketDetails.test.js +421 -0
  12. package/dist/components/__tests__/BucketLifecycleFormPage.test.d.ts +14 -0
  13. package/dist/components/__tests__/BucketLifecycleFormPage.test.js +618 -0
  14. package/dist/components/__tests__/BucketLifecycleList.test.d.ts +1 -0
  15. package/dist/components/__tests__/BucketLifecycleList.test.js +325 -0
  16. package/dist/components/__tests__/BucketList.test.js +495 -81
  17. package/dist/components/__tests__/BucketNotificationFormPage.test.d.ts +1 -0
  18. package/dist/components/__tests__/BucketNotificationFormPage.test.js +348 -0
  19. package/dist/components/__tests__/BucketNotificationList.test.d.ts +1 -0
  20. package/dist/components/__tests__/BucketNotificationList.test.js +379 -0
  21. package/dist/components/__tests__/BucketOverview.test.js +484 -179
  22. package/dist/components/__tests__/BucketPolicyPage.test.js +151 -99
  23. package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +16 -0
  24. package/dist/components/__tests__/BucketReplicationFormPage.test.js +1757 -0
  25. package/dist/components/__tests__/BucketReplicationList.test.d.ts +1 -0
  26. package/dist/components/__tests__/BucketReplicationList.test.js +344 -0
  27. package/dist/components/__tests__/CreateFolderButton.test.js +56 -56
  28. package/dist/components/__tests__/DeleteBucketButton.test.js +64 -64
  29. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.d.ts +1 -0
  30. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +196 -0
  31. package/dist/components/__tests__/DeleteObjectButton.test.js +64 -64
  32. package/dist/components/__tests__/EmptyBucketButton.test.d.ts +1 -0
  33. package/dist/components/__tests__/EmptyBucketButton.test.js +302 -0
  34. package/dist/components/__tests__/MetadataSearch.test.js +65 -65
  35. package/dist/components/__tests__/ObjectList.test.js +741 -240
  36. package/dist/components/__tests__/UploadButton.test.js +45 -45
  37. package/dist/components/breadcrumb/Breadcrumb.d.ts +6 -0
  38. package/dist/components/breadcrumb/Breadcrumb.js +37 -0
  39. package/dist/components/breadcrumb/DataBrowserBreadcrumb.d.ts +1 -0
  40. package/dist/components/breadcrumb/DataBrowserBreadcrumb.js +10 -0
  41. package/dist/components/breadcrumb/__tests__/Breadcrumb.test.d.ts +1 -0
  42. package/dist/components/breadcrumb/__tests__/Breadcrumb.test.js +196 -0
  43. package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.d.ts +1 -0
  44. package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.js +153 -0
  45. package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.d.ts +1 -0
  46. package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.js +134 -0
  47. package/dist/components/breadcrumb/index.d.ts +8 -0
  48. package/dist/components/breadcrumb/index.js +4 -0
  49. package/dist/components/breadcrumb/useBreadcrumbPaths.d.ts +2 -0
  50. package/dist/components/breadcrumb/useBreadcrumbPaths.js +82 -0
  51. package/dist/components/buckets/BucketAccessor.d.ts +2 -0
  52. package/dist/components/buckets/BucketAccessor.js +125 -0
  53. package/dist/components/buckets/BucketConfigEditButton.d.ts +8 -0
  54. package/dist/components/buckets/{BucketPolicyButton.js → BucketConfigEditButton.js} +9 -5
  55. package/dist/components/buckets/BucketCorsPage.d.ts +1 -0
  56. package/dist/components/buckets/BucketCorsPage.js +234 -0
  57. package/dist/components/buckets/BucketCreate.d.ts +50 -0
  58. package/dist/components/buckets/BucketCreate.js +279 -0
  59. package/dist/components/buckets/BucketDetails.d.ts +42 -0
  60. package/dist/components/buckets/BucketDetails.js +256 -40
  61. package/dist/components/buckets/BucketLifecycleFormPage.d.ts +15 -0
  62. package/dist/components/buckets/BucketLifecycleFormPage.js +1086 -0
  63. package/dist/components/buckets/BucketLifecycleList.d.ts +10 -0
  64. package/dist/components/buckets/BucketLifecycleList.js +270 -0
  65. package/dist/components/buckets/BucketList.d.ts +6 -4
  66. package/dist/components/buckets/BucketList.js +161 -94
  67. package/dist/components/buckets/BucketLocation.js +4 -4
  68. package/dist/components/buckets/BucketOverview.d.ts +86 -5
  69. package/dist/components/buckets/BucketOverview.js +481 -192
  70. package/dist/components/buckets/BucketPage.js +44 -22
  71. package/dist/components/buckets/BucketPolicyPage.js +155 -127
  72. package/dist/components/buckets/BucketReplicationFormPage.d.ts +1 -0
  73. package/dist/components/buckets/BucketReplicationFormPage.js +835 -0
  74. package/dist/components/buckets/BucketReplicationList.d.ts +11 -0
  75. package/dist/components/buckets/BucketReplicationList.js +189 -0
  76. package/dist/components/buckets/BucketVersioning.d.ts +4 -0
  77. package/dist/components/buckets/BucketVersioning.js +76 -0
  78. package/dist/components/buckets/DeleteBucketButton.js +8 -8
  79. package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +18 -0
  80. package/dist/components/buckets/DeleteBucketConfigRuleButton.js +53 -0
  81. package/dist/components/buckets/EmptyBucketButton.d.ts +5 -0
  82. package/dist/components/buckets/EmptyBucketButton.js +232 -0
  83. package/dist/components/buckets/EmptyBucketSummary.d.ts +9 -0
  84. package/dist/components/buckets/EmptyBucketSummary.js +60 -0
  85. package/dist/components/buckets/EmptyBucketSummaryList.d.ts +13 -0
  86. package/dist/components/buckets/EmptyBucketSummaryList.js +140 -0
  87. package/dist/components/buckets/__tests__/BucketVersioning.test.d.ts +1 -0
  88. package/dist/components/buckets/__tests__/BucketVersioning.test.js +163 -0
  89. package/dist/components/buckets/notifications/BucketNotificationFormPage.d.ts +1 -0
  90. package/dist/components/buckets/notifications/BucketNotificationFormPage.js +316 -0
  91. package/dist/components/buckets/notifications/BucketNotificationList.d.ts +10 -0
  92. package/dist/components/buckets/notifications/BucketNotificationList.js +267 -0
  93. package/dist/components/buckets/notifications/EventsSection.js +145 -29
  94. package/dist/components/buckets/notifications/__tests__/events.test.d.ts +1 -0
  95. package/dist/components/buckets/notifications/__tests__/events.test.js +56 -0
  96. package/dist/components/buckets/notifications/events.d.ts +71 -7
  97. package/dist/components/buckets/notifications/events.js +98 -16
  98. package/dist/components/index.d.ts +27 -13
  99. package/dist/components/index.js +20 -6
  100. package/dist/components/layouts/ArrowNavigation.d.ts +3 -0
  101. package/dist/components/layouts/ArrowNavigation.js +28 -0
  102. package/dist/components/layouts/BrowserPageLayout.d.ts +5 -1
  103. package/dist/components/layouts/BrowserPageLayout.js +10 -5
  104. package/dist/components/objects/CreateFolderButton.d.ts +2 -2
  105. package/dist/components/objects/CreateFolderButton.js +12 -12
  106. package/dist/components/objects/DeleteObjectButton.d.ts +1 -1
  107. package/dist/components/objects/DeleteObjectButton.js +19 -21
  108. package/dist/components/objects/GetPresignedUrlButton.d.ts +7 -0
  109. package/dist/components/objects/GetPresignedUrlButton.js +255 -0
  110. package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +2 -2
  111. package/dist/components/objects/ObjectDetails/ObjectMetadata.js +263 -230
  112. package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +2 -2
  113. package/dist/components/objects/ObjectDetails/ObjectSummary.js +540 -138
  114. package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +2 -2
  115. package/dist/components/objects/ObjectDetails/ObjectTags.js +95 -123
  116. package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.d.ts +1 -0
  117. package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.js +516 -0
  118. package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.d.ts +1 -0
  119. package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.js +1064 -0
  120. package/dist/components/objects/ObjectDetails/index.d.ts +18 -2
  121. package/dist/components/objects/ObjectDetails/index.js +152 -40
  122. package/dist/components/objects/ObjectList.d.ts +12 -10
  123. package/dist/components/objects/ObjectList.js +590 -263
  124. package/dist/components/objects/ObjectLock/EditRetentionButton.d.ts +4 -0
  125. package/dist/components/objects/ObjectLock/EditRetentionButton.js +32 -0
  126. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.d.ts +3 -0
  127. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +211 -0
  128. package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +9 -0
  129. package/dist/components/objects/ObjectLock/ObjectLockSettings.js +159 -0
  130. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +8 -0
  131. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +39 -0
  132. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.d.ts +1 -0
  133. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +204 -0
  134. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.d.ts +1 -0
  135. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +374 -0
  136. package/dist/components/objects/ObjectPage.js +12 -8
  137. package/dist/components/objects/UploadButton.d.ts +3 -3
  138. package/dist/components/objects/UploadButton.js +10 -10
  139. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.d.ts +1 -0
  140. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.js +531 -0
  141. package/dist/components/providers/DataBrowserProvider.d.ts +23 -12
  142. package/dist/components/providers/DataBrowserProvider.js +60 -38
  143. package/dist/components/providers/QueryProvider.d.ts +9 -0
  144. package/dist/components/providers/QueryProvider.js +21 -0
  145. package/dist/components/search/MetadataSearch.js +29 -28
  146. package/dist/components/search/SearchHints.js +1 -1
  147. package/dist/components/ui/ArrayFieldActions.d.ts +36 -0
  148. package/dist/components/ui/ArrayFieldActions.js +43 -0
  149. package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +16 -0
  150. package/dist/components/ui/ConfirmDeleteRuleModal.js +48 -0
  151. package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
  152. package/dist/components/ui/DeleteObjectModalContent.js +12 -12
  153. package/dist/components/ui/FilterFormSection.d.ts +44 -0
  154. package/dist/components/ui/FilterFormSection.js +159 -0
  155. package/dist/components/ui/Search.elements.d.ts +2 -2
  156. package/dist/components/ui/Search.elements.js +7 -7
  157. package/dist/components/ui/Table.elements.d.ts +2 -1
  158. package/dist/components/ui/Table.elements.js +18 -12
  159. package/dist/config/__tests__/factory.test.d.ts +1 -0
  160. package/dist/config/__tests__/factory.test.js +311 -0
  161. package/dist/config/factory.d.ts +14 -49
  162. package/dist/config/factory.js +23 -68
  163. package/dist/config/types.d.ts +212 -34
  164. package/dist/contexts/DataBrowserUICustomizationContext.d.ts +27 -0
  165. package/dist/contexts/DataBrowserUICustomizationContext.js +13 -0
  166. package/dist/hooks/__tests__/useAccessibleBuckets.test.d.ts +1 -0
  167. package/dist/hooks/__tests__/useAccessibleBuckets.test.js +145 -0
  168. package/dist/hooks/__tests__/useISVBucketDetection.test.d.ts +1 -0
  169. package/dist/hooks/__tests__/useISVBucketDetection.test.js +188 -0
  170. package/dist/hooks/__tests__/useIsBucketEmpty.test.js +27 -27
  171. package/dist/hooks/__tests__/useLoginMutation.test.d.ts +1 -0
  172. package/dist/hooks/__tests__/useLoginMutation.test.js +194 -0
  173. package/dist/hooks/bucketConfiguration.d.ts +8 -1
  174. package/dist/hooks/bucketConfiguration.js +52 -51
  175. package/dist/hooks/bucketOperations.d.ts +10 -1
  176. package/dist/hooks/bucketOperations.js +10 -9
  177. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +80 -80
  178. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +80 -80
  179. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +44 -44
  180. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +63 -63
  181. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +95 -52
  182. package/dist/hooks/factories/index.d.ts +4 -4
  183. package/dist/hooks/factories/index.js +2 -2
  184. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
  185. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +16 -13
  186. package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
  187. package/dist/hooks/factories/useCreateS3LoginHook.js +1 -1
  188. package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
  189. package/dist/hooks/factories/useCreateS3MutationHook.js +7 -2
  190. package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
  191. package/dist/hooks/factories/useCreateS3QueryHook.js +29 -3
  192. package/dist/hooks/index.d.ts +19 -8
  193. package/dist/hooks/index.js +16 -5
  194. package/dist/hooks/loginOperations.d.ts +1 -1
  195. package/dist/hooks/loginOperations.js +1 -1
  196. package/dist/hooks/objectOperations.d.ts +2 -2
  197. package/dist/hooks/objectOperations.js +50 -49
  198. package/dist/hooks/presignedOperations.d.ts +4 -4
  199. package/dist/hooks/presignedOperations.js +5 -5
  200. package/dist/hooks/useAccessibleBuckets.d.ts +11 -0
  201. package/dist/hooks/useAccessibleBuckets.js +115 -0
  202. package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
  203. package/dist/hooks/useBatchObjectLegalHold.js +48 -0
  204. package/dist/hooks/useBucketConfigEditor.d.ts +31 -0
  205. package/dist/hooks/useBucketConfigEditor.js +82 -0
  206. package/dist/hooks/useDataBrowserNavigate.d.ts +28 -0
  207. package/dist/hooks/useDataBrowserNavigate.js +24 -0
  208. package/dist/hooks/useDeleteBucketConfigRule.d.ts +26 -0
  209. package/dist/hooks/useDeleteBucketConfigRule.js +46 -0
  210. package/dist/hooks/useEmptyBucket.d.ts +27 -0
  211. package/dist/hooks/useEmptyBucket.js +116 -0
  212. package/dist/hooks/useFeatures.d.ts +7 -0
  213. package/dist/hooks/useFeatures.js +8 -0
  214. package/dist/hooks/useISVBucketDetection.d.ts +15 -0
  215. package/dist/hooks/useISVBucketDetection.js +27 -0
  216. package/dist/hooks/useIsBucketEmpty.js +4 -4
  217. package/dist/hooks/useLimitedAccessFlow.d.ts +48 -0
  218. package/dist/hooks/useLimitedAccessFlow.js +23 -0
  219. package/dist/hooks/useS3Client.d.ts +6 -0
  220. package/dist/hooks/useS3Client.js +3 -2
  221. package/dist/hooks/useS3ConfigSwitch.d.ts +11 -0
  222. package/dist/hooks/useS3ConfigSwitch.js +37 -0
  223. package/dist/hooks/useSupportedNotificationEvents.d.ts +6 -0
  224. package/dist/hooks/useSupportedNotificationEvents.js +8 -0
  225. package/dist/hooks/useTableRowSelection.d.ts +9 -0
  226. package/dist/hooks/useTableRowSelection.js +45 -0
  227. package/dist/index.d.ts +6 -6
  228. package/dist/index.js +2 -2
  229. package/dist/schemas/bucketPolicySchema.json +3 -13
  230. package/dist/test/msw/handlers/deleteBucket.d.ts +1 -1
  231. package/dist/test/msw/handlers/deleteBucket.js +20 -10
  232. package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -1
  233. package/dist/test/msw/handlers/getBucketAcl.js +29 -17
  234. package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -1
  235. package/dist/test/msw/handlers/getBucketLocation.js +29 -15
  236. package/dist/test/msw/handlers/getBucketPolicy.d.ts +1 -1
  237. package/dist/test/msw/handlers/getBucketPolicy.js +52 -32
  238. package/dist/test/msw/handlers/headObject.d.ts +1 -1
  239. package/dist/test/msw/handlers/headObject.js +31 -13
  240. package/dist/test/msw/handlers/listBuckets.d.ts +1 -1
  241. package/dist/test/msw/handlers/listBuckets.js +5 -3
  242. package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -1
  243. package/dist/test/msw/handlers/listObjectVersions.js +38 -26
  244. package/dist/test/msw/handlers/listObjects.d.ts +1 -1
  245. package/dist/test/msw/handlers/listObjects.js +35 -23
  246. package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -1
  247. package/dist/test/msw/handlers/objectLegalHold.js +32 -17
  248. package/dist/test/msw/handlers/objectRetention.d.ts +1 -1
  249. package/dist/test/msw/handlers/objectRetention.js +31 -17
  250. package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -1
  251. package/dist/test/msw/handlers/putBucketAcl.js +29 -14
  252. package/dist/test/msw/handlers/putObject.d.ts +1 -1
  253. package/dist/test/msw/handlers/putObject.js +27 -12
  254. package/dist/test/msw/handlers.d.ts +3 -3
  255. package/dist/test/msw/handlers.js +77 -54
  256. package/dist/test/msw/index.d.ts +2 -2
  257. package/dist/test/msw/index.js +1 -1
  258. package/dist/test/msw/server.d.ts +1 -1
  259. package/dist/test/msw/server.js +1 -1
  260. package/dist/test/msw/utils.js +2 -2
  261. package/dist/test/setup.d.ts +1 -1
  262. package/dist/test/setup.js +13 -30
  263. package/dist/test/testUtils.d.ts +170 -36
  264. package/dist/test/testUtils.js +229 -116
  265. package/dist/test/utils/errorHandling.test.js +146 -108
  266. package/dist/types/index.d.ts +49 -36
  267. package/dist/types/monaco.d.ts +13 -0
  268. package/dist/types/monaco.js +0 -0
  269. package/dist/utils/__tests__/proxyMiddleware.test.d.ts +1 -0
  270. package/dist/utils/__tests__/proxyMiddleware.test.js +579 -0
  271. package/dist/utils/__tests__/s3Client.test.d.ts +1 -0
  272. package/dist/utils/__tests__/s3Client.test.js +340 -0
  273. package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
  274. package/dist/utils/__tests__/s3ConfigIdentifier.test.js +437 -0
  275. package/dist/utils/constants.d.ts +22 -0
  276. package/dist/utils/constants.js +19 -0
  277. package/dist/utils/deletion/index.d.ts +2 -2
  278. package/dist/utils/deletion/index.js +1 -1
  279. package/dist/utils/deletion/messages.d.ts +1 -1
  280. package/dist/utils/deletion/messages.js +4 -4
  281. package/dist/utils/errorHandling.d.ts +12 -3
  282. package/dist/utils/errorHandling.js +12 -7
  283. package/dist/utils/hooks.js +8 -8
  284. package/dist/utils/index.d.ts +5 -2
  285. package/dist/utils/index.js +5 -1
  286. package/dist/utils/proxyMiddleware.d.ts +32 -13
  287. package/dist/utils/proxyMiddleware.js +90 -36
  288. package/dist/utils/s3Client.d.ts +14 -4
  289. package/dist/utils/s3Client.js +5 -26
  290. package/dist/utils/s3ConfigIdentifier.d.ts +79 -0
  291. package/dist/utils/s3ConfigIdentifier.js +57 -0
  292. package/dist/utils/s3RuleUtils.d.ts +53 -0
  293. package/dist/utils/s3RuleUtils.js +101 -0
  294. package/package.json +10 -8
  295. package/dist/components/__tests__/BucketNotificationCreatePage.test.js +0 -316
  296. package/dist/components/buckets/BucketPolicyButton.d.ts +0 -7
  297. package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +0 -1
  298. package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +0 -234
  299. package/dist/hooks/useLoginMutation.d.ts +0 -21
  300. package/dist/hooks/useLoginMutation.js +0 -9
  301. package/dist/utils/useFeatures.d.ts +0 -1
  302. package/dist/utils/useFeatures.js +0 -7
  303. /package/dist/components/__tests__/{BucketNotificationCreatePage.test.d.ts → BucketAccessor.test.d.ts} +0 -0
@@ -1,9 +1,9 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { act, fireEvent, render, screen, waitFor } from "@testing-library/react";
3
+ import { useDeleteObjects, useGetBucketVersioning } from "../../hooks/index.js";
3
4
  import { createTestWrapper } from "../../test/testUtils.js";
4
5
  import { DeleteObjectButton } from "../objects/DeleteObjectButton.js";
5
- import { useDeleteObjects, useGetBucketVersioning } from "../../hooks/index.js";
6
- jest.mock("../../hooks");
6
+ jest.mock('../../hooks');
7
7
  const mockUseDeleteObjects = jest.mocked(useDeleteObjects);
8
8
  const mockUseGetBucketVersioning = jest.mocked(useGetBucketVersioning);
9
9
  const mockDeleteObjects = jest.fn();
@@ -14,7 +14,7 @@ const createMockObjects = (count, withVersions = false)=>Array.from({
14
14
  displayName: `file${i + 1}.txt`,
15
15
  Size: 1024 * (i + 1),
16
16
  LastModified: new Date(`2023-01-${i + 1}T10:00:00Z`),
17
- type: "object",
17
+ type: 'object',
18
18
  ...withVersions && {
19
19
  VersionId: `version-${i + 1}`
20
20
  }
@@ -24,13 +24,13 @@ const createMockFolders = (count)=>Array.from({
24
24
  }, (_, i)=>({
25
25
  Key: `folder${i + 1}/`,
26
26
  displayName: `folder${i + 1}/`,
27
- type: "folder",
27
+ type: 'folder',
28
28
  LastModified: void 0
29
29
  }));
30
30
  const renderDeleteObjectButton = (props = {})=>{
31
31
  const defaultProps = {
32
32
  objects: createMockObjects(2),
33
- bucketName: "test-bucket",
33
+ bucketName: 'test-bucket',
34
34
  ...props
35
35
  };
36
36
  const Wrapper = createTestWrapper();
@@ -43,7 +43,7 @@ const renderDeleteObjectButton = (props = {})=>{
43
43
  const mockHookDefaults = (versioningEnabled = false)=>{
44
44
  mockUseGetBucketVersioning.mockReturnValue({
45
45
  data: {
46
- Status: versioningEnabled ? "Enabled" : "Suspended"
46
+ Status: versioningEnabled ? 'Enabled' : 'Suspended'
47
47
  },
48
48
  isLoading: false,
49
49
  error: null
@@ -53,55 +53,55 @@ const mockHookDefaults = (versioningEnabled = false)=>{
53
53
  isPending: false
54
54
  });
55
55
  };
56
- describe("DeleteObjectButton", ()=>{
56
+ describe('DeleteObjectButton', ()=>{
57
57
  beforeEach(()=>{
58
58
  jest.clearAllMocks();
59
59
  mockHookDefaults();
60
60
  });
61
- it("renders delete button with correct label and icon", ()=>{
61
+ it('renders delete button with correct label and icon', ()=>{
62
62
  renderDeleteObjectButton();
63
- const button = screen.getByRole("button", {
63
+ const button = screen.getByRole('button', {
64
64
  name: /delete/i
65
65
  });
66
66
  expect(button).toBeInTheDocument();
67
- expect(button).toHaveAttribute("id", "object-list-delete-button");
67
+ expect(button).toHaveAttribute('id', 'object-list-delete-button');
68
68
  });
69
- it("disables button when no objects are selected", ()=>{
69
+ it('disables button when no objects are selected', ()=>{
70
70
  renderDeleteObjectButton({
71
71
  objects: []
72
72
  });
73
- const button = screen.getByRole("button", {
73
+ const button = screen.getByRole('button', {
74
74
  name: /delete/i
75
75
  });
76
76
  expect(button).toBeDisabled();
77
77
  });
78
- it("enables button when objects are selected", ()=>{
78
+ it('enables button when objects are selected', ()=>{
79
79
  renderDeleteObjectButton();
80
- const button = screen.getByRole("button", {
80
+ const button = screen.getByRole('button', {
81
81
  name: /delete/i
82
82
  });
83
83
  expect(button).not.toBeDisabled();
84
84
  });
85
- it("opens confirmation modal when delete button is clicked", ()=>{
85
+ it('opens confirmation modal when delete button is clicked', ()=>{
86
86
  renderDeleteObjectButton();
87
- const button = screen.getByRole("button", {
87
+ const button = screen.getByRole('button', {
88
88
  name: /delete/i
89
89
  });
90
90
  fireEvent.click(button);
91
- expect(screen.getByText("Confirmation")).toBeInTheDocument();
91
+ expect(screen.getByText('Confirmation')).toBeInTheDocument();
92
92
  expect(screen.getByText(/do you want to.*delete/i)).toBeInTheDocument();
93
93
  });
94
- it("shows correct confirmation message for objects without versioning", ()=>{
94
+ it('shows correct confirmation message for objects without versioning', ()=>{
95
95
  renderDeleteObjectButton({
96
96
  objects: createMockObjects(2)
97
97
  });
98
- const button = screen.getByRole("button", {
98
+ const button = screen.getByRole('button', {
99
99
  name: /delete/i
100
100
  });
101
101
  fireEvent.click(button);
102
- expect(screen.getByText((content, _)=>content.includes("2") && content.includes("object"))).toBeInTheDocument();
102
+ expect(screen.getByText((content, _)=>content.includes('2') && content.includes('object'))).toBeInTheDocument();
103
103
  });
104
- it("shows correct confirmation message for mixed objects and folders", ()=>{
104
+ it('shows correct confirmation message for mixed objects and folders', ()=>{
105
105
  const mixedObjects = [
106
106
  ...createMockObjects(1),
107
107
  ...createMockFolders(1)
@@ -109,90 +109,90 @@ describe("DeleteObjectButton", ()=>{
109
109
  renderDeleteObjectButton({
110
110
  objects: mixedObjects
111
111
  });
112
- const button = screen.getByRole("button", {
112
+ const button = screen.getByRole('button', {
113
113
  name: /delete/i
114
114
  });
115
115
  fireEvent.click(button);
116
116
  expect(screen.getByText(/do you want to/i)).toBeInTheDocument();
117
117
  expect(screen.getByText(/delete the selected/i)).toBeInTheDocument();
118
118
  });
119
- it("shows permanently delete message for versioned objects with specific versions", ()=>{
119
+ it('shows permanently delete message for versioned objects with specific versions', ()=>{
120
120
  mockHookDefaults(true);
121
121
  renderDeleteObjectButton({
122
122
  objects: createMockObjects(2, true)
123
123
  });
124
- const button = screen.getByRole("button", {
124
+ const button = screen.getByRole('button', {
125
125
  name: /delete/i
126
126
  });
127
127
  fireEvent.click(button);
128
- expect(screen.getByText("The selected versions will be permanently deleted.")).toBeInTheDocument();
128
+ expect(screen.getByText('The selected versions will be permanently deleted.')).toBeInTheDocument();
129
129
  expect(screen.getByText(/do you want to/i)).toBeInTheDocument();
130
130
  expect(screen.getByText(/object versions/i)).toBeInTheDocument();
131
131
  });
132
- it("displays total size of selected objects", ()=>{
132
+ it('displays total size of selected objects', ()=>{
133
133
  const objects = createMockObjects(2);
134
134
  renderDeleteObjectButton({
135
135
  objects
136
136
  });
137
- const button = screen.getByRole("button", {
137
+ const button = screen.getByRole('button', {
138
138
  name: /delete/i
139
139
  });
140
140
  fireEvent.click(button);
141
141
  expect(screen.getByText(/total.*3.*kb/i)).toBeInTheDocument();
142
142
  });
143
- it("shows info banner with deletion message", ()=>{
143
+ it('shows info banner with deletion message', ()=>{
144
144
  renderDeleteObjectButton();
145
- const button = screen.getByRole("button", {
145
+ const button = screen.getByRole('button', {
146
146
  name: /delete/i
147
147
  });
148
148
  fireEvent.click(button);
149
149
  expect(screen.getByText(/the selected objects will be permanently deleted/i)).toBeInTheDocument();
150
150
  });
151
- it("shows different info message for versioned buckets without specific versions", ()=>{
151
+ it('shows different info message for versioned buckets without specific versions', ()=>{
152
152
  mockHookDefaults(true);
153
153
  renderDeleteObjectButton({
154
154
  objects: createMockObjects(2, false)
155
155
  });
156
- const button = screen.getByRole("button", {
156
+ const button = screen.getByRole('button', {
157
157
  name: /delete/i
158
158
  });
159
159
  fireEvent.click(button);
160
160
  expect(screen.getByText(/delete markers will be added to the objects/i)).toBeInTheDocument();
161
161
  });
162
- it("closes modal when cancel button is clicked", ()=>{
162
+ it('closes modal when cancel button is clicked', ()=>{
163
163
  renderDeleteObjectButton();
164
- const deleteButton = screen.getByRole("button", {
164
+ const deleteButton = screen.getByRole('button', {
165
165
  name: /delete/i
166
166
  });
167
167
  fireEvent.click(deleteButton);
168
- const cancelButton = screen.getByRole("button", {
168
+ const cancelButton = screen.getByRole('button', {
169
169
  name: /cancel/i
170
170
  });
171
171
  fireEvent.click(cancelButton);
172
- expect(screen.queryByText("Confirmation")).not.toBeInTheDocument();
172
+ expect(screen.queryByText('Confirmation')).not.toBeInTheDocument();
173
173
  });
174
- it("calls delete mutation with correct parameters when deletion is confirmed", ()=>{
174
+ it('calls delete mutation with correct parameters when deletion is confirmed', ()=>{
175
175
  const objects = createMockObjects(2);
176
176
  renderDeleteObjectButton({
177
177
  objects,
178
- bucketName: "my-bucket"
178
+ bucketName: 'my-bucket'
179
179
  });
180
- const deleteButton = screen.getByRole("button", {
180
+ const deleteButton = screen.getByRole('button', {
181
181
  name: /delete/i
182
182
  });
183
183
  fireEvent.click(deleteButton);
184
- const confirmButton = document.getElementById("object-delete-delete-button");
184
+ const confirmButton = document.getElementById('object-delete-delete-button');
185
185
  expect(confirmButton).toBeInTheDocument();
186
186
  fireEvent.click(confirmButton);
187
187
  expect(mockDeleteObjects).toHaveBeenCalledWith({
188
- Bucket: "my-bucket",
188
+ Bucket: 'my-bucket',
189
189
  Delete: {
190
190
  Objects: [
191
191
  {
192
- Key: "file1.txt"
192
+ Key: 'file1.txt'
193
193
  },
194
194
  {
195
- Key: "file2.txt"
195
+ Key: 'file2.txt'
196
196
  }
197
197
  ]
198
198
  }
@@ -201,29 +201,29 @@ describe("DeleteObjectButton", ()=>{
201
201
  onError: expect.any(Function)
202
202
  }));
203
203
  });
204
- it("includes version IDs in delete request when objects have versions", ()=>{
204
+ it('includes version IDs in delete request when objects have versions', ()=>{
205
205
  const objects = createMockObjects(1, true);
206
206
  renderDeleteObjectButton({
207
207
  objects
208
208
  });
209
- const deleteButton = screen.getByRole("button", {
209
+ const deleteButton = screen.getByRole('button', {
210
210
  name: /delete/i
211
211
  });
212
212
  fireEvent.click(deleteButton);
213
- const confirmButton = document.getElementById("object-delete-delete-button");
213
+ const confirmButton = document.getElementById('object-delete-delete-button');
214
214
  fireEvent.click(confirmButton);
215
215
  expect(mockDeleteObjects).toHaveBeenCalledWith(expect.objectContaining({
216
216
  Delete: {
217
217
  Objects: [
218
218
  {
219
- Key: "file1.txt",
220
- VersionId: "version-1"
219
+ Key: 'file1.txt',
220
+ VersionId: 'version-1'
221
221
  }
222
222
  ]
223
223
  }
224
224
  }), expect.any(Object));
225
225
  });
226
- it("handles mixed objects and folders in delete request", ()=>{
226
+ it('handles mixed objects and folders in delete request', ()=>{
227
227
  const mixedObjects = [
228
228
  ...createMockObjects(1),
229
229
  ...createMockFolders(1)
@@ -231,61 +231,61 @@ describe("DeleteObjectButton", ()=>{
231
231
  renderDeleteObjectButton({
232
232
  objects: mixedObjects
233
233
  });
234
- const deleteButton = screen.getByRole("button", {
234
+ const deleteButton = screen.getByRole('button', {
235
235
  name: /delete/i
236
236
  });
237
237
  fireEvent.click(deleteButton);
238
- const confirmButton = document.getElementById("object-delete-delete-button");
238
+ const confirmButton = document.getElementById('object-delete-delete-button');
239
239
  fireEvent.click(confirmButton);
240
240
  expect(mockDeleteObjects).toHaveBeenCalledWith(expect.objectContaining({
241
241
  Delete: {
242
242
  Objects: [
243
243
  {
244
- Key: "file1.txt"
244
+ Key: 'file1.txt'
245
245
  },
246
246
  {
247
- Key: "folder1/"
247
+ Key: 'folder1/'
248
248
  }
249
249
  ]
250
250
  }
251
251
  }), expect.any(Object));
252
252
  });
253
- it("shows success toast and closes modal when deletion succeeds", async ()=>{
253
+ it('shows success toast and closes modal when deletion succeeds', async ()=>{
254
254
  renderDeleteObjectButton();
255
- const deleteButton = screen.getByRole("button", {
255
+ const deleteButton = screen.getByRole('button', {
256
256
  name: /delete/i
257
257
  });
258
258
  fireEvent.click(deleteButton);
259
- expect(screen.getByText("Confirmation")).toBeInTheDocument();
260
- const confirmButton = document.getElementById("object-delete-delete-button");
259
+ expect(screen.getByText('Confirmation')).toBeInTheDocument();
260
+ const confirmButton = document.getElementById('object-delete-delete-button');
261
261
  fireEvent.click(confirmButton);
262
262
  await act(async ()=>{
263
263
  const successCallback = mockDeleteObjects.mock.calls[0][1].onSuccess;
264
264
  successCallback();
265
265
  });
266
266
  await waitFor(()=>{
267
- expect(screen.queryByText("Confirmation")).not.toBeInTheDocument();
267
+ expect(screen.queryByText('Confirmation')).not.toBeInTheDocument();
268
268
  });
269
269
  });
270
- it("handles non-Error objects in error callback", async ()=>{
270
+ it('handles non-Error objects in error callback', async ()=>{
271
271
  renderDeleteObjectButton();
272
- const deleteButton = screen.getByRole("button", {
272
+ const deleteButton = screen.getByRole('button', {
273
273
  name: /delete/i
274
274
  });
275
275
  fireEvent.click(deleteButton);
276
- const confirmButton = document.getElementById("object-delete-delete-button");
276
+ const confirmButton = document.getElementById('object-delete-delete-button');
277
277
  fireEvent.click(confirmButton);
278
278
  await act(async ()=>{
279
279
  const errorCallback = mockDeleteObjects.mock.calls[0][1].onError;
280
- errorCallback("string error");
280
+ errorCallback('string error');
281
281
  });
282
282
  expect(mockDeleteObjects.mock.calls[0][1].onError).toBeDefined();
283
283
  });
284
- it("updates objects when props change", ()=>{
284
+ it('updates objects when props change', ()=>{
285
285
  const { rerender } = renderDeleteObjectButton({
286
286
  objects: createMockObjects(1)
287
287
  });
288
- expect(screen.getByRole("button", {
288
+ expect(screen.getByRole('button', {
289
289
  name: /delete/i
290
290
  })).not.toBeDisabled();
291
291
  const Wrapper = createTestWrapper();
@@ -295,7 +295,7 @@ describe("DeleteObjectButton", ()=>{
295
295
  bucketName: "test-bucket"
296
296
  })
297
297
  }));
298
- expect(screen.getByRole("button", {
298
+ expect(screen.getByRole('button', {
299
299
  name: /delete/i
300
300
  })).toBeDisabled();
301
301
  });
@@ -0,0 +1,302 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { fireEvent, render, screen, waitFor } from "@testing-library/react";
3
+ import { useGetBucketObjectLockConfiguration } from "../../hooks/bucketConfiguration.js";
4
+ import { useEmptyBucket } from "../../hooks/useEmptyBucket.js";
5
+ import { useIsBucketEmpty } from "../../hooks/useIsBucketEmpty.js";
6
+ import { createTestWrapper } from "../../test/testUtils.js";
7
+ import { EmptyBucketButton } from "../buckets/EmptyBucketButton.js";
8
+ jest.mock('../../hooks/useIsBucketEmpty');
9
+ jest.mock('../../hooks/useEmptyBucket');
10
+ jest.mock('../../hooks/bucketConfiguration');
11
+ const mockUseIsBucketEmpty = jest.mocked(useIsBucketEmpty);
12
+ const mockUseEmptyBucket = jest.mocked(useEmptyBucket);
13
+ const mockUseGetBucketObjectLockConfiguration = jest.mocked(useGetBucketObjectLockConfiguration);
14
+ const renderEmptyBucketButton = (props = {})=>{
15
+ const Wrapper = createTestWrapper();
16
+ return render(/*#__PURE__*/ jsx(Wrapper, {
17
+ children: /*#__PURE__*/ jsx(EmptyBucketButton, {
18
+ bucketName: "test-bucket",
19
+ ...props
20
+ })
21
+ }));
22
+ };
23
+ const mockHookDefaults = ()=>{
24
+ mockUseIsBucketEmpty.mockReturnValue({
25
+ isEmpty: false,
26
+ isLoading: false,
27
+ error: null
28
+ });
29
+ mockUseEmptyBucket.mockReturnValue({
30
+ emptyBucket: jest.fn(),
31
+ isEmptying: false,
32
+ error: null,
33
+ result: null,
34
+ reset: jest.fn()
35
+ });
36
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
37
+ data: void 0,
38
+ isLoading: false,
39
+ error: null
40
+ });
41
+ };
42
+ describe('EmptyBucketButton', ()=>{
43
+ beforeEach(()=>{
44
+ jest.clearAllMocks();
45
+ mockHookDefaults();
46
+ });
47
+ it('renders empty button with correct label', ()=>{
48
+ renderEmptyBucketButton();
49
+ expect(screen.getByRole('button', {
50
+ name: /empty bucket/i
51
+ })).toBeInTheDocument();
52
+ });
53
+ it('disables button when bucket is empty', ()=>{
54
+ mockUseIsBucketEmpty.mockReturnValue({
55
+ isEmpty: true,
56
+ isLoading: false,
57
+ error: null
58
+ });
59
+ renderEmptyBucketButton();
60
+ const button = screen.getByRole('button', {
61
+ name: /empty bucket/i
62
+ });
63
+ expect(button).toBeDisabled();
64
+ });
65
+ it('enables button when bucket is not empty', ()=>{
66
+ mockUseIsBucketEmpty.mockReturnValue({
67
+ isEmpty: false,
68
+ isLoading: false,
69
+ error: null
70
+ });
71
+ renderEmptyBucketButton();
72
+ const button = screen.getByRole('button', {
73
+ name: /empty bucket/i
74
+ });
75
+ expect(button).not.toBeDisabled();
76
+ });
77
+ it('opens confirmation modal when button is clicked', ()=>{
78
+ renderEmptyBucketButton();
79
+ const button = screen.getByRole('button', {
80
+ name: /empty bucket/i
81
+ });
82
+ fireEvent.click(button);
83
+ expect(screen.getByText(/Empty Bucket 'test-bucket'\?/i)).toBeInTheDocument();
84
+ expect(screen.getByText(/Emptying a bucket removes all contents and cannot be reversed/i)).toBeInTheDocument();
85
+ });
86
+ it('shows information list in modal', ()=>{
87
+ renderEmptyBucketButton();
88
+ const button = screen.getByRole('button', {
89
+ name: /empty bucket/i
90
+ });
91
+ fireEvent.click(button);
92
+ expect(screen.getByText(/Emptying a bucket removes all contents and cannot be reversed/i)).toBeInTheDocument();
93
+ expect(screen.getByText(/New objects added during the empty action may also be removed/i)).toBeInTheDocument();
94
+ });
95
+ it('shows confirmation input field', ()=>{
96
+ renderEmptyBucketButton();
97
+ const button = screen.getByRole('button', {
98
+ name: /empty bucket/i
99
+ });
100
+ fireEvent.click(button);
101
+ const input = screen.getByPlaceholderText(/test-bucket/i);
102
+ expect(input).toBeInTheDocument();
103
+ });
104
+ it('disables empty button until bucket name is typed', ()=>{
105
+ renderEmptyBucketButton();
106
+ const button = screen.getByRole('button', {
107
+ name: /empty bucket/i
108
+ });
109
+ fireEvent.click(button);
110
+ const emptyButton = screen.getByRole('button', {
111
+ name: /^empty$/i
112
+ });
113
+ expect(emptyButton).toBeDisabled();
114
+ const input = screen.getByPlaceholderText(/test-bucket/i);
115
+ fireEvent.change(input, {
116
+ target: {
117
+ value: 'test-bucket'
118
+ }
119
+ });
120
+ expect(emptyButton).not.toBeDisabled();
121
+ });
122
+ it('closes modal when cancel is clicked', ()=>{
123
+ renderEmptyBucketButton();
124
+ const deleteButton = screen.getByRole('button', {
125
+ name: /empty bucket/i
126
+ });
127
+ fireEvent.click(deleteButton);
128
+ const cancelButton = screen.getByRole('button', {
129
+ name: /cancel/i
130
+ });
131
+ fireEvent.click(cancelButton);
132
+ expect(screen.queryByText(/Empty Bucket 'test-bucket'\?/i)).not.toBeInTheDocument();
133
+ });
134
+ it('resets state when modal is cancelled', ()=>{
135
+ renderEmptyBucketButton();
136
+ const button = screen.getByRole('button', {
137
+ name: /empty bucket/i
138
+ });
139
+ fireEvent.click(button);
140
+ const input = screen.getByPlaceholderText(/test-bucket/i);
141
+ fireEvent.change(input, {
142
+ target: {
143
+ value: 'test-bucket'
144
+ }
145
+ });
146
+ expect(input).toHaveValue('test-bucket');
147
+ const cancelButton = screen.getByRole('button', {
148
+ name: /cancel/i
149
+ });
150
+ fireEvent.click(cancelButton);
151
+ fireEvent.click(button);
152
+ const inputAfterReopen = screen.getByPlaceholderText(/test-bucket/i);
153
+ expect(inputAfterReopen).toHaveValue('');
154
+ });
155
+ it('displays correct bucket name in modal title', ()=>{
156
+ renderEmptyBucketButton({
157
+ bucketName: 'my-special-bucket'
158
+ });
159
+ const button = screen.getByRole('button', {
160
+ name: /empty bucket/i
161
+ });
162
+ fireEvent.click(button);
163
+ expect(screen.getByText(/Empty Bucket 'my-special-bucket'\?/i)).toBeInTheDocument();
164
+ });
165
+ it('shows loading state during deletion', async ()=>{
166
+ const mockEmptyBucket = jest.fn();
167
+ mockUseEmptyBucket.mockReturnValue({
168
+ emptyBucket: mockEmptyBucket,
169
+ isEmptying: true,
170
+ error: null,
171
+ result: null,
172
+ reset: jest.fn()
173
+ });
174
+ renderEmptyBucketButton();
175
+ const button = screen.getByRole('button', {
176
+ name: /empty bucket/i
177
+ });
178
+ fireEvent.click(button);
179
+ expect(screen.getByText(/Deletion in progress.../i)).toBeInTheDocument();
180
+ });
181
+ it('completes empty bucket operation successfully and shows summary', async ()=>{
182
+ const mockEmptyBucket = jest.fn().mockResolvedValue({
183
+ success: true,
184
+ deletedCount: 100,
185
+ errors: [],
186
+ limitReached: false
187
+ });
188
+ mockUseEmptyBucket.mockReturnValue({
189
+ emptyBucket: mockEmptyBucket,
190
+ isEmptying: false,
191
+ error: null,
192
+ result: null,
193
+ reset: jest.fn()
194
+ });
195
+ renderEmptyBucketButton();
196
+ const button = screen.getByRole('button', {
197
+ name: /empty bucket/i
198
+ });
199
+ fireEvent.click(button);
200
+ const input = screen.getByPlaceholderText(/test-bucket/i);
201
+ fireEvent.change(input, {
202
+ target: {
203
+ value: 'test-bucket'
204
+ }
205
+ });
206
+ const emptyButton = screen.getByRole('button', {
207
+ name: /^empty$/i
208
+ });
209
+ fireEvent.click(emptyButton);
210
+ await waitFor(()=>{
211
+ expect(mockEmptyBucket).toHaveBeenCalledWith('test-bucket');
212
+ });
213
+ });
214
+ it('displays error when deletion fails', ()=>{
215
+ mockUseEmptyBucket.mockReturnValue({
216
+ emptyBucket: jest.fn(),
217
+ isEmptying: false,
218
+ error: new Error('Network error'),
219
+ result: null,
220
+ reset: jest.fn()
221
+ });
222
+ renderEmptyBucketButton();
223
+ const button = screen.getByRole('button', {
224
+ name: /empty bucket/i
225
+ });
226
+ fireEvent.click(button);
227
+ expect(screen.getByText(/Network error/i)).toBeInTheDocument();
228
+ });
229
+ it('calls emptyBucket when user confirms', async ()=>{
230
+ const mockEmptyBucket = jest.fn().mockResolvedValue({
231
+ success: false,
232
+ deletedCount: 50,
233
+ errors: [
234
+ {
235
+ key: 'file1.txt',
236
+ code: 'AccessDenied',
237
+ message: 'Access denied'
238
+ }
239
+ ],
240
+ limitReached: false
241
+ });
242
+ mockUseEmptyBucket.mockReturnValue({
243
+ emptyBucket: mockEmptyBucket,
244
+ isEmptying: false,
245
+ error: null,
246
+ result: null,
247
+ reset: jest.fn()
248
+ });
249
+ renderEmptyBucketButton();
250
+ const button = screen.getByRole('button', {
251
+ name: /empty bucket/i
252
+ });
253
+ fireEvent.click(button);
254
+ const input = screen.getByPlaceholderText(/test-bucket/i);
255
+ fireEvent.change(input, {
256
+ target: {
257
+ value: 'test-bucket'
258
+ }
259
+ });
260
+ const emptyButton = screen.getByRole('button', {
261
+ name: /^empty$/i
262
+ });
263
+ fireEvent.click(emptyButton);
264
+ await waitFor(()=>{
265
+ expect(mockEmptyBucket).toHaveBeenCalledWith('test-bucket');
266
+ });
267
+ });
268
+ it('displays Object Lock warning when enabled', ()=>{
269
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
270
+ data: {
271
+ ObjectLockConfiguration: {
272
+ ObjectLockEnabled: 'Enabled'
273
+ }
274
+ },
275
+ isLoading: false,
276
+ error: null
277
+ });
278
+ renderEmptyBucketButton();
279
+ const button = screen.getByRole('button', {
280
+ name: /empty bucket/i
281
+ });
282
+ fireEvent.click(button);
283
+ expect(screen.getByText(/locked in governance mode/i)).toBeInTheDocument();
284
+ });
285
+ it('does not show Object Lock warning when disabled', ()=>{
286
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
287
+ data: {
288
+ ObjectLockConfiguration: {
289
+ ObjectLockEnabled: 'Disabled'
290
+ }
291
+ },
292
+ isLoading: false,
293
+ error: null
294
+ });
295
+ renderEmptyBucketButton();
296
+ const button = screen.getByRole('button', {
297
+ name: /empty bucket/i
298
+ });
299
+ fireEvent.click(button);
300
+ expect(screen.queryByText(/locked in governance mode/i)).not.toBeInTheDocument();
301
+ });
302
+ });