@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
|
@@ -4,9 +4,8 @@ import { MemoryRouter } from "react-router";
|
|
|
4
4
|
import { createTestWrapper, mockOffsetSize } from "../../test/testUtils.js";
|
|
5
5
|
import { BucketList } from "../buckets/BucketList.js";
|
|
6
6
|
import * as __WEBPACK_EXTERNAL_MODULE__contexts_DataBrowserUICustomizationContext_js_f267b01c__ from "../../contexts/DataBrowserUICustomizationContext.js";
|
|
7
|
-
jest.mock("../../contexts/DataBrowserUICustomizationContext");
|
|
8
7
|
const mockUseDataBrowserUICustomization = (config = {})=>{
|
|
9
|
-
jest.spyOn(__WEBPACK_EXTERNAL_MODULE__contexts_DataBrowserUICustomizationContext_js_f267b01c__,
|
|
8
|
+
jest.spyOn(__WEBPACK_EXTERNAL_MODULE__contexts_DataBrowserUICustomizationContext_js_f267b01c__, 'useDataBrowserUICustomization').mockReturnValue(config);
|
|
10
9
|
};
|
|
11
10
|
const renderBucketList = (props = {})=>{
|
|
12
11
|
const Wrapper = createTestWrapper();
|
|
@@ -21,169 +20,169 @@ const renderBucketList = (props = {})=>{
|
|
|
21
20
|
};
|
|
22
21
|
const mockBuckets = [
|
|
23
22
|
{
|
|
24
|
-
Name:
|
|
25
|
-
CreationDate: new Date(
|
|
23
|
+
Name: 'test-bucket-1',
|
|
24
|
+
CreationDate: new Date('2024-01-15T10:30:00Z')
|
|
26
25
|
},
|
|
27
26
|
{
|
|
28
|
-
Name:
|
|
29
|
-
CreationDate: new Date(
|
|
27
|
+
Name: 'test-bucket-2',
|
|
28
|
+
CreationDate: new Date('2024-01-16T14:45:00Z')
|
|
30
29
|
},
|
|
31
30
|
{
|
|
32
|
-
Name:
|
|
33
|
-
CreationDate: new Date(
|
|
31
|
+
Name: 'test-bucket-3',
|
|
32
|
+
CreationDate: new Date('2024-01-17T09:15:00Z')
|
|
34
33
|
}
|
|
35
34
|
];
|
|
36
|
-
describe(
|
|
35
|
+
describe('BucketList', ()=>{
|
|
37
36
|
beforeEach(()=>{
|
|
38
37
|
jest.clearAllMocks();
|
|
39
38
|
mockOffsetSize(800, 600);
|
|
40
39
|
mockUseDataBrowserUICustomization({});
|
|
41
40
|
});
|
|
42
|
-
it(
|
|
41
|
+
it('shows a table with proper headers', ()=>{
|
|
43
42
|
renderBucketList({
|
|
44
43
|
buckets: mockBuckets
|
|
45
44
|
});
|
|
46
|
-
expect(screen.getByRole(
|
|
47
|
-
expect(screen.getByText(
|
|
48
|
-
expect(screen.getByText(
|
|
49
|
-
expect(screen.getByText(
|
|
45
|
+
expect(screen.getByRole('grid')).toBeInTheDocument();
|
|
46
|
+
expect(screen.getByText('Bucket Name')).toBeInTheDocument();
|
|
47
|
+
expect(screen.getByText('Storage Location')).toBeInTheDocument();
|
|
48
|
+
expect(screen.getByText('Created on')).toBeInTheDocument();
|
|
50
49
|
});
|
|
51
|
-
it(
|
|
50
|
+
it('displays buckets with their names as clickable links', ()=>{
|
|
52
51
|
const onNavigateToBucket = jest.fn();
|
|
53
52
|
renderBucketList({
|
|
54
53
|
buckets: mockBuckets,
|
|
55
54
|
onNavigateToBucket
|
|
56
55
|
});
|
|
57
|
-
expect(screen.getByText(
|
|
58
|
-
expect(screen.getByText(
|
|
59
|
-
expect(screen.getByText(
|
|
60
|
-
fireEvent.click(screen.getByText(
|
|
61
|
-
expect(onNavigateToBucket).toHaveBeenCalledWith(
|
|
56
|
+
expect(screen.getByText('test-bucket-1')).toBeInTheDocument();
|
|
57
|
+
expect(screen.getByText('test-bucket-2')).toBeInTheDocument();
|
|
58
|
+
expect(screen.getByText('test-bucket-3')).toBeInTheDocument();
|
|
59
|
+
fireEvent.click(screen.getByText('test-bucket-1'));
|
|
60
|
+
expect(onNavigateToBucket).toHaveBeenCalledWith('test-bucket-1');
|
|
62
61
|
});
|
|
63
|
-
it(
|
|
62
|
+
it('displays creation dates in formatted format', ()=>{
|
|
64
63
|
renderBucketList({
|
|
65
64
|
buckets: mockBuckets
|
|
66
65
|
});
|
|
67
|
-
const gridElement = screen.getByRole(
|
|
68
|
-
expect(gridElement).toHaveTextContent(
|
|
66
|
+
const gridElement = screen.getByRole('grid');
|
|
67
|
+
expect(gridElement).toHaveTextContent('2024');
|
|
69
68
|
const dateElements = screen.getAllByText(/2024/);
|
|
70
69
|
expect(dateElements.length).toBeGreaterThanOrEqual(3);
|
|
71
70
|
});
|
|
72
|
-
it(
|
|
71
|
+
it('handles bucket selection when onBucketSelect is provided', ()=>{
|
|
73
72
|
const onBucketSelect = jest.fn();
|
|
74
73
|
renderBucketList({
|
|
75
74
|
buckets: mockBuckets,
|
|
76
75
|
onBucketSelect
|
|
77
76
|
});
|
|
78
|
-
const rows = screen.getAllByRole(
|
|
77
|
+
const rows = screen.getAllByRole('row');
|
|
79
78
|
fireEvent.click(rows[1]);
|
|
80
|
-
expect(onBucketSelect).toHaveBeenCalledWith(
|
|
79
|
+
expect(onBucketSelect).toHaveBeenCalledWith('test-bucket-3');
|
|
81
80
|
});
|
|
82
|
-
it(
|
|
81
|
+
it('shows selected bucket when selectedBucketName is provided', ()=>{
|
|
83
82
|
renderBucketList({
|
|
84
83
|
buckets: mockBuckets,
|
|
85
|
-
selectedBucketName:
|
|
84
|
+
selectedBucketName: 'test-bucket-2'
|
|
86
85
|
});
|
|
87
|
-
const selectedRow = screen.getByRole(
|
|
86
|
+
const selectedRow = screen.getByRole('row', {
|
|
88
87
|
name: /test-bucket-2/
|
|
89
88
|
});
|
|
90
|
-
expect(selectedRow).toHaveAttribute(
|
|
89
|
+
expect(selectedRow).toHaveAttribute('aria-selected', 'true');
|
|
91
90
|
});
|
|
92
|
-
it(
|
|
91
|
+
it('handles create bucket button click', ()=>{
|
|
93
92
|
const onCreateBucket = jest.fn();
|
|
94
93
|
renderBucketList({
|
|
95
94
|
buckets: mockBuckets,
|
|
96
95
|
onCreateBucket
|
|
97
96
|
});
|
|
98
|
-
const createButton = screen.getByRole(
|
|
97
|
+
const createButton = screen.getByRole('button', {
|
|
99
98
|
name: /create bucket/i
|
|
100
99
|
});
|
|
101
100
|
expect(createButton).toBeInTheDocument();
|
|
102
101
|
fireEvent.click(createButton);
|
|
103
102
|
expect(onCreateBucket).toHaveBeenCalled();
|
|
104
103
|
});
|
|
105
|
-
it(
|
|
104
|
+
it('shows search functionality', ()=>{
|
|
106
105
|
renderBucketList({
|
|
107
106
|
buckets: mockBuckets
|
|
108
107
|
});
|
|
109
|
-
const searchInput = screen.getByRole(
|
|
108
|
+
const searchInput = screen.getByRole('searchbox');
|
|
110
109
|
expect(searchInput).toBeInTheDocument();
|
|
111
|
-
expect(searchInput).toHaveAttribute(
|
|
110
|
+
expect(searchInput).toHaveAttribute('placeholder', 'Example: Search');
|
|
112
111
|
});
|
|
113
|
-
it(
|
|
112
|
+
it('handles empty buckets list', ()=>{
|
|
114
113
|
renderBucketList({
|
|
115
114
|
buckets: []
|
|
116
115
|
});
|
|
117
|
-
expect(screen.getByRole(
|
|
118
|
-
expect(screen.getByText(
|
|
116
|
+
expect(screen.getByRole('grid')).toBeInTheDocument();
|
|
117
|
+
expect(screen.getByText('Bucket Name')).toBeInTheDocument();
|
|
119
118
|
});
|
|
120
|
-
it(
|
|
119
|
+
it('handles buckets without names gracefully', ()=>{
|
|
121
120
|
const bucketsWithMissingNames = [
|
|
122
121
|
{
|
|
123
122
|
Name: void 0,
|
|
124
123
|
CreationDate: new Date()
|
|
125
124
|
},
|
|
126
125
|
{
|
|
127
|
-
Name:
|
|
126
|
+
Name: '',
|
|
128
127
|
CreationDate: new Date()
|
|
129
128
|
},
|
|
130
129
|
{
|
|
131
|
-
Name:
|
|
130
|
+
Name: 'valid-bucket',
|
|
132
131
|
CreationDate: new Date()
|
|
133
132
|
}
|
|
134
133
|
];
|
|
135
134
|
renderBucketList({
|
|
136
135
|
buckets: bucketsWithMissingNames
|
|
137
136
|
});
|
|
138
|
-
expect(screen.getByText(
|
|
139
|
-
const dashes = screen.getAllByText(
|
|
137
|
+
expect(screen.getByText('valid-bucket')).toBeInTheDocument();
|
|
138
|
+
const dashes = screen.getAllByText('-');
|
|
140
139
|
expect(dashes.length).toBeGreaterThan(0);
|
|
141
140
|
});
|
|
142
|
-
it(
|
|
141
|
+
it('handles buckets without creation dates', ()=>{
|
|
143
142
|
const bucketsWithoutDates = [
|
|
144
143
|
{
|
|
145
|
-
Name:
|
|
144
|
+
Name: 'bucket-1',
|
|
146
145
|
CreationDate: void 0
|
|
147
146
|
},
|
|
148
147
|
{
|
|
149
|
-
Name:
|
|
148
|
+
Name: 'bucket-2'
|
|
150
149
|
}
|
|
151
150
|
];
|
|
152
151
|
renderBucketList({
|
|
153
152
|
buckets: bucketsWithoutDates
|
|
154
153
|
});
|
|
155
|
-
expect(screen.getByText(
|
|
156
|
-
expect(screen.getByText(
|
|
154
|
+
expect(screen.getByText('bucket-1')).toBeInTheDocument();
|
|
155
|
+
expect(screen.getByText('bucket-2')).toBeInTheDocument();
|
|
157
156
|
});
|
|
158
|
-
it(
|
|
157
|
+
it('works when no callbacks are provided', ()=>{
|
|
159
158
|
renderBucketList({
|
|
160
159
|
buckets: mockBuckets
|
|
161
160
|
});
|
|
162
161
|
expect(()=>{
|
|
163
|
-
fireEvent.click(screen.getByText(
|
|
164
|
-
const createButton = screen.getByRole(
|
|
162
|
+
fireEvent.click(screen.getByText('test-bucket-1'));
|
|
163
|
+
const createButton = screen.getByRole('button', {
|
|
165
164
|
name: /create bucket/i
|
|
166
165
|
});
|
|
167
166
|
fireEvent.click(createButton);
|
|
168
167
|
}).not.toThrow();
|
|
169
168
|
});
|
|
170
|
-
it(
|
|
169
|
+
it('handles different bucket statuses', ()=>{
|
|
171
170
|
expect(()=>{
|
|
172
171
|
renderBucketList({
|
|
173
172
|
buckets: mockBuckets,
|
|
174
|
-
bucketStatus:
|
|
173
|
+
bucketStatus: 'loading'
|
|
175
174
|
});
|
|
176
175
|
renderBucketList({
|
|
177
176
|
buckets: mockBuckets,
|
|
178
|
-
bucketStatus:
|
|
177
|
+
bucketStatus: 'error'
|
|
179
178
|
});
|
|
180
179
|
renderBucketList({
|
|
181
180
|
buckets: mockBuckets,
|
|
182
|
-
bucketStatus:
|
|
181
|
+
bucketStatus: 'success'
|
|
183
182
|
});
|
|
184
183
|
}).not.toThrow();
|
|
185
184
|
});
|
|
186
|
-
it(
|
|
185
|
+
it('prevents event propagation when clicking bucket name link', ()=>{
|
|
187
186
|
const onNavigateToBucket = jest.fn();
|
|
188
187
|
const onBucketSelect = jest.fn();
|
|
189
188
|
renderBucketList({
|
|
@@ -191,23 +190,23 @@ describe("BucketList", ()=>{
|
|
|
191
190
|
onNavigateToBucket,
|
|
192
191
|
onBucketSelect
|
|
193
192
|
});
|
|
194
|
-
fireEvent.click(screen.getByText(
|
|
195
|
-
expect(onNavigateToBucket).toHaveBeenCalledWith(
|
|
193
|
+
fireEvent.click(screen.getByText('test-bucket-1'));
|
|
194
|
+
expect(onNavigateToBucket).toHaveBeenCalledWith('test-bucket-1');
|
|
196
195
|
expect(onBucketSelect).not.toHaveBeenCalled();
|
|
197
196
|
});
|
|
198
|
-
it(
|
|
197
|
+
it('does not select already selected bucket', ()=>{
|
|
199
198
|
const onBucketSelect = jest.fn();
|
|
200
199
|
renderBucketList({
|
|
201
200
|
buckets: mockBuckets,
|
|
202
|
-
selectedBucketName:
|
|
201
|
+
selectedBucketName: 'test-bucket-1',
|
|
203
202
|
onBucketSelect
|
|
204
203
|
});
|
|
205
|
-
const bucketName = screen.getByText(
|
|
204
|
+
const bucketName = screen.getByText('test-bucket-1');
|
|
206
205
|
fireEvent.click(bucketName.closest('[role="row"]') || bucketName);
|
|
207
206
|
expect(onBucketSelect).not.toHaveBeenCalled();
|
|
208
207
|
});
|
|
209
|
-
describe(
|
|
210
|
-
it(
|
|
208
|
+
describe('extraBucketListColumns support', ()=>{
|
|
209
|
+
it('renders extra columns when extraBucketListColumns is configured', ()=>{
|
|
211
210
|
const CustomColumn = ({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
212
211
|
children: [
|
|
213
212
|
"Custom data for ",
|
|
@@ -217,8 +216,8 @@ describe("BucketList", ()=>{
|
|
|
217
216
|
mockUseDataBrowserUICustomization({
|
|
218
217
|
extraBucketListColumns: [
|
|
219
218
|
{
|
|
220
|
-
id:
|
|
221
|
-
header:
|
|
219
|
+
id: 'customData',
|
|
220
|
+
header: 'Custom Data',
|
|
222
221
|
render: CustomColumn
|
|
223
222
|
}
|
|
224
223
|
]
|
|
@@ -226,12 +225,12 @@ describe("BucketList", ()=>{
|
|
|
226
225
|
renderBucketList({
|
|
227
226
|
buckets: mockBuckets
|
|
228
227
|
});
|
|
229
|
-
expect(screen.getByText(
|
|
230
|
-
expect(screen.getByText(
|
|
231
|
-
expect(screen.getByText(
|
|
232
|
-
expect(screen.getByText(
|
|
228
|
+
expect(screen.getByText('Custom Data')).toBeInTheDocument();
|
|
229
|
+
expect(screen.getByText('Custom data for test-bucket-1')).toBeInTheDocument();
|
|
230
|
+
expect(screen.getByText('Custom data for test-bucket-2')).toBeInTheDocument();
|
|
231
|
+
expect(screen.getByText('Custom data for test-bucket-3')).toBeInTheDocument();
|
|
233
232
|
});
|
|
234
|
-
it(
|
|
233
|
+
it('renders multiple extra columns in correct order', ()=>{
|
|
235
234
|
const ColumnA = ()=>/*#__PURE__*/ jsx("span", {
|
|
236
235
|
children: "A"
|
|
237
236
|
});
|
|
@@ -241,13 +240,13 @@ describe("BucketList", ()=>{
|
|
|
241
240
|
mockUseDataBrowserUICustomization({
|
|
242
241
|
extraBucketListColumns: [
|
|
243
242
|
{
|
|
244
|
-
id:
|
|
245
|
-
header:
|
|
243
|
+
id: 'columnA',
|
|
244
|
+
header: 'Column A',
|
|
246
245
|
render: ColumnA
|
|
247
246
|
},
|
|
248
247
|
{
|
|
249
|
-
id:
|
|
250
|
-
header:
|
|
248
|
+
id: 'columnB',
|
|
249
|
+
header: 'Column B',
|
|
251
250
|
render: ColumnB
|
|
252
251
|
}
|
|
253
252
|
]
|
|
@@ -255,35 +254,35 @@ describe("BucketList", ()=>{
|
|
|
255
254
|
renderBucketList({
|
|
256
255
|
buckets: mockBuckets
|
|
257
256
|
});
|
|
258
|
-
const headers = screen.getAllByRole(
|
|
257
|
+
const headers = screen.getAllByRole('columnheader');
|
|
259
258
|
const headerTexts = headers.map((h)=>h.textContent);
|
|
260
|
-
expect(headerTexts).toContain(
|
|
261
|
-
expect(headerTexts).toContain(
|
|
262
|
-
expect(headerTexts).toContain(
|
|
263
|
-
expect(headerTexts).toContain(
|
|
264
|
-
expect(headerTexts).toContain(
|
|
265
|
-
const bucketNameIndex = headerTexts.indexOf(
|
|
266
|
-
const storageLocationIndex = headerTexts.indexOf(
|
|
267
|
-
const columnAIndex = headerTexts.indexOf(
|
|
268
|
-
const columnBIndex = headerTexts.indexOf(
|
|
269
|
-
const createdOnIndex = headerTexts.indexOf(
|
|
259
|
+
expect(headerTexts).toContain('Bucket Name');
|
|
260
|
+
expect(headerTexts).toContain('Storage Location');
|
|
261
|
+
expect(headerTexts).toContain('Column A');
|
|
262
|
+
expect(headerTexts).toContain('Column B');
|
|
263
|
+
expect(headerTexts).toContain('Created on');
|
|
264
|
+
const bucketNameIndex = headerTexts.indexOf('Bucket Name');
|
|
265
|
+
const storageLocationIndex = headerTexts.indexOf('Storage Location');
|
|
266
|
+
const columnAIndex = headerTexts.indexOf('Column A');
|
|
267
|
+
const columnBIndex = headerTexts.indexOf('Column B');
|
|
268
|
+
const createdOnIndex = headerTexts.indexOf('Created on');
|
|
270
269
|
expect(bucketNameIndex).toBeLessThan(storageLocationIndex);
|
|
271
270
|
expect(storageLocationIndex).toBeLessThan(columnAIndex);
|
|
272
271
|
expect(columnAIndex).toBeLessThan(columnBIndex);
|
|
273
272
|
expect(columnBIndex).toBeLessThan(createdOnIndex);
|
|
274
273
|
});
|
|
275
|
-
it(
|
|
274
|
+
it('works without extra columns (shows default columns)', ()=>{
|
|
276
275
|
renderBucketList({
|
|
277
276
|
buckets: mockBuckets
|
|
278
277
|
});
|
|
279
|
-
const headers = screen.getAllByRole(
|
|
278
|
+
const headers = screen.getAllByRole('columnheader');
|
|
280
279
|
const headerTexts = headers.map((h)=>h.textContent);
|
|
281
|
-
expect(headerTexts).toContain(
|
|
282
|
-
expect(headerTexts).toContain(
|
|
283
|
-
expect(headerTexts).toContain(
|
|
280
|
+
expect(headerTexts).toContain('Bucket Name');
|
|
281
|
+
expect(headerTexts).toContain('Storage Location');
|
|
282
|
+
expect(headerTexts).toContain('Created on');
|
|
284
283
|
expect(headerTexts).toHaveLength(3);
|
|
285
284
|
});
|
|
286
|
-
it(
|
|
285
|
+
it('receives full bucket data in render component', ()=>{
|
|
287
286
|
const CustomColumn = jest.fn(({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
288
287
|
children: [
|
|
289
288
|
"Bucket ",
|
|
@@ -293,8 +292,8 @@ describe("BucketList", ()=>{
|
|
|
293
292
|
mockUseDataBrowserUICustomization({
|
|
294
293
|
extraBucketListColumns: [
|
|
295
294
|
{
|
|
296
|
-
id:
|
|
297
|
-
header:
|
|
295
|
+
id: 'customColumn',
|
|
296
|
+
header: 'Custom',
|
|
298
297
|
render: CustomColumn
|
|
299
298
|
}
|
|
300
299
|
]
|
|
@@ -306,7 +305,7 @@ describe("BucketList", ()=>{
|
|
|
306
305
|
data: mockBuckets[0]
|
|
307
306
|
}), expect.anything());
|
|
308
307
|
});
|
|
309
|
-
it(
|
|
308
|
+
it('supports custom column widths', ()=>{
|
|
310
309
|
const CustomColumn = ({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
311
310
|
children: [
|
|
312
311
|
"Width: ",
|
|
@@ -316,9 +315,9 @@ describe("BucketList", ()=>{
|
|
|
316
315
|
mockUseDataBrowserUICustomization({
|
|
317
316
|
extraBucketListColumns: [
|
|
318
317
|
{
|
|
319
|
-
id:
|
|
320
|
-
header:
|
|
321
|
-
width:
|
|
318
|
+
id: 'customWidth',
|
|
319
|
+
header: 'Custom Width',
|
|
320
|
+
width: '200px',
|
|
322
321
|
render: CustomColumn
|
|
323
322
|
}
|
|
324
323
|
]
|
|
@@ -326,10 +325,10 @@ describe("BucketList", ()=>{
|
|
|
326
325
|
renderBucketList({
|
|
327
326
|
buckets: mockBuckets
|
|
328
327
|
});
|
|
329
|
-
expect(screen.getByText(
|
|
330
|
-
expect(screen.getByText(
|
|
328
|
+
expect(screen.getByText('Custom Width')).toBeInTheDocument();
|
|
329
|
+
expect(screen.getByText('Width: test-bucket-1')).toBeInTheDocument();
|
|
331
330
|
});
|
|
332
|
-
it(
|
|
331
|
+
it('supports custom columns with IDs not in Bucket type (e.g., computed data)', ()=>{
|
|
333
332
|
const DataUsedColumn = ({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
334
333
|
children: [
|
|
335
334
|
"Data used for ",
|
|
@@ -339,8 +338,8 @@ describe("BucketList", ()=>{
|
|
|
339
338
|
mockUseDataBrowserUICustomization({
|
|
340
339
|
extraBucketListColumns: [
|
|
341
340
|
{
|
|
342
|
-
id:
|
|
343
|
-
header:
|
|
341
|
+
id: 'dataUsed',
|
|
342
|
+
header: 'Data Used',
|
|
344
343
|
render: DataUsedColumn
|
|
345
344
|
}
|
|
346
345
|
]
|
|
@@ -348,12 +347,12 @@ describe("BucketList", ()=>{
|
|
|
348
347
|
renderBucketList({
|
|
349
348
|
buckets: mockBuckets
|
|
350
349
|
});
|
|
351
|
-
expect(screen.getByText(
|
|
352
|
-
expect(screen.getByText(
|
|
353
|
-
expect(screen.getByText(
|
|
354
|
-
expect(screen.getByText(
|
|
350
|
+
expect(screen.getByText('Data Used')).toBeInTheDocument();
|
|
351
|
+
expect(screen.getByText('Data used for test-bucket-1')).toBeInTheDocument();
|
|
352
|
+
expect(screen.getByText('Data used for test-bucket-2')).toBeInTheDocument();
|
|
353
|
+
expect(screen.getByText('Data used for test-bucket-3')).toBeInTheDocument();
|
|
355
354
|
});
|
|
356
|
-
it(
|
|
355
|
+
it('supports mixing native and custom column IDs', ()=>{
|
|
357
356
|
const RegionColumn = ({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
358
357
|
children: [
|
|
359
358
|
"Region: ",
|
|
@@ -369,13 +368,13 @@ describe("BucketList", ()=>{
|
|
|
369
368
|
mockUseDataBrowserUICustomization({
|
|
370
369
|
extraBucketListColumns: [
|
|
371
370
|
{
|
|
372
|
-
id:
|
|
373
|
-
header:
|
|
371
|
+
id: 'location',
|
|
372
|
+
header: 'Region',
|
|
374
373
|
render: RegionColumn
|
|
375
374
|
},
|
|
376
375
|
{
|
|
377
|
-
id:
|
|
378
|
-
header:
|
|
376
|
+
id: 'customMetrics',
|
|
377
|
+
header: 'Metrics',
|
|
379
378
|
render: MetricsColumn
|
|
380
379
|
}
|
|
381
380
|
]
|
|
@@ -383,13 +382,13 @@ describe("BucketList", ()=>{
|
|
|
383
382
|
renderBucketList({
|
|
384
383
|
buckets: mockBuckets
|
|
385
384
|
});
|
|
386
|
-
expect(screen.queryByText(
|
|
387
|
-
expect(screen.getByText(
|
|
388
|
-
expect(screen.getByText(
|
|
389
|
-
expect(screen.getByText(
|
|
390
|
-
expect(screen.getByText(
|
|
385
|
+
expect(screen.queryByText('Storage Location')).not.toBeInTheDocument();
|
|
386
|
+
expect(screen.getByText('Region')).toBeInTheDocument();
|
|
387
|
+
expect(screen.getByText('Metrics')).toBeInTheDocument();
|
|
388
|
+
expect(screen.getByText('Region: test-bucket-1')).toBeInTheDocument();
|
|
389
|
+
expect(screen.getByText('Metrics for test-bucket-1')).toBeInTheDocument();
|
|
391
390
|
});
|
|
392
|
-
it(
|
|
391
|
+
it('can replace default columns by using matching IDs', ()=>{
|
|
393
392
|
const CustomLocationColumn = ({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
394
393
|
children: [
|
|
395
394
|
"Custom location for ",
|
|
@@ -399,8 +398,8 @@ describe("BucketList", ()=>{
|
|
|
399
398
|
mockUseDataBrowserUICustomization({
|
|
400
399
|
extraBucketListColumns: [
|
|
401
400
|
{
|
|
402
|
-
id:
|
|
403
|
-
header:
|
|
401
|
+
id: 'location',
|
|
402
|
+
header: 'Custom Location',
|
|
404
403
|
render: CustomLocationColumn
|
|
405
404
|
}
|
|
406
405
|
]
|
|
@@ -408,13 +407,13 @@ describe("BucketList", ()=>{
|
|
|
408
407
|
renderBucketList({
|
|
409
408
|
buckets: mockBuckets
|
|
410
409
|
});
|
|
411
|
-
expect(screen.getByText(
|
|
412
|
-
expect(screen.queryByText(
|
|
413
|
-
expect(screen.getByText(
|
|
414
|
-
expect(screen.getByText(
|
|
415
|
-
expect(screen.getByText(
|
|
410
|
+
expect(screen.getByText('Custom Location')).toBeInTheDocument();
|
|
411
|
+
expect(screen.queryByText('Storage Location')).not.toBeInTheDocument();
|
|
412
|
+
expect(screen.getByText('Custom location for test-bucket-1')).toBeInTheDocument();
|
|
413
|
+
expect(screen.getByText('Custom location for test-bucket-2')).toBeInTheDocument();
|
|
414
|
+
expect(screen.getByText('Custom location for test-bucket-3')).toBeInTheDocument();
|
|
416
415
|
});
|
|
417
|
-
it(
|
|
416
|
+
it('can replace multiple default columns simultaneously', ()=>{
|
|
418
417
|
const CustomLocationColumn = ({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
419
418
|
children: [
|
|
420
419
|
"Loc: ",
|
|
@@ -430,13 +429,13 @@ describe("BucketList", ()=>{
|
|
|
430
429
|
mockUseDataBrowserUICustomization({
|
|
431
430
|
extraBucketListColumns: [
|
|
432
431
|
{
|
|
433
|
-
id:
|
|
434
|
-
header:
|
|
432
|
+
id: 'location',
|
|
433
|
+
header: 'Loc',
|
|
435
434
|
render: CustomLocationColumn
|
|
436
435
|
},
|
|
437
436
|
{
|
|
438
|
-
id:
|
|
439
|
-
header:
|
|
437
|
+
id: 'date',
|
|
438
|
+
header: 'Date',
|
|
440
439
|
render: CustomDateColumn
|
|
441
440
|
}
|
|
442
441
|
]
|
|
@@ -444,13 +443,13 @@ describe("BucketList", ()=>{
|
|
|
444
443
|
renderBucketList({
|
|
445
444
|
buckets: mockBuckets
|
|
446
445
|
});
|
|
447
|
-
expect(screen.getByText(
|
|
448
|
-
expect(screen.getByText(
|
|
449
|
-
expect(screen.queryByText(
|
|
450
|
-
expect(screen.queryByText(
|
|
451
|
-
expect(screen.getByText(
|
|
446
|
+
expect(screen.getByText('Loc')).toBeInTheDocument();
|
|
447
|
+
expect(screen.getByText('Date')).toBeInTheDocument();
|
|
448
|
+
expect(screen.queryByText('Storage Location')).not.toBeInTheDocument();
|
|
449
|
+
expect(screen.queryByText('Created on')).not.toBeInTheDocument();
|
|
450
|
+
expect(screen.getByText('Loc: test-bucket-1')).toBeInTheDocument();
|
|
452
451
|
});
|
|
453
|
-
it(
|
|
452
|
+
it('maintains correct column order when replacing and adding columns', ()=>{
|
|
454
453
|
const CustomLocationColumn = ()=>/*#__PURE__*/ jsx("span", {
|
|
455
454
|
children: "Custom Loc"
|
|
456
455
|
});
|
|
@@ -460,13 +459,13 @@ describe("BucketList", ()=>{
|
|
|
460
459
|
mockUseDataBrowserUICustomization({
|
|
461
460
|
extraBucketListColumns: [
|
|
462
461
|
{
|
|
463
|
-
id:
|
|
464
|
-
header:
|
|
462
|
+
id: 'location',
|
|
463
|
+
header: 'Custom Location',
|
|
465
464
|
render: CustomLocationColumn
|
|
466
465
|
},
|
|
467
466
|
{
|
|
468
|
-
id:
|
|
469
|
-
header:
|
|
467
|
+
id: 'extraData',
|
|
468
|
+
header: 'Extra Data',
|
|
470
469
|
render: ExtraColumn
|
|
471
470
|
}
|
|
472
471
|
]
|
|
@@ -474,27 +473,27 @@ describe("BucketList", ()=>{
|
|
|
474
473
|
renderBucketList({
|
|
475
474
|
buckets: mockBuckets
|
|
476
475
|
});
|
|
477
|
-
const headers = screen.getAllByRole(
|
|
476
|
+
const headers = screen.getAllByRole('columnheader');
|
|
478
477
|
const headerTexts = headers.map((h)=>h.textContent);
|
|
479
|
-
const bucketNameIndex = headerTexts.indexOf(
|
|
480
|
-
const customLocationIndex = headerTexts.indexOf(
|
|
481
|
-
const extraDataIndex = headerTexts.indexOf(
|
|
482
|
-
const createdOnIndex = headerTexts.indexOf(
|
|
478
|
+
const bucketNameIndex = headerTexts.indexOf('Bucket Name');
|
|
479
|
+
const customLocationIndex = headerTexts.indexOf('Custom Location');
|
|
480
|
+
const extraDataIndex = headerTexts.indexOf('Extra Data');
|
|
481
|
+
const createdOnIndex = headerTexts.indexOf('Created on');
|
|
483
482
|
expect(bucketNameIndex).toBe(0);
|
|
484
483
|
expect(customLocationIndex).toBe(1);
|
|
485
484
|
expect(extraDataIndex).toBe(2);
|
|
486
485
|
expect(createdOnIndex).toBe(3);
|
|
487
486
|
});
|
|
488
487
|
});
|
|
489
|
-
describe(
|
|
490
|
-
it(
|
|
488
|
+
describe('extraBucketListActions support', ()=>{
|
|
489
|
+
it('renders extra actions when extraBucketListActions is configured', ()=>{
|
|
491
490
|
const CustomAction = ()=>/*#__PURE__*/ jsx("button", {
|
|
492
491
|
children: "Custom Action"
|
|
493
492
|
});
|
|
494
493
|
mockUseDataBrowserUICustomization({
|
|
495
494
|
extraBucketListActions: [
|
|
496
495
|
{
|
|
497
|
-
id:
|
|
496
|
+
id: 'customAction',
|
|
498
497
|
render: CustomAction
|
|
499
498
|
}
|
|
500
499
|
]
|
|
@@ -502,9 +501,9 @@ describe("BucketList", ()=>{
|
|
|
502
501
|
renderBucketList({
|
|
503
502
|
buckets: mockBuckets
|
|
504
503
|
});
|
|
505
|
-
expect(screen.getByText(
|
|
504
|
+
expect(screen.getByText('Custom Action')).toBeInTheDocument();
|
|
506
505
|
});
|
|
507
|
-
it(
|
|
506
|
+
it('renders multiple extra actions', ()=>{
|
|
508
507
|
const Action1 = ()=>/*#__PURE__*/ jsx("button", {
|
|
509
508
|
children: "Action 1"
|
|
510
509
|
});
|
|
@@ -514,11 +513,11 @@ describe("BucketList", ()=>{
|
|
|
514
513
|
mockUseDataBrowserUICustomization({
|
|
515
514
|
extraBucketListActions: [
|
|
516
515
|
{
|
|
517
|
-
id:
|
|
516
|
+
id: 'action1',
|
|
518
517
|
render: Action1
|
|
519
518
|
},
|
|
520
519
|
{
|
|
521
|
-
id:
|
|
520
|
+
id: 'action2',
|
|
522
521
|
render: Action2
|
|
523
522
|
}
|
|
524
523
|
]
|
|
@@ -526,17 +525,17 @@ describe("BucketList", ()=>{
|
|
|
526
525
|
renderBucketList({
|
|
527
526
|
buckets: mockBuckets
|
|
528
527
|
});
|
|
529
|
-
expect(screen.getByText(
|
|
530
|
-
expect(screen.getByText(
|
|
528
|
+
expect(screen.getByText('Action 1')).toBeInTheDocument();
|
|
529
|
+
expect(screen.getByText('Action 2')).toBeInTheDocument();
|
|
531
530
|
});
|
|
532
|
-
it(
|
|
531
|
+
it('renders actions alongside default Create Bucket button', ()=>{
|
|
533
532
|
const CustomAction = ()=>/*#__PURE__*/ jsx("button", {
|
|
534
533
|
children: "Export"
|
|
535
534
|
});
|
|
536
535
|
mockUseDataBrowserUICustomization({
|
|
537
536
|
extraBucketListActions: [
|
|
538
537
|
{
|
|
539
|
-
id:
|
|
538
|
+
id: 'export',
|
|
540
539
|
render: CustomAction
|
|
541
540
|
}
|
|
542
541
|
]
|
|
@@ -545,15 +544,15 @@ describe("BucketList", ()=>{
|
|
|
545
544
|
buckets: mockBuckets,
|
|
546
545
|
onCreateBucket: jest.fn()
|
|
547
546
|
});
|
|
548
|
-
expect(screen.getByText(
|
|
549
|
-
expect(screen.getByText(
|
|
547
|
+
expect(screen.getByText('Create Bucket')).toBeInTheDocument();
|
|
548
|
+
expect(screen.getByText('Export')).toBeInTheDocument();
|
|
550
549
|
});
|
|
551
|
-
it(
|
|
550
|
+
it('works without extra actions', ()=>{
|
|
552
551
|
renderBucketList({
|
|
553
552
|
buckets: mockBuckets,
|
|
554
553
|
onCreateBucket: jest.fn()
|
|
555
554
|
});
|
|
556
|
-
expect(screen.getByText(
|
|
555
|
+
expect(screen.getByText('Create Bucket')).toBeInTheDocument();
|
|
557
556
|
});
|
|
558
557
|
it("can replace default Create Bucket action by using 'createBucket' ID", ()=>{
|
|
559
558
|
const CustomCreateAction = ()=>/*#__PURE__*/ jsx("button", {
|
|
@@ -562,7 +561,7 @@ describe("BucketList", ()=>{
|
|
|
562
561
|
mockUseDataBrowserUICustomization({
|
|
563
562
|
extraBucketListActions: [
|
|
564
563
|
{
|
|
565
|
-
id:
|
|
564
|
+
id: 'createBucket',
|
|
566
565
|
render: CustomCreateAction
|
|
567
566
|
}
|
|
568
567
|
]
|
|
@@ -571,10 +570,10 @@ describe("BucketList", ()=>{
|
|
|
571
570
|
buckets: mockBuckets,
|
|
572
571
|
onCreateBucket: jest.fn()
|
|
573
572
|
});
|
|
574
|
-
expect(screen.getByText(
|
|
575
|
-
expect(screen.queryByText(
|
|
573
|
+
expect(screen.getByText('Custom Create')).toBeInTheDocument();
|
|
574
|
+
expect(screen.queryByText('Create Bucket')).not.toBeInTheDocument();
|
|
576
575
|
});
|
|
577
|
-
it(
|
|
576
|
+
it('can mix replacing default action and adding new actions', ()=>{
|
|
578
577
|
const CustomCreateAction = ()=>/*#__PURE__*/ jsx("button", {
|
|
579
578
|
children: "Custom Create"
|
|
580
579
|
});
|
|
@@ -584,11 +583,11 @@ describe("BucketList", ()=>{
|
|
|
584
583
|
mockUseDataBrowserUICustomization({
|
|
585
584
|
extraBucketListActions: [
|
|
586
585
|
{
|
|
587
|
-
id:
|
|
586
|
+
id: 'createBucket',
|
|
588
587
|
render: CustomCreateAction
|
|
589
588
|
},
|
|
590
589
|
{
|
|
591
|
-
id:
|
|
590
|
+
id: 'export',
|
|
592
591
|
render: ExportAction
|
|
593
592
|
}
|
|
594
593
|
]
|
|
@@ -597,11 +596,11 @@ describe("BucketList", ()=>{
|
|
|
597
596
|
buckets: mockBuckets,
|
|
598
597
|
onCreateBucket: jest.fn()
|
|
599
598
|
});
|
|
600
|
-
expect(screen.getByText(
|
|
601
|
-
expect(screen.getByText(
|
|
602
|
-
expect(screen.queryByText(
|
|
599
|
+
expect(screen.getByText('Custom Create')).toBeInTheDocument();
|
|
600
|
+
expect(screen.getByText('Export')).toBeInTheDocument();
|
|
601
|
+
expect(screen.queryByText('Create Bucket')).not.toBeInTheDocument();
|
|
603
602
|
});
|
|
604
|
-
it(
|
|
603
|
+
it('maintains correct action order when replacing and adding actions', ()=>{
|
|
605
604
|
const CustomCreateAction = ()=>/*#__PURE__*/ jsx("button", {
|
|
606
605
|
children: "Custom Create"
|
|
607
606
|
});
|
|
@@ -614,15 +613,15 @@ describe("BucketList", ()=>{
|
|
|
614
613
|
mockUseDataBrowserUICustomization({
|
|
615
614
|
extraBucketListActions: [
|
|
616
615
|
{
|
|
617
|
-
id:
|
|
616
|
+
id: 'createBucket',
|
|
618
617
|
render: CustomCreateAction
|
|
619
618
|
},
|
|
620
619
|
{
|
|
621
|
-
id:
|
|
620
|
+
id: 'action1',
|
|
622
621
|
render: Action1
|
|
623
622
|
},
|
|
624
623
|
{
|
|
625
|
-
id:
|
|
624
|
+
id: 'action2',
|
|
626
625
|
render: Action2
|
|
627
626
|
}
|
|
628
627
|
]
|
|
@@ -631,10 +630,10 @@ describe("BucketList", ()=>{
|
|
|
631
630
|
buckets: mockBuckets,
|
|
632
631
|
onCreateBucket: jest.fn()
|
|
633
632
|
});
|
|
634
|
-
const buttons = screen.getAllByRole(
|
|
635
|
-
expect(buttons[0]).toHaveTextContent(
|
|
636
|
-
expect(buttons[1]).toHaveTextContent(
|
|
637
|
-
expect(buttons[2]).toHaveTextContent(
|
|
633
|
+
const buttons = screen.getAllByRole('button');
|
|
634
|
+
expect(buttons[0]).toHaveTextContent('Custom Create');
|
|
635
|
+
expect(buttons[1]).toHaveTextContent('Action 1');
|
|
636
|
+
expect(buttons[2]).toHaveTextContent('Action 2');
|
|
638
637
|
});
|
|
639
638
|
});
|
|
640
639
|
});
|