diff --git a/src/js/mock/S3Client.ts b/src/js/mock/S3Client.ts index 0aae044e9..f02fe5551 100644 --- a/src/js/mock/S3Client.ts +++ b/src/js/mock/S3Client.ts @@ -174,6 +174,7 @@ export const bucketInfoResponseVersioningDisabled: BucketInfo = { ObjectLockEnabled: 'Disabled', }, }; + export class MockS3Client implements S3ClientInterface { listBucketsWithLocation() { return Promise.resolve({ diff --git a/src/js/mock/S3ClientMSWHandlers.ts b/src/js/mock/S3ClientMSWHandlers.ts index a9edc1856..f73a97f36 100644 --- a/src/js/mock/S3ClientMSWHandlers.ts +++ b/src/js/mock/S3ClientMSWHandlers.ts @@ -66,18 +66,21 @@ export function mockBucketOperations( slowdown = false, forceFailure = false, isVeeamTagged = false, + isObjectLockEnabled = true, }: { location?: string | ((bucketName: string) => string); isVersioningEnabled?: boolean | ((bucketName: string) => boolean); slowdown?: boolean; forceFailure?: boolean; isVeeamTagged?: boolean | ((bucketName: string) => boolean); + isObjectLockEnabled?: boolean; } = { location: '', isVersioningEnabled: false, slowdown: false, forceFailure: false, isVeeamTagged: false, + isObjectLockEnabled: true, }, ) { return rest.get( @@ -152,14 +155,28 @@ export function mockBucketOperations( } if (req.url.searchParams.has('object-lock')) { - return res( - ctx.xml(` + if (isObjectLockEnabled) { + return res( + ctx.xml(` Enabled `), - ); + ); + } else { + return res( + ctx.status(404), + ctx.xml( + ` + + ObjectLockConfigurationNotFoundError + + 771ff09e6b408a3e5ed8 + `, + ), + ); + } } if (req.url.searchParams.has('tagging')) { diff --git a/src/react/account/AwsPaginatedResourceTable.tsx b/src/react/account/AwsPaginatedResourceTable.tsx index c602426b1..1a196af03 100644 --- a/src/react/account/AwsPaginatedResourceTable.tsx +++ b/src/react/account/AwsPaginatedResourceTable.tsx @@ -138,6 +138,10 @@ const AwsPaginatedResourceTable = ({ value={search} placeholder={'Search'} disableToggle + onReset={() => { + queryParams.delete(SEARCH_QUERY_PARAM); + history.push(`${match.url}?${queryParams.toString()}`); + }} onChange={(evt: ChangeEvent) => { setSearch(evt.target.value); }} diff --git a/src/react/databrowser/buckets/BucketCreate.tsx b/src/react/databrowser/buckets/BucketCreate.tsx index 25654c4ee..76558d4ff 100644 --- a/src/react/databrowser/buckets/BucketCreate.tsx +++ b/src/react/databrowser/buckets/BucketCreate.tsx @@ -170,13 +170,13 @@ function BucketCreate() { }) => { clearServerError(); let lName = locationName; - + const location = accountsLocationsAndEndpoints?.locations.find( + (location) => location.name === locationName, + ); if ( isAsyncNotification && - //@ts-expect-error fix this when you are working on it - locations && - //@ts-expect-error fix this when you are working on it - isIngestLocation(locations[locationName], capabilities) + location && + isIngestLocation(location, capabilities) ) { lName = `${locationName}:ingest`; } diff --git a/src/react/databrowser/buckets/details/Overview.tsx b/src/react/databrowser/buckets/details/Overview.tsx index 0982335ed..96e960ec6 100644 --- a/src/react/databrowser/buckets/details/Overview.tsx +++ b/src/react/databrowser/buckets/details/Overview.tsx @@ -93,7 +93,13 @@ const workflowAttachedError = (count: number, bucketName: string) => ( ); -function VersionningValue({ bucketInfo }: { bucketInfo: BucketInfo }) { +function VersionningValue({ + bucketInfo, + isVeeamBucket, +}: { + bucketInfo: BucketInfo; + isVeeamBucket: boolean; +}) { const dispatch = useDispatch(); const accountsLocationsEndpointsAdapter = useAccountsLocationsEndpointsAdapter(); @@ -114,6 +120,11 @@ function VersionningValue({ bucketInfo }: { bucketInfo: BucketInfo }) { }, }); }; + const isVersioningToggleDisabled = + locationsStatus === 'idle' || + locationsStatus === 'loading' || + isBucketHostedOnAzureOrGCP || + isVeeamBucket; return ( @@ -130,15 +141,17 @@ function VersionningValue({ bucketInfo }: { bucketInfo: BucketInfo }) { Enabling versioning is not possible due to the bucket being hosted on Google Cloud. + ) : isVeeamBucket ? ( + <> + Enabling versioning is not possible due to the bucket being + managed by Veeam. + ) : null } > Versioning - + Location diff --git a/src/react/databrowser/buckets/details/__tests__/Overview.test.tsx b/src/react/databrowser/buckets/details/__tests__/Overview.test.tsx index 9f54b4ef0..6fbdb525e 100644 --- a/src/react/databrowser/buckets/details/__tests__/Overview.test.tsx +++ b/src/react/databrowser/buckets/details/__tests__/Overview.test.tsx @@ -1,5 +1,4 @@ import { - fireEvent, render, screen, waitFor, @@ -195,17 +194,8 @@ describe('Overview', () => { ); await waitForElementToBeRemoved(() => screen.getByText(/loading/i)); await waitFor(() => { - expect( - screen.getByRole('checkbox', { - name: /inactive/i, - }), - ).toBeInTheDocument(); - }); - const versioningToggleItem = screen.getByRole('checkbox', { - name: /inactive/i, + expect(selectors.inActiveVersioningToggle()).toHaveAttribute('disabled'); }); - //V - expect(versioningToggleItem).toHaveAttribute('disabled'); }); }); @@ -302,6 +292,8 @@ const selectors = { screen.getByRole('generic', { name: /indicate if object lock is enabled/i, }), + inActiveVersioningToggle: () => + screen.getByRole('checkbox', { name: /inactive/i }), }; describe('Overview', () => { @@ -312,32 +304,23 @@ describe('Overview', () => { useUpdateBucketVersioningMock(req.body); return res(ctx.status(200)); }), + mockBucketOperations({ + isVersioningEnabled: false, + isObjectLockEnabled: false, + }), ); - renderWithRouterMatch( + render( , - undefined, - { - ...TEST_STATE, - ...{ s3: { bucketInfo: bucketInfoResponseVersioningDisabled } }, - }, + { wrapper: NewWrapper() }, ); - - const versioningToggleItem = screen - .getByRole('checkbox', { - name: /inactive/i, - }) - .querySelector('input'); - await waitFor(() => { - expect(versioningToggleItem).toBeInTheDocument(); + expect(selectors.inActiveVersioningToggle()).toBeEnabled(); }); - - versioningToggleItem && fireEvent.click(versioningToggleItem); - + await userEvent.click(selectors.inActiveVersioningToggle()); await waitFor(() => { expect(useUpdateBucketVersioningMock).toHaveBeenCalledWith(mockResponse); }); @@ -411,4 +394,34 @@ describe('Overview', () => { expect(selectors.bucketTaggingErorToastQuery()).toBe(null); }); }); + + it('should disable the versioning toggle for Veeam bucket', async () => { + //S + server.use( + mockBucketOperations({ + isVersioningEnabled: false, + isVeeamTagged: true, + isObjectLockEnabled: false, + }), + ); + //E + render( + , + { wrapper: NewWrapper() }, + ); + //V + await waitFor(() => { + expect(selectors.inActiveVersioningToggle()).toBeInTheDocument(); + }); + + // toBeDisabled() works only with the following element, but not with label. + // https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements + // https://github.com/testing-library/jest-dom/blob/e8c8b13c6de2a0ccffaa6539809c8c11f141beca/src/to-be-disabled.js#L71 + await waitFor(() => { + expect(selectors.inActiveVersioningToggle()).toHaveAttribute('disabled'); + }); + }); });