@scality/data-browser-library 1.0.0-preview.13 → 1.0.0-preview.15
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.
- package/dist/components/DataBrowserUI.d.ts +15 -8
- package/dist/components/DataBrowserUI.js +79 -55
- package/dist/components/Editor.d.ts +1 -1
- package/dist/components/Editor.js +3 -3
- package/dist/components/__tests__/BucketCreate.test.js +102 -102
- package/dist/components/__tests__/BucketDetails.test.js +121 -122
- package/dist/components/__tests__/BucketLifecycleFormPage.test.js +177 -177
- package/dist/components/__tests__/BucketLifecycleList.test.js +85 -85
- package/dist/components/__tests__/BucketList.test.js +175 -176
- package/dist/components/__tests__/BucketNotificationCreatePage.test.js +84 -84
- package/dist/components/__tests__/BucketOverview.test.js +256 -200
- package/dist/components/__tests__/BucketPolicyPage.test.js +62 -62
- package/dist/components/__tests__/BucketReplicationFormPage.test.js +542 -542
- package/dist/components/__tests__/BucketReplicationList.test.js +106 -106
- package/dist/components/__tests__/CreateFolderButton.test.js +56 -56
- package/dist/components/__tests__/DeleteBucketButton.test.js +62 -62
- package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +47 -47
- package/dist/components/__tests__/DeleteObjectButton.test.js +63 -63
- package/dist/components/__tests__/EmptyBucketButton.test.js +56 -56
- package/dist/components/__tests__/MetadataSearch.test.js +65 -65
- package/dist/components/__tests__/ObjectList.test.js +251 -250
- package/dist/components/__tests__/UploadButton.test.js +45 -45
- package/dist/components/buckets/BucketCreate.d.ts +2 -2
- package/dist/components/buckets/BucketCreate.js +41 -41
- package/dist/components/buckets/BucketDetails.d.ts +2 -2
- package/dist/components/buckets/BucketDetails.js +48 -36
- package/dist/components/buckets/BucketLifecycleFormPage.js +161 -160
- package/dist/components/buckets/BucketLifecycleList.d.ts +2 -2
- package/dist/components/buckets/BucketLifecycleList.js +46 -46
- package/dist/components/buckets/BucketList.d.ts +2 -2
- package/dist/components/buckets/BucketList.js +28 -27
- package/dist/components/buckets/BucketLocation.js +3 -3
- package/dist/components/buckets/BucketOverview.d.ts +1 -1
- package/dist/components/buckets/BucketOverview.js +62 -62
- package/dist/components/buckets/BucketPage.js +19 -11
- package/dist/components/buckets/BucketPolicyButton.js +2 -2
- package/dist/components/buckets/BucketPolicyPage.js +27 -25
- package/dist/components/buckets/BucketReplicationFormPage.js +133 -132
- package/dist/components/buckets/BucketReplicationList.d.ts +2 -2
- package/dist/components/buckets/BucketReplicationList.js +41 -41
- package/dist/components/buckets/BucketVersioning.js +11 -11
- package/dist/components/buckets/DeleteBucketButton.js +5 -5
- package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +2 -2
- package/dist/components/buckets/DeleteBucketConfigRuleButton.js +1 -1
- package/dist/components/buckets/EmptyBucketButton.js +19 -19
- package/dist/components/buckets/EmptyBucketSummary.d.ts +1 -1
- package/dist/components/buckets/EmptyBucketSummary.js +1 -1
- package/dist/components/buckets/EmptyBucketSummaryList.js +22 -22
- package/dist/components/buckets/__tests__/BucketVersioning.test.js +45 -45
- package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +34 -33
- package/dist/components/buckets/notifications/EventsSection.js +144 -28
- package/dist/components/buckets/notifications/__tests__/events.test.d.ts +1 -0
- package/dist/components/buckets/notifications/__tests__/events.test.js +56 -0
- package/dist/components/buckets/notifications/events.d.ts +71 -7
- package/dist/components/buckets/notifications/events.js +98 -16
- package/dist/components/index.d.ts +23 -22
- package/dist/components/index.js +3 -2
- package/dist/components/layouts/ArrowNavigation.d.ts +1 -2
- package/dist/components/layouts/ArrowNavigation.js +3 -3
- package/dist/components/layouts/BrowserPageLayout.d.ts +2 -3
- package/dist/components/layouts/BrowserPageLayout.js +1 -1
- package/dist/components/objects/CreateFolderButton.d.ts +2 -2
- package/dist/components/objects/CreateFolderButton.js +9 -9
- package/dist/components/objects/DeleteObjectButton.d.ts +1 -1
- package/dist/components/objects/DeleteObjectButton.js +20 -20
- package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +1 -1
- package/dist/components/objects/ObjectDetails/ObjectMetadata.js +56 -56
- package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +1 -1
- package/dist/components/objects/ObjectDetails/ObjectSummary.js +39 -39
- package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +1 -1
- package/dist/components/objects/ObjectDetails/ObjectTags.js +25 -25
- package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.js +119 -119
- package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.js +211 -211
- package/dist/components/objects/ObjectDetails/index.d.ts +1 -1
- package/dist/components/objects/ObjectDetails/index.js +30 -30
- package/dist/components/objects/ObjectList.d.ts +5 -5
- package/dist/components/objects/ObjectList.js +112 -111
- package/dist/components/objects/ObjectLock/EditRetentionButton.js +3 -3
- package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +14 -14
- package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +1 -1
- package/dist/components/objects/ObjectLock/ObjectLockSettings.js +29 -28
- package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +1 -1
- package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +6 -6
- package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +50 -50
- package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +77 -77
- package/dist/components/objects/ObjectPage.js +5 -4
- package/dist/components/objects/UploadButton.d.ts +3 -3
- package/dist/components/objects/UploadButton.js +5 -5
- package/dist/components/providers/DataBrowserProvider.d.ts +15 -4
- package/dist/components/providers/DataBrowserProvider.js +33 -11
- package/dist/components/search/MetadataSearch.js +26 -25
- package/dist/components/search/SearchHints.js +1 -1
- package/dist/components/ui/ArrayFieldActions.js +4 -4
- package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +1 -1
- package/dist/components/ui/ConfirmDeleteRuleModal.js +1 -1
- package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
- package/dist/components/ui/DeleteObjectModalContent.js +12 -12
- package/dist/components/ui/FilterFormSection.d.ts +2 -2
- package/dist/components/ui/FilterFormSection.js +29 -29
- package/dist/components/ui/Search.elements.d.ts +1 -1
- package/dist/components/ui/Search.elements.js +7 -7
- package/dist/components/ui/Table.elements.js +5 -5
- package/dist/config/factory.d.ts +23 -10
- package/dist/config/factory.js +22 -7
- package/dist/config/types.d.ts +20 -3
- package/dist/contexts/DataBrowserUICustomizationContext.d.ts +2 -2
- package/dist/hooks/__tests__/useISVBucketDetection.test.js +41 -41
- package/dist/hooks/__tests__/useIsBucketEmpty.test.js +25 -25
- package/dist/hooks/bucketConfiguration.d.ts +1 -1
- package/dist/hooks/bucketConfiguration.js +48 -48
- package/dist/hooks/bucketOperations.d.ts +1 -1
- package/dist/hooks/bucketOperations.js +6 -6
- package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +78 -78
- package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +78 -78
- package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +42 -42
- package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +61 -61
- package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +63 -63
- package/dist/hooks/factories/index.d.ts +4 -4
- package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +15 -12
- package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
- package/dist/hooks/factories/useCreateS3MutationHook.js +6 -1
- package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3QueryHook.js +8 -5
- package/dist/hooks/index.d.ts +14 -13
- package/dist/hooks/index.js +2 -1
- package/dist/hooks/loginOperations.d.ts +1 -1
- package/dist/hooks/loginOperations.js +1 -1
- package/dist/hooks/objectOperations.d.ts +2 -2
- package/dist/hooks/objectOperations.js +49 -49
- package/dist/hooks/presignedOperations.d.ts +2 -2
- package/dist/hooks/presignedOperations.js +3 -3
- package/dist/hooks/useBatchObjectLegalHold.js +7 -4
- package/dist/hooks/useDataBrowserNavigate.d.ts +14 -0
- package/dist/hooks/useDataBrowserNavigate.js +24 -0
- package/dist/hooks/useDeleteBucketConfigRule.d.ts +2 -2
- package/dist/hooks/useDeleteBucketConfigRule.js +4 -4
- package/dist/hooks/useEmptyBucket.js +10 -10
- package/dist/hooks/useISVBucketDetection.js +3 -3
- package/dist/hooks/useIsBucketEmpty.js +4 -4
- package/dist/hooks/useLoginMutation.d.ts +1 -1
- package/dist/hooks/useLoginMutation.js +1 -1
- package/dist/hooks/useS3Client.d.ts +5 -0
- package/dist/hooks/useS3Client.js +3 -2
- package/dist/hooks/useS3ConfigSwitch.d.ts +11 -0
- package/dist/hooks/useS3ConfigSwitch.js +37 -0
- package/dist/index.d.ts +6 -6
- package/dist/test/msw/handlers/deleteBucket.d.ts +1 -1
- package/dist/test/msw/handlers/deleteBucket.js +20 -10
- package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -1
- package/dist/test/msw/handlers/getBucketAcl.js +29 -17
- package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -1
- package/dist/test/msw/handlers/getBucketLocation.js +29 -15
- package/dist/test/msw/handlers/getBucketPolicy.d.ts +1 -1
- package/dist/test/msw/handlers/getBucketPolicy.js +52 -32
- package/dist/test/msw/handlers/headObject.d.ts +1 -1
- package/dist/test/msw/handlers/headObject.js +31 -13
- package/dist/test/msw/handlers/listBuckets.d.ts +1 -1
- package/dist/test/msw/handlers/listBuckets.js +5 -3
- package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -1
- package/dist/test/msw/handlers/listObjectVersions.js +38 -26
- package/dist/test/msw/handlers/listObjects.d.ts +1 -1
- package/dist/test/msw/handlers/listObjects.js +35 -23
- package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -1
- package/dist/test/msw/handlers/objectLegalHold.js +31 -16
- package/dist/test/msw/handlers/objectRetention.d.ts +1 -1
- package/dist/test/msw/handlers/objectRetention.js +31 -17
- package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -1
- package/dist/test/msw/handlers/putBucketAcl.js +29 -14
- package/dist/test/msw/handlers/putObject.d.ts +1 -1
- package/dist/test/msw/handlers/putObject.js +27 -12
- package/dist/test/msw/handlers.d.ts +3 -3
- package/dist/test/msw/handlers.js +72 -49
- package/dist/test/msw/index.d.ts +2 -2
- package/dist/test/msw/server.d.ts +1 -1
- package/dist/test/msw/server.js +1 -1
- package/dist/test/msw/utils.js +2 -2
- package/dist/test/setup.d.ts +1 -1
- package/dist/test/setup.js +19 -19
- package/dist/test/testUtils.d.ts +9 -15
- package/dist/test/testUtils.js +78 -92
- package/dist/test/utils/errorHandling.test.js +119 -119
- package/dist/types/index.d.ts +6 -31
- package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
- package/dist/utils/__tests__/s3ConfigIdentifier.test.js +429 -0
- package/dist/utils/constants.js +8 -8
- package/dist/utils/deletion/index.d.ts +2 -2
- package/dist/utils/deletion/messages.d.ts +1 -1
- package/dist/utils/deletion/messages.js +4 -4
- package/dist/utils/errorHandling.d.ts +3 -3
- package/dist/utils/errorHandling.js +6 -6
- package/dist/utils/hooks.js +8 -8
- package/dist/utils/index.d.ts +5 -4
- package/dist/utils/index.js +2 -0
- package/dist/utils/proxyMiddleware.d.ts +1 -1
- package/dist/utils/proxyMiddleware.js +6 -11
- package/dist/utils/s3Client.d.ts +2 -2
- package/dist/utils/s3Client.js +1 -1
- package/dist/utils/s3ConfigIdentifier.d.ts +68 -0
- package/dist/utils/s3ConfigIdentifier.js +55 -0
- package/dist/utils/s3RuleUtils.d.ts +5 -5
- package/dist/utils/s3RuleUtils.js +17 -17
- package/dist/utils/useSupportedNotificationEvents.d.ts +6 -0
- package/dist/utils/useSupportedNotificationEvents.js +7 -0
- package/package.json +2 -2
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import { fireEvent, render, screen, waitFor } from "@testing-library/react";
|
|
3
3
|
import user_event from "@testing-library/user-event";
|
|
4
|
-
import { MemoryRouter, Route, Routes } from "react-router
|
|
4
|
+
import { MemoryRouter, Route, Routes } from "react-router";
|
|
5
5
|
import { createTestWrapper } from "../../test/testUtils.js";
|
|
6
6
|
import { BucketNotificationCreatePage } from "../buckets/notifications/BucketNotificationCreatePage.js";
|
|
7
7
|
import { useGetBucketNotification, useSetBucketNotification } from "../../hooks/index.js";
|
|
8
|
-
jest.mock(
|
|
8
|
+
jest.mock('../../hooks', ()=>({
|
|
9
9
|
useGetBucketNotification: jest.fn(),
|
|
10
10
|
useSetBucketNotification: jest.fn()
|
|
11
11
|
}));
|
|
12
12
|
const mockUseGetBucketNotification = jest.mocked(useGetBucketNotification);
|
|
13
13
|
const mockUseSetBucketNotification = jest.mocked(useSetBucketNotification);
|
|
14
14
|
const mockNavigate = jest.fn();
|
|
15
|
-
jest.mock(
|
|
16
|
-
...jest.requireActual(
|
|
15
|
+
jest.mock('react-router', ()=>({
|
|
16
|
+
...jest.requireActual('react-router'),
|
|
17
17
|
useNavigate: ()=>mockNavigate
|
|
18
18
|
}));
|
|
19
|
-
const renderBucketNotificationCreatePage = (bucketName =
|
|
19
|
+
const renderBucketNotificationCreatePage = (bucketName = 'test-bucket')=>{
|
|
20
20
|
const Wrapper = createTestWrapper();
|
|
21
21
|
return render(/*#__PURE__*/ jsx(MemoryRouter, {
|
|
22
22
|
initialEntries: [
|
|
@@ -32,7 +32,7 @@ const renderBucketNotificationCreatePage = (bucketName = "test-bucket")=>{
|
|
|
32
32
|
})
|
|
33
33
|
}));
|
|
34
34
|
};
|
|
35
|
-
describe(
|
|
35
|
+
describe('BucketNotificationCreatePage', ()=>{
|
|
36
36
|
const mockMutate = jest.fn();
|
|
37
37
|
beforeEach(()=>{
|
|
38
38
|
jest.clearAllMocks();
|
|
@@ -45,38 +45,38 @@ describe("BucketNotificationCreatePage", ()=>{
|
|
|
45
45
|
isPending: false
|
|
46
46
|
});
|
|
47
47
|
});
|
|
48
|
-
it(
|
|
48
|
+
it('renders create notification form with all fields', ()=>{
|
|
49
49
|
renderBucketNotificationCreatePage();
|
|
50
|
-
expect(screen.getByText(
|
|
50
|
+
expect(screen.getByText('Create Bucket Notification')).toBeInTheDocument();
|
|
51
51
|
expect(screen.getByLabelText(/rule name/i)).toBeInTheDocument();
|
|
52
|
-
expect(screen.getByText(
|
|
52
|
+
expect(screen.getByText('Events')).toBeInTheDocument();
|
|
53
53
|
expect(screen.getByLabelText(/destination queue/i)).toBeInTheDocument();
|
|
54
54
|
expect(screen.getByLabelText(/prefix/i)).toBeInTheDocument();
|
|
55
55
|
expect(screen.getByLabelText(/suffix/i)).toBeInTheDocument();
|
|
56
56
|
});
|
|
57
|
-
it(
|
|
57
|
+
it('disables create button when form is pristine', ()=>{
|
|
58
58
|
renderBucketNotificationCreatePage();
|
|
59
|
-
expect(screen.getByRole(
|
|
59
|
+
expect(screen.getByRole('button', {
|
|
60
60
|
name: /create/i
|
|
61
61
|
})).toBeDisabled();
|
|
62
62
|
});
|
|
63
|
-
it(
|
|
63
|
+
it('shows validation error when rule name is empty', async ()=>{
|
|
64
64
|
renderBucketNotificationCreatePage();
|
|
65
65
|
const ruleNameInput = screen.getByLabelText(/rule name/i);
|
|
66
|
-
await user_event.type(ruleNameInput,
|
|
66
|
+
await user_event.type(ruleNameInput, 'a');
|
|
67
67
|
await user_event.clear(ruleNameInput);
|
|
68
68
|
await waitFor(()=>{
|
|
69
69
|
expect(screen.getByText(/this field is required/i)).toBeInTheDocument();
|
|
70
70
|
});
|
|
71
71
|
});
|
|
72
|
-
it(
|
|
72
|
+
it('shows validation error when rule name already exists', async ()=>{
|
|
73
73
|
const existingConfig = {
|
|
74
74
|
QueueConfigurations: [
|
|
75
75
|
{
|
|
76
|
-
Id:
|
|
77
|
-
QueueArn:
|
|
76
|
+
Id: 'existing-rule',
|
|
77
|
+
QueueArn: 'arn:aws:sqs:us-east-1:123:queue',
|
|
78
78
|
Events: [
|
|
79
|
-
|
|
79
|
+
's3:ObjectCreated:*'
|
|
80
80
|
]
|
|
81
81
|
}
|
|
82
82
|
]
|
|
@@ -86,83 +86,83 @@ describe("BucketNotificationCreatePage", ()=>{
|
|
|
86
86
|
});
|
|
87
87
|
renderBucketNotificationCreatePage();
|
|
88
88
|
const ruleNameInput = screen.getByLabelText(/rule name/i);
|
|
89
|
-
await user_event.type(ruleNameInput,
|
|
89
|
+
await user_event.type(ruleNameInput, 'existing-rule');
|
|
90
90
|
await waitFor(()=>{
|
|
91
91
|
expect(screen.getByText(/a rule with this name already exists/i)).toBeInTheDocument();
|
|
92
92
|
});
|
|
93
93
|
});
|
|
94
|
-
it(
|
|
94
|
+
it('shows validation error when queue ARN is invalid', async ()=>{
|
|
95
95
|
renderBucketNotificationCreatePage();
|
|
96
96
|
const queueArnInput = screen.getByLabelText(/destination queue/i);
|
|
97
|
-
await user_event.type(queueArnInput,
|
|
97
|
+
await user_event.type(queueArnInput, 'invalid-arn');
|
|
98
98
|
await waitFor(()=>{
|
|
99
99
|
expect(screen.getByText(/must be a valid arn/i)).toBeInTheDocument();
|
|
100
100
|
});
|
|
101
101
|
});
|
|
102
|
-
it(
|
|
102
|
+
it('shows validation error when no event is selected', async ()=>{
|
|
103
103
|
renderBucketNotificationCreatePage();
|
|
104
104
|
const ruleNameInput = screen.getByLabelText(/rule name/i);
|
|
105
|
-
await user_event.type(ruleNameInput,
|
|
105
|
+
await user_event.type(ruleNameInput, 'test-rule');
|
|
106
106
|
const queueArnInput = screen.getByLabelText(/destination queue/i);
|
|
107
|
-
await user_event.type(queueArnInput,
|
|
107
|
+
await user_event.type(queueArnInput, 'arn:aws:sqs:us-east-1:123:queue');
|
|
108
108
|
await waitFor(()=>{
|
|
109
|
-
expect(screen.getByRole(
|
|
109
|
+
expect(screen.getByRole('button', {
|
|
110
110
|
name: /create/i
|
|
111
111
|
})).toBeDisabled();
|
|
112
112
|
});
|
|
113
113
|
});
|
|
114
|
-
it(
|
|
114
|
+
it('enables create button when form is valid', async ()=>{
|
|
115
115
|
renderBucketNotificationCreatePage();
|
|
116
|
-
await user_event.type(screen.getByLabelText(/rule name/i),
|
|
117
|
-
await user_event.type(screen.getByLabelText(/destination queue/i),
|
|
118
|
-
const checkbox = screen.getByRole(
|
|
116
|
+
await user_event.type(screen.getByLabelText(/rule name/i), 'test-rule');
|
|
117
|
+
await user_event.type(screen.getByLabelText(/destination queue/i), 'arn:aws:sqs:us-east-1:123:queue');
|
|
118
|
+
const checkbox = screen.getByRole('checkbox', {
|
|
119
119
|
name: /s3:ObjectCreated:\*/i
|
|
120
120
|
});
|
|
121
121
|
fireEvent.click(checkbox);
|
|
122
122
|
await waitFor(()=>{
|
|
123
|
-
expect(screen.getByRole(
|
|
123
|
+
expect(screen.getByRole('button', {
|
|
124
124
|
name: /create/i
|
|
125
125
|
})).toBeEnabled();
|
|
126
126
|
});
|
|
127
127
|
});
|
|
128
|
-
it(
|
|
128
|
+
it('creates notification with all fields and navigates on success', async ()=>{
|
|
129
129
|
renderBucketNotificationCreatePage();
|
|
130
|
-
await user_event.type(screen.getByLabelText(/rule name/i),
|
|
131
|
-
await user_event.type(screen.getByLabelText(/destination queue/i),
|
|
132
|
-
fireEvent.click(screen.getByRole(
|
|
130
|
+
await user_event.type(screen.getByLabelText(/rule name/i), 'test-rule');
|
|
131
|
+
await user_event.type(screen.getByLabelText(/destination queue/i), 'arn:aws:sqs:us-east-1:123:my-queue');
|
|
132
|
+
fireEvent.click(screen.getByRole('checkbox', {
|
|
133
133
|
name: /s3:ObjectCreated:Put/i
|
|
134
134
|
}));
|
|
135
|
-
await user_event.type(screen.getByLabelText(/prefix/i),
|
|
136
|
-
await user_event.type(screen.getByLabelText(/suffix/i),
|
|
135
|
+
await user_event.type(screen.getByLabelText(/prefix/i), 'uploads/');
|
|
136
|
+
await user_event.type(screen.getByLabelText(/suffix/i), '.jpg');
|
|
137
137
|
mockMutate.mockImplementation((_, options)=>{
|
|
138
138
|
options?.onSuccess?.();
|
|
139
139
|
});
|
|
140
|
-
const createButton = screen.getByRole(
|
|
140
|
+
const createButton = screen.getByRole('button', {
|
|
141
141
|
name: /create/i
|
|
142
142
|
});
|
|
143
143
|
await waitFor(()=>expect(createButton).toBeEnabled());
|
|
144
144
|
fireEvent.click(createButton);
|
|
145
145
|
await waitFor(()=>{
|
|
146
146
|
expect(mockMutate).toHaveBeenCalledWith({
|
|
147
|
-
Bucket:
|
|
147
|
+
Bucket: 'test-bucket',
|
|
148
148
|
NotificationConfiguration: {
|
|
149
149
|
QueueConfigurations: [
|
|
150
150
|
{
|
|
151
|
-
Id:
|
|
152
|
-
QueueArn:
|
|
151
|
+
Id: 'test-rule',
|
|
152
|
+
QueueArn: 'arn:aws:sqs:us-east-1:123:my-queue',
|
|
153
153
|
Events: [
|
|
154
|
-
|
|
154
|
+
's3:ObjectCreated:Put'
|
|
155
155
|
],
|
|
156
156
|
Filter: {
|
|
157
157
|
Key: {
|
|
158
158
|
FilterRules: [
|
|
159
159
|
{
|
|
160
|
-
Name:
|
|
161
|
-
Value:
|
|
160
|
+
Name: 'prefix',
|
|
161
|
+
Value: 'uploads/'
|
|
162
162
|
},
|
|
163
163
|
{
|
|
164
|
-
Name:
|
|
165
|
-
Value:
|
|
164
|
+
Name: 'suffix',
|
|
165
|
+
Value: '.jpg'
|
|
166
166
|
}
|
|
167
167
|
]
|
|
168
168
|
}
|
|
@@ -171,34 +171,34 @@ describe("BucketNotificationCreatePage", ()=>{
|
|
|
171
171
|
]
|
|
172
172
|
}
|
|
173
173
|
}, expect.any(Object));
|
|
174
|
-
expect(mockNavigate).toHaveBeenCalledWith(
|
|
174
|
+
expect(mockNavigate).toHaveBeenCalledWith('/buckets/test-bucket');
|
|
175
175
|
});
|
|
176
176
|
});
|
|
177
|
-
it(
|
|
177
|
+
it('creates notification without filters when not provided', async ()=>{
|
|
178
178
|
renderBucketNotificationCreatePage();
|
|
179
|
-
await user_event.type(screen.getByLabelText(/rule name/i),
|
|
180
|
-
await user_event.type(screen.getByLabelText(/destination queue/i),
|
|
181
|
-
fireEvent.click(screen.getByRole(
|
|
179
|
+
await user_event.type(screen.getByLabelText(/rule name/i), 'test-rule');
|
|
180
|
+
await user_event.type(screen.getByLabelText(/destination queue/i), 'arn:aws:sqs:us-east-1:123:my-queue');
|
|
181
|
+
fireEvent.click(screen.getByRole('checkbox', {
|
|
182
182
|
name: /s3:ObjectRemoved:\*/i
|
|
183
183
|
}));
|
|
184
184
|
mockMutate.mockImplementation((_, options)=>{
|
|
185
185
|
options?.onSuccess?.();
|
|
186
186
|
});
|
|
187
|
-
const createButton = screen.getByRole(
|
|
187
|
+
const createButton = screen.getByRole('button', {
|
|
188
188
|
name: /create/i
|
|
189
189
|
});
|
|
190
190
|
await waitFor(()=>expect(createButton).toBeEnabled());
|
|
191
191
|
fireEvent.click(createButton);
|
|
192
192
|
await waitFor(()=>{
|
|
193
193
|
expect(mockMutate).toHaveBeenCalledWith({
|
|
194
|
-
Bucket:
|
|
194
|
+
Bucket: 'test-bucket',
|
|
195
195
|
NotificationConfiguration: {
|
|
196
196
|
QueueConfigurations: [
|
|
197
197
|
{
|
|
198
|
-
Id:
|
|
199
|
-
QueueArn:
|
|
198
|
+
Id: 'test-rule',
|
|
199
|
+
QueueArn: 'arn:aws:sqs:us-east-1:123:my-queue',
|
|
200
200
|
Events: [
|
|
201
|
-
|
|
201
|
+
's3:ObjectRemoved:*'
|
|
202
202
|
]
|
|
203
203
|
}
|
|
204
204
|
]
|
|
@@ -206,14 +206,14 @@ describe("BucketNotificationCreatePage", ()=>{
|
|
|
206
206
|
}, expect.any(Object));
|
|
207
207
|
});
|
|
208
208
|
});
|
|
209
|
-
it(
|
|
209
|
+
it('preserves existing queue configurations when creating new notification', async ()=>{
|
|
210
210
|
const existingConfig = {
|
|
211
211
|
QueueConfigurations: [
|
|
212
212
|
{
|
|
213
|
-
Id:
|
|
214
|
-
QueueArn:
|
|
213
|
+
Id: 'existing-rule',
|
|
214
|
+
QueueArn: 'arn:aws:sqs:us-east-1:123:existing-queue',
|
|
215
215
|
Events: [
|
|
216
|
-
|
|
216
|
+
's3:ObjectCreated:*'
|
|
217
217
|
]
|
|
218
218
|
}
|
|
219
219
|
]
|
|
@@ -222,15 +222,15 @@ describe("BucketNotificationCreatePage", ()=>{
|
|
|
222
222
|
data: existingConfig
|
|
223
223
|
});
|
|
224
224
|
renderBucketNotificationCreatePage();
|
|
225
|
-
await user_event.type(screen.getByLabelText(/rule name/i),
|
|
226
|
-
await user_event.type(screen.getByLabelText(/destination queue/i),
|
|
227
|
-
fireEvent.click(screen.getByRole(
|
|
225
|
+
await user_event.type(screen.getByLabelText(/rule name/i), 'new-rule');
|
|
226
|
+
await user_event.type(screen.getByLabelText(/destination queue/i), 'arn:aws:sqs:us-east-1:123:new-queue');
|
|
227
|
+
fireEvent.click(screen.getByRole('checkbox', {
|
|
228
228
|
name: /^s3:ObjectRemoved:Delete$/i
|
|
229
229
|
}));
|
|
230
230
|
mockMutate.mockImplementation((_, options)=>{
|
|
231
231
|
options?.onSuccess?.();
|
|
232
232
|
});
|
|
233
|
-
const createButton = screen.getByRole(
|
|
233
|
+
const createButton = screen.getByRole('button', {
|
|
234
234
|
name: /create/i
|
|
235
235
|
});
|
|
236
236
|
await waitFor(()=>expect(createButton).toBeEnabled());
|
|
@@ -240,26 +240,26 @@ describe("BucketNotificationCreatePage", ()=>{
|
|
|
240
240
|
expect(call.NotificationConfiguration.QueueConfigurations).toHaveLength(2);
|
|
241
241
|
expect(call.NotificationConfiguration.QueueConfigurations[0]).toEqual(existingConfig.QueueConfigurations[0]);
|
|
242
242
|
expect(call.NotificationConfiguration.QueueConfigurations[1]).toMatchObject({
|
|
243
|
-
Id:
|
|
244
|
-
QueueArn:
|
|
243
|
+
Id: 'new-rule',
|
|
244
|
+
QueueArn: 'arn:aws:sqs:us-east-1:123:new-queue',
|
|
245
245
|
Events: [
|
|
246
|
-
|
|
246
|
+
's3:ObjectRemoved:Delete'
|
|
247
247
|
]
|
|
248
248
|
});
|
|
249
249
|
});
|
|
250
250
|
});
|
|
251
|
-
it(
|
|
251
|
+
it('displays error message when creation fails', async ()=>{
|
|
252
252
|
renderBucketNotificationCreatePage();
|
|
253
|
-
await user_event.type(screen.getByLabelText(/rule name/i),
|
|
254
|
-
await user_event.type(screen.getByLabelText(/destination queue/i),
|
|
255
|
-
fireEvent.click(screen.getByRole(
|
|
253
|
+
await user_event.type(screen.getByLabelText(/rule name/i), 'test-rule');
|
|
254
|
+
await user_event.type(screen.getByLabelText(/destination queue/i), 'arn:aws:sqs:us-east-1:123:my-queue');
|
|
255
|
+
fireEvent.click(screen.getByRole('checkbox', {
|
|
256
256
|
name: /s3:ObjectCreated:\*/i
|
|
257
257
|
}));
|
|
258
|
-
const error = new Error(
|
|
258
|
+
const error = new Error('Access Denied');
|
|
259
259
|
mockMutate.mockImplementation((_, options)=>{
|
|
260
260
|
options?.onError?.(error);
|
|
261
261
|
});
|
|
262
|
-
const createButton = screen.getByRole(
|
|
262
|
+
const createButton = screen.getByRole('button', {
|
|
263
263
|
name: /create/i
|
|
264
264
|
});
|
|
265
265
|
await waitFor(()=>expect(createButton).toBeEnabled());
|
|
@@ -268,31 +268,31 @@ describe("BucketNotificationCreatePage", ()=>{
|
|
|
268
268
|
expect(mockNavigate).not.toHaveBeenCalled();
|
|
269
269
|
});
|
|
270
270
|
});
|
|
271
|
-
it(
|
|
271
|
+
it('handles cancel button click and navigates back', ()=>{
|
|
272
272
|
renderBucketNotificationCreatePage();
|
|
273
|
-
const cancelButton = screen.getByRole(
|
|
273
|
+
const cancelButton = screen.getByRole('button', {
|
|
274
274
|
name: /cancel/i
|
|
275
275
|
});
|
|
276
276
|
fireEvent.click(cancelButton);
|
|
277
|
-
expect(mockNavigate).toHaveBeenCalledWith(
|
|
277
|
+
expect(mockNavigate).toHaveBeenCalledWith('/buckets/test-bucket');
|
|
278
278
|
});
|
|
279
|
-
it(
|
|
279
|
+
it('allows selecting multiple events', async ()=>{
|
|
280
280
|
renderBucketNotificationCreatePage();
|
|
281
|
-
await user_event.type(screen.getByLabelText(/rule name/i),
|
|
282
|
-
await user_event.type(screen.getByLabelText(/destination queue/i),
|
|
283
|
-
fireEvent.click(screen.getByRole(
|
|
281
|
+
await user_event.type(screen.getByLabelText(/rule name/i), 'multi-event');
|
|
282
|
+
await user_event.type(screen.getByLabelText(/destination queue/i), 'arn:aws:sqs:us-east-1:123:queue');
|
|
283
|
+
fireEvent.click(screen.getByRole('checkbox', {
|
|
284
284
|
name: /^s3:ObjectCreated:Put$/i
|
|
285
285
|
}));
|
|
286
|
-
fireEvent.click(screen.getByRole(
|
|
286
|
+
fireEvent.click(screen.getByRole('checkbox', {
|
|
287
287
|
name: /^s3:ObjectCreated:Copy$/i
|
|
288
288
|
}));
|
|
289
|
-
fireEvent.click(screen.getByRole(
|
|
289
|
+
fireEvent.click(screen.getByRole('checkbox', {
|
|
290
290
|
name: /^s3:ObjectRemoved:Delete$/i
|
|
291
291
|
}));
|
|
292
292
|
mockMutate.mockImplementation((_, options)=>{
|
|
293
293
|
options?.onSuccess?.();
|
|
294
294
|
});
|
|
295
|
-
const createButton = screen.getByRole(
|
|
295
|
+
const createButton = screen.getByRole('button', {
|
|
296
296
|
name: /create/i
|
|
297
297
|
});
|
|
298
298
|
await waitFor(()=>expect(createButton).toBeEnabled());
|
|
@@ -303,9 +303,9 @@ describe("BucketNotificationCreatePage", ()=>{
|
|
|
303
303
|
QueueConfigurations: [
|
|
304
304
|
expect.objectContaining({
|
|
305
305
|
Events: expect.arrayContaining([
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
306
|
+
's3:ObjectCreated:Put',
|
|
307
|
+
's3:ObjectCreated:Copy',
|
|
308
|
+
's3:ObjectRemoved:Delete'
|
|
309
309
|
])
|
|
310
310
|
})
|
|
311
311
|
]
|