From 4122e475a1b500c993eb77aa5ff694d0ed145651 Mon Sep 17 00:00:00 2001 From: Takeshi Kimata <117462761+kimatata@users.noreply.github.com> Date: Sat, 23 Mar 2024 23:17:40 +0900 Subject: [PATCH] Impremented test case create button and process --- backend/routes/cases/new.js | 43 +++++++++++++++-- .../folders/[folderId]/cases/page.tsx | 47 ++++++++++++++++++- .../[folderId]/cases/test-case-table.tsx | 5 +- 3 files changed, 89 insertions(+), 6 deletions(-) diff --git a/backend/routes/cases/new.js b/backend/routes/cases/new.js index 281a8a2..35f7f92 100644 --- a/backend/routes/cases/new.js +++ b/backend/routes/cases/new.js @@ -3,16 +3,53 @@ const router = express.Router(); const defineCase = require("../../models/cases"); const { DataTypes } = require("sequelize"); +const requiredFields = [ + "title", + "state", + "priority", + "type", + "automationStatus", + "template", + "folderId", +]; + +function isEmpty(value) { + if (value === null || value === undefined) { + return true; + } else { + return false; + } +} + module.exports = function (sequelize) { const Case = defineCase(sequelize, DataTypes); router.post("/", async (req, res) => { try { - const { title, state, priority, type, automationStatus, description, template, preConditions, expectedResults, folderId } = req.body; - if (!title || !state || !priority || !type || !automationStatus || !template || !folderId) { - return res.status(400).json({ error: "Title, state, priority, type, automationStatus, template, and folderId are required" }); + if ( + requiredFields.some((field) => { + return isEmpty(req.body[field]); + }) + ) { + return res.status(400).json({ + error: + "Title, state, priority, type, automationStatus, template, and folderId are required", + }); } + const { + title, + state, + priority, + type, + automationStatus, + description, + template, + preConditions, + expectedResults, + folderId, + } = req.body; + const newCase = await Case.create({ title, state, diff --git a/frontend/app/projects/[projectId]/folders/[folderId]/cases/page.tsx b/frontend/app/projects/[projectId]/folders/[folderId]/cases/page.tsx index dbe23b4..a34dc09 100644 --- a/frontend/app/projects/[projectId]/folders/[folderId]/cases/page.tsx +++ b/frontend/app/projects/[projectId]/folders/[folderId]/cases/page.tsx @@ -31,6 +31,43 @@ async function fetchCases(url) { } } +async function fetchCreateCase(folderId: string) { + const newCase = { + title: "untitled case", + state: 0, + priority: 2, + type: 0, + automationStatus: 0, + description: "", + template: 0, + preConditions: "", + expectedResults: "", + folderId: folderId, + }; + + const fetchOptions = { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(newCase), + }; + + const url = `${apiServer}/cases`; + + 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) { + console.error("Error creating case:", error); + throw error; + } +} + async function fetchDeleteCase(caseId: number) { const fetchOptions = { method: "DELETE", @@ -47,7 +84,7 @@ async function fetchDeleteCase(caseId: number) { throw new Error(`HTTP error! Status: ${response.status}`); } } catch (error) { - console.error("Error deleting project:", error); + console.error("Error deleting case:", error); throw error; } } @@ -73,6 +110,13 @@ export default function Page({ fetchDataEffect(); }, []); + const handleCreateCase = async (folderId: string) => { + const newCase = await fetchCreateCase(folderId); + const updateCases = [...cases]; + updateCases.push(newCase); + setCases(updateCases); + }; + const handleDeleteCase = async (caseId: number) => { await fetchDeleteCase(caseId); const data = await fetchCases(url); @@ -84,6 +128,7 @@ export default function Page({ handleCreateCase(params.folderId)} onDeleteCase={handleDeleteCase} /> diff --git a/frontend/app/projects/[projectId]/folders/[folderId]/cases/test-case-table.tsx b/frontend/app/projects/[projectId]/folders/[folderId]/cases/test-case-table.tsx index a024726..58afc18 100644 --- a/frontend/app/projects/[projectId]/folders/[folderId]/cases/test-case-table.tsx +++ b/frontend/app/projects/[projectId]/folders/[folderId]/cases/test-case-table.tsx @@ -46,10 +46,11 @@ type Case = { type Props = { projectId: boolean; cases: Case[]; + onCreateCase: () => void; onDeleteCase: (caseId: number) => void; }; -export default function TestCaseTable({ projectId, cases, onDeleteCase }: Props) { +export default function TestCaseTable({ projectId, cases, onCreateCase, onDeleteCase }: Props) { const [selectedKeys, setSelectedKeys] = useState(new Set([])); const [sortDescriptor, setSortDescriptor] = useState({ column: "id", @@ -141,7 +142,7 @@ export default function TestCaseTable({ projectId, cases, onDeleteCase }: Props) startContent={} size="sm" color="primary" - onClick={() => console.log("create")} + onClick={onCreateCase} > New Test Case