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');
+ });
+ });
});