@scality/data-browser-library 1.0.0-preview.9 → 1.0.1
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 +12 -0
- package/dist/components/DataBrowserUI.js +99 -0
- package/dist/components/Editor.d.ts +1 -1
- package/dist/components/Editor.js +3 -3
- package/dist/components/__tests__/BucketAccessor.test.js +214 -0
- package/dist/components/__tests__/BucketCorsPage.test.d.ts +1 -0
- package/dist/components/__tests__/BucketCorsPage.test.js +263 -0
- package/dist/components/__tests__/BucketCreate.test.js +271 -105
- package/dist/components/__tests__/BucketDetails.test.d.ts +1 -0
- package/dist/components/__tests__/BucketDetails.test.js +421 -0
- package/dist/components/__tests__/BucketLifecycleFormPage.test.d.ts +13 -0
- package/dist/components/__tests__/BucketLifecycleFormPage.test.js +178 -178
- package/dist/components/__tests__/BucketLifecycleList.test.js +85 -85
- package/dist/components/__tests__/BucketList.test.js +463 -239
- package/dist/components/__tests__/BucketNotificationFormPage.test.d.ts +1 -0
- package/dist/components/__tests__/BucketNotificationFormPage.test.js +348 -0
- package/dist/components/__tests__/BucketNotificationList.test.d.ts +1 -0
- package/dist/components/__tests__/BucketNotificationList.test.js +379 -0
- package/dist/components/__tests__/BucketOverview.test.js +281 -266
- package/dist/components/__tests__/BucketPolicyPage.test.js +151 -99
- package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +15 -0
- package/dist/components/__tests__/BucketReplicationFormPage.test.js +544 -544
- 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 +64 -64
- package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +47 -47
- package/dist/components/__tests__/DeleteObjectButton.test.js +64 -64
- package/dist/components/__tests__/EmptyBucketButton.test.js +59 -59
- package/dist/components/__tests__/MetadataSearch.test.js +65 -65
- package/dist/components/__tests__/ObjectList.test.js +741 -240
- package/dist/components/__tests__/UploadButton.test.js +45 -45
- package/dist/components/breadcrumb/Breadcrumb.d.ts +6 -0
- package/dist/components/breadcrumb/Breadcrumb.js +37 -0
- package/dist/components/breadcrumb/DataBrowserBreadcrumb.d.ts +1 -0
- package/dist/components/breadcrumb/DataBrowserBreadcrumb.js +10 -0
- package/dist/components/breadcrumb/__tests__/Breadcrumb.test.d.ts +1 -0
- package/dist/components/breadcrumb/__tests__/Breadcrumb.test.js +196 -0
- package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.d.ts +1 -0
- package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.js +153 -0
- package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.d.ts +1 -0
- package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.js +134 -0
- package/dist/components/breadcrumb/index.d.ts +8 -0
- package/dist/components/breadcrumb/index.js +4 -0
- package/dist/components/breadcrumb/useBreadcrumbPaths.d.ts +2 -0
- package/dist/components/breadcrumb/useBreadcrumbPaths.js +82 -0
- package/dist/components/buckets/BucketAccessor.d.ts +2 -0
- package/dist/components/buckets/BucketAccessor.js +125 -0
- package/dist/components/buckets/BucketConfigEditButton.d.ts +8 -0
- package/dist/components/buckets/{BucketPolicyButton.js → BucketConfigEditButton.js} +9 -5
- package/dist/components/buckets/BucketCorsPage.d.ts +1 -0
- package/dist/components/buckets/BucketCorsPage.js +234 -0
- package/dist/components/buckets/BucketCreate.d.ts +3 -2
- package/dist/components/buckets/BucketCreate.js +89 -47
- package/dist/components/buckets/BucketDetails.d.ts +42 -0
- package/dist/components/buckets/BucketDetails.js +249 -85
- package/dist/components/buckets/BucketLifecycleFormPage.js +206 -190
- package/dist/components/buckets/BucketLifecycleList.d.ts +2 -2
- package/dist/components/buckets/BucketLifecycleList.js +47 -47
- package/dist/components/buckets/BucketList.d.ts +7 -8
- package/dist/components/buckets/BucketList.js +158 -101
- package/dist/components/buckets/BucketLocation.js +4 -4
- package/dist/components/buckets/BucketOverview.d.ts +22 -2
- package/dist/components/buckets/BucketOverview.js +394 -187
- package/dist/components/buckets/BucketPage.js +43 -21
- package/dist/components/buckets/BucketPolicyPage.js +155 -127
- package/dist/components/buckets/BucketReplicationFormPage.js +134 -133
- package/dist/components/buckets/BucketReplicationList.d.ts +2 -2
- package/dist/components/buckets/BucketReplicationList.js +42 -42
- package/dist/components/buckets/BucketVersioning.d.ts +4 -0
- package/dist/components/buckets/BucketVersioning.js +76 -0
- package/dist/components/buckets/DeleteBucketButton.js +8 -8
- package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +2 -2
- package/dist/components/buckets/DeleteBucketConfigRuleButton.js +2 -2
- package/dist/components/buckets/EmptyBucketButton.js +24 -24
- package/dist/components/buckets/EmptyBucketSummary.d.ts +2 -2
- package/dist/components/buckets/EmptyBucketSummary.js +1 -1
- package/dist/components/buckets/EmptyBucketSummaryList.d.ts +1 -1
- package/dist/components/buckets/EmptyBucketSummaryList.js +22 -22
- package/dist/components/buckets/__tests__/BucketVersioning.test.d.ts +1 -0
- package/dist/components/buckets/__tests__/BucketVersioning.test.js +163 -0
- package/dist/components/buckets/notifications/BucketNotificationFormPage.d.ts +1 -0
- package/dist/components/buckets/notifications/BucketNotificationFormPage.js +316 -0
- package/dist/components/buckets/notifications/BucketNotificationList.d.ts +10 -0
- package/dist/components/buckets/notifications/BucketNotificationList.js +267 -0
- package/dist/components/buckets/notifications/EventsSection.js +145 -29
- 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 +27 -20
- package/dist/components/index.js +17 -10
- package/dist/components/layouts/ArrowNavigation.d.ts +3 -0
- package/dist/components/layouts/ArrowNavigation.js +28 -0
- package/dist/components/layouts/BrowserPageLayout.d.ts +5 -1
- package/dist/components/layouts/BrowserPageLayout.js +10 -5
- package/dist/components/objects/CreateFolderButton.d.ts +2 -2
- package/dist/components/objects/CreateFolderButton.js +12 -12
- package/dist/components/objects/DeleteObjectButton.d.ts +1 -1
- package/dist/components/objects/DeleteObjectButton.js +19 -21
- package/dist/components/objects/GetPresignedUrlButton.d.ts +7 -0
- package/dist/components/objects/GetPresignedUrlButton.js +255 -0
- package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +2 -2
- package/dist/components/objects/ObjectDetails/ObjectMetadata.js +263 -230
- package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +2 -2
- package/dist/components/objects/ObjectDetails/ObjectSummary.js +540 -138
- package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +2 -2
- package/dist/components/objects/ObjectDetails/ObjectTags.js +95 -123
- package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.d.ts +1 -0
- package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.js +516 -0
- package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.d.ts +1 -0
- package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.js +1064 -0
- package/dist/components/objects/ObjectDetails/index.d.ts +18 -2
- package/dist/components/objects/ObjectDetails/index.js +152 -40
- package/dist/components/objects/ObjectList.d.ts +12 -10
- package/dist/components/objects/ObjectList.js +590 -263
- package/dist/components/objects/ObjectLock/EditRetentionButton.js +4 -4
- package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +15 -15
- package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +1 -1
- package/dist/components/objects/ObjectLock/ObjectLockSettings.js +32 -31
- 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 +51 -51
- package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +78 -78
- package/dist/components/objects/ObjectPage.js +12 -8
- package/dist/components/objects/UploadButton.d.ts +3 -3
- package/dist/components/objects/UploadButton.js +10 -10
- package/dist/components/objects/__tests__/GetPresignedUrlButton.test.d.ts +1 -0
- package/dist/components/objects/__tests__/GetPresignedUrlButton.test.js +531 -0
- package/dist/components/providers/DataBrowserProvider.d.ts +23 -12
- package/dist/components/providers/DataBrowserProvider.js +60 -38
- package/dist/components/providers/QueryProvider.d.ts +9 -0
- package/dist/components/providers/QueryProvider.js +21 -0
- package/dist/components/search/MetadataSearch.js +29 -28
- package/dist/components/search/SearchHints.js +1 -1
- package/dist/components/ui/ArrayFieldActions.js +12 -7
- package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +2 -2
- package/dist/components/ui/ConfirmDeleteRuleModal.js +6 -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 +2 -2
- package/dist/components/ui/Search.elements.js +7 -7
- package/dist/components/ui/Table.elements.d.ts +2 -1
- package/dist/components/ui/Table.elements.js +18 -12
- package/dist/config/__tests__/factory.test.d.ts +1 -0
- package/dist/config/__tests__/factory.test.js +311 -0
- package/dist/config/factory.d.ts +10 -56
- package/dist/config/factory.js +23 -71
- package/dist/config/types.d.ts +212 -34
- package/dist/contexts/DataBrowserUICustomizationContext.d.ts +27 -0
- package/dist/contexts/DataBrowserUICustomizationContext.js +13 -0
- package/dist/hooks/__tests__/useAccessibleBuckets.test.d.ts +1 -0
- package/dist/hooks/__tests__/useAccessibleBuckets.test.js +145 -0
- package/dist/hooks/__tests__/useISVBucketDetection.test.js +45 -45
- package/dist/hooks/__tests__/useIsBucketEmpty.test.js +27 -27
- package/dist/hooks/__tests__/useLoginMutation.test.d.ts +1 -0
- package/dist/hooks/__tests__/useLoginMutation.test.js +194 -0
- package/dist/hooks/bucketConfiguration.d.ts +8 -1
- package/dist/hooks/bucketConfiguration.js +52 -51
- package/dist/hooks/bucketOperations.d.ts +10 -1
- package/dist/hooks/bucketOperations.js +10 -9
- package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +80 -80
- package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +80 -80
- package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +44 -44
- package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +63 -63
- package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +65 -65
- package/dist/hooks/factories/index.d.ts +4 -4
- package/dist/hooks/factories/index.js +2 -2
- package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +16 -13
- package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3LoginHook.js +1 -1
- package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
- package/dist/hooks/factories/useCreateS3MutationHook.js +7 -2
- package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3QueryHook.js +11 -6
- package/dist/hooks/index.d.ts +19 -12
- package/dist/hooks/index.js +16 -9
- 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 +50 -49
- package/dist/hooks/presignedOperations.d.ts +4 -4
- package/dist/hooks/presignedOperations.js +5 -5
- package/dist/hooks/useAccessibleBuckets.d.ts +11 -0
- package/dist/hooks/useAccessibleBuckets.js +115 -0
- package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
- package/dist/hooks/useBatchObjectLegalHold.js +48 -0
- package/dist/hooks/useBucketConfigEditor.d.ts +31 -0
- package/dist/hooks/useBucketConfigEditor.js +82 -0
- package/dist/hooks/useDataBrowserNavigate.d.ts +28 -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 +11 -11
- package/dist/hooks/useFeatures.d.ts +7 -0
- package/dist/hooks/useFeatures.js +8 -0
- package/dist/hooks/useISVBucketDetection.js +6 -6
- package/dist/hooks/useIsBucketEmpty.js +4 -4
- package/dist/hooks/useLimitedAccessFlow.d.ts +48 -0
- package/dist/hooks/useLimitedAccessFlow.js +23 -0
- package/dist/hooks/useS3Client.d.ts +6 -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/hooks/useSupportedNotificationEvents.d.ts +6 -0
- package/dist/hooks/useSupportedNotificationEvents.js +8 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +2 -2
- package/dist/schemas/bucketPolicySchema.json +3 -13
- 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 +32 -17
- 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 +77 -54
- package/dist/test/msw/index.d.ts +2 -2
- package/dist/test/msw/index.js +1 -1
- 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 +13 -30
- package/dist/test/testUtils.d.ts +85 -33
- package/dist/test/testUtils.js +176 -111
- package/dist/test/utils/errorHandling.test.js +119 -119
- package/dist/types/index.d.ts +49 -36
- package/dist/types/monaco.d.ts +13 -0
- package/dist/types/monaco.js +0 -0
- package/dist/utils/__tests__/proxyMiddleware.test.d.ts +1 -0
- package/dist/utils/__tests__/proxyMiddleware.test.js +579 -0
- package/dist/utils/__tests__/s3Client.test.d.ts +1 -0
- package/dist/utils/__tests__/s3Client.test.js +340 -0
- package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
- package/dist/utils/__tests__/s3ConfigIdentifier.test.js +437 -0
- package/dist/utils/constants.d.ts +10 -0
- package/dist/utils/constants.js +19 -9
- package/dist/utils/deletion/index.d.ts +2 -2
- package/dist/utils/deletion/index.js +1 -1
- 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 +4 -2
- package/dist/utils/proxyMiddleware.d.ts +32 -13
- package/dist/utils/proxyMiddleware.js +90 -36
- package/dist/utils/s3Client.d.ts +14 -4
- package/dist/utils/s3Client.js +5 -26
- package/dist/utils/s3ConfigIdentifier.d.ts +79 -0
- package/dist/utils/s3ConfigIdentifier.js +57 -0
- package/dist/utils/s3RuleUtils.d.ts +5 -5
- package/dist/utils/s3RuleUtils.js +17 -17
- package/package.json +10 -8
- package/dist/components/__tests__/BucketNotificationCreatePage.test.js +0 -316
- package/dist/components/buckets/BucketPolicyButton.d.ts +0 -7
- package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +0 -1
- package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +0 -234
- package/dist/hooks/useLoginMutation.d.ts +0 -21
- package/dist/hooks/useLoginMutation.js +0 -9
- package/dist/utils/useFeatures.d.ts +0 -1
- package/dist/utils/useFeatures.js +0 -7
- /package/dist/components/__tests__/{BucketNotificationCreatePage.test.d.ts → BucketAccessor.test.d.ts} +0 -0
|
@@ -1,56 +1,56 @@
|
|
|
1
1
|
import { renderHook, waitFor } from "@testing-library/react";
|
|
2
|
-
import {
|
|
3
|
-
import { useS3Client } from "../../useS3Client.js";
|
|
2
|
+
import { createTestWrapper, validateFactoryHook, validateHookResult } from "../../../test/testUtils.js";
|
|
4
3
|
import { createS3OperationError } from "../../../utils/errorHandling.js";
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
jest.mock(
|
|
4
|
+
import { useS3Client } from "../../useS3Client.js";
|
|
5
|
+
import { useCreateS3FunctionMutationHook } from "../useCreateS3MutationHook.js";
|
|
6
|
+
jest.mock('../../useS3Client');
|
|
7
|
+
jest.mock('../../../utils/errorHandling');
|
|
8
8
|
const mockUseS3Client = useS3Client;
|
|
9
9
|
const mockCreateS3OperationError = createS3OperationError;
|
|
10
10
|
const mockS3Client = {
|
|
11
11
|
config: {}
|
|
12
12
|
};
|
|
13
13
|
const mockOperation = jest.fn();
|
|
14
|
-
describe(
|
|
14
|
+
describe('useCreateS3FunctionMutationHook - Factory Specific', ()=>{
|
|
15
15
|
beforeEach(()=>{
|
|
16
16
|
jest.clearAllMocks();
|
|
17
17
|
mockUseS3Client.mockReturnValue(mockS3Client);
|
|
18
18
|
mockOperation.mockReset();
|
|
19
19
|
});
|
|
20
|
-
it(
|
|
20
|
+
it('should create a functioning mutation hook', ()=>{
|
|
21
21
|
const useMutation = useCreateS3FunctionMutationHook(mockOperation);
|
|
22
|
-
validateFactoryHook(useMutation,
|
|
22
|
+
validateFactoryHook(useMutation, 'function-based mutation');
|
|
23
23
|
const { result } = renderHook(()=>useMutation(), {
|
|
24
|
-
wrapper:
|
|
24
|
+
wrapper: createTestWrapper()
|
|
25
25
|
});
|
|
26
|
-
validateHookResult(result.current,
|
|
26
|
+
validateHookResult(result.current, 'mutation');
|
|
27
27
|
});
|
|
28
|
-
it(
|
|
28
|
+
it('should accept invalidation keys parameter', ()=>{
|
|
29
29
|
const useMutation = useCreateS3FunctionMutationHook(mockOperation, [
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
'PresignedUrls',
|
|
31
|
+
'TestQuery'
|
|
32
32
|
]);
|
|
33
|
-
validateFactoryHook(useMutation,
|
|
33
|
+
validateFactoryHook(useMutation, 'function-based mutation');
|
|
34
34
|
const { result } = renderHook(()=>useMutation(), {
|
|
35
|
-
wrapper:
|
|
35
|
+
wrapper: createTestWrapper()
|
|
36
36
|
});
|
|
37
|
-
validateHookResult(result.current,
|
|
37
|
+
validateHookResult(result.current, 'mutation');
|
|
38
38
|
});
|
|
39
|
-
it(
|
|
39
|
+
it('should execute function operation successfully', async ()=>{
|
|
40
40
|
const mockResponse = {
|
|
41
|
-
Url:
|
|
41
|
+
Url: 'https://presigned.url',
|
|
42
42
|
ExpiresAt: new Date(),
|
|
43
|
-
Bucket:
|
|
44
|
-
Key:
|
|
43
|
+
Bucket: 'test-bucket',
|
|
44
|
+
Key: 'test-key'
|
|
45
45
|
};
|
|
46
46
|
mockOperation.mockResolvedValue(mockResponse);
|
|
47
47
|
const useMutation = useCreateS3FunctionMutationHook(mockOperation);
|
|
48
48
|
const { result } = renderHook(()=>useMutation(), {
|
|
49
|
-
wrapper:
|
|
49
|
+
wrapper: createTestWrapper()
|
|
50
50
|
});
|
|
51
51
|
const inputParams = {
|
|
52
|
-
Bucket:
|
|
53
|
-
Key:
|
|
52
|
+
Bucket: 'test-bucket',
|
|
53
|
+
Key: 'test-key',
|
|
54
54
|
expiresIn: 3600
|
|
55
55
|
};
|
|
56
56
|
result.current.mutate(inputParams);
|
|
@@ -61,30 +61,30 @@ describe("useCreateS3FunctionMutationHook - Factory Specific", ()=>{
|
|
|
61
61
|
expect(mockOperation).toHaveBeenCalledWith(mockS3Client, inputParams);
|
|
62
62
|
expect(mockOperation).toHaveBeenCalledTimes(1);
|
|
63
63
|
});
|
|
64
|
-
it(
|
|
65
|
-
const mockError = new Error(
|
|
64
|
+
it('should handle function operation errors', async ()=>{
|
|
65
|
+
const mockError = new Error('Presigned URL generation failed');
|
|
66
66
|
mockOperation.mockRejectedValue(mockError);
|
|
67
67
|
const useMutation = useCreateS3FunctionMutationHook(mockOperation);
|
|
68
68
|
const { result } = renderHook(()=>useMutation(), {
|
|
69
|
-
wrapper:
|
|
69
|
+
wrapper: createTestWrapper()
|
|
70
70
|
});
|
|
71
71
|
result.current.mutate({
|
|
72
|
-
Bucket:
|
|
73
|
-
Key:
|
|
72
|
+
Bucket: 'test-bucket',
|
|
73
|
+
Key: 'test-key'
|
|
74
74
|
});
|
|
75
75
|
await waitFor(()=>{
|
|
76
76
|
expect(result.current.isError).toBe(true);
|
|
77
77
|
});
|
|
78
78
|
expect(result.current.error).toBe(mockError);
|
|
79
79
|
expect(mockOperation).toHaveBeenCalledWith(mockS3Client, {
|
|
80
|
-
Bucket:
|
|
81
|
-
Key:
|
|
80
|
+
Bucket: 'test-bucket',
|
|
81
|
+
Key: 'test-key'
|
|
82
82
|
});
|
|
83
83
|
expect(mockCreateS3OperationError).not.toHaveBeenCalled();
|
|
84
84
|
});
|
|
85
|
-
it(
|
|
86
|
-
const mockInternalError = new Error(
|
|
87
|
-
const mockWrappedError = new Error(
|
|
85
|
+
it('should handle function operation with internal error wrapping', async ()=>{
|
|
86
|
+
const mockInternalError = new Error('Internal operation error');
|
|
87
|
+
const mockWrappedError = new Error('Wrapped operation error');
|
|
88
88
|
const mockOperationWithErrorHandling = jest.fn().mockImplementation(async ()=>{
|
|
89
89
|
try {
|
|
90
90
|
throw mockInternalError;
|
|
@@ -95,24 +95,24 @@ describe("useCreateS3FunctionMutationHook - Factory Specific", ()=>{
|
|
|
95
95
|
});
|
|
96
96
|
const useMutation = useCreateS3FunctionMutationHook(mockOperationWithErrorHandling);
|
|
97
97
|
const { result } = renderHook(()=>useMutation(), {
|
|
98
|
-
wrapper:
|
|
98
|
+
wrapper: createTestWrapper()
|
|
99
99
|
});
|
|
100
100
|
result.current.mutate({
|
|
101
|
-
Bucket:
|
|
102
|
-
Key:
|
|
101
|
+
Bucket: 'test-bucket',
|
|
102
|
+
Key: 'test-key'
|
|
103
103
|
});
|
|
104
104
|
await waitFor(()=>{
|
|
105
105
|
expect(result.current.isError).toBe(true);
|
|
106
106
|
});
|
|
107
107
|
expect(result.current.error).toBe(mockWrappedError);
|
|
108
108
|
expect(mockOperationWithErrorHandling).toHaveBeenCalledWith(mockS3Client, {
|
|
109
|
-
Bucket:
|
|
110
|
-
Key:
|
|
109
|
+
Bucket: 'test-bucket',
|
|
110
|
+
Key: 'test-key'
|
|
111
111
|
});
|
|
112
112
|
});
|
|
113
|
-
it(
|
|
113
|
+
it('should handle mutation callbacks correctly', async ()=>{
|
|
114
114
|
const mockResponse = {
|
|
115
|
-
Url:
|
|
115
|
+
Url: 'https://presigned.url',
|
|
116
116
|
ExpiresAt: new Date()
|
|
117
117
|
};
|
|
118
118
|
const onSuccess = jest.fn();
|
|
@@ -125,11 +125,11 @@ describe("useCreateS3FunctionMutationHook - Factory Specific", ()=>{
|
|
|
125
125
|
onError,
|
|
126
126
|
onSettled
|
|
127
127
|
}), {
|
|
128
|
-
wrapper:
|
|
128
|
+
wrapper: createTestWrapper()
|
|
129
129
|
});
|
|
130
130
|
const variables = {
|
|
131
|
-
Bucket:
|
|
132
|
-
Key:
|
|
131
|
+
Bucket: 'test-bucket',
|
|
132
|
+
Key: 'test-key'
|
|
133
133
|
};
|
|
134
134
|
result.current.mutate(variables);
|
|
135
135
|
await waitFor(()=>{
|
|
@@ -139,38 +139,38 @@ describe("useCreateS3FunctionMutationHook - Factory Specific", ()=>{
|
|
|
139
139
|
expect(onError).not.toHaveBeenCalled();
|
|
140
140
|
expect(onSettled).toHaveBeenCalledWith(mockResponse, null, variables, void 0, expect.any(Object));
|
|
141
141
|
});
|
|
142
|
-
it(
|
|
142
|
+
it('should handle function operation with invalidation keys', async ()=>{
|
|
143
143
|
const mockResponse = {
|
|
144
144
|
success: true
|
|
145
145
|
};
|
|
146
146
|
mockOperation.mockResolvedValue(mockResponse);
|
|
147
147
|
const useMutation = useCreateS3FunctionMutationHook(mockOperation, [
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
'PresignedUrls',
|
|
149
|
+
'ObjectList'
|
|
150
150
|
]);
|
|
151
151
|
const { result } = renderHook(()=>useMutation(), {
|
|
152
|
-
wrapper:
|
|
152
|
+
wrapper: createTestWrapper()
|
|
153
153
|
});
|
|
154
154
|
result.current.mutate({
|
|
155
|
-
Bucket:
|
|
156
|
-
Key:
|
|
155
|
+
Bucket: 'test-bucket',
|
|
156
|
+
Key: 'test-key'
|
|
157
157
|
});
|
|
158
158
|
await waitFor(()=>{
|
|
159
159
|
expect(result.current.isSuccess).toBe(true);
|
|
160
160
|
});
|
|
161
161
|
expect(result.current.data).toEqual(mockResponse);
|
|
162
162
|
expect(mockOperation).toHaveBeenCalledWith(mockS3Client, {
|
|
163
|
-
Bucket:
|
|
164
|
-
Key:
|
|
163
|
+
Bucket: 'test-bucket',
|
|
164
|
+
Key: 'test-key'
|
|
165
165
|
});
|
|
166
166
|
});
|
|
167
|
-
it(
|
|
167
|
+
it('should handle concurrent function operations correctly', async ()=>{
|
|
168
168
|
const mockResponse1 = {
|
|
169
|
-
Url:
|
|
169
|
+
Url: 'https://presigned1.url',
|
|
170
170
|
ExpiresAt: new Date()
|
|
171
171
|
};
|
|
172
172
|
const mockResponse2 = {
|
|
173
|
-
Url:
|
|
173
|
+
Url: 'https://presigned2.url',
|
|
174
174
|
ExpiresAt: new Date()
|
|
175
175
|
};
|
|
176
176
|
let callCount = 0;
|
|
@@ -180,18 +180,18 @@ describe("useCreateS3FunctionMutationHook - Factory Specific", ()=>{
|
|
|
180
180
|
});
|
|
181
181
|
const useMutation = useCreateS3FunctionMutationHook(mockOperation);
|
|
182
182
|
const { result: result1 } = renderHook(()=>useMutation(), {
|
|
183
|
-
wrapper:
|
|
183
|
+
wrapper: createTestWrapper()
|
|
184
184
|
});
|
|
185
185
|
const { result: result2 } = renderHook(()=>useMutation(), {
|
|
186
|
-
wrapper:
|
|
186
|
+
wrapper: createTestWrapper()
|
|
187
187
|
});
|
|
188
188
|
result1.current.mutate({
|
|
189
|
-
Bucket:
|
|
190
|
-
Key:
|
|
189
|
+
Bucket: 'test-bucket',
|
|
190
|
+
Key: 'file1.txt'
|
|
191
191
|
});
|
|
192
192
|
result2.current.mutate({
|
|
193
|
-
Bucket:
|
|
194
|
-
Key:
|
|
193
|
+
Bucket: 'test-bucket',
|
|
194
|
+
Key: 'file2.txt'
|
|
195
195
|
});
|
|
196
196
|
await waitFor(()=>{
|
|
197
197
|
expect(result1.current.isSuccess).toBe(true);
|
|
@@ -201,7 +201,7 @@ describe("useCreateS3FunctionMutationHook - Factory Specific", ()=>{
|
|
|
201
201
|
expect(result2.current.data).toEqual(mockResponse2);
|
|
202
202
|
expect(mockOperation).toHaveBeenCalledTimes(2);
|
|
203
203
|
});
|
|
204
|
-
it(
|
|
204
|
+
it('should pass correct parameters to function operation', async ()=>{
|
|
205
205
|
const mockResponse = {
|
|
206
206
|
success: true
|
|
207
207
|
};
|
|
@@ -214,12 +214,12 @@ describe("useCreateS3FunctionMutationHook - Factory Specific", ()=>{
|
|
|
214
214
|
});
|
|
215
215
|
const useMutation = useCreateS3FunctionMutationHook(mockOperation);
|
|
216
216
|
const { result } = renderHook(()=>useMutation(), {
|
|
217
|
-
wrapper:
|
|
217
|
+
wrapper: createTestWrapper()
|
|
218
218
|
});
|
|
219
219
|
const inputParams = {
|
|
220
|
-
Bucket:
|
|
221
|
-
Key:
|
|
222
|
-
ContentType:
|
|
220
|
+
Bucket: 'test-bucket',
|
|
221
|
+
Key: 'test-key',
|
|
222
|
+
ContentType: 'text/plain',
|
|
223
223
|
expiresIn: 1800
|
|
224
224
|
};
|
|
225
225
|
result.current.mutate(inputParams);
|
|
@@ -229,25 +229,25 @@ describe("useCreateS3FunctionMutationHook - Factory Specific", ()=>{
|
|
|
229
229
|
expect(capturedClient).toBe(mockS3Client);
|
|
230
230
|
expect(capturedParams).toEqual(inputParams);
|
|
231
231
|
});
|
|
232
|
-
it(
|
|
232
|
+
it('should handle complex function operations with metadata', async ()=>{
|
|
233
233
|
const mockResponse = {
|
|
234
|
-
Url:
|
|
235
|
-
ExpiresAt: new Date(
|
|
236
|
-
Bucket:
|
|
237
|
-
Key:
|
|
238
|
-
VersionId:
|
|
234
|
+
Url: 'https://complex-presigned.url',
|
|
235
|
+
ExpiresAt: new Date('2024-01-01T12:00:00Z'),
|
|
236
|
+
Bucket: 'complex-bucket',
|
|
237
|
+
Key: 'complex/path/file.txt',
|
|
238
|
+
VersionId: 'version123'
|
|
239
239
|
};
|
|
240
240
|
mockOperation.mockResolvedValue(mockResponse);
|
|
241
241
|
const useMutation = useCreateS3FunctionMutationHook(mockOperation);
|
|
242
242
|
const { result } = renderHook(()=>useMutation(), {
|
|
243
|
-
wrapper:
|
|
243
|
+
wrapper: createTestWrapper()
|
|
244
244
|
});
|
|
245
245
|
const complexParams = {
|
|
246
|
-
Bucket:
|
|
247
|
-
Key:
|
|
248
|
-
VersionId:
|
|
249
|
-
ResponseContentType:
|
|
250
|
-
ResponseContentDisposition:
|
|
246
|
+
Bucket: 'complex-bucket',
|
|
247
|
+
Key: 'complex/path/file.txt',
|
|
248
|
+
VersionId: 'version123',
|
|
249
|
+
ResponseContentType: 'application/json',
|
|
250
|
+
ResponseContentDisposition: 'attachment; filename=data.json',
|
|
251
251
|
expiresIn: 7200
|
|
252
252
|
};
|
|
253
253
|
result.current.mutate(complexParams);
|
|
@@ -257,14 +257,14 @@ describe("useCreateS3FunctionMutationHook - Factory Specific", ()=>{
|
|
|
257
257
|
expect(result.current.data).toEqual(mockResponse);
|
|
258
258
|
expect(mockOperation).toHaveBeenCalledWith(mockS3Client, complexParams);
|
|
259
259
|
});
|
|
260
|
-
it(
|
|
260
|
+
it('should handle function operations without parameters', async ()=>{
|
|
261
261
|
const mockResponse = {
|
|
262
|
-
status:
|
|
262
|
+
status: 'operation completed'
|
|
263
263
|
};
|
|
264
264
|
mockOperation.mockResolvedValue(mockResponse);
|
|
265
265
|
const useMutation = useCreateS3FunctionMutationHook(mockOperation);
|
|
266
266
|
const { result } = renderHook(()=>useMutation(), {
|
|
267
|
-
wrapper:
|
|
267
|
+
wrapper: createTestWrapper()
|
|
268
268
|
});
|
|
269
269
|
result.current.mutate(void 0);
|
|
270
270
|
await waitFor(()=>{
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { renderHook, waitFor } from "@testing-library/react";
|
|
2
|
-
import {
|
|
3
|
-
import { useS3Client } from "../../useS3Client.js";
|
|
2
|
+
import { createTestWrapper, validateFactoryHook, validateHookResult } from "../../../test/testUtils.js";
|
|
4
3
|
import { createS3OperationError } from "../../../utils/errorHandling.js";
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
jest.mock(
|
|
4
|
+
import { useS3Client } from "../../useS3Client.js";
|
|
5
|
+
import { useCreateS3InfiniteQueryHook } from "../useCreateS3InfiniteQueryHook.js";
|
|
6
|
+
jest.mock('../../useS3Client');
|
|
7
|
+
jest.mock('../../../utils/errorHandling');
|
|
8
8
|
const mockUseS3Client = useS3Client;
|
|
9
9
|
const mockCreateS3OperationError = createS3OperationError;
|
|
10
10
|
class MockCommand {
|
|
@@ -16,82 +16,82 @@ class MockCommand {
|
|
|
16
16
|
const mockS3Client = {
|
|
17
17
|
send: jest.fn()
|
|
18
18
|
};
|
|
19
|
-
describe(
|
|
19
|
+
describe('useCreateS3InfiniteQueryHook - Pagination Logic', ()=>{
|
|
20
20
|
beforeEach(()=>{
|
|
21
21
|
jest.clearAllMocks();
|
|
22
22
|
mockUseS3Client.mockReturnValue(mockS3Client);
|
|
23
23
|
});
|
|
24
|
-
it(
|
|
25
|
-
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand,
|
|
26
|
-
validateFactoryHook(useInfiniteQuery,
|
|
24
|
+
it('should create a functioning infinite query hook', ()=>{
|
|
25
|
+
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand, 'ListObjects');
|
|
26
|
+
validateFactoryHook(useInfiniteQuery, 'ListObjects');
|
|
27
27
|
const { result } = renderHook(()=>useInfiniteQuery({
|
|
28
|
-
Bucket:
|
|
28
|
+
Bucket: 'test-bucket'
|
|
29
29
|
}), {
|
|
30
|
-
wrapper:
|
|
30
|
+
wrapper: createTestWrapper()
|
|
31
31
|
});
|
|
32
|
-
validateHookResult(result.current,
|
|
32
|
+
validateHookResult(result.current, 'infiniteQuery');
|
|
33
33
|
});
|
|
34
|
-
it(
|
|
34
|
+
it('should handle getPaginationParams for different operations', async ()=>{
|
|
35
35
|
const mockResponse = {
|
|
36
36
|
IsTruncated: false
|
|
37
37
|
};
|
|
38
38
|
mockS3Client.send.mockResolvedValue(mockResponse);
|
|
39
|
-
const useListObjects = useCreateS3InfiniteQueryHook(MockCommand,
|
|
39
|
+
const useListObjects = useCreateS3InfiniteQueryHook(MockCommand, 'ListObjects');
|
|
40
40
|
const { result: listResult } = renderHook(()=>useListObjects({
|
|
41
|
-
Bucket:
|
|
41
|
+
Bucket: 'test-bucket'
|
|
42
42
|
}), {
|
|
43
|
-
wrapper:
|
|
43
|
+
wrapper: createTestWrapper()
|
|
44
44
|
});
|
|
45
|
-
const useListVersions = useCreateS3InfiniteQueryHook(MockCommand,
|
|
45
|
+
const useListVersions = useCreateS3InfiniteQueryHook(MockCommand, 'ListObjectVersions');
|
|
46
46
|
const { result: versionsResult } = renderHook(()=>useListVersions({
|
|
47
|
-
Bucket:
|
|
47
|
+
Bucket: 'test-bucket'
|
|
48
48
|
}), {
|
|
49
|
-
wrapper:
|
|
49
|
+
wrapper: createTestWrapper()
|
|
50
50
|
});
|
|
51
51
|
await waitFor(()=>{
|
|
52
|
-
expect(listResult.current.fetchStatus).not.toBe(
|
|
53
|
-
expect(versionsResult.current.fetchStatus).not.toBe(
|
|
52
|
+
expect(listResult.current.fetchStatus).not.toBe('idle');
|
|
53
|
+
expect(versionsResult.current.fetchStatus).not.toBe('idle');
|
|
54
54
|
});
|
|
55
|
-
expect(typeof listResult.current.fetchNextPage).toBe(
|
|
56
|
-
expect(typeof versionsResult.current.fetchNextPage).toBe(
|
|
55
|
+
expect(typeof listResult.current.fetchNextPage).toBe('function');
|
|
56
|
+
expect(typeof versionsResult.current.fetchNextPage).toBe('function');
|
|
57
57
|
});
|
|
58
|
-
it(
|
|
59
|
-
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand,
|
|
58
|
+
it('should handle Prefix parameter in enabled logic correctly', ()=>{
|
|
59
|
+
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand, 'ListObjects');
|
|
60
60
|
const { result: undefinedResult } = renderHook(()=>useInfiniteQuery({
|
|
61
|
-
Bucket:
|
|
61
|
+
Bucket: 'test-bucket',
|
|
62
62
|
Prefix: void 0
|
|
63
63
|
}), {
|
|
64
|
-
wrapper:
|
|
64
|
+
wrapper: createTestWrapper()
|
|
65
65
|
});
|
|
66
|
-
expect(undefinedResult.current.fetchStatus).toBe(
|
|
66
|
+
expect(undefinedResult.current.fetchStatus).toBe('idle');
|
|
67
67
|
const { result: definedResult } = renderHook(()=>useInfiniteQuery({
|
|
68
|
-
Bucket:
|
|
69
|
-
Prefix:
|
|
68
|
+
Bucket: 'test-bucket',
|
|
69
|
+
Prefix: 'folder/'
|
|
70
70
|
}), {
|
|
71
|
-
wrapper:
|
|
71
|
+
wrapper: createTestWrapper()
|
|
72
72
|
});
|
|
73
|
-
expect(definedResult.current.fetchStatus).not.toBe(
|
|
73
|
+
expect(definedResult.current.fetchStatus).not.toBe('idle');
|
|
74
74
|
});
|
|
75
|
-
it(
|
|
75
|
+
it('should handle pagination data correctly', async ()=>{
|
|
76
76
|
const mockFirstPage = {
|
|
77
77
|
Contents: [
|
|
78
78
|
{
|
|
79
|
-
Key:
|
|
79
|
+
Key: 'file1.txt'
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
|
-
Key:
|
|
82
|
+
Key: 'file2.txt'
|
|
83
83
|
}
|
|
84
84
|
],
|
|
85
85
|
IsTruncated: true,
|
|
86
|
-
NextContinuationToken:
|
|
86
|
+
NextContinuationToken: 'token123'
|
|
87
87
|
};
|
|
88
88
|
const mockSecondPage = {
|
|
89
89
|
Contents: [
|
|
90
90
|
{
|
|
91
|
-
Key:
|
|
91
|
+
Key: 'file3.txt'
|
|
92
92
|
},
|
|
93
93
|
{
|
|
94
|
-
Key:
|
|
94
|
+
Key: 'file4.txt'
|
|
95
95
|
}
|
|
96
96
|
],
|
|
97
97
|
IsTruncated: false
|
|
@@ -101,11 +101,11 @@ describe("useCreateS3InfiniteQueryHook - Pagination Logic", ()=>{
|
|
|
101
101
|
callCount++;
|
|
102
102
|
return Promise.resolve(1 === callCount ? mockFirstPage : mockSecondPage);
|
|
103
103
|
});
|
|
104
|
-
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand,
|
|
104
|
+
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand, 'ListObjects');
|
|
105
105
|
const { result } = renderHook(()=>useInfiniteQuery({
|
|
106
|
-
Bucket:
|
|
106
|
+
Bucket: 'test-bucket'
|
|
107
107
|
}), {
|
|
108
|
-
wrapper:
|
|
108
|
+
wrapper: createTestWrapper()
|
|
109
109
|
});
|
|
110
110
|
await waitFor(()=>{
|
|
111
111
|
expect(result.current.isSuccess).toBe(true);
|
|
@@ -123,30 +123,30 @@ describe("useCreateS3InfiniteQueryHook - Pagination Logic", ()=>{
|
|
|
123
123
|
expect(finalData?.pages?.[1]).toEqual(mockSecondPage);
|
|
124
124
|
expect(result.current.hasNextPage).toBe(false);
|
|
125
125
|
});
|
|
126
|
-
it(
|
|
126
|
+
it('should handle ListObjectVersions pagination patterns', async ()=>{
|
|
127
127
|
const mockVersionsResponse = {
|
|
128
128
|
Versions: [
|
|
129
129
|
{
|
|
130
|
-
Key:
|
|
131
|
-
VersionId:
|
|
130
|
+
Key: 'file1.txt',
|
|
131
|
+
VersionId: 'v1'
|
|
132
132
|
}
|
|
133
133
|
],
|
|
134
134
|
DeleteMarkers: [
|
|
135
135
|
{
|
|
136
|
-
Key:
|
|
137
|
-
VersionId:
|
|
136
|
+
Key: 'file2.txt',
|
|
137
|
+
VersionId: 'v2'
|
|
138
138
|
}
|
|
139
139
|
],
|
|
140
140
|
IsTruncated: true,
|
|
141
|
-
NextKeyMarker:
|
|
142
|
-
NextVersionIdMarker:
|
|
141
|
+
NextKeyMarker: 'file1.txt',
|
|
142
|
+
NextVersionIdMarker: 'v1'
|
|
143
143
|
};
|
|
144
144
|
mockS3Client.send.mockResolvedValue(mockVersionsResponse);
|
|
145
|
-
const useVersionsQuery = useCreateS3InfiniteQueryHook(MockCommand,
|
|
145
|
+
const useVersionsQuery = useCreateS3InfiniteQueryHook(MockCommand, 'ListObjectVersions');
|
|
146
146
|
const { result } = renderHook(()=>useVersionsQuery({
|
|
147
|
-
Bucket:
|
|
147
|
+
Bucket: 'test-bucket'
|
|
148
148
|
}), {
|
|
149
|
-
wrapper:
|
|
149
|
+
wrapper: createTestWrapper()
|
|
150
150
|
});
|
|
151
151
|
await waitFor(()=>{
|
|
152
152
|
expect(result.current.isSuccess).toBe(true);
|
|
@@ -155,67 +155,67 @@ describe("useCreateS3InfiniteQueryHook - Pagination Logic", ()=>{
|
|
|
155
155
|
expect(data?.pages).toHaveLength(1);
|
|
156
156
|
expect(data?.pages?.[0]).toEqual(mockVersionsResponse);
|
|
157
157
|
expect(result.current.hasNextPage).toBe(true);
|
|
158
|
-
expect(mockVersionsResponse.NextKeyMarker).toBe(
|
|
159
|
-
expect(mockVersionsResponse.NextVersionIdMarker).toBe(
|
|
158
|
+
expect(mockVersionsResponse.NextKeyMarker).toBe('file1.txt');
|
|
159
|
+
expect(mockVersionsResponse.NextVersionIdMarker).toBe('v1');
|
|
160
160
|
});
|
|
161
|
-
it(
|
|
162
|
-
const mockError = new Error(
|
|
163
|
-
const enhancedError = new Error(
|
|
161
|
+
it('should handle infinite query errors with context', async ()=>{
|
|
162
|
+
const mockError = new Error('S3 List Error');
|
|
163
|
+
const enhancedError = new Error('Enhanced S3 List Error');
|
|
164
164
|
mockS3Client.send.mockRejectedValue(mockError);
|
|
165
165
|
mockCreateS3OperationError.mockReturnValue(enhancedError);
|
|
166
|
-
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand,
|
|
166
|
+
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand, 'ListObjects');
|
|
167
167
|
const { result } = renderHook(()=>useInfiniteQuery({
|
|
168
|
-
Bucket:
|
|
168
|
+
Bucket: 'test-bucket'
|
|
169
169
|
}), {
|
|
170
|
-
wrapper:
|
|
170
|
+
wrapper: createTestWrapper()
|
|
171
171
|
});
|
|
172
172
|
await waitFor(()=>{
|
|
173
173
|
expect(result.current.isError).toBe(true);
|
|
174
174
|
});
|
|
175
175
|
expect(result.current.error).toBe(enhancedError);
|
|
176
|
-
expect(mockCreateS3OperationError).toHaveBeenCalledWith(mockError,
|
|
176
|
+
expect(mockCreateS3OperationError).toHaveBeenCalledWith(mockError, 'ListObjects', 'test-bucket');
|
|
177
177
|
});
|
|
178
|
-
it(
|
|
178
|
+
it('should handle fetchNextPage correctly', async ()=>{
|
|
179
179
|
const mockFirstPage = {
|
|
180
180
|
Contents: [
|
|
181
181
|
{
|
|
182
|
-
Key:
|
|
182
|
+
Key: 'file1.txt'
|
|
183
183
|
}
|
|
184
184
|
],
|
|
185
185
|
IsTruncated: true,
|
|
186
|
-
NextContinuationToken:
|
|
186
|
+
NextContinuationToken: 'token123'
|
|
187
187
|
};
|
|
188
188
|
mockS3Client.send.mockResolvedValue(mockFirstPage);
|
|
189
|
-
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand,
|
|
189
|
+
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand, 'ListObjects');
|
|
190
190
|
const { result } = renderHook(()=>useInfiniteQuery({
|
|
191
|
-
Bucket:
|
|
191
|
+
Bucket: 'test-bucket'
|
|
192
192
|
}), {
|
|
193
|
-
wrapper:
|
|
193
|
+
wrapper: createTestWrapper()
|
|
194
194
|
});
|
|
195
195
|
await waitFor(()=>{
|
|
196
196
|
expect(result.current.isSuccess).toBe(true);
|
|
197
197
|
});
|
|
198
|
-
expect(typeof result.current.fetchNextPage).toBe(
|
|
198
|
+
expect(typeof result.current.fetchNextPage).toBe('function');
|
|
199
199
|
expect(result.current.isFetchingNextPage).toBe(false);
|
|
200
200
|
expect(result.current.hasNextPage).toBe(true);
|
|
201
201
|
expect(()=>result.current.fetchNextPage()).not.toThrow();
|
|
202
202
|
});
|
|
203
|
-
it(
|
|
204
|
-
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand,
|
|
203
|
+
it('should handle infinite query options correctly', ()=>{
|
|
204
|
+
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand, 'ListObjects');
|
|
205
205
|
const customOptions = {
|
|
206
206
|
enabled: false,
|
|
207
207
|
staleTime: 10000,
|
|
208
208
|
refetchOnWindowFocus: false
|
|
209
209
|
};
|
|
210
210
|
const { result } = renderHook(()=>useInfiniteQuery({
|
|
211
|
-
Bucket:
|
|
211
|
+
Bucket: 'test-bucket'
|
|
212
212
|
}, customOptions), {
|
|
213
|
-
wrapper:
|
|
213
|
+
wrapper: createTestWrapper()
|
|
214
214
|
});
|
|
215
|
-
expect(result.current.fetchStatus).toBe(
|
|
215
|
+
expect(result.current.fetchStatus).toBe('idle');
|
|
216
216
|
expect(result.current.isLoading).toBe(false);
|
|
217
217
|
});
|
|
218
|
-
it(
|
|
218
|
+
it('should pass AbortSignal correctly for infinite queries', async ()=>{
|
|
219
219
|
let capturedAbortSignal;
|
|
220
220
|
mockS3Client.send.mockImplementation((_command, options)=>{
|
|
221
221
|
capturedAbortSignal = options?.abortSignal;
|
|
@@ -224,11 +224,11 @@ describe("useCreateS3InfiniteQueryHook - Pagination Logic", ()=>{
|
|
|
224
224
|
IsTruncated: false
|
|
225
225
|
});
|
|
226
226
|
});
|
|
227
|
-
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand,
|
|
227
|
+
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand, 'ListObjects');
|
|
228
228
|
const { result } = renderHook(()=>useInfiniteQuery({
|
|
229
|
-
Bucket:
|
|
229
|
+
Bucket: 'test-bucket'
|
|
230
230
|
}), {
|
|
231
|
-
wrapper:
|
|
231
|
+
wrapper: createTestWrapper()
|
|
232
232
|
});
|
|
233
233
|
await waitFor(()=>{
|
|
234
234
|
expect(result.current.isSuccess).toBe(true);
|
|
@@ -236,17 +236,17 @@ describe("useCreateS3InfiniteQueryHook - Pagination Logic", ()=>{
|
|
|
236
236
|
expect(capturedAbortSignal).toBeInstanceOf(AbortSignal);
|
|
237
237
|
expect(capturedAbortSignal?.aborted).toBe(false);
|
|
238
238
|
});
|
|
239
|
-
it(
|
|
239
|
+
it('should handle empty result sets correctly', async ()=>{
|
|
240
240
|
const mockEmptyResponse = {
|
|
241
241
|
Contents: [],
|
|
242
242
|
IsTruncated: false
|
|
243
243
|
};
|
|
244
244
|
mockS3Client.send.mockResolvedValue(mockEmptyResponse);
|
|
245
|
-
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand,
|
|
245
|
+
const useInfiniteQuery = useCreateS3InfiniteQueryHook(MockCommand, 'ListObjects');
|
|
246
246
|
const { result } = renderHook(()=>useInfiniteQuery({
|
|
247
|
-
Bucket:
|
|
247
|
+
Bucket: 'test-bucket'
|
|
248
248
|
}), {
|
|
249
|
-
wrapper:
|
|
249
|
+
wrapper: createTestWrapper()
|
|
250
250
|
});
|
|
251
251
|
await waitFor(()=>{
|
|
252
252
|
expect(result.current.isSuccess).toBe(true);
|