From 8f4ca3d882cf043ce0659d7505dc1a31bc267e44 Mon Sep 17 00:00:00 2001 From: Takeshi Kimata <117462761+kimatata@users.noreply.github.com> Date: Sun, 21 Apr 2024 13:10:28 +0900 Subject: [PATCH] Implemented test run editor's bulk test case selection --- backend/routes/runcases/bulkDelete.js | 2 +- .../[projectId]/runs/[runId]/RunEditor.tsx | 52 +++++++++++-------- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/backend/routes/runcases/bulkDelete.js b/backend/routes/runcases/bulkDelete.js index 855b049..08ef3f5 100644 --- a/backend/routes/runcases/bulkDelete.js +++ b/backend/routes/runcases/bulkDelete.js @@ -20,7 +20,7 @@ module.exports = function (sequelize) { }); if (existingRunCases.length === 0) { - return res.status(400).send("No records found to delete"); + return res.status(200).send("No records found to delete"); } await RunCase.destroy({ diff --git a/frontend/app/projects/[projectId]/runs/[runId]/RunEditor.tsx b/frontend/app/projects/[projectId]/runs/[runId]/RunEditor.tsx index 4292f98..5144931 100644 --- a/frontend/app/projects/[projectId]/runs/[runId]/RunEditor.tsx +++ b/frontend/app/projects/[projectId]/runs/[runId]/RunEditor.tsx @@ -38,7 +38,7 @@ import { createRunCase, bulkCreateRunCases, deleteRunCase, - bulkDeleteRunCases + bulkDeleteRunCases, } from "../runsControl"; import { fetchFolders } from "../../folders/foldersControl"; import { fetchCases } from "../../folders/[folderId]/cases/caseControl"; @@ -121,11 +121,18 @@ export default function RunEditor({ projectId, runId }: Props) { isInclude: boolean, clickedTestCaseId: number ) => { - let createdRunCase: RunCaseType; if (isInclude) { - createdRunCase = await createRunCase(runId, clickedTestCaseId); + const createdRunCase = await createRunCase(runId, clickedTestCaseId); + setRunCases((prevRunCases) => { + return [...prevRunCases, createdRunCase]; + }); } else { await deleteRunCase(runId, clickedTestCaseId); + setRunCases((prevRunCases) => { + return prevRunCases.filter( + (runCase) => runCase.caseId !== clickedTestCaseId + ); + }); } setTestCases((prevTestCases) => { @@ -136,27 +143,16 @@ export default function RunEditor({ projectId, runId }: Props) { return testCase; }); }); - - if (isInclude) { - setRunCases((prevRunCases) => { - return [...prevRunCases, createdRunCase]; - }); - } else { - setRunCases((prevRunCases) => { - return prevRunCases.filter( - (runCase) => runCase.caseId !== clickedTestCaseId - ); - }); - } }; - const onIncludeExcludeClick = async (isInclude: boolean) => { - let keys = []; + const handleBulkIncludeExcludeCases = async (isInclude: boolean) => { + let keys: number[] = []; if (selectedKeys === "all") { keys = testcases.map((item) => item.id); } else { - keys = testcases + keys = Array.from(selectedKeys).map(Number); } + console.log(keys) const runCaseInfo: RunCaseInfoType[] = keys.map((caseId) => ({ runId: runId, @@ -164,11 +160,25 @@ export default function RunEditor({ projectId, runId }: Props) { })); if (isInclude) { const createdRunCases = await bulkCreateRunCases(runCaseInfo); - console.log(createdRunCases) + setRunCases((prevRunCases) => [...prevRunCases, ...createdRunCases]); } else { await bulkDeleteRunCases(runCaseInfo); + setRunCases((prevRunCases) => { + return prevRunCases.filter((runCase) => { + return !runCaseInfo.some((info) => info.caseId === runCase.caseId); + }); + }); } + setTestCases((prevTestCases) => { + return prevTestCases.map((testCase) => { + const isCaseIncluded = isInclude + ? keys.includes(testCase.id) + : !keys.includes(testCase.id); + return { ...testCase, isIncluded: isCaseIncluded }; + }); + }); + setSelectedKeys(new Set([])); }; @@ -275,13 +285,13 @@ export default function RunEditor({ projectId, runId }: Props) { } - onClick={() => onIncludeExcludeClick(true)} + onClick={() => handleBulkIncludeExcludeCases(true)} > Include selected cases in run } - onClick={() => onIncludeExcludeClick(false)} + onClick={() => handleBulkIncludeExcludeCases(false)} > Exclude selected cases from run