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

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 (287) 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 +93 -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 +225 -191
  57. package/dist/components/buckets/BucketLifecycleList.d.ts +2 -2
  58. package/dist/components/buckets/BucketLifecycleList.js +59 -61
  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 +48 -45
  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 +289 -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 +103 -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/formUtils.d.ts +15 -0
  113. package/dist/components/objects/ObjectDetails/formUtils.js +7 -0
  114. package/dist/components/objects/ObjectDetails/index.d.ts +18 -2
  115. package/dist/components/objects/ObjectDetails/index.js +152 -40
  116. package/dist/components/objects/ObjectList.d.ts +12 -10
  117. package/dist/components/objects/ObjectList.js +590 -263
  118. package/dist/components/objects/ObjectLock/EditRetentionButton.js +4 -4
  119. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +15 -15
  120. package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +1 -1
  121. package/dist/components/objects/ObjectLock/ObjectLockSettings.js +32 -31
  122. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +1 -1
  123. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +6 -6
  124. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +51 -51
  125. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +78 -78
  126. package/dist/components/objects/ObjectPage.js +12 -8
  127. package/dist/components/objects/UploadButton.d.ts +3 -3
  128. package/dist/components/objects/UploadButton.js +10 -10
  129. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.d.ts +1 -0
  130. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.js +531 -0
  131. package/dist/components/providers/DataBrowserProvider.d.ts +23 -12
  132. package/dist/components/providers/DataBrowserProvider.js +60 -38
  133. package/dist/components/providers/QueryProvider.d.ts +9 -0
  134. package/dist/components/providers/QueryProvider.js +21 -0
  135. package/dist/components/search/MetadataSearch.js +29 -28
  136. package/dist/components/search/SearchHints.js +1 -1
  137. package/dist/components/ui/ArrayFieldActions.js +12 -7
  138. package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +2 -2
  139. package/dist/components/ui/ConfirmDeleteRuleModal.js +6 -1
  140. package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
  141. package/dist/components/ui/DeleteObjectModalContent.js +12 -12
  142. package/dist/components/ui/FilterFormSection.d.ts +2 -2
  143. package/dist/components/ui/FilterFormSection.js +29 -29
  144. package/dist/components/ui/Search.elements.d.ts +2 -2
  145. package/dist/components/ui/Search.elements.js +7 -7
  146. package/dist/components/ui/Table.elements.d.ts +2 -1
  147. package/dist/components/ui/Table.elements.js +18 -12
  148. package/dist/config/__tests__/factory.test.d.ts +1 -0
  149. package/dist/config/__tests__/factory.test.js +311 -0
  150. package/dist/config/factory.d.ts +10 -56
  151. package/dist/config/factory.js +23 -71
  152. package/dist/config/types.d.ts +212 -34
  153. package/dist/contexts/DataBrowserUICustomizationContext.d.ts +27 -0
  154. package/dist/contexts/DataBrowserUICustomizationContext.js +13 -0
  155. package/dist/hooks/__tests__/useAccessibleBuckets.test.d.ts +1 -0
  156. package/dist/hooks/__tests__/useAccessibleBuckets.test.js +145 -0
  157. package/dist/hooks/__tests__/useISVBucketDetection.test.js +45 -45
  158. package/dist/hooks/__tests__/useIsBucketEmpty.test.js +27 -27
  159. package/dist/hooks/__tests__/useLoginMutation.test.d.ts +1 -0
  160. package/dist/hooks/__tests__/useLoginMutation.test.js +194 -0
  161. package/dist/hooks/bucketConfiguration.d.ts +8 -1
  162. package/dist/hooks/bucketConfiguration.js +52 -51
  163. package/dist/hooks/bucketOperations.d.ts +10 -1
  164. package/dist/hooks/bucketOperations.js +10 -9
  165. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +80 -80
  166. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +80 -80
  167. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +44 -44
  168. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +63 -63
  169. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +65 -65
  170. package/dist/hooks/factories/index.d.ts +4 -4
  171. package/dist/hooks/factories/index.js +2 -2
  172. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
  173. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +16 -13
  174. package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
  175. package/dist/hooks/factories/useCreateS3LoginHook.js +1 -1
  176. package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
  177. package/dist/hooks/factories/useCreateS3MutationHook.js +7 -2
  178. package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
  179. package/dist/hooks/factories/useCreateS3QueryHook.js +11 -6
  180. package/dist/hooks/index.d.ts +19 -12
  181. package/dist/hooks/index.js +16 -9
  182. package/dist/hooks/loginOperations.d.ts +1 -1
  183. package/dist/hooks/loginOperations.js +1 -1
  184. package/dist/hooks/objectOperations.d.ts +2 -2
  185. package/dist/hooks/objectOperations.js +50 -49
  186. package/dist/hooks/presignedOperations.d.ts +4 -4
  187. package/dist/hooks/presignedOperations.js +5 -5
  188. package/dist/hooks/useAccessibleBuckets.d.ts +11 -0
  189. package/dist/hooks/useAccessibleBuckets.js +115 -0
  190. package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
  191. package/dist/hooks/useBatchObjectLegalHold.js +48 -0
  192. package/dist/hooks/useBucketConfigEditor.d.ts +31 -0
  193. package/dist/hooks/useBucketConfigEditor.js +82 -0
  194. package/dist/hooks/useDataBrowserNavigate.d.ts +28 -0
  195. package/dist/hooks/useDataBrowserNavigate.js +24 -0
  196. package/dist/hooks/useDeleteBucketConfigRule.d.ts +2 -2
  197. package/dist/hooks/useDeleteBucketConfigRule.js +4 -4
  198. package/dist/hooks/useEmptyBucket.js +11 -11
  199. package/dist/hooks/useFeatures.d.ts +7 -0
  200. package/dist/hooks/useFeatures.js +8 -0
  201. package/dist/hooks/useISVBucketDetection.js +6 -6
  202. package/dist/hooks/useIsBucketEmpty.js +4 -4
  203. package/dist/hooks/useLimitedAccessFlow.d.ts +48 -0
  204. package/dist/hooks/useLimitedAccessFlow.js +23 -0
  205. package/dist/hooks/useS3Client.d.ts +6 -0
  206. package/dist/hooks/useS3Client.js +3 -2
  207. package/dist/hooks/useS3ConfigSwitch.d.ts +11 -0
  208. package/dist/hooks/useS3ConfigSwitch.js +37 -0
  209. package/dist/hooks/useSupportedNotificationEvents.d.ts +6 -0
  210. package/dist/hooks/useSupportedNotificationEvents.js +8 -0
  211. package/dist/index.d.ts +6 -6
  212. package/dist/index.js +2 -2
  213. package/dist/schemas/bucketPolicySchema.json +3 -13
  214. package/dist/test/msw/handlers/deleteBucket.d.ts +1 -1
  215. package/dist/test/msw/handlers/deleteBucket.js +20 -10
  216. package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -1
  217. package/dist/test/msw/handlers/getBucketAcl.js +29 -17
  218. package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -1
  219. package/dist/test/msw/handlers/getBucketLocation.js +29 -15
  220. package/dist/test/msw/handlers/getBucketPolicy.d.ts +1 -1
  221. package/dist/test/msw/handlers/getBucketPolicy.js +52 -32
  222. package/dist/test/msw/handlers/headObject.d.ts +1 -1
  223. package/dist/test/msw/handlers/headObject.js +31 -13
  224. package/dist/test/msw/handlers/listBuckets.d.ts +1 -1
  225. package/dist/test/msw/handlers/listBuckets.js +5 -3
  226. package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -1
  227. package/dist/test/msw/handlers/listObjectVersions.js +38 -26
  228. package/dist/test/msw/handlers/listObjects.d.ts +1 -1
  229. package/dist/test/msw/handlers/listObjects.js +35 -23
  230. package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -1
  231. package/dist/test/msw/handlers/objectLegalHold.js +32 -17
  232. package/dist/test/msw/handlers/objectRetention.d.ts +1 -1
  233. package/dist/test/msw/handlers/objectRetention.js +31 -17
  234. package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -1
  235. package/dist/test/msw/handlers/putBucketAcl.js +29 -14
  236. package/dist/test/msw/handlers/putObject.d.ts +1 -1
  237. package/dist/test/msw/handlers/putObject.js +27 -12
  238. package/dist/test/msw/handlers.d.ts +3 -3
  239. package/dist/test/msw/handlers.js +77 -54
  240. package/dist/test/msw/index.d.ts +2 -2
  241. package/dist/test/msw/index.js +1 -1
  242. package/dist/test/msw/server.d.ts +1 -1
  243. package/dist/test/msw/server.js +1 -1
  244. package/dist/test/msw/utils.js +2 -2
  245. package/dist/test/setup.d.ts +1 -1
  246. package/dist/test/setup.js +13 -30
  247. package/dist/test/testUtils.d.ts +85 -33
  248. package/dist/test/testUtils.js +176 -111
  249. package/dist/test/utils/errorHandling.test.js +119 -119
  250. package/dist/types/index.d.ts +50 -37
  251. package/dist/types/monaco.d.ts +13 -0
  252. package/dist/types/monaco.js +0 -0
  253. package/dist/utils/__tests__/proxyMiddleware.test.d.ts +1 -0
  254. package/dist/utils/__tests__/proxyMiddleware.test.js +579 -0
  255. package/dist/utils/__tests__/s3Client.test.d.ts +1 -0
  256. package/dist/utils/__tests__/s3Client.test.js +340 -0
  257. package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
  258. package/dist/utils/__tests__/s3ConfigIdentifier.test.js +437 -0
  259. package/dist/utils/constants.d.ts +10 -0
  260. package/dist/utils/constants.js +19 -9
  261. package/dist/utils/deletion/index.d.ts +2 -2
  262. package/dist/utils/deletion/index.js +1 -1
  263. package/dist/utils/deletion/messages.d.ts +1 -1
  264. package/dist/utils/deletion/messages.js +4 -4
  265. package/dist/utils/errorHandling.d.ts +3 -3
  266. package/dist/utils/errorHandling.js +6 -6
  267. package/dist/utils/hooks.js +8 -8
  268. package/dist/utils/index.d.ts +5 -4
  269. package/dist/utils/index.js +4 -2
  270. package/dist/utils/proxyMiddleware.d.ts +32 -13
  271. package/dist/utils/proxyMiddleware.js +90 -36
  272. package/dist/utils/s3Client.d.ts +14 -4
  273. package/dist/utils/s3Client.js +5 -26
  274. package/dist/utils/s3ConfigIdentifier.d.ts +79 -0
  275. package/dist/utils/s3ConfigIdentifier.js +57 -0
  276. package/dist/utils/s3RuleUtils.d.ts +5 -5
  277. package/dist/utils/s3RuleUtils.js +17 -17
  278. package/package.json +10 -8
  279. package/dist/components/__tests__/BucketNotificationCreatePage.test.js +0 -316
  280. package/dist/components/buckets/BucketPolicyButton.d.ts +0 -7
  281. package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +0 -1
  282. package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +0 -234
  283. package/dist/hooks/useLoginMutation.d.ts +0 -21
  284. package/dist/hooks/useLoginMutation.js +0 -9
  285. package/dist/utils/useFeatures.d.ts +0 -1
  286. package/dist/utils/useFeatures.js +0 -7
  287. /package/dist/components/__tests__/{BucketNotificationCreatePage.test.d.ts → BucketAccessor.test.d.ts} +0 -0
@@ -1,26 +1,54 @@
1
+ import * as __rspack_external__providers_DataBrowserProvider_js_b116b609 from "../providers/DataBrowserProvider.js";
1
2
  import { jsx } from "react/jsx-runtime";
2
3
  import { fireEvent, render, screen, waitFor } from "@testing-library/react";
3
4
  import user_event from "@testing-library/user-event";
4
- import { MemoryRouter } from "react-router-dom";
5
+ import { MemoryRouter } from "react-router";
6
+ import { useCreateBucket, useSetBucketEncryption, useSetBucketObjectLockConfiguration, useSetBucketVersioning } from "../../hooks/index.js";
5
7
  import { createMockMutationResult, createTestWrapper } from "../../test/testUtils.js";
6
8
  import { BucketCreate } from "../buckets/BucketCreate.js";
7
- import { useCreateBucket, useSetBucketObjectLockConfiguration, useSetBucketVersioning } from "../../hooks/index.js";
8
- jest.mock("../../hooks", ()=>({
9
+ var __webpack_modules__ = {
10
+ "../providers/DataBrowserProvider" (module) {
11
+ module.exports = __rspack_external__providers_DataBrowserProvider_js_b116b609;
12
+ }
13
+ };
14
+ var __webpack_module_cache__ = {};
15
+ function __webpack_require__(moduleId) {
16
+ var cachedModule = __webpack_module_cache__[moduleId];
17
+ if (void 0 !== cachedModule) return cachedModule.exports;
18
+ var module = __webpack_module_cache__[moduleId] = {
19
+ exports: {}
20
+ };
21
+ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
22
+ return module.exports;
23
+ }
24
+ jest.mock('../../hooks', ()=>({
9
25
  useCreateBucket: jest.fn(),
10
26
  useSetBucketVersioning: jest.fn(),
11
- useSetBucketObjectLockConfiguration: jest.fn()
27
+ useSetBucketObjectLockConfiguration: jest.fn(),
28
+ useSetBucketEncryption: jest.fn()
29
+ }));
30
+ jest.mock('../providers/DataBrowserProvider', ()=>({
31
+ ...jest.requireActual('../providers/DataBrowserProvider'),
32
+ useDataBrowserConfig: jest.fn(()=>({
33
+ s3Capabilities: {
34
+ bucketEncryption: false
35
+ }
36
+ }))
12
37
  }));
13
38
  const mockUseCreateBucket = jest.mocked(useCreateBucket);
14
39
  const mockUseSetBucketVersioning = jest.mocked(useSetBucketVersioning);
15
40
  const mockUseSetBucketObjectLockConfiguration = jest.mocked(useSetBucketObjectLockConfiguration);
41
+ const mockUseSetBucketEncryption = jest.mocked(useSetBucketEncryption);
42
+ const { useDataBrowserConfig } = __webpack_require__("../providers/DataBrowserProvider");
43
+ const mockUseDataBrowserConfig = jest.mocked(useDataBrowserConfig);
16
44
  const mockNavigate = jest.fn();
17
45
  const mockShowToast = jest.fn();
18
- jest.mock("react-router", ()=>({
19
- ...jest.requireActual("react-router"),
46
+ jest.mock('react-router', ()=>({
47
+ ...jest.requireActual('react-router'),
20
48
  useNavigate: ()=>mockNavigate
21
49
  }));
22
- jest.mock("@scality/core-ui", ()=>({
23
- ...jest.requireActual("@scality/core-ui"),
50
+ jest.mock('@scality/core-ui', ()=>({
51
+ ...jest.requireActual('@scality/core-ui'),
24
52
  useToast: ()=>({
25
53
  showToast: mockShowToast
26
54
  })
@@ -38,12 +66,14 @@ const renderBucketCreate = (props = {})=>{
38
66
  const mockMutations = {
39
67
  createBucket: jest.fn(),
40
68
  setVersioning: jest.fn(),
41
- setObjectLock: jest.fn()
69
+ setObjectLock: jest.fn(),
70
+ setBucketEncryption: jest.fn()
42
71
  };
43
72
  const setupMocks = (overrides = {})=>{
44
73
  mockUseCreateBucket.mockReturnValue(createMockMutationResult(mockMutations.createBucket, overrides));
45
74
  mockUseSetBucketVersioning.mockReturnValue(createMockMutationResult(mockMutations.setVersioning));
46
75
  mockUseSetBucketObjectLockConfiguration.mockReturnValue(createMockMutationResult(mockMutations.setObjectLock));
76
+ mockUseSetBucketEncryption.mockReturnValue(createMockMutationResult(mockMutations.setBucketEncryption));
47
77
  };
48
78
  const fillBucketName = async (name)=>{
49
79
  const nameInput = screen.getByLabelText(/bucket name/i);
@@ -51,108 +81,108 @@ const fillBucketName = async (name)=>{
51
81
  };
52
82
  const submitForm = async ()=>{
53
83
  await waitFor(()=>{
54
- const createButton = screen.getByRole("button", {
84
+ const createButton = screen.getByRole('button', {
55
85
  name: /^create$/i
56
86
  });
57
87
  expect(createButton).not.toBeDisabled();
58
88
  }, {
59
89
  timeout: 3000
60
90
  });
61
- const createButton = screen.getByRole("button", {
91
+ const createButton = screen.getByRole('button', {
62
92
  name: /^create$/i
63
93
  });
64
94
  await user_event.click(createButton);
65
95
  };
66
- describe("BucketCreate", ()=>{
96
+ describe('BucketCreate', ()=>{
67
97
  beforeEach(()=>{
68
98
  jest.clearAllMocks();
69
99
  setupMocks();
70
100
  });
71
- it("renders form with required fields", ()=>{
101
+ it('renders form with required fields', ()=>{
72
102
  renderBucketCreate();
73
- expect(screen.getByText("Create a New Bucket")).toBeInTheDocument();
103
+ expect(screen.getByText('Create a New Bucket')).toBeInTheDocument();
74
104
  expect(screen.getByLabelText(/bucket name/i)).toBeInTheDocument();
75
- expect(screen.getByText("Versioning")).toBeInTheDocument();
76
- expect(screen.getByText("Object-lock")).toBeInTheDocument();
105
+ expect(screen.getByText('Versioning')).toBeInTheDocument();
106
+ expect(screen.getByText('Object-lock')).toBeInTheDocument();
77
107
  });
78
- it("shows validation error for invalid bucket name with uppercase", async ()=>{
108
+ it('shows validation error for invalid bucket name with uppercase', async ()=>{
79
109
  renderBucketCreate();
80
- await user_event.type(screen.getByLabelText(/bucket name/i), "INVALID");
110
+ await user_event.type(screen.getByLabelText(/bucket name/i), 'INVALID');
81
111
  await user_event.tab();
82
112
  await waitFor(()=>{
83
113
  expect(screen.getByText(/bucket names can include only lowercase/i)).toBeInTheDocument();
84
114
  });
85
115
  });
86
- it("shows validation error for bucket name starting with hyphen", async ()=>{
116
+ it('shows validation error for bucket name starting with hyphen', async ()=>{
87
117
  renderBucketCreate();
88
- await user_event.type(screen.getByLabelText(/bucket name/i), "-invalid");
118
+ await user_event.type(screen.getByLabelText(/bucket name/i), '-invalid');
89
119
  await user_event.tab();
90
120
  await waitFor(()=>{
91
121
  expect(screen.getByText(/bucket names can include only lowercase/i)).toBeInTheDocument();
92
122
  });
93
123
  });
94
- it("shows validation error for bucket name ending with hyphen", async ()=>{
124
+ it('shows validation error for bucket name ending with hyphen', async ()=>{
95
125
  renderBucketCreate();
96
- await user_event.type(screen.getByLabelText(/bucket name/i), "invalid-");
126
+ await user_event.type(screen.getByLabelText(/bucket name/i), 'invalid-');
97
127
  await user_event.tab();
98
128
  await waitFor(()=>{
99
129
  expect(screen.getByText(/bucket names can include only lowercase/i)).toBeInTheDocument();
100
130
  });
101
131
  });
102
- it("shows validation error for bucket name with adjacent periods", async ()=>{
132
+ it('shows validation error for bucket name with adjacent periods', async ()=>{
103
133
  renderBucketCreate();
104
- await user_event.type(screen.getByLabelText(/bucket name/i), "test..bucket");
134
+ await user_event.type(screen.getByLabelText(/bucket name/i), 'test..bucket');
105
135
  await user_event.tab();
106
136
  await waitFor(()=>{
107
137
  expect(screen.getByText(/bucket names cannot contain two adjacent periods/i)).toBeInTheDocument();
108
138
  });
109
139
  });
110
- it("shows validation error for bucket name formatted as IP address", async ()=>{
140
+ it('shows validation error for bucket name formatted as IP address', async ()=>{
111
141
  renderBucketCreate();
112
- await user_event.type(screen.getByLabelText(/bucket name/i), "192.168.1.1");
142
+ await user_event.type(screen.getByLabelText(/bucket name/i), '192.168.1.1');
113
143
  await user_event.tab();
114
144
  await waitFor(()=>{
115
145
  expect(screen.getByText(/bucket names must not be formatted as an ip address/i)).toBeInTheDocument();
116
146
  });
117
147
  });
118
- it("shows validation error for bucket name with forbidden prefix", async ()=>{
148
+ it('shows validation error for bucket name with forbidden prefix', async ()=>{
119
149
  renderBucketCreate();
120
- await user_event.type(screen.getByLabelText(/bucket name/i), "xn--test");
150
+ await user_event.type(screen.getByLabelText(/bucket name/i), 'xn--test');
121
151
  await user_event.tab();
122
152
  await waitFor(()=>{
123
153
  expect(screen.getByText(/bucket names must not start with/i)).toBeInTheDocument();
124
154
  });
125
155
  });
126
- it("shows validation error for bucket name with forbidden suffix", async ()=>{
156
+ it('shows validation error for bucket name with forbidden suffix', async ()=>{
127
157
  renderBucketCreate();
128
- await user_event.type(screen.getByLabelText(/bucket name/i), "test-s3alias");
158
+ await user_event.type(screen.getByLabelText(/bucket name/i), 'test-s3alias');
129
159
  await user_event.tab();
130
160
  await waitFor(()=>{
131
161
  expect(screen.getByText(/bucket names must not end with/i)).toBeInTheDocument();
132
162
  });
133
163
  });
134
- it("shows validation error for duplicate bucket name when context provided", async ()=>{
164
+ it('shows validation error for duplicate bucket name when context provided', async ()=>{
135
165
  renderBucketCreate({
136
166
  validationContext: {
137
167
  existingBuckets: [
138
- "existing-bucket",
139
- "another-bucket"
168
+ 'existing-bucket',
169
+ 'another-bucket'
140
170
  ]
141
171
  }
142
172
  });
143
- await user_event.type(screen.getByLabelText(/bucket name/i), "existing-bucket");
173
+ await user_event.type(screen.getByLabelText(/bucket name/i), 'existing-bucket');
144
174
  await user_event.tab();
145
175
  await waitFor(()=>{
146
176
  expect(screen.getByText(/a bucket with this name already exists/i)).toBeInTheDocument();
147
177
  });
148
178
  });
149
- it("accepts valid bucket names with dots and hyphens", async ()=>{
179
+ it('accepts valid bucket names with dots and hyphens', async ()=>{
150
180
  renderBucketCreate();
151
181
  const validNames = [
152
- "my-bucket-123",
153
- "my.bucket.name",
154
- "test-bucket.example",
155
- "123-bucket-456"
182
+ 'my-bucket-123',
183
+ 'my.bucket.name',
184
+ 'test-bucket.example',
185
+ '123-bucket-456'
156
186
  ];
157
187
  for (const name of validNames){
158
188
  const input = screen.getByLabelText(/bucket name/i);
@@ -166,79 +196,79 @@ describe("BucketCreate", ()=>{
166
196
  });
167
197
  }
168
198
  });
169
- it("allows bucket creation when name is unique", async ()=>{
199
+ it('allows bucket creation when name is unique', async ()=>{
170
200
  renderBucketCreate({
171
201
  validationContext: {
172
202
  existingBuckets: [
173
- "existing-bucket",
174
- "another-bucket"
203
+ 'existing-bucket',
204
+ 'another-bucket'
175
205
  ]
176
206
  }
177
207
  });
178
- await fillBucketName("new-unique-bucket");
208
+ await fillBucketName('new-unique-bucket');
179
209
  await waitFor(()=>{
180
- expect(screen.getByRole("button", {
210
+ expect(screen.getByRole('button', {
181
211
  name: /^create$/i
182
212
  })).not.toBeDisabled();
183
213
  });
184
214
  });
185
- it("disables create button when form is invalid", ()=>{
215
+ it('disables create button when form is invalid', ()=>{
186
216
  renderBucketCreate();
187
- expect(screen.getByRole("button", {
217
+ expect(screen.getByRole('button', {
188
218
  name: /^create$/i
189
219
  })).toBeDisabled();
190
220
  });
191
- it("enables create button when bucket name is valid", async ()=>{
221
+ it('enables create button when bucket name is valid', async ()=>{
192
222
  renderBucketCreate();
193
- await fillBucketName("test-bucket");
223
+ await fillBucketName('test-bucket');
194
224
  await waitFor(()=>{
195
- expect(screen.getByRole("button", {
225
+ expect(screen.getByRole('button', {
196
226
  name: /^create$/i
197
227
  })).not.toBeDisabled();
198
228
  });
199
229
  });
200
- it("creates bucket with basic configuration", async ()=>{
230
+ it('creates bucket with basic configuration', async ()=>{
201
231
  renderBucketCreate();
202
- await fillBucketName("test-bucket");
232
+ await fillBucketName('test-bucket');
203
233
  await submitForm();
204
234
  expect(mockMutations.createBucket).toHaveBeenCalledWith({
205
- Bucket: "test-bucket",
235
+ Bucket: 'test-bucket',
206
236
  ObjectLockEnabledForBucket: void 0
207
237
  }, expect.objectContaining({
208
238
  onSuccess: expect.any(Function),
209
239
  onError: expect.any(Function)
210
240
  }));
211
241
  });
212
- it("shows success toast and navigates after bucket creation", async ()=>{
242
+ it('shows success toast and navigates after bucket creation', async ()=>{
213
243
  renderBucketCreate();
214
- await fillBucketName("my-bucket");
244
+ await fillBucketName('my-bucket');
215
245
  await submitForm();
216
246
  const successCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
217
247
  successCallback();
218
248
  expect(mockShowToast).toHaveBeenCalledWith({
219
249
  open: true,
220
250
  message: 'Bucket "my-bucket" created successfully',
221
- status: "success"
251
+ status: 'success'
222
252
  });
223
- expect(mockNavigate).toHaveBeenCalledWith("/buckets/my-bucket");
253
+ expect(mockNavigate).toHaveBeenCalledWith('/buckets/my-bucket');
224
254
  });
225
- it("shows error toast when bucket creation fails", async ()=>{
255
+ it('shows error toast when bucket creation fails', async ()=>{
226
256
  renderBucketCreate();
227
- await fillBucketName("test-bucket");
257
+ await fillBucketName('test-bucket');
228
258
  await submitForm();
229
259
  const errorCallback = mockMutations.createBucket.mock.calls[0][1].onError;
230
- const error = new Error("Bucket already exists");
260
+ const error = new Error('Bucket already exists');
231
261
  errorCallback(error);
232
262
  expect(mockShowToast).toHaveBeenCalledWith({
233
263
  open: true,
234
- message: "Bucket already exists",
235
- status: "error"
264
+ message: 'Bucket already exists',
265
+ status: 'error'
236
266
  });
237
267
  });
238
- it("enables versioning when requested", async ()=>{
268
+ it('enables versioning when requested', async ()=>{
239
269
  renderBucketCreate();
240
- await fillBucketName("test-bucket");
241
- const versioningCheckbox = screen.getByRole("checkbox", {
270
+ await fillBucketName('test-bucket');
271
+ const versioningCheckbox = screen.getByRole('checkbox', {
242
272
  name: /versioning/i
243
273
  });
244
274
  await user_event.click(versioningCheckbox);
@@ -246,32 +276,32 @@ describe("BucketCreate", ()=>{
246
276
  const successCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
247
277
  successCallback();
248
278
  expect(mockMutations.setVersioning).toHaveBeenCalledWith({
249
- Bucket: "test-bucket",
279
+ Bucket: 'test-bucket',
250
280
  VersioningConfiguration: {
251
- Status: "Enabled"
281
+ Status: 'Enabled'
252
282
  }
253
283
  }, expect.objectContaining({
254
284
  onSuccess: expect.any(Function),
255
285
  onError: expect.any(Function)
256
286
  }));
257
287
  });
258
- it("disables versioning checkbox when object lock is enabled", async ()=>{
288
+ it('disables versioning checkbox when object lock is enabled', async ()=>{
259
289
  renderBucketCreate();
260
- await fillBucketName("test-bucket");
261
- const objectLockCheckbox = screen.getByRole("checkbox", {
290
+ await fillBucketName('test-bucket');
291
+ const objectLockCheckbox = screen.getByRole('checkbox', {
262
292
  name: /object-lock/i
263
293
  });
264
294
  await user_event.click(objectLockCheckbox);
265
- const versioningCheckbox = screen.getByRole("checkbox", {
295
+ const versioningCheckbox = screen.getByRole('checkbox', {
266
296
  name: /versioning/i
267
297
  });
268
298
  expect(versioningCheckbox).toBeDisabled();
269
299
  expect(screen.getByText(/automatically activated when object-lock is enabled/i)).toBeInTheDocument();
270
300
  });
271
- it("enables versioning automatically when object lock is enabled", async ()=>{
301
+ it('enables versioning automatically when object lock is enabled', async ()=>{
272
302
  renderBucketCreate();
273
- await fillBucketName("test-bucket");
274
- const objectLockCheckbox = screen.getByRole("checkbox", {
303
+ await fillBucketName('test-bucket');
304
+ const objectLockCheckbox = screen.getByRole('checkbox', {
275
305
  name: /object-lock/i
276
306
  });
277
307
  await user_event.click(objectLockCheckbox);
@@ -283,13 +313,13 @@ describe("BucketCreate", ()=>{
283
313
  successCallback();
284
314
  expect(mockMutations.setVersioning).not.toHaveBeenCalled();
285
315
  });
286
- it("configures object lock retention when enabled", async ()=>{
316
+ it('configures object lock retention when enabled', async ()=>{
287
317
  renderBucketCreate();
288
- await fillBucketName("test-bucket");
289
- await user_event.click(screen.getByRole("checkbox", {
318
+ await fillBucketName('test-bucket');
319
+ await user_event.click(screen.getByRole('checkbox', {
290
320
  name: /object-lock/i
291
321
  }));
292
- await user_event.click(screen.getByRole("checkbox", {
322
+ await user_event.click(screen.getByRole('checkbox', {
293
323
  name: /default retention/i
294
324
  }));
295
325
  await submitForm();
@@ -297,12 +327,12 @@ describe("BucketCreate", ()=>{
297
327
  createSuccessCallback();
298
328
  expect(mockMutations.setVersioning).not.toHaveBeenCalled();
299
329
  expect(mockMutations.setObjectLock).toHaveBeenCalledWith({
300
- Bucket: "test-bucket",
330
+ Bucket: 'test-bucket',
301
331
  ObjectLockConfiguration: {
302
- ObjectLockEnabled: "Enabled",
332
+ ObjectLockEnabled: 'Enabled',
303
333
  Rule: {
304
334
  DefaultRetention: {
305
- Mode: "GOVERNANCE",
335
+ Mode: 'GOVERNANCE',
306
336
  Days: 1,
307
337
  Years: void 0
308
338
  }
@@ -313,83 +343,83 @@ describe("BucketCreate", ()=>{
313
343
  onError: expect.any(Function)
314
344
  }));
315
345
  });
316
- it("calls custom onSubmit when provided", async ()=>{
346
+ it('calls custom onSubmit when provided', async ()=>{
317
347
  const customSubmit = jest.fn();
318
348
  renderBucketCreate({
319
349
  onSubmit: customSubmit
320
350
  });
321
- await fillBucketName("test-bucket");
351
+ await fillBucketName('test-bucket');
322
352
  await submitForm();
323
353
  expect(customSubmit).toHaveBeenCalledWith(expect.objectContaining({
324
- name: "test-bucket",
354
+ name: 'test-bucket',
325
355
  isVersioning: false,
326
356
  isObjectLockEnabled: false
327
357
  }));
328
358
  expect(mockMutations.createBucket).not.toHaveBeenCalled();
329
359
  });
330
- it("calls custom onCancel when provided", ()=>{
360
+ it('calls custom onCancel when provided', ()=>{
331
361
  const customCancel = jest.fn();
332
362
  renderBucketCreate({
333
363
  onCancel: customCancel
334
364
  });
335
- const cancelButton = screen.getByRole("button", {
365
+ const cancelButton = screen.getByRole('button', {
336
366
  name: /cancel/i
337
367
  });
338
368
  fireEvent.click(cancelButton);
339
369
  expect(customCancel).toHaveBeenCalled();
340
370
  expect(mockNavigate).not.toHaveBeenCalled();
341
371
  });
342
- it("navigates to buckets list when cancel is clicked without custom handler", ()=>{
372
+ it('navigates to buckets list when cancel is clicked without custom handler', ()=>{
343
373
  renderBucketCreate();
344
- const cancelButton = screen.getByRole("button", {
374
+ const cancelButton = screen.getByRole('button', {
345
375
  name: /cancel/i
346
376
  });
347
377
  fireEvent.click(cancelButton);
348
- expect(mockNavigate).toHaveBeenCalledWith("/buckets");
378
+ expect(mockNavigate).toHaveBeenCalledWith('/buckets');
349
379
  });
350
- it("renders injected children", ()=>{
380
+ it('renders injected children', ()=>{
351
381
  renderBucketCreate({
352
382
  children: /*#__PURE__*/ jsx("div", {
353
383
  "data-testid": "custom-field",
354
384
  children: "Custom Field"
355
385
  })
356
386
  });
357
- expect(screen.getByTestId("custom-field")).toBeInTheDocument();
387
+ expect(screen.getByTestId('custom-field')).toBeInTheDocument();
358
388
  });
359
- it("shows loading state during bucket creation", async ()=>{
389
+ it('shows loading state during bucket creation', async ()=>{
360
390
  renderBucketCreate();
361
- await fillBucketName("test-bucket");
391
+ await fillBucketName('test-bucket');
362
392
  await submitForm();
363
393
  setupMocks({
364
394
  isPending: true
365
395
  });
366
396
  expect(mockMutations.createBucket).toHaveBeenCalled();
367
397
  });
368
- it("shows error toast when versioning configuration fails", async ()=>{
398
+ it('shows error toast when versioning configuration fails', async ()=>{
369
399
  renderBucketCreate();
370
- await fillBucketName("test-bucket");
371
- await user_event.click(screen.getByRole("checkbox", {
400
+ await fillBucketName('test-bucket');
401
+ await user_event.click(screen.getByRole('checkbox', {
372
402
  name: /versioning/i
373
403
  }));
374
404
  await submitForm();
375
405
  const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
376
406
  createSuccessCallback();
377
407
  const versioningErrorCallback = mockMutations.setVersioning.mock.calls[0][1].onError;
378
- const error = new Error("Failed to enable versioning");
408
+ const error = new Error('Failed to enable versioning');
379
409
  versioningErrorCallback(error);
380
410
  expect(mockShowToast).toHaveBeenCalledWith({
381
411
  open: true,
382
- message: "Failed to enable versioning",
383
- status: "error"
412
+ message: 'Failed to enable versioning',
413
+ status: 'error'
384
414
  });
385
415
  });
386
- it("shows error toast when object lock configuration fails", async ()=>{
416
+ it('shows error toast when object lock configuration fails', async ()=>{
387
417
  renderBucketCreate();
388
- await fillBucketName("test-bucket");
389
- await user_event.click(screen.getByRole("checkbox", {
418
+ await fillBucketName('test-bucket');
419
+ await user_event.click(screen.getByRole('checkbox', {
390
420
  name: /object-lock/i
391
421
  }));
392
- await user_event.click(screen.getByRole("checkbox", {
422
+ await user_event.click(screen.getByRole('checkbox', {
393
423
  name: /default retention/i
394
424
  }));
395
425
  await submitForm();
@@ -397,12 +427,148 @@ describe("BucketCreate", ()=>{
397
427
  createSuccessCallback();
398
428
  expect(mockMutations.setVersioning).not.toHaveBeenCalled();
399
429
  const objectLockErrorCallback = mockMutations.setObjectLock.mock.calls[0][1].onError;
400
- const error = new Error("Failed to configure retention");
430
+ const error = new Error('Failed to configure retention');
401
431
  objectLockErrorCallback(error);
402
432
  expect(mockShowToast).toHaveBeenCalledWith({
403
433
  open: true,
404
- message: "Failed to configure retention",
405
- status: "error"
434
+ message: 'Failed to configure retention',
435
+ status: 'error'
436
+ });
437
+ });
438
+ describe('Bucket Encryption Feature', ()=>{
439
+ beforeEach(()=>{
440
+ mockUseDataBrowserConfig.mockReturnValue({
441
+ s3Capabilities: {
442
+ bucketEncryption: false
443
+ }
444
+ });
445
+ });
446
+ it('does not show encryption checkbox when feature is disabled', ()=>{
447
+ mockUseDataBrowserConfig.mockReturnValue({
448
+ s3Capabilities: {
449
+ bucketEncryption: false
450
+ }
451
+ });
452
+ renderBucketCreate();
453
+ expect(screen.queryByText(/encryption/i)).not.toBeInTheDocument();
454
+ });
455
+ it('shows encryption checkbox when feature is enabled', ()=>{
456
+ mockUseDataBrowserConfig.mockReturnValue({
457
+ s3Capabilities: {
458
+ bucketEncryption: true
459
+ }
460
+ });
461
+ renderBucketCreate();
462
+ expect(screen.getByText(/encryption/i)).toBeInTheDocument();
463
+ });
464
+ it('creates bucket with encryption when enabled', async ()=>{
465
+ mockUseDataBrowserConfig.mockReturnValue({
466
+ s3Capabilities: {
467
+ bucketEncryption: true
468
+ }
469
+ });
470
+ renderBucketCreate();
471
+ await fillBucketName('test-bucket');
472
+ const encryptionCheckbox = screen.getByLabelText(/encryption/i);
473
+ await user_event.click(encryptionCheckbox);
474
+ await submitForm();
475
+ const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
476
+ createSuccessCallback();
477
+ expect(mockMutations.setBucketEncryption).toHaveBeenCalledWith({
478
+ Bucket: 'test-bucket',
479
+ ServerSideEncryptionConfiguration: {
480
+ Rules: [
481
+ {
482
+ ApplyServerSideEncryptionByDefault: {
483
+ SSEAlgorithm: 'AES256'
484
+ }
485
+ }
486
+ ]
487
+ }
488
+ }, expect.objectContaining({
489
+ onSuccess: expect.any(Function),
490
+ onError: expect.any(Function)
491
+ }));
492
+ });
493
+ it('creates bucket without encryption when checkbox not selected', async ()=>{
494
+ mockUseDataBrowserConfig.mockReturnValue({
495
+ s3Capabilities: {
496
+ bucketEncryption: true
497
+ }
498
+ });
499
+ renderBucketCreate();
500
+ await fillBucketName('test-bucket');
501
+ await submitForm();
502
+ const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
503
+ createSuccessCallback();
504
+ expect(mockMutations.setBucketEncryption).not.toHaveBeenCalled();
505
+ expect(mockShowToast).toHaveBeenCalledWith({
506
+ open: true,
507
+ message: 'Bucket "test-bucket" created successfully',
508
+ status: 'success'
509
+ });
510
+ });
511
+ it('applies encryption after versioning when both enabled', async ()=>{
512
+ mockUseDataBrowserConfig.mockReturnValue({
513
+ s3Capabilities: {
514
+ bucketEncryption: true
515
+ }
516
+ });
517
+ renderBucketCreate();
518
+ await fillBucketName('test-bucket');
519
+ await user_event.click(screen.getByLabelText(/versioning/i));
520
+ await user_event.click(screen.getByLabelText(/encryption/i));
521
+ await submitForm();
522
+ const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
523
+ createSuccessCallback();
524
+ expect(mockMutations.setVersioning).toHaveBeenCalled();
525
+ const versioningSuccessCallback = mockMutations.setVersioning.mock.calls[0][1].onSuccess;
526
+ versioningSuccessCallback();
527
+ expect(mockMutations.setBucketEncryption).toHaveBeenCalledWith(expect.objectContaining({
528
+ Bucket: 'test-bucket'
529
+ }), expect.any(Object));
530
+ });
531
+ it('applies encryption after object lock retention when enabled', async ()=>{
532
+ mockUseDataBrowserConfig.mockReturnValue({
533
+ s3Capabilities: {
534
+ bucketEncryption: true
535
+ }
536
+ });
537
+ renderBucketCreate();
538
+ await fillBucketName('test-bucket');
539
+ await user_event.click(screen.getByLabelText(/object-lock/i));
540
+ await user_event.click(screen.getByLabelText(/default retention/i));
541
+ await user_event.click(screen.getByLabelText(/encryption/i));
542
+ await submitForm();
543
+ const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
544
+ createSuccessCallback();
545
+ expect(mockMutations.setObjectLock).toHaveBeenCalled();
546
+ const objectLockSuccessCallback = mockMutations.setObjectLock.mock.calls[0][1].onSuccess;
547
+ objectLockSuccessCallback();
548
+ expect(mockMutations.setBucketEncryption).toHaveBeenCalledWith(expect.objectContaining({
549
+ Bucket: 'test-bucket'
550
+ }), expect.any(Object));
551
+ });
552
+ it('shows error toast when encryption configuration fails', async ()=>{
553
+ mockUseDataBrowserConfig.mockReturnValue({
554
+ s3Capabilities: {
555
+ bucketEncryption: true
556
+ }
557
+ });
558
+ renderBucketCreate();
559
+ await fillBucketName('test-bucket');
560
+ await user_event.click(screen.getByLabelText(/encryption/i));
561
+ await submitForm();
562
+ const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
563
+ createSuccessCallback();
564
+ const encryptionErrorCallback = mockMutations.setBucketEncryption.mock.calls[0][1].onError;
565
+ const error = new Error('Failed to enable encryption');
566
+ encryptionErrorCallback(error);
567
+ expect(mockShowToast).toHaveBeenCalledWith({
568
+ open: true,
569
+ message: 'Failed to enable encryption',
570
+ status: 'error'
571
+ });
406
572
  });
407
573
  });
408
574
  });
@@ -0,0 +1 @@
1
+ export {};