Fix update metadata (#3560)

This commit is contained in:
Paweł Chyła 2023-04-27 11:55:16 +02:00 committed by GitHub
parent 13fd9f43a2
commit 6acf43bab5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 266 additions and 25 deletions

View file

@ -0,0 +1,235 @@
import { MetadataFormData } from "@dashboard/components/Metadata";
import createMetadataUpdateHandler, {
ObjectWithMetadata,
} from "./metadataUpdateHandler";
describe("createMetadataUpdateHandler", () => {
it("should return array of errors when update function return errors", async () => {
// Arrange
const intialData: ObjectWithMetadata = {
id: "testId",
metadata: [],
privateMetadata: [],
};
const data: MetadataFormData = {
metadata: [],
privateMetadata: [],
};
const updateFun = jest.fn(() => Promise.resolve(["error1", "error2"]));
const metadataUpdateFun = jest.fn();
const privateMetadataUpdateFun = jest.fn();
// Act
const handleUpdate = await createMetadataUpdateHandler(
intialData,
updateFun,
metadataUpdateFun,
privateMetadataUpdateFun,
);
const result = await handleUpdate(data);
// Assert
expect(result).toEqual(["error1", "error2"]);
});
it("should call only updateMetadata mutation", async () => {
// Arrange
const intialData: ObjectWithMetadata = {
id: "testId",
metadata: [],
privateMetadata: [],
};
const data: MetadataFormData = {
metadata: [
{
key: "testKey",
value: "testValue",
},
],
privateMetadata: [],
};
const updateFun = jest.fn(() => Promise.resolve([])) as any;
const metadataUpdateFun = jest.fn(() =>
Promise.resolve({
data: {},
}),
) as any;
const privateMetadataUpdateFun = jest.fn();
// Act
const handleUpdate = await createMetadataUpdateHandler(
intialData,
updateFun,
metadataUpdateFun,
privateMetadataUpdateFun,
);
const result = await handleUpdate(data);
// Assert
expect(result).toEqual([]);
expect(metadataUpdateFun).toHaveBeenLastCalledWith({
id: intialData.id,
input: [
{
key: "testKey",
value: "testValue",
},
],
keysToDelete: [],
});
expect(privateMetadataUpdateFun).not.toHaveBeenCalled();
});
it("should call only updatePrivateMetadata mutation", async () => {
// Arrange
const intialData: ObjectWithMetadata = {
id: "testId",
metadata: [],
privateMetadata: [],
};
const data: MetadataFormData = {
metadata: [],
privateMetadata: [
{
key: "testKey",
value: "testValue",
},
],
};
const updateFun = jest.fn(() => Promise.resolve([])) as any;
const metadataUpdateFun = jest.fn();
const privateMetadataUpdateFun = jest.fn(() =>
Promise.resolve({
data: {},
}),
) as any;
// Act
const handleUpdate = await createMetadataUpdateHandler(
intialData,
updateFun,
metadataUpdateFun,
privateMetadataUpdateFun,
);
const result = await handleUpdate(data);
// Assert
expect(result).toEqual([]);
expect(privateMetadataUpdateFun).toHaveBeenLastCalledWith({
id: intialData.id,
input: [
{
key: "testKey",
value: "testValue",
},
],
keysToDelete: [],
});
expect(metadataUpdateFun).not.toHaveBeenCalled();
});
it("should return updateMetadata errors if exists", async () => {
// Arrange
const intialData: ObjectWithMetadata = {
id: "testId",
metadata: [],
privateMetadata: [],
};
const data: MetadataFormData = {
metadata: [
{
key: "testKey",
value: "testValue",
},
],
privateMetadata: [
{
key: "privateTestKey",
value: "privateTestValue",
},
],
};
const updateFun = jest.fn(() => Promise.resolve([])) as any;
const metadataUpdateFun = jest.fn(() =>
Promise.resolve({
data: {
deleteMetadata: {
errors: ["error1", "error2"],
},
},
}),
) as any;
const privateMetadataUpdateFun = jest.fn();
// Act
const handleUpdate = await createMetadataUpdateHandler(
intialData,
updateFun,
metadataUpdateFun,
privateMetadataUpdateFun,
);
const result = await handleUpdate(data);
// Assert
expect(result).toEqual(["error1", "error2"]);
expect(privateMetadataUpdateFun).not.toHaveBeenCalled();
});
it("should return updatePrivateMetadata errors if exists", async () => {
// Arrange
const intialData: ObjectWithMetadata = {
id: "testId",
metadata: [],
privateMetadata: [],
};
const data: MetadataFormData = {
metadata: [
{
key: "testKey",
value: "testValue",
},
],
privateMetadata: [
{
key: "testKey",
value: "testValue",
},
],
};
const updateFun = jest.fn(() => Promise.resolve([])) as any;
const metadataUpdateFun = jest.fn(() =>
Promise.resolve({
data: {},
}),
) as any;
const privateMetadataUpdateFun = jest.fn(() =>
Promise.resolve({
data: {
deletePrivateMetadata: {
errors: ["privateError1", "privateError2"],
},
},
}),
) as any;
// Act
const handleUpdate = await createMetadataUpdateHandler(
intialData,
updateFun,
metadataUpdateFun,
privateMetadataUpdateFun,
);
const result = await handleUpdate(data);
// Assert
expect(metadataUpdateFun).toHaveBeenCalled();
expect(result).toEqual(["privateError1", "privateError2"]);
});
});

View file

@ -14,7 +14,7 @@ import { arrayDiff } from "@dashboard/utils/arrays";
import { filterMetadataArray } from "./filterMetadataArray";
import { areMetadataArraysEqual } from "./metadataUpdateHelpers";
interface ObjectWithMetadata {
export interface ObjectWithMetadata {
id: string;
metadata: MetadataInput[];
privateMetadata: MetadataInput[];
@ -54,20 +54,23 @@ function createMetadataUpdateHandler<TData extends MetadataFormData, TError>(
const modifiedKeys = data.metadata.map(m => m.key);
const keyDiff = arrayDiff(initialKeys, modifiedKeys);
const metadataInput = filterMetadataArray(data.metadata);
const updateMetaResult = await updateMetadata({
id: initial.id,
input: filterMetadataArray(data.metadata),
keysToDelete: keyDiff.removed,
});
if (metadataInput.length) {
const updateMetaResult = await updateMetadata({
id: initial.id,
input: metadataInput,
keysToDelete: keyDiff.removed,
});
const updateMetaErrors = [
...(updateMetaResult.data?.deleteMetadata?.errors || []),
...(updateMetaResult.data?.updateMetadata?.errors || []),
];
const updateMetaErrors = [
...(updateMetaResult.data?.deleteMetadata?.errors || []),
...(updateMetaResult.data?.updateMetadata?.errors || []),
];
if (updateMetaErrors.length > 0) {
return updateMetaErrors;
if (updateMetaErrors.length > 0) {
return updateMetaErrors;
}
}
}
@ -76,22 +79,25 @@ function createMetadataUpdateHandler<TData extends MetadataFormData, TError>(
const modifiedKeys = data.privateMetadata.map(m => m.key);
const keyDiff = arrayDiff(initialKeys, modifiedKeys);
const privateMetadataInput = filterMetadataArray(data.privateMetadata);
const updatePrivateMetaResult = await updatePrivateMetadata({
id: initial.id,
input: filterMetadataArray(data.privateMetadata),
keysToDelete: keyDiff.removed,
});
if (privateMetadataInput.length) {
const updatePrivateMetaResult = await updatePrivateMetadata({
id: initial.id,
input: privateMetadataInput,
keysToDelete: keyDiff.removed,
});
const updatePrivateMetaErrors = [
...(updatePrivateMetaResult.data?.deletePrivateMetadata?.errors ||
[]),
...(updatePrivateMetaResult.data?.updatePrivateMetadata?.errors ||
[]),
];
const updatePrivateMetaErrors = [
...(updatePrivateMetaResult.data?.deletePrivateMetadata?.errors ||
[]),
...(updatePrivateMetaResult.data?.updatePrivateMetadata?.errors ||
[]),
];
if (updatePrivateMetaErrors.length > 0) {
return updatePrivateMetaErrors;
if (updatePrivateMetaErrors.length > 0) {
return updatePrivateMetaErrors;
}
}
}
}