@scality/data-browser-library 1.0.0-preview.13 → 1.0.0-preview.16

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