mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
fix(site): fix react state violation in filetree create/update utils (#20483)
This commit is contained in:
@@ -10,18 +10,20 @@ import {
|
|||||||
} from "./filetree";
|
} from "./filetree";
|
||||||
|
|
||||||
test("createFile() set file into the file tree", () => {
|
test("createFile() set file into the file tree", () => {
|
||||||
let fileTree: FileTree = {
|
const fileTree: FileTree = {
|
||||||
"main.tf": "terraform",
|
"main.tf": "terraform",
|
||||||
images: { "java.Dockerfile": "java dockerfile" },
|
images: { "java.Dockerfile": "java dockerfile" },
|
||||||
};
|
};
|
||||||
fileTree = createFile(
|
const updatedFileTree = createFile(
|
||||||
"images/python.Dockerfile",
|
"images/python.Dockerfile",
|
||||||
fileTree,
|
fileTree,
|
||||||
"python dockerfile",
|
"python dockerfile",
|
||||||
);
|
);
|
||||||
expect((fileTree.images as FileTree)["python.Dockerfile"]).toEqual(
|
expect((updatedFileTree.images as FileTree)["python.Dockerfile"]).toEqual(
|
||||||
"python dockerfile",
|
"python dockerfile",
|
||||||
);
|
);
|
||||||
|
// Verify the original FileTree was not modified.
|
||||||
|
expect((fileTree.images as FileTree)["python.Dockerfile"]).toBeUndefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
test("getFileContent() return the file content from the file tree", () => {
|
test("getFileContent() return the file content from the file tree", () => {
|
||||||
@@ -35,50 +37,56 @@ test("getFileContent() return the file content from the file tree", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test("removeFile() removes a file from a folder", () => {
|
test("removeFile() removes a file from a folder", () => {
|
||||||
let fileTree: FileTree = {
|
const fileTree: FileTree = {
|
||||||
"main.tf": "terraform content",
|
"main.tf": "terraform content",
|
||||||
images: {
|
images: {
|
||||||
"java.Dockerfile": "java dockerfile",
|
"java.Dockerfile": "java dockerfile",
|
||||||
"python.Dockerfile": "python Dockerfile",
|
"python.Dockerfile": "python Dockerfile",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
fileTree = removeFile("images/python.Dockerfile", fileTree);
|
const updatedFileTree = removeFile("images/python.Dockerfile", fileTree);
|
||||||
const expectedFileTree = {
|
const expectedFileTree = {
|
||||||
"main.tf": "terraform content",
|
"main.tf": "terraform content",
|
||||||
images: {
|
images: {
|
||||||
"java.Dockerfile": "java dockerfile",
|
"java.Dockerfile": "java dockerfile",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
expect(expectedFileTree).toEqual(fileTree);
|
expect(updatedFileTree).toEqual(expectedFileTree);
|
||||||
|
// Verify the original FileTree was not modified.
|
||||||
|
expect((fileTree.images as FileTree)["python.Dockerfile"]).toEqual(
|
||||||
|
"python Dockerfile",
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("removeFile() removes a file from root", () => {
|
test("removeFile() removes a file from root", () => {
|
||||||
let fileTree: FileTree = {
|
const fileTree: FileTree = {
|
||||||
"main.tf": "terraform content",
|
"main.tf": "terraform content",
|
||||||
images: {
|
images: {
|
||||||
"java.Dockerfile": "java dockerfile",
|
"java.Dockerfile": "java dockerfile",
|
||||||
"python.Dockerfile": "python Dockerfile",
|
"python.Dockerfile": "python Dockerfile",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
fileTree = removeFile("main.tf", fileTree);
|
const updatedFileTree = removeFile("main.tf", fileTree);
|
||||||
const expectedFileTree = {
|
const expectedFileTree = {
|
||||||
images: {
|
images: {
|
||||||
"java.Dockerfile": "java dockerfile",
|
"java.Dockerfile": "java dockerfile",
|
||||||
"python.Dockerfile": "python Dockerfile",
|
"python.Dockerfile": "python Dockerfile",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
expect(expectedFileTree).toEqual(fileTree);
|
expect(updatedFileTree).toEqual(expectedFileTree);
|
||||||
|
// Verify the original FileTree was not modified.
|
||||||
|
expect(fileTree["main.tf"]).toEqual("terraform content");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("moveFile() moves a file from in file tree", () => {
|
test("moveFile() moves a file from in file tree", () => {
|
||||||
let fileTree: FileTree = {
|
const fileTree: FileTree = {
|
||||||
"main.tf": "terraform content",
|
"main.tf": "terraform content",
|
||||||
images: {
|
images: {
|
||||||
"java.Dockerfile": "java dockerfile",
|
"java.Dockerfile": "java dockerfile",
|
||||||
"python.Dockerfile": "python Dockerfile",
|
"python.Dockerfile": "python Dockerfile",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
fileTree = moveFile(
|
const updatedFileTree = moveFile(
|
||||||
"images/java.Dockerfile",
|
"images/java.Dockerfile",
|
||||||
"other/java.Dockerfile",
|
"other/java.Dockerfile",
|
||||||
fileTree,
|
fileTree,
|
||||||
@@ -92,7 +100,9 @@ test("moveFile() moves a file from in file tree", () => {
|
|||||||
"java.Dockerfile": "java dockerfile",
|
"java.Dockerfile": "java dockerfile",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
expect(fileTree).toEqual(expectedFileTree);
|
expect(updatedFileTree).toEqual(expectedFileTree);
|
||||||
|
// Verify the original FileTree was not modified.
|
||||||
|
expect(fileTree["main.tf"]).toEqual("terraform content");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("existsFile() returns if there is or not a file", () => {
|
test("existsFile() returns if there is or not a file", () => {
|
||||||
|
|||||||
@@ -20,7 +20,8 @@ export const createFile = (
|
|||||||
throw new Error(pathError);
|
throw new Error(pathError);
|
||||||
}
|
}
|
||||||
|
|
||||||
return set(fileTree, path.split("/"), value);
|
const updatedFileTree = structuredClone(fileTree);
|
||||||
|
return set(updatedFileTree, path.split("/"), value);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const validatePath = (
|
export const validatePath = (
|
||||||
@@ -43,7 +44,8 @@ export const updateFile = (
|
|||||||
content: FileTree | string,
|
content: FileTree | string,
|
||||||
fileTree: FileTree,
|
fileTree: FileTree,
|
||||||
): FileTree => {
|
): FileTree => {
|
||||||
return set(fileTree, path.split("/"), content);
|
const updatedFileTree = structuredClone(fileTree);
|
||||||
|
return set(updatedFileTree, path.split("/"), content);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const existsFile = (path: string, fileTree: FileTree) => {
|
export const existsFile = (path: string, fileTree: FileTree) => {
|
||||||
@@ -51,7 +53,7 @@ export const existsFile = (path: string, fileTree: FileTree) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const removeFile = (path: string, fileTree: FileTree) => {
|
export const removeFile = (path: string, fileTree: FileTree) => {
|
||||||
const updatedFileTree = { ...fileTree };
|
const updatedFileTree = structuredClone(fileTree);
|
||||||
unset(updatedFileTree, path.split("/"));
|
unset(updatedFileTree, path.split("/"));
|
||||||
return updatedFileTree;
|
return updatedFileTree;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user