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

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