Implemented test run editor's test status update
This commit is contained in:
@@ -92,11 +92,13 @@ app.use("/runs", runDeleteRoute);
|
|||||||
// "/runcases"
|
// "/runcases"
|
||||||
const runCaseIndexRoute = require("./routes/runcases/index")(sequelize);
|
const runCaseIndexRoute = require("./routes/runcases/index")(sequelize);
|
||||||
const runCaseNewRoute = require("./routes/runcases/new")(sequelize);
|
const runCaseNewRoute = require("./routes/runcases/new")(sequelize);
|
||||||
|
const runCaseEditRoute = require("./routes/runcases/edit")(sequelize);
|
||||||
const runCaseBuldNewRoute = require("./routes/runcases/bulkNew")(sequelize);
|
const runCaseBuldNewRoute = require("./routes/runcases/bulkNew")(sequelize);
|
||||||
const runCaseDeleteRoute = require("./routes/runcases/delete")(sequelize);
|
const runCaseDeleteRoute = require("./routes/runcases/delete")(sequelize);
|
||||||
const runCaseBulkDeleteRoute = require("./routes/runcases/bulkDelete")(sequelize);
|
const runCaseBulkDeleteRoute = require("./routes/runcases/bulkDelete")(sequelize);
|
||||||
app.use("/runcases", runCaseIndexRoute);
|
app.use("/runcases", runCaseIndexRoute);
|
||||||
app.use("/runcases", runCaseNewRoute);
|
app.use("/runcases", runCaseNewRoute);
|
||||||
|
app.use("/runcases", runCaseEditRoute);
|
||||||
app.use("/runcases", runCaseBuldNewRoute);
|
app.use("/runcases", runCaseBuldNewRoute);
|
||||||
app.use("/runcases", runCaseDeleteRoute);
|
app.use("/runcases", runCaseDeleteRoute);
|
||||||
app.use("/runcases", runCaseBulkDeleteRoute);
|
app.use("/runcases", runCaseBulkDeleteRoute);
|
||||||
|
|||||||
39
backend/routes/runcases/edit.js
Normal file
39
backend/routes/runcases/edit.js
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
const express = require("express");
|
||||||
|
const router = express.Router();
|
||||||
|
const defineRunCase = require("../../models/runCases");
|
||||||
|
const { DataTypes } = require("sequelize");
|
||||||
|
|
||||||
|
module.exports = function (sequelize) {
|
||||||
|
const RunCase = defineRunCase(sequelize, DataTypes);
|
||||||
|
|
||||||
|
router.put("/", async (req, res) => {
|
||||||
|
const runId = req.query.runId;
|
||||||
|
const caseId = req.query.caseId;
|
||||||
|
const status = req.query.status;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const runCase = await RunCase.findOne({
|
||||||
|
where: {
|
||||||
|
runId: runId,
|
||||||
|
caseId: caseId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!runCase) {
|
||||||
|
return res.status(404).send("Runcase not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
await runCase.update({
|
||||||
|
runId,
|
||||||
|
caseId,
|
||||||
|
status,
|
||||||
|
});
|
||||||
|
res.json(runCase);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
res.status(500).send("Internal Server Error");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return router;
|
||||||
|
};
|
||||||
@@ -36,6 +36,7 @@ import {
|
|||||||
updateRun,
|
updateRun,
|
||||||
fetchRunCases,
|
fetchRunCases,
|
||||||
createRunCase,
|
createRunCase,
|
||||||
|
updateRunCase,
|
||||||
bulkCreateRunCases,
|
bulkCreateRunCases,
|
||||||
deleteRunCase,
|
deleteRunCase,
|
||||||
bulkDeleteRunCases,
|
bulkDeleteRunCases,
|
||||||
@@ -117,6 +118,18 @@ export default function RunEditor({ projectId, runId }: Props) {
|
|||||||
fetchCasesData();
|
fetchCasesData();
|
||||||
}, [selectedFolder]);
|
}, [selectedFolder]);
|
||||||
|
|
||||||
|
const handleChangeStatus = async (changeCaseId: number, status: number) => {
|
||||||
|
await updateRunCase(runId, changeCaseId, status);
|
||||||
|
setTestCases((prevTestCases) => {
|
||||||
|
return prevTestCases.map((testCase) => {
|
||||||
|
if (testCase.id === changeCaseId) {
|
||||||
|
return { ...testCase, runStatus: status };
|
||||||
|
}
|
||||||
|
return testCase;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const handleIncludeExcludeCase = async (
|
const handleIncludeExcludeCase = async (
|
||||||
isInclude: boolean,
|
isInclude: boolean,
|
||||||
clickedTestCaseId: number
|
clickedTestCaseId: number
|
||||||
@@ -152,7 +165,6 @@ export default function RunEditor({ projectId, runId }: Props) {
|
|||||||
} else {
|
} else {
|
||||||
keys = Array.from(selectedKeys).map(Number);
|
keys = Array.from(selectedKeys).map(Number);
|
||||||
}
|
}
|
||||||
console.log(keys)
|
|
||||||
|
|
||||||
const runCaseInfo: RunCaseInfoType[] = keys.map((caseId) => ({
|
const runCaseInfo: RunCaseInfoType[] = keys.map((caseId) => ({
|
||||||
runId: runId,
|
runId: runId,
|
||||||
@@ -170,14 +182,13 @@ export default function RunEditor({ projectId, runId }: Props) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
setTestCases((prevTestCases) => {
|
const updatedTestCases = testcases.map((testcase) => {
|
||||||
return prevTestCases.map((testCase) => {
|
if (keys.includes(testcase.id)) {
|
||||||
const isCaseIncluded = isInclude
|
return { ...testcase, isIncluded: isInclude };
|
||||||
? keys.includes(testCase.id)
|
}
|
||||||
: !keys.includes(testCase.id);
|
return testcase;
|
||||||
return { ...testCase, isIncluded: isCaseIncluded };
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
setTestCases(updatedTestCases);
|
||||||
|
|
||||||
setSelectedKeys(new Set([]));
|
setSelectedKeys(new Set([]));
|
||||||
};
|
};
|
||||||
@@ -329,6 +340,7 @@ export default function RunEditor({ projectId, runId }: Props) {
|
|||||||
cases={testcases}
|
cases={testcases}
|
||||||
selectedKeys={selectedKeys}
|
selectedKeys={selectedKeys}
|
||||||
onSelectionChange={setSelectedKeys}
|
onSelectionChange={setSelectedKeys}
|
||||||
|
onStatusChange={handleChangeStatus}
|
||||||
onIncludeCase={(includeTestId) =>
|
onIncludeCase={(includeTestId) =>
|
||||||
handleIncludeExcludeCase(true, includeTestId)
|
handleIncludeExcludeCase(true, includeTestId)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ type Props = {
|
|||||||
cases: CaseType[];
|
cases: CaseType[];
|
||||||
selectedKeys: Selection;
|
selectedKeys: Selection;
|
||||||
onSelectionChange: React.Dispatch<React.SetStateAction<Selection>>;
|
onSelectionChange: React.Dispatch<React.SetStateAction<Selection>>;
|
||||||
|
onStatusChange: (changeCaseId: number, status: number) => {};
|
||||||
onIncludeCase: (includeCaseId: number) => {};
|
onIncludeCase: (includeCaseId: number) => {};
|
||||||
onExcludeCase: (excludeCaseId: number) => {};
|
onExcludeCase: (excludeCaseId: number) => {};
|
||||||
};
|
};
|
||||||
@@ -48,6 +49,7 @@ export default function TestCaseSelector({
|
|||||||
cases,
|
cases,
|
||||||
selectedKeys,
|
selectedKeys,
|
||||||
onSelectionChange,
|
onSelectionChange,
|
||||||
|
onStatusChange,
|
||||||
onIncludeCase,
|
onIncludeCase,
|
||||||
onExcludeCase,
|
onExcludeCase,
|
||||||
}: Props) {
|
}: Props) {
|
||||||
@@ -121,7 +123,7 @@ export default function TestCaseSelector({
|
|||||||
<DropdownItem
|
<DropdownItem
|
||||||
key={index}
|
key={index}
|
||||||
startContent={renderStatusIcon(runCaseStatus.uid)}
|
startContent={renderStatusIcon(runCaseStatus.uid)}
|
||||||
onClick={() => {}}
|
onPress={() => onStatusChange(testCase.id, index)}
|
||||||
>
|
>
|
||||||
{runCaseStatus.name}
|
{runCaseStatus.name}
|
||||||
</DropdownItem>
|
</DropdownItem>
|
||||||
|
|||||||
@@ -168,13 +168,36 @@ async function createRunCase(runId: string, caseId: number) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function updateRunCase(runId: string, caseId: number, status: number) {
|
||||||
|
const fetchOptions = {
|
||||||
|
method: "PUT",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const url = `${apiServer}/runcases?runId=${runId}&caseId=${caseId}&status=${status}`;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch(url, fetchOptions);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`HTTP error! Status: ${response.status}`);
|
||||||
|
}
|
||||||
|
const data = await response.json();
|
||||||
|
return data;
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error("Error updating runcase:", error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function bulkCreateRunCases(runCaseInfo: RunCaseInfoType[]) {
|
async function bulkCreateRunCases(runCaseInfo: RunCaseInfoType[]) {
|
||||||
const fetchOptions = {
|
const fetchOptions = {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
},
|
},
|
||||||
body: JSON.stringify(runCaseInfo)
|
body: JSON.stringify(runCaseInfo),
|
||||||
};
|
};
|
||||||
|
|
||||||
const url = `${apiServer}/runcases/bulknew`;
|
const url = `${apiServer}/runcases/bulknew`;
|
||||||
@@ -219,7 +242,7 @@ async function bulkDeleteRunCases(runCaseInfo: RunCaseInfoType[]) {
|
|||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
},
|
},
|
||||||
body: JSON.stringify(runCaseInfo)
|
body: JSON.stringify(runCaseInfo),
|
||||||
};
|
};
|
||||||
|
|
||||||
const url = `${apiServer}/runcases/bulkdelete`;
|
const url = `${apiServer}/runcases/bulkdelete`;
|
||||||
@@ -243,6 +266,7 @@ export {
|
|||||||
deleteRun,
|
deleteRun,
|
||||||
fetchRunCases,
|
fetchRunCases,
|
||||||
createRunCase,
|
createRunCase,
|
||||||
|
updateRunCase,
|
||||||
bulkCreateRunCases,
|
bulkCreateRunCases,
|
||||||
deleteRunCase,
|
deleteRunCase,
|
||||||
bulkDeleteRunCases,
|
bulkDeleteRunCases,
|
||||||
|
|||||||
Reference in New Issue
Block a user