@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,479 +1,784 @@
1
- import { jsx } from "react/jsx-runtime";
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { fireEvent, render, screen } from "@testing-library/react";
3
- import { useGetBucketAcl, useGetBucketCors, useGetBucketLocation, useGetBucketObjectLockConfiguration, useGetBucketPolicy, useGetBucketVersioning } from "../../hooks/index.js";
4
- import { createTestWrapper } from "../../test/testUtils.js";
5
- import { BucketOverview } from "../buckets/BucketOverview.js";
6
- jest.mock("../../hooks");
3
+ import { MemoryRouter } from "react-router";
4
+ import { useGetBucketAcl, useGetBucketCors, useGetBucketLocation, useGetBucketObjectLockConfiguration, useGetBucketPolicy, useGetBucketTagging, useGetBucketVersioning, useISVBucketStatus } from "../../hooks/index.js";
5
+ import { useFeatures } from "../../hooks/useFeatures.js";
6
+ import { applyBucketMocks, createTestWrapper } from "../../test/testUtils.js";
7
+ import { BucketOverview, useBucketOverviewContext } from "../buckets/BucketOverview.js";
8
+ import * as __rspack_external__contexts_DataBrowserUICustomizationContext_js_f267b01c from "../../contexts/DataBrowserUICustomizationContext.js";
9
+ jest.mock('../../hooks');
10
+ jest.mock('../../hooks/useFeatures');
7
11
  const mockUseGetBucketVersioning = jest.mocked(useGetBucketVersioning);
8
12
  const mockUseGetBucketAcl = jest.mocked(useGetBucketAcl);
9
13
  const mockUseGetBucketLocation = jest.mocked(useGetBucketLocation);
10
14
  const mockUseGetBucketCors = jest.mocked(useGetBucketCors);
11
15
  const mockUseGetBucketObjectLockConfiguration = jest.mocked(useGetBucketObjectLockConfiguration);
12
16
  const mockUseGetBucketPolicy = jest.mocked(useGetBucketPolicy);
17
+ const mockUseGetBucketTagging = jest.mocked(useGetBucketTagging);
18
+ const mockUseISVBucketStatus = jest.mocked(useISVBucketStatus);
19
+ const mockUseFeatures = jest.mocked(useFeatures);
20
+ const mockUseDataBrowserUICustomization = (config = {})=>{
21
+ jest.spyOn(__rspack_external__contexts_DataBrowserUICustomizationContext_js_f267b01c, 'useDataBrowserUICustomization').mockReturnValue(config);
22
+ };
13
23
  const renderBucketOverview = (props = {})=>{
24
+ const { bucketName = 'test-bucket', onEmptyBucket, onDeleteBucket, onEditPolicy, renderEmptyButton, renderDeleteButton, isEmptyBucketDisabled, isDeleteBucketDisabled } = props;
14
25
  const Wrapper = createTestWrapper();
15
- return render(/*#__PURE__*/ jsx(Wrapper, {
16
- children: /*#__PURE__*/ jsx(BucketOverview, {
17
- bucketName: "test-bucket",
18
- ...props
26
+ return render(/*#__PURE__*/ jsx(MemoryRouter, {
27
+ children: /*#__PURE__*/ jsx(Wrapper, {
28
+ children: /*#__PURE__*/ jsxs(BucketOverview, {
29
+ bucketName: bucketName,
30
+ children: [
31
+ /*#__PURE__*/ jsx(BucketOverview.Actions, {
32
+ onEmptyBucket: onEmptyBucket,
33
+ onDeleteBucket: onDeleteBucket,
34
+ renderEmptyButton: renderEmptyButton,
35
+ renderDeleteButton: renderDeleteButton,
36
+ isEmptyBucketDisabled: isEmptyBucketDisabled,
37
+ isDeleteBucketDisabled: isDeleteBucketDisabled
38
+ }),
39
+ /*#__PURE__*/ jsxs(BucketOverview.Sections, {
40
+ children: [
41
+ /*#__PURE__*/ jsx(BucketOverview.GeneralSection, {}),
42
+ /*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
43
+ /*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {
44
+ onEditPolicy: onEditPolicy
45
+ })
46
+ ]
47
+ })
48
+ ]
49
+ })
19
50
  })
20
51
  }));
21
52
  };
22
- const mockHookDefaults = ()=>{
23
- mockUseGetBucketVersioning.mockReturnValue({
24
- data: {
25
- Status: "Enabled"
26
- },
27
- status: "success"
28
- });
29
- mockUseGetBucketAcl.mockReturnValue({
30
- data: {
31
- Owner: {
32
- DisplayName: "test-owner"
33
- },
34
- Grants: [
35
- {
36
- Grantee: {
37
- DisplayName: "test-grantee"
38
- }
39
- }
40
- ]
41
- },
42
- status: "success"
43
- });
44
- mockUseGetBucketLocation.mockReturnValue({
45
- data: {
46
- LocationConstraint: "us-west-2"
47
- },
48
- status: "success"
49
- });
50
- mockUseGetBucketCors.mockReturnValue({
51
- data: {
52
- CORSRules: []
53
- },
54
- status: "success"
55
- });
56
- mockUseGetBucketObjectLockConfiguration.mockReturnValue({
57
- data: {
58
- ObjectLockConfiguration: {
59
- ObjectLockEnabled: "Disabled"
60
- }
61
- },
62
- status: "success"
63
- });
64
- mockUseGetBucketPolicy.mockReturnValue({
65
- data: void 0,
66
- error: null,
67
- status: "success"
68
- });
53
+ const mockHookDefaults = (overrides = {})=>{
54
+ applyBucketMocks({
55
+ useGetBucketVersioning: mockUseGetBucketVersioning,
56
+ useGetBucketAcl: mockUseGetBucketAcl,
57
+ useGetBucketLocation: mockUseGetBucketLocation,
58
+ useGetBucketCors: mockUseGetBucketCors,
59
+ useGetBucketObjectLockConfiguration: mockUseGetBucketObjectLockConfiguration,
60
+ useGetBucketPolicy: mockUseGetBucketPolicy,
61
+ useGetBucketTagging: mockUseGetBucketTagging,
62
+ useISVBucketStatus: mockUseISVBucketStatus,
63
+ useFeatures: mockUseFeatures
64
+ }, overrides);
69
65
  };
70
- describe("BucketOverview", ()=>{
66
+ describe('BucketOverview', ()=>{
71
67
  beforeEach(()=>{
72
68
  jest.clearAllMocks();
73
69
  mockHookDefaults();
70
+ mockUseDataBrowserUICustomization({});
74
71
  });
75
- it("renders bucket overview with all sections", ()=>{
72
+ it('renders bucket overview with all sections', ()=>{
76
73
  renderBucketOverview();
77
- expect(screen.getByText("General")).toBeInTheDocument();
78
- expect(screen.getByText("Data protection")).toBeInTheDocument();
79
- expect(screen.getByText("Permissions")).toBeInTheDocument();
74
+ expect(screen.getByText('General')).toBeInTheDocument();
75
+ expect(screen.getByText('Data protection')).toBeInTheDocument();
76
+ expect(screen.getByText('Permissions')).toBeInTheDocument();
80
77
  });
81
- it("displays bucket name correctly", ()=>{
78
+ it('displays bucket name correctly', ()=>{
82
79
  renderBucketOverview({
83
- bucketName: "my-test-bucket"
80
+ bucketName: 'my-test-bucket'
84
81
  });
85
- expect(screen.getByText("my-test-bucket")).toBeInTheDocument();
82
+ expect(screen.getByText('my-test-bucket')).toBeInTheDocument();
86
83
  });
87
- it("shows versioning status when enabled", ()=>{
84
+ it('shows versioning status when enabled', ()=>{
88
85
  mockUseGetBucketVersioning.mockReturnValue({
89
86
  data: {
90
- Status: "Enabled"
87
+ Status: 'Enabled'
91
88
  },
92
- status: "success"
89
+ status: 'success'
93
90
  });
94
91
  renderBucketOverview();
95
- expect(screen.getByText("Active")).toBeInTheDocument();
92
+ expect(screen.getByText('Active')).toBeInTheDocument();
96
93
  });
97
- it("shows versioning status when disabled", ()=>{
94
+ it('shows versioning status when disabled', ()=>{
98
95
  mockUseGetBucketVersioning.mockReturnValue({
99
96
  data: {
100
- Status: "Suspended"
97
+ Status: 'Suspended'
101
98
  },
102
- status: "success"
99
+ status: 'success'
103
100
  });
104
101
  renderBucketOverview();
105
- expect(screen.getByText("Inactive")).toBeInTheDocument();
102
+ expect(screen.getByText('Inactive')).toBeInTheDocument();
106
103
  });
107
- it("displays bucket location", ()=>{
104
+ it('displays bucket location', ()=>{
108
105
  mockUseGetBucketLocation.mockReturnValue({
109
106
  data: {
110
- LocationConstraint: "eu-west-1"
107
+ LocationConstraint: 'eu-west-1'
111
108
  },
112
- status: "success"
109
+ status: 'success'
113
110
  });
114
111
  renderBucketOverview();
115
- expect(screen.getByText("eu-west-1")).toBeInTheDocument();
112
+ expect(screen.getByText('eu-west-1')).toBeInTheDocument();
116
113
  });
117
- it("shows default location when LocationConstraint is null", ()=>{
114
+ it('shows default location when LocationConstraint is null', ()=>{
118
115
  mockUseGetBucketLocation.mockReturnValue({
119
116
  data: {
120
117
  LocationConstraint: null
121
118
  },
122
- status: "success"
119
+ status: 'success'
120
+ });
121
+ renderBucketOverview();
122
+ expect(screen.getByText('us-east-1')).toBeInTheDocument();
123
+ });
124
+ it('shows object-lock enabled status', ()=>{
125
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
126
+ data: {
127
+ ObjectLockConfiguration: {
128
+ ObjectLockEnabled: 'Enabled'
129
+ }
130
+ },
131
+ status: 'success'
132
+ });
133
+ renderBucketOverview();
134
+ expect(screen.getByText('Enabled')).toBeInTheDocument();
135
+ });
136
+ it('shows object-lock disabled status', ()=>{
137
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
138
+ data: {
139
+ ObjectLockConfiguration: {
140
+ ObjectLockEnabled: 'Disabled'
141
+ }
142
+ },
143
+ status: 'success'
144
+ });
145
+ renderBucketOverview();
146
+ expect(screen.getByText('Disabled')).toBeInTheDocument();
147
+ });
148
+ it('shows default retention as Inactive when not configured', ()=>{
149
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
150
+ data: {
151
+ ObjectLockConfiguration: {
152
+ ObjectLockEnabled: 'Enabled'
153
+ }
154
+ },
155
+ status: 'success'
123
156
  });
124
157
  renderBucketOverview();
125
- expect(screen.getByText("us-east-1")).toBeInTheDocument();
158
+ expect(screen.getByText('Inactive')).toBeInTheDocument();
126
159
  });
127
- it("shows object-lock enabled status", ()=>{
160
+ it('shows default retention with days in Governance mode', ()=>{
128
161
  mockUseGetBucketObjectLockConfiguration.mockReturnValue({
129
162
  data: {
130
163
  ObjectLockConfiguration: {
131
- ObjectLockEnabled: "Enabled"
164
+ ObjectLockEnabled: 'Enabled',
165
+ Rule: {
166
+ DefaultRetention: {
167
+ Mode: 'GOVERNANCE',
168
+ Days: 30
169
+ }
170
+ }
132
171
  }
133
172
  },
134
- status: "success"
173
+ status: 'success'
135
174
  });
136
175
  renderBucketOverview();
137
- expect(screen.getByText("Enabled")).toBeInTheDocument();
176
+ expect(screen.getByText('Governance - 30 days')).toBeInTheDocument();
138
177
  });
139
- it("shows object-lock disabled status", ()=>{
178
+ it('shows default retention with single day', ()=>{
140
179
  mockUseGetBucketObjectLockConfiguration.mockReturnValue({
141
180
  data: {
142
181
  ObjectLockConfiguration: {
143
- ObjectLockEnabled: "Disabled"
182
+ ObjectLockEnabled: 'Enabled',
183
+ Rule: {
184
+ DefaultRetention: {
185
+ Mode: 'COMPLIANCE',
186
+ Days: 1
187
+ }
188
+ }
144
189
  }
145
190
  },
146
- status: "success"
191
+ status: 'success'
147
192
  });
148
193
  renderBucketOverview();
149
- expect(screen.getByText("Disabled")).toBeInTheDocument();
194
+ expect(screen.getByText('Compliance - 1 day')).toBeInTheDocument();
150
195
  });
151
- it("displays bucket owner from ACL", ()=>{
196
+ it('shows default retention with years in Compliance mode', ()=>{
197
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
198
+ data: {
199
+ ObjectLockConfiguration: {
200
+ ObjectLockEnabled: 'Enabled',
201
+ Rule: {
202
+ DefaultRetention: {
203
+ Mode: 'COMPLIANCE',
204
+ Years: 7
205
+ }
206
+ }
207
+ }
208
+ },
209
+ status: 'success'
210
+ });
211
+ renderBucketOverview();
212
+ expect(screen.getByText('Compliance - 7 years')).toBeInTheDocument();
213
+ });
214
+ it('shows default retention with single year', ()=>{
215
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
216
+ data: {
217
+ ObjectLockConfiguration: {
218
+ ObjectLockEnabled: 'Enabled',
219
+ Rule: {
220
+ DefaultRetention: {
221
+ Mode: 'GOVERNANCE',
222
+ Years: 1
223
+ }
224
+ }
225
+ }
226
+ },
227
+ status: 'success'
228
+ });
229
+ renderBucketOverview();
230
+ expect(screen.getByText('Governance - 1 year')).toBeInTheDocument();
231
+ });
232
+ it('shows edit retention button when object lock is enabled', ()=>{
233
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
234
+ data: {
235
+ ObjectLockConfiguration: {
236
+ ObjectLockEnabled: 'Enabled',
237
+ Rule: {
238
+ DefaultRetention: {
239
+ Mode: 'GOVERNANCE',
240
+ Days: 30
241
+ }
242
+ }
243
+ }
244
+ },
245
+ status: 'success'
246
+ });
247
+ renderBucketOverview();
248
+ const editButton = screen.getByRole('button', {
249
+ name: /edit default retention/i
250
+ });
251
+ expect(editButton).toBeInTheDocument();
252
+ });
253
+ it('does not show edit retention button when object lock is disabled', ()=>{
254
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
255
+ data: {
256
+ ObjectLockConfiguration: {
257
+ ObjectLockEnabled: 'Disabled'
258
+ }
259
+ },
260
+ status: 'success'
261
+ });
262
+ renderBucketOverview();
263
+ const editButton = screen.queryByRole('button', {
264
+ name: /edit default retention/i
265
+ });
266
+ expect(editButton).not.toBeInTheDocument();
267
+ });
268
+ it('displays bucket owner from ACL', ()=>{
152
269
  mockUseGetBucketAcl.mockReturnValue({
153
270
  data: {
154
271
  Owner: {
155
- DisplayName: "bucket-owner"
272
+ DisplayName: 'bucket-owner'
156
273
  },
157
274
  Grants: []
158
275
  },
159
- status: "success"
276
+ status: 'success'
160
277
  });
161
278
  renderBucketOverview();
162
- expect(screen.getByText("bucket-owner")).toBeInTheDocument();
279
+ expect(screen.getByText('bucket-owner')).toBeInTheDocument();
163
280
  });
164
- it("shows ACL grantees count", ()=>{
281
+ it('shows ACL grantees count', ()=>{
165
282
  mockUseGetBucketAcl.mockReturnValue({
166
283
  data: {
167
284
  Owner: {
168
- DisplayName: "owner"
285
+ DisplayName: 'owner'
169
286
  },
170
287
  Grants: [
171
288
  {
172
289
  Grantee: {
173
- DisplayName: "user1"
290
+ DisplayName: 'user1'
174
291
  }
175
292
  },
176
293
  {
177
294
  Grantee: {
178
- DisplayName: "user2"
295
+ DisplayName: 'user2'
179
296
  }
180
297
  },
181
298
  {
182
299
  Grantee: {
183
- DisplayName: "user3"
300
+ DisplayName: 'user3'
184
301
  }
185
302
  }
186
303
  ]
187
304
  },
188
- status: "success"
305
+ status: 'success'
189
306
  });
190
307
  renderBucketOverview();
191
- expect(screen.getByText("3 Grantees")).toBeInTheDocument();
308
+ expect(screen.getByText('3 Grantees')).toBeInTheDocument();
192
309
  });
193
- it("shows single grantee without plural", ()=>{
310
+ it('shows single grantee without plural', ()=>{
194
311
  mockUseGetBucketAcl.mockReturnValue({
195
312
  data: {
196
313
  Owner: {
197
- DisplayName: "owner"
314
+ DisplayName: 'owner'
198
315
  },
199
316
  Grants: [
200
317
  {
201
318
  Grantee: {
202
- DisplayName: "user1"
319
+ DisplayName: 'user1'
203
320
  }
204
321
  }
205
322
  ]
206
323
  },
207
- status: "success"
324
+ status: 'success'
208
325
  });
209
326
  renderBucketOverview();
210
- expect(screen.getByText("1 Grantee")).toBeInTheDocument();
327
+ expect(screen.getByText('1 Grantee')).toBeInTheDocument();
211
328
  });
212
- it("shows CORS enabled when rules exist", ()=>{
329
+ it('shows CORS enabled when rules exist', ()=>{
213
330
  mockUseGetBucketCors.mockReturnValue({
214
331
  data: {
215
332
  CORSRules: [
216
333
  {
217
334
  AllowedMethods: [
218
- "GET"
335
+ 'GET'
219
336
  ],
220
337
  AllowedOrigins: [
221
- "*"
338
+ '*'
222
339
  ]
223
340
  }
224
341
  ]
225
342
  },
226
- status: "success"
343
+ status: 'success',
344
+ error: null
227
345
  });
228
346
  renderBucketOverview();
229
- expect(screen.getByText("Yes")).toBeInTheDocument();
347
+ const yesElements = screen.getAllByText('Yes');
348
+ expect(yesElements.length).toBeGreaterThanOrEqual(1);
230
349
  });
231
- it("shows CORS disabled when no rules exist", ()=>{
350
+ it('shows CORS disabled when no rules exist', ()=>{
232
351
  mockUseGetBucketCors.mockReturnValue({
233
352
  data: {
234
353
  CORSRules: []
235
354
  },
236
- status: "success"
355
+ status: 'success',
356
+ error: null
237
357
  });
238
358
  renderBucketOverview();
239
- const corsValues = screen.getAllByText("No");
240
- expect(corsValues.length).toBeGreaterThan(0);
359
+ const noElements = screen.getAllByText('No');
360
+ expect(noElements.length).toBeGreaterThanOrEqual(1);
241
361
  });
242
- it("detects public bucket from ACL grants", ()=>{
362
+ it('detects public bucket from ACL grants', ()=>{
243
363
  mockUseGetBucketAcl.mockReturnValue({
244
364
  data: {
245
365
  Owner: {
246
- DisplayName: "owner"
366
+ DisplayName: 'owner'
247
367
  },
248
368
  Grants: [
249
369
  {
250
370
  Grantee: {
251
- URI: "http://acs.amazonaws.com/groups/global/AllUsers"
371
+ URI: 'http://acs.amazonaws.com/groups/global/AllUsers'
252
372
  },
253
- Permission: "READ"
373
+ Permission: 'READ'
254
374
  }
255
375
  ]
256
376
  },
257
- status: "success"
377
+ status: 'success'
258
378
  });
259
379
  renderBucketOverview();
260
- expect(screen.getByText("Yes")).toBeInTheDocument();
380
+ expect(screen.getByText('Yes')).toBeInTheDocument();
261
381
  });
262
- it("shows non-public bucket when no public grants", ()=>{
382
+ it('shows non-public bucket when no public grants', ()=>{
263
383
  mockUseGetBucketAcl.mockReturnValue({
264
384
  data: {
265
385
  Owner: {
266
- DisplayName: "owner"
386
+ DisplayName: 'owner'
267
387
  },
268
388
  Grants: [
269
389
  {
270
390
  Grantee: {
271
- DisplayName: "private-user"
391
+ DisplayName: 'private-user'
272
392
  },
273
- Permission: "READ"
393
+ Permission: 'READ'
274
394
  }
275
395
  ]
276
396
  },
277
- status: "success"
397
+ status: 'success'
278
398
  });
279
399
  renderBucketOverview();
280
- const publicValues = screen.getAllByText("No");
400
+ const publicValues = screen.getAllByText('No');
281
401
  expect(publicValues.length).toBeGreaterThan(0);
282
402
  });
283
- it("shows loading states while data is being fetched", ()=>{
403
+ it('shows loading states while data is being fetched', ()=>{
284
404
  mockUseGetBucketVersioning.mockReturnValue({
285
405
  data: void 0,
286
- status: "pending"
406
+ status: 'pending'
287
407
  });
288
408
  mockUseGetBucketAcl.mockReturnValue({
289
409
  data: void 0,
290
- status: "pending"
410
+ status: 'pending'
291
411
  });
292
412
  renderBucketOverview();
293
413
  const loaders = document.querySelectorAll('[data-testid="loader"], .loader, [class*="loader"]');
294
414
  expect(loaders.length).toBeGreaterThan(0);
295
415
  });
296
- it("shows error states when API calls fail", ()=>{
416
+ it('shows error states when API calls fail', ()=>{
297
417
  mockUseGetBucketVersioning.mockReturnValue({
298
418
  data: void 0,
299
- status: "error"
419
+ status: 'error'
300
420
  });
301
421
  mockUseGetBucketLocation.mockReturnValue({
302
422
  data: void 0,
303
- status: "error"
423
+ status: 'error'
304
424
  });
305
425
  renderBucketOverview();
306
- const errorElements = screen.getAllByText("Error");
426
+ const errorElements = screen.getAllByText('Error');
307
427
  expect(errorElements.length).toBeGreaterThan(0);
308
428
  });
309
- it("handles empty bucket button click", ()=>{
429
+ it('handles empty bucket button click', ()=>{
310
430
  const onEmptyBucket = jest.fn();
311
431
  renderBucketOverview({
312
432
  onEmptyBucket,
313
433
  isEmptyBucketDisabled: false
314
434
  });
315
- const emptyButton = screen.getByRole("button", {
435
+ const emptyButton = screen.getByRole('button', {
316
436
  name: /empty bucket/i
317
437
  });
318
438
  fireEvent.click(emptyButton);
319
439
  expect(onEmptyBucket).toHaveBeenCalled();
320
440
  });
321
- it("handles delete bucket button click", ()=>{
441
+ it('handles delete bucket button click', ()=>{
322
442
  const onDeleteBucket = jest.fn();
323
443
  renderBucketOverview({
324
444
  onDeleteBucket
325
445
  });
326
- const deleteButton = screen.getByRole("button", {
446
+ const deleteButton = screen.getByRole('button', {
327
447
  name: /delete bucket/i
328
448
  });
329
449
  fireEvent.click(deleteButton);
330
450
  expect(onDeleteBucket).toHaveBeenCalled();
331
451
  });
332
- it("disables empty button when specified", ()=>{
452
+ it('disables empty button when specified', ()=>{
333
453
  renderBucketOverview({
334
454
  isEmptyBucketDisabled: true
335
455
  });
336
- const emptyButton = screen.getByRole("button", {
456
+ const emptyButton = screen.getByRole('button', {
337
457
  name: /empty bucket/i
338
458
  });
339
459
  expect(emptyButton).toBeDisabled();
340
460
  });
341
- it("disables delete button when specified", ()=>{
461
+ it('disables delete button when specified', ()=>{
342
462
  renderBucketOverview({
343
463
  isDeleteBucketDisabled: true
344
464
  });
345
- const deleteButton = screen.getByRole("button", {
465
+ const deleteButton = screen.getByRole('button', {
346
466
  name: /delete bucket/i
347
467
  });
348
468
  expect(deleteButton).toBeDisabled();
349
469
  });
350
- it("renders custom empty button when provided", ()=>{
470
+ it('renders custom empty button when provided', ()=>{
351
471
  const renderEmptyButton = jest.fn(()=>/*#__PURE__*/ jsx("button", {
352
472
  children: "Custom Empty Button"
353
473
  }));
354
474
  renderBucketOverview({
355
475
  renderEmptyButton
356
476
  });
357
- expect(screen.getByText("Custom Empty Button")).toBeInTheDocument();
358
- expect(renderEmptyButton).toHaveBeenCalledWith("test-bucket");
477
+ expect(screen.getByText('Custom Empty Button')).toBeInTheDocument();
478
+ expect(renderEmptyButton).toHaveBeenCalledWith('test-bucket');
359
479
  });
360
- it("renders custom delete button when provided", ()=>{
480
+ it('renders custom delete button when provided', ()=>{
361
481
  const renderDeleteButton = jest.fn(()=>/*#__PURE__*/ jsx("button", {
362
482
  children: "Custom Delete Button"
363
483
  }));
364
484
  renderBucketOverview({
365
485
  renderDeleteButton
366
486
  });
367
- expect(screen.getByText("Custom Delete Button")).toBeInTheDocument();
368
- expect(renderDeleteButton).toHaveBeenCalledWith("test-bucket");
487
+ expect(screen.getByText('Custom Delete Button')).toBeInTheDocument();
488
+ expect(renderDeleteButton).toHaveBeenCalledWith('test-bucket');
369
489
  });
370
- it("works when no callbacks are provided", ()=>{
490
+ it('works when no callbacks are provided', ()=>{
371
491
  expect(()=>{
372
492
  renderBucketOverview();
373
- const emptyButton = screen.getByRole("button", {
493
+ const emptyButton = screen.getByRole('button', {
374
494
  name: /empty bucket/i
375
495
  });
376
- const deleteButton = screen.getByRole("button", {
496
+ const deleteButton = screen.getByRole('button', {
377
497
  name: /delete bucket/i
378
498
  });
379
499
  fireEvent.click(emptyButton);
380
500
  fireEvent.click(deleteButton);
381
501
  }).not.toThrow();
382
502
  });
383
- it("handles missing ACL data gracefully", ()=>{
503
+ it('handles missing ACL data gracefully', ()=>{
384
504
  mockUseGetBucketAcl.mockReturnValue({
385
505
  data: void 0,
386
- status: "success"
506
+ status: 'success'
387
507
  });
388
508
  renderBucketOverview();
389
- const naElements = screen.getAllByText("N/A");
509
+ const naElements = screen.getAllByText('N/A');
390
510
  expect(naElements.length).toBeGreaterThan(0);
391
511
  });
392
- it("handles missing versioning data gracefully", ()=>{
512
+ it('handles missing versioning data gracefully', ()=>{
393
513
  mockUseGetBucketVersioning.mockReturnValue({
394
514
  data: void 0,
395
- status: "success"
515
+ status: 'success'
396
516
  });
397
517
  renderBucketOverview();
398
- expect(screen.getByText("Inactive")).toBeInTheDocument();
518
+ expect(screen.getByText('Inactive')).toBeInTheDocument();
399
519
  });
400
- it("handles CORS error state", ()=>{
520
+ it('handles CORS error state', ()=>{
401
521
  mockUseGetBucketCors.mockReturnValue({
402
522
  data: void 0,
403
- status: "error"
523
+ status: 'error'
404
524
  });
405
525
  renderBucketOverview();
406
- const corsValues = screen.getAllByText("No");
526
+ const corsValues = screen.getAllByText('No');
407
527
  expect(corsValues.length).toBeGreaterThan(0);
408
528
  });
409
- it("handles object lock error state", ()=>{
529
+ it('handles object lock error state (404 - not configured)', ()=>{
530
+ const notFoundError = new Error('Object Lock configuration does not exist');
531
+ notFoundError.name = 'NoSuchBucketObjectLockConfiguration';
532
+ notFoundError.$metadata = {
533
+ httpStatusCode: 404
534
+ };
535
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
536
+ data: void 0,
537
+ status: 'error',
538
+ error: notFoundError
539
+ });
540
+ renderBucketOverview();
541
+ expect(screen.getByText('Disabled')).toBeInTheDocument();
542
+ });
543
+ it('handles object lock real error state (non-404)', ()=>{
544
+ const accessDeniedError = new Error('Access Denied');
545
+ accessDeniedError.name = 'AccessDenied';
546
+ accessDeniedError.$metadata = {
547
+ httpStatusCode: 403
548
+ };
410
549
  mockUseGetBucketObjectLockConfiguration.mockReturnValue({
411
550
  data: void 0,
412
- status: "error"
551
+ status: 'error',
552
+ error: accessDeniedError
413
553
  });
414
554
  renderBucketOverview();
415
- expect(screen.getByText("Disabled")).toBeInTheDocument();
555
+ expect(screen.getByText('Error')).toBeInTheDocument();
416
556
  });
417
- describe("Bucket Policy", ()=>{
557
+ describe('Bucket Policy', ()=>{
418
558
  it("shows 'Configured' when policy exists", ()=>{
419
559
  mockUseGetBucketPolicy.mockReturnValue({
420
560
  data: {
421
561
  Policy: '{"Version":"2012-10-17","Statement":[]}'
422
562
  },
423
563
  error: null,
424
- status: "success"
564
+ status: 'success'
425
565
  });
426
566
  renderBucketOverview();
427
- expect(screen.getByText("Configured")).toBeInTheDocument();
567
+ expect(screen.getByText('Configured')).toBeInTheDocument();
428
568
  });
429
569
  it("shows 'Not configured' when no policy exists", ()=>{
430
570
  mockUseGetBucketPolicy.mockReturnValue({
431
571
  data: void 0,
432
572
  error: null,
433
- status: "success"
573
+ status: 'success'
434
574
  });
435
575
  renderBucketOverview();
436
- expect(screen.getByText("Not configured")).toBeInTheDocument();
576
+ const notConfiguredElements = screen.getAllByText('Not configured');
577
+ expect(notConfiguredElements.length).toBeGreaterThanOrEqual(1);
437
578
  });
438
579
  it("shows 'Error' when policy fetch fails with non-NoSuchBucketPolicy error", ()=>{
439
- const genericError = new Error("Network error");
580
+ const genericError = new Error('Network error');
440
581
  mockUseGetBucketPolicy.mockReturnValue({
441
582
  data: void 0,
442
583
  error: genericError,
443
- status: "error"
584
+ status: 'error'
444
585
  });
445
586
  renderBucketOverview();
446
- const errorElements = screen.getAllByText("Error");
587
+ const errorElements = screen.getAllByText('Error');
447
588
  expect(errorElements.length).toBeGreaterThan(0);
448
589
  });
449
590
  it("shows 'Not configured' when policy does not exist (NoSuchBucketPolicy)", ()=>{
450
- const noSuchPolicyError = new Error("Policy does not exist");
451
- noSuchPolicyError.name = "NoSuchBucketPolicy";
591
+ const noSuchPolicyError = new Error('Policy does not exist');
592
+ noSuchPolicyError.name = 'NoSuchBucketPolicy';
452
593
  mockUseGetBucketPolicy.mockReturnValue({
453
594
  data: void 0,
454
595
  error: noSuchPolicyError,
455
- status: "error"
596
+ status: 'error'
456
597
  });
457
598
  renderBucketOverview();
458
- expect(screen.getByText("Not configured")).toBeInTheDocument();
599
+ const notConfiguredElements = screen.getAllByText('Not configured');
600
+ expect(notConfiguredElements.length).toBeGreaterThanOrEqual(1);
459
601
  });
460
- it("calls onEditPolicy when edit button is clicked", ()=>{
602
+ it('calls onEditPolicy when edit button is clicked', ()=>{
461
603
  const onEditPolicy = jest.fn();
462
604
  mockUseGetBucketPolicy.mockReturnValue({
463
605
  data: {
464
606
  Policy: '{"Version":"2012-10-17","Statement":[]}'
465
607
  },
466
608
  error: null,
467
- status: "success"
609
+ status: 'success'
468
610
  });
469
611
  renderBucketOverview({
470
612
  onEditPolicy
471
613
  });
472
- const editButton = screen.getByRole("button", {
473
- name: /edit/i
474
- });
475
- fireEvent.click(editButton);
476
- expect(onEditPolicy).toHaveBeenCalledWith("test-bucket");
614
+ fireEvent.click(screen.getByRole('button', {
615
+ name: 'Edit bucket policy'
616
+ }));
617
+ expect(onEditPolicy).toHaveBeenCalledWith('test-bucket');
618
+ });
619
+ });
620
+ describe('Extra Sections', ()=>{
621
+ it('renders extra sections between General and Data Protection', ()=>{
622
+ const Wrapper = createTestWrapper();
623
+ const extraSections = [
624
+ {
625
+ id: 'custom-section',
626
+ title: 'Custom Section',
627
+ render: ()=>/*#__PURE__*/ jsx("div", {
628
+ children: "Custom content"
629
+ })
630
+ }
631
+ ];
632
+ render(/*#__PURE__*/ jsx(MemoryRouter, {
633
+ children: /*#__PURE__*/ jsx(Wrapper, {
634
+ children: /*#__PURE__*/ jsxs(BucketOverview, {
635
+ bucketName: "test-bucket",
636
+ children: [
637
+ /*#__PURE__*/ jsx(BucketOverview.Actions, {}),
638
+ /*#__PURE__*/ jsxs(BucketOverview.Sections, {
639
+ children: [
640
+ /*#__PURE__*/ jsx(BucketOverview.GeneralSection, {}),
641
+ extraSections.map((section)=>/*#__PURE__*/ jsx(BucketOverview.Section, {
642
+ title: section.title,
643
+ children: section.render()
644
+ }, section.id)),
645
+ /*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
646
+ /*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {})
647
+ ]
648
+ })
649
+ ]
650
+ })
651
+ })
652
+ }));
653
+ expect(screen.getByText('Custom Section')).toBeInTheDocument();
654
+ expect(screen.getByText('Custom content')).toBeInTheDocument();
655
+ });
656
+ it('extra sections have access to BucketOverview context', ()=>{
657
+ const CustomSectionContent = ()=>{
658
+ const { bucketName } = useBucketOverviewContext();
659
+ return /*#__PURE__*/ jsxs("div", {
660
+ children: [
661
+ "Bucket name from context: ",
662
+ bucketName
663
+ ]
664
+ });
665
+ };
666
+ const Wrapper = createTestWrapper();
667
+ const extraSections = [
668
+ {
669
+ id: 'context-section',
670
+ title: 'Context Test',
671
+ render: ()=>/*#__PURE__*/ jsx(CustomSectionContent, {})
672
+ }
673
+ ];
674
+ render(/*#__PURE__*/ jsx(MemoryRouter, {
675
+ children: /*#__PURE__*/ jsx(Wrapper, {
676
+ children: /*#__PURE__*/ jsxs(BucketOverview, {
677
+ bucketName: "my-custom-bucket",
678
+ children: [
679
+ /*#__PURE__*/ jsx(BucketOverview.Actions, {}),
680
+ /*#__PURE__*/ jsxs(BucketOverview.Sections, {
681
+ children: [
682
+ /*#__PURE__*/ jsx(BucketOverview.GeneralSection, {}),
683
+ extraSections.map((section)=>/*#__PURE__*/ jsx(BucketOverview.Section, {
684
+ title: section.title,
685
+ children: section.render()
686
+ }, section.id)),
687
+ /*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
688
+ /*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {})
689
+ ]
690
+ })
691
+ ]
692
+ })
693
+ })
694
+ }));
695
+ expect(screen.getByText('Bucket name from context: my-custom-bucket')).toBeInTheDocument();
696
+ });
697
+ });
698
+ describe('Field Overrides', ()=>{
699
+ it('renders slot-based field override', ()=>{
700
+ const Wrapper = createTestWrapper();
701
+ render(/*#__PURE__*/ jsx(MemoryRouter, {
702
+ children: /*#__PURE__*/ jsx(Wrapper, {
703
+ children: /*#__PURE__*/ jsxs(BucketOverview, {
704
+ bucketName: "test-bucket",
705
+ children: [
706
+ /*#__PURE__*/ jsx(BucketOverview.Actions, {}),
707
+ /*#__PURE__*/ jsxs(BucketOverview.Sections, {
708
+ children: [
709
+ /*#__PURE__*/ jsx(BucketOverview.GeneralSection, {
710
+ locationField: /*#__PURE__*/ jsx("span", {
711
+ children: "Custom Location Content"
712
+ })
713
+ }),
714
+ /*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
715
+ /*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {})
716
+ ]
717
+ })
718
+ ]
719
+ })
720
+ })
721
+ }));
722
+ expect(screen.getByText('Custom Location Content')).toBeInTheDocument();
723
+ expect(screen.getByText('test-bucket')).toBeInTheDocument();
724
+ });
725
+ it('renders render prop field override', ()=>{
726
+ const Wrapper = createTestWrapper();
727
+ render(/*#__PURE__*/ jsx(MemoryRouter, {
728
+ children: /*#__PURE__*/ jsx(Wrapper, {
729
+ children: /*#__PURE__*/ jsxs(BucketOverview, {
730
+ bucketName: "test-bucket",
731
+ children: [
732
+ /*#__PURE__*/ jsx(BucketOverview.Actions, {}),
733
+ /*#__PURE__*/ jsxs(BucketOverview.Sections, {
734
+ children: [
735
+ /*#__PURE__*/ jsx(BucketOverview.GeneralSection, {
736
+ renderVersioning: (name)=>/*#__PURE__*/ jsxs("span", {
737
+ children: [
738
+ "Custom Versioning for ",
739
+ name
740
+ ]
741
+ })
742
+ }),
743
+ /*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
744
+ /*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {})
745
+ ]
746
+ })
747
+ ]
748
+ })
749
+ })
750
+ }));
751
+ expect(screen.getByText('Custom Versioning for test-bucket')).toBeInTheDocument();
752
+ });
753
+ it('prioritizes slot prop over render prop over default', ()=>{
754
+ const Wrapper = createTestWrapper();
755
+ const renderName = jest.fn(()=>/*#__PURE__*/ jsx("span", {
756
+ children: "Render Prop Name"
757
+ }));
758
+ render(/*#__PURE__*/ jsx(MemoryRouter, {
759
+ children: /*#__PURE__*/ jsx(Wrapper, {
760
+ children: /*#__PURE__*/ jsxs(BucketOverview, {
761
+ bucketName: "test-bucket",
762
+ children: [
763
+ /*#__PURE__*/ jsx(BucketOverview.Actions, {}),
764
+ /*#__PURE__*/ jsxs(BucketOverview.Sections, {
765
+ children: [
766
+ /*#__PURE__*/ jsx(BucketOverview.GeneralSection, {
767
+ nameField: /*#__PURE__*/ jsx("span", {
768
+ children: "Slot Prop Name"
769
+ }),
770
+ renderName: renderName
771
+ }),
772
+ /*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
773
+ /*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {})
774
+ ]
775
+ })
776
+ ]
777
+ })
778
+ })
779
+ }));
780
+ expect(screen.getByText('Slot Prop Name')).toBeInTheDocument();
781
+ expect(renderName).not.toHaveBeenCalled();
477
782
  });
478
783
  });
479
784
  });