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

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 (90) hide show
  1. package/dist/components/__tests__/BucketCreate.test.d.ts +1 -0
  2. package/dist/components/__tests__/BucketCreate.test.js +408 -0
  3. package/dist/components/__tests__/BucketLifecycleFormPage.test.d.ts +1 -0
  4. package/dist/components/__tests__/BucketLifecycleFormPage.test.js +618 -0
  5. package/dist/components/__tests__/BucketLifecycleList.test.d.ts +1 -0
  6. package/dist/components/__tests__/BucketLifecycleList.test.js +325 -0
  7. package/dist/components/__tests__/BucketList.test.js +190 -0
  8. package/dist/components/__tests__/BucketOverview.test.js +298 -8
  9. package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +1 -0
  10. package/dist/components/__tests__/BucketReplicationFormPage.test.js +1757 -0
  11. package/dist/components/__tests__/BucketReplicationList.test.d.ts +1 -0
  12. package/dist/components/__tests__/BucketReplicationList.test.js +344 -0
  13. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.d.ts +1 -0
  14. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +196 -0
  15. package/dist/components/__tests__/EmptyBucketButton.test.d.ts +1 -0
  16. package/dist/components/__tests__/EmptyBucketButton.test.js +302 -0
  17. package/dist/components/buckets/BucketCreate.d.ts +49 -0
  18. package/dist/components/buckets/BucketCreate.js +237 -0
  19. package/dist/components/buckets/BucketDetails.js +62 -10
  20. package/dist/components/buckets/BucketLifecycleFormPage.d.ts +15 -0
  21. package/dist/components/buckets/BucketLifecycleFormPage.js +1070 -0
  22. package/dist/components/buckets/BucketLifecycleList.d.ts +10 -0
  23. package/dist/components/buckets/BucketLifecycleList.js +270 -0
  24. package/dist/components/buckets/BucketList.d.ts +5 -2
  25. package/dist/components/buckets/BucketList.js +38 -28
  26. package/dist/components/buckets/BucketOverview.d.ts +65 -4
  27. package/dist/components/buckets/BucketOverview.js +261 -179
  28. package/dist/components/buckets/BucketPage.js +1 -1
  29. package/dist/components/buckets/BucketReplicationFormPage.d.ts +1 -0
  30. package/dist/components/buckets/BucketReplicationFormPage.js +834 -0
  31. package/dist/components/buckets/BucketReplicationList.d.ts +11 -0
  32. package/dist/components/buckets/BucketReplicationList.js +189 -0
  33. package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +18 -0
  34. package/dist/components/buckets/DeleteBucketConfigRuleButton.js +53 -0
  35. package/dist/components/buckets/EmptyBucketButton.d.ts +5 -0
  36. package/dist/components/buckets/EmptyBucketButton.js +232 -0
  37. package/dist/components/buckets/EmptyBucketSummary.d.ts +9 -0
  38. package/dist/components/buckets/EmptyBucketSummary.js +60 -0
  39. package/dist/components/buckets/EmptyBucketSummaryList.d.ts +13 -0
  40. package/dist/components/buckets/EmptyBucketSummaryList.js +140 -0
  41. package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +8 -8
  42. package/dist/components/index.d.ts +8 -1
  43. package/dist/components/index.js +9 -2
  44. package/dist/components/objects/ObjectLock/EditRetentionButton.d.ts +4 -0
  45. package/dist/components/objects/ObjectLock/EditRetentionButton.js +32 -0
  46. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.d.ts +3 -0
  47. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +211 -0
  48. package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +9 -0
  49. package/dist/components/objects/ObjectLock/ObjectLockSettings.js +158 -0
  50. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +8 -0
  51. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +39 -0
  52. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.d.ts +1 -0
  53. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +204 -0
  54. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.d.ts +1 -0
  55. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +374 -0
  56. package/dist/components/ui/ArrayFieldActions.d.ts +36 -0
  57. package/dist/components/ui/ArrayFieldActions.js +38 -0
  58. package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +16 -0
  59. package/dist/components/ui/ConfirmDeleteRuleModal.js +43 -0
  60. package/dist/components/ui/FilterFormSection.d.ts +44 -0
  61. package/dist/components/ui/FilterFormSection.js +159 -0
  62. package/dist/config/factory.d.ts +13 -2
  63. package/dist/config/factory.js +9 -6
  64. package/dist/hooks/__tests__/useISVBucketDetection.test.d.ts +1 -0
  65. package/dist/hooks/__tests__/useISVBucketDetection.test.js +188 -0
  66. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +44 -1
  67. package/dist/hooks/factories/useCreateS3QueryHook.js +22 -1
  68. package/dist/hooks/index.d.ts +4 -0
  69. package/dist/hooks/index.js +5 -1
  70. package/dist/hooks/useDeleteBucketConfigRule.d.ts +26 -0
  71. package/dist/hooks/useDeleteBucketConfigRule.js +46 -0
  72. package/dist/hooks/useEmptyBucket.d.ts +27 -0
  73. package/dist/hooks/useEmptyBucket.js +116 -0
  74. package/dist/hooks/useISVBucketDetection.d.ts +15 -0
  75. package/dist/hooks/useISVBucketDetection.js +27 -0
  76. package/dist/hooks/useTableRowSelection.d.ts +9 -0
  77. package/dist/hooks/useTableRowSelection.js +45 -0
  78. package/dist/test/setup.js +8 -0
  79. package/dist/test/testUtils.d.ts +99 -17
  80. package/dist/test/testUtils.js +64 -16
  81. package/dist/test/utils/errorHandling.test.js +39 -1
  82. package/dist/utils/constants.d.ts +12 -0
  83. package/dist/utils/constants.js +9 -0
  84. package/dist/utils/errorHandling.d.ts +9 -0
  85. package/dist/utils/errorHandling.js +6 -1
  86. package/dist/utils/index.d.ts +2 -0
  87. package/dist/utils/index.js +2 -0
  88. package/dist/utils/s3RuleUtils.d.ts +53 -0
  89. package/dist/utils/s3RuleUtils.js +101 -0
  90. package/package.json +1 -1
@@ -1,21 +1,70 @@
1
- import { jsx } from "react/jsx-runtime";
1
+ import * as __WEBPACK_EXTERNAL_MODULE_react_router_dom_5358f3fe__ from "react-router-dom";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
2
3
  import { fireEvent, render, screen } from "@testing-library/react";
3
- import { useGetBucketAcl, useGetBucketCors, useGetBucketLocation, useGetBucketObjectLockConfiguration, useGetBucketPolicy, useGetBucketVersioning } from "../../hooks/index.js";
4
+ import { useGetBucketAcl, useGetBucketCors, useGetBucketLocation, useGetBucketObjectLockConfiguration, useGetBucketPolicy, useGetBucketTagging, useGetBucketVersioning, useISVBucketStatus } from "../../hooks/index.js";
4
5
  import { createTestWrapper } from "../../test/testUtils.js";
5
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");
6
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
+ }));
7
30
  const mockUseGetBucketVersioning = jest.mocked(useGetBucketVersioning);
8
31
  const mockUseGetBucketAcl = jest.mocked(useGetBucketAcl);
9
32
  const mockUseGetBucketLocation = jest.mocked(useGetBucketLocation);
10
33
  const mockUseGetBucketCors = jest.mocked(useGetBucketCors);
11
34
  const mockUseGetBucketObjectLockConfiguration = jest.mocked(useGetBucketObjectLockConfiguration);
12
35
  const mockUseGetBucketPolicy = jest.mocked(useGetBucketPolicy);
36
+ const mockUseGetBucketTagging = jest.mocked(useGetBucketTagging);
37
+ const mockUseISVBucketStatus = jest.mocked(useISVBucketStatus);
38
+ const mockUseFeatures = jest.mocked(useFeatures);
13
39
  const renderBucketOverview = (props = {})=>{
40
+ const { bucketName = "test-bucket", onEmptyBucket, onDeleteBucket, onEditPolicy, renderEmptyButton, renderDeleteButton, isEmptyBucketDisabled, isDeleteBucketDisabled } = props;
14
41
  const Wrapper = createTestWrapper();
15
- return render(/*#__PURE__*/ jsx(Wrapper, {
16
- children: /*#__PURE__*/ jsx(BucketOverview, {
17
- bucketName: "test-bucket",
18
- ...props
42
+ const mockNavigate = jest.fn();
43
+ __webpack_require__("react-router-dom").useNavigate.mockReturnValue(mockNavigate);
44
+ return render(/*#__PURE__*/ jsx(external_react_router_dom_.MemoryRouter, {
45
+ children: /*#__PURE__*/ jsx(Wrapper, {
46
+ children: /*#__PURE__*/ jsxs(BucketOverview, {
47
+ bucketName: bucketName,
48
+ children: [
49
+ /*#__PURE__*/ jsx(BucketOverview.Actions, {
50
+ onEmptyBucket: onEmptyBucket,
51
+ onDeleteBucket: onDeleteBucket,
52
+ renderEmptyButton: renderEmptyButton,
53
+ renderDeleteButton: renderDeleteButton,
54
+ isEmptyBucketDisabled: isEmptyBucketDisabled,
55
+ isDeleteBucketDisabled: isDeleteBucketDisabled
56
+ }),
57
+ /*#__PURE__*/ jsxs(BucketOverview.Sections, {
58
+ children: [
59
+ /*#__PURE__*/ jsx(BucketOverview.GeneralSection, {}),
60
+ /*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
61
+ /*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {
62
+ onEditPolicy: onEditPolicy
63
+ })
64
+ ]
65
+ })
66
+ ]
67
+ })
19
68
  })
20
69
  }));
21
70
  };
@@ -66,6 +115,21 @@ const mockHookDefaults = ()=>{
66
115
  error: null,
67
116
  status: "success"
68
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);
69
133
  };
70
134
  describe("BucketOverview", ()=>{
71
135
  beforeEach(()=>{
@@ -148,6 +212,126 @@ describe("BucketOverview", ()=>{
148
212
  renderBucketOverview();
149
213
  expect(screen.getByText("Disabled")).toBeInTheDocument();
150
214
  });
215
+ it("shows default retention as Inactive when not configured", ()=>{
216
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
217
+ data: {
218
+ ObjectLockConfiguration: {
219
+ ObjectLockEnabled: "Enabled"
220
+ }
221
+ },
222
+ status: "success"
223
+ });
224
+ renderBucketOverview();
225
+ expect(screen.getByText("Inactive")).toBeInTheDocument();
226
+ });
227
+ it("shows default retention with days in Governance mode", ()=>{
228
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
229
+ data: {
230
+ ObjectLockConfiguration: {
231
+ ObjectLockEnabled: "Enabled",
232
+ Rule: {
233
+ DefaultRetention: {
234
+ Mode: "GOVERNANCE",
235
+ Days: 30
236
+ }
237
+ }
238
+ }
239
+ },
240
+ status: "success"
241
+ });
242
+ renderBucketOverview();
243
+ expect(screen.getByText("Governance - 30 days")).toBeInTheDocument();
244
+ });
245
+ it("shows default retention with single day", ()=>{
246
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
247
+ data: {
248
+ ObjectLockConfiguration: {
249
+ ObjectLockEnabled: "Enabled",
250
+ Rule: {
251
+ DefaultRetention: {
252
+ Mode: "COMPLIANCE",
253
+ Days: 1
254
+ }
255
+ }
256
+ }
257
+ },
258
+ status: "success"
259
+ });
260
+ renderBucketOverview();
261
+ expect(screen.getByText("Compliance - 1 day")).toBeInTheDocument();
262
+ });
263
+ it("shows default retention with years in Compliance mode", ()=>{
264
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
265
+ data: {
266
+ ObjectLockConfiguration: {
267
+ ObjectLockEnabled: "Enabled",
268
+ Rule: {
269
+ DefaultRetention: {
270
+ Mode: "COMPLIANCE",
271
+ Years: 7
272
+ }
273
+ }
274
+ }
275
+ },
276
+ status: "success"
277
+ });
278
+ renderBucketOverview();
279
+ expect(screen.getByText("Compliance - 7 years")).toBeInTheDocument();
280
+ });
281
+ it("shows default retention with single year", ()=>{
282
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
283
+ data: {
284
+ ObjectLockConfiguration: {
285
+ ObjectLockEnabled: "Enabled",
286
+ Rule: {
287
+ DefaultRetention: {
288
+ Mode: "GOVERNANCE",
289
+ Years: 1
290
+ }
291
+ }
292
+ }
293
+ },
294
+ status: "success"
295
+ });
296
+ renderBucketOverview();
297
+ expect(screen.getByText("Governance - 1 year")).toBeInTheDocument();
298
+ });
299
+ it("shows edit retention button when object lock is enabled", ()=>{
300
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
301
+ data: {
302
+ ObjectLockConfiguration: {
303
+ ObjectLockEnabled: "Enabled",
304
+ Rule: {
305
+ DefaultRetention: {
306
+ Mode: "GOVERNANCE",
307
+ Days: 30
308
+ }
309
+ }
310
+ }
311
+ },
312
+ status: "success"
313
+ });
314
+ renderBucketOverview();
315
+ const editButton = screen.getByRole("button", {
316
+ name: /edit default retention/i
317
+ });
318
+ expect(editButton).toBeInTheDocument();
319
+ });
320
+ it("does not show edit retention button when object lock is disabled", ()=>{
321
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
322
+ data: {
323
+ ObjectLockConfiguration: {
324
+ ObjectLockEnabled: "Disabled"
325
+ }
326
+ },
327
+ status: "success"
328
+ });
329
+ renderBucketOverview();
330
+ const editButton = screen.queryByRole("button", {
331
+ name: /edit default retention/i
332
+ });
333
+ expect(editButton).not.toBeInTheDocument();
334
+ });
151
335
  it("displays bucket owner from ACL", ()=>{
152
336
  mockUseGetBucketAcl.mockReturnValue({
153
337
  data: {
@@ -406,14 +590,34 @@ describe("BucketOverview", ()=>{
406
590
  const corsValues = screen.getAllByText("No");
407
591
  expect(corsValues.length).toBeGreaterThan(0);
408
592
  });
409
- it("handles object lock error state", ()=>{
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";
596
+ notFoundError.$metadata = {
597
+ httpStatusCode: 404
598
+ };
410
599
  mockUseGetBucketObjectLockConfiguration.mockReturnValue({
411
600
  data: void 0,
412
- status: "error"
601
+ status: "error",
602
+ error: notFoundError
413
603
  });
414
604
  renderBucketOverview();
415
605
  expect(screen.getByText("Disabled")).toBeInTheDocument();
416
606
  });
607
+ it("handles object lock real error state (non-404)", ()=>{
608
+ const accessDeniedError = new Error("Access Denied");
609
+ accessDeniedError.name = "AccessDenied";
610
+ accessDeniedError.$metadata = {
611
+ httpStatusCode: 403
612
+ };
613
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
614
+ data: void 0,
615
+ status: "error",
616
+ error: accessDeniedError
617
+ });
618
+ renderBucketOverview();
619
+ expect(screen.getByText("Error")).toBeInTheDocument();
620
+ });
417
621
  describe("Bucket Policy", ()=>{
418
622
  it("shows 'Configured' when policy exists", ()=>{
419
623
  mockUseGetBucketPolicy.mockReturnValue({
@@ -476,4 +680,90 @@ describe("BucketOverview", ()=>{
476
680
  expect(onEditPolicy).toHaveBeenCalledWith("test-bucket");
477
681
  });
478
682
  });
683
+ describe("Field Overrides", ()=>{
684
+ it("renders slot-based field override", ()=>{
685
+ const Wrapper = createTestWrapper();
686
+ render(/*#__PURE__*/ jsx(external_react_router_dom_.MemoryRouter, {
687
+ children: /*#__PURE__*/ jsx(Wrapper, {
688
+ children: /*#__PURE__*/ jsxs(BucketOverview, {
689
+ bucketName: "test-bucket",
690
+ children: [
691
+ /*#__PURE__*/ jsx(BucketOverview.Actions, {}),
692
+ /*#__PURE__*/ jsxs(BucketOverview.Sections, {
693
+ children: [
694
+ /*#__PURE__*/ jsx(BucketOverview.GeneralSection, {
695
+ locationField: /*#__PURE__*/ jsx("span", {
696
+ children: "Custom Location Content"
697
+ })
698
+ }),
699
+ /*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
700
+ /*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {})
701
+ ]
702
+ })
703
+ ]
704
+ })
705
+ })
706
+ }));
707
+ expect(screen.getByText("Custom Location Content")).toBeInTheDocument();
708
+ expect(screen.getByText("test-bucket")).toBeInTheDocument();
709
+ });
710
+ it("renders render prop field override", ()=>{
711
+ const Wrapper = createTestWrapper();
712
+ render(/*#__PURE__*/ jsx(external_react_router_dom_.MemoryRouter, {
713
+ children: /*#__PURE__*/ jsx(Wrapper, {
714
+ children: /*#__PURE__*/ jsxs(BucketOverview, {
715
+ bucketName: "test-bucket",
716
+ children: [
717
+ /*#__PURE__*/ jsx(BucketOverview.Actions, {}),
718
+ /*#__PURE__*/ jsxs(BucketOverview.Sections, {
719
+ children: [
720
+ /*#__PURE__*/ jsx(BucketOverview.GeneralSection, {
721
+ renderVersioning: (name)=>/*#__PURE__*/ jsxs("span", {
722
+ children: [
723
+ "Custom Versioning for ",
724
+ name
725
+ ]
726
+ })
727
+ }),
728
+ /*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
729
+ /*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {})
730
+ ]
731
+ })
732
+ ]
733
+ })
734
+ })
735
+ }));
736
+ expect(screen.getByText("Custom Versioning for test-bucket")).toBeInTheDocument();
737
+ });
738
+ it("prioritizes slot prop over render prop over default", ()=>{
739
+ const Wrapper = createTestWrapper();
740
+ const renderName = jest.fn(()=>/*#__PURE__*/ jsx("span", {
741
+ children: "Render Prop Name"
742
+ }));
743
+ render(/*#__PURE__*/ jsx(external_react_router_dom_.MemoryRouter, {
744
+ children: /*#__PURE__*/ jsx(Wrapper, {
745
+ children: /*#__PURE__*/ jsxs(BucketOverview, {
746
+ bucketName: "test-bucket",
747
+ children: [
748
+ /*#__PURE__*/ jsx(BucketOverview.Actions, {}),
749
+ /*#__PURE__*/ jsxs(BucketOverview.Sections, {
750
+ children: [
751
+ /*#__PURE__*/ jsx(BucketOverview.GeneralSection, {
752
+ nameField: /*#__PURE__*/ jsx("span", {
753
+ children: "Slot Prop Name"
754
+ }),
755
+ renderName: renderName
756
+ }),
757
+ /*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
758
+ /*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {})
759
+ ]
760
+ })
761
+ ]
762
+ })
763
+ })
764
+ }));
765
+ expect(screen.getByText("Slot Prop Name")).toBeInTheDocument();
766
+ expect(renderName).not.toHaveBeenCalled();
767
+ });
768
+ });
479
769
  });