Files
pp-tcms/frontend/src/app/[locale]/projects/[projectId]/runs/runsControl.ts
2025-05-06 20:31:47 +09:00

353 lines
9.2 KiB
TypeScript

import { CaseType } from '@/types/case';
import { RunType, RunCaseType } from '@/types/run';
import Config from '@/config/config';
import { testRunCaseStatus } from '@/config/selection';
const apiServer = Config.apiServer;
async function fetchRun(jwt: string, runId: number) {
const url = `${apiServer}/runs/${runId}`;
try {
const response = await fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${jwt}`,
},
});
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error: any) {
console.error('Error fetching data:', error.message);
}
}
async function fetchRuns(jwt: string, projectId: number) {
const url = `${apiServer}/runs?projectId=${projectId}`;
try {
const response = await fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${jwt}`,
},
});
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error: any) {
console.error('Error fetching data:', error.message);
}
}
async function createRun(jwt: string, projectId: number, name: string, description: string) {
const newTestRun = {
name,
configurations: 0,
description,
state: 0,
};
const fetchOptions = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${jwt}`,
},
body: JSON.stringify(newTestRun),
};
const url = `${apiServer}/runs?projectId=${projectId}`;
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 creating new test run:', error);
throw error;
}
}
async function updateRun(jwt: string, updateTestRun: RunType) {
const fetchOptions = {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${jwt}`,
},
body: JSON.stringify(updateTestRun),
};
const url = `${apiServer}/runs/${updateTestRun.id}`;
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 run:', error);
throw error;
}
}
async function deleteRun(jwt: string, runId: number) {
const fetchOptions = {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${jwt}`,
},
};
const url = `${apiServer}/runs/${runId}`;
try {
const response = await fetch(url, fetchOptions);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
} catch (error: any) {
console.error('Error deleting run:', error);
throw error;
}
}
async function exportRun(jwt: string, runId: number, type: string) {
if (type !== 'xml' && type !== 'json' && type !== 'csv') {
console.error('export type error. type:', type);
return;
}
const url = `${apiServer}/runs/download/${runId}?type=${type}`;
try {
const response = await fetch(url, {
method: 'GET',
headers: {
Authorization: `Bearer ${jwt}`,
},
});
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const blob = await response.blob();
const objectUrl = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = objectUrl;
a.download = `run_${runId}.${type}`;
document.body.appendChild(a);
a.click();
a.remove();
window.URL.revokeObjectURL(objectUrl);
} catch (error: any) {
console.error('Error fetching data:', error.message);
}
}
async function fetchRunCases(jwt: string, runId: number) {
const url = `${apiServer}/runcases?runId=${runId}`;
try {
const response = await fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${jwt}`,
},
});
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error: any) {
console.error('Error fetching data:', error.message);
}
}
function changeStatus(changeCaseId: number, newStatus: number, currentTestCases: CaseType[]): CaseType[] {
const updatedTestCases = [...currentTestCases];
const found = updatedTestCases.find((testCase) => testCase.id === changeCaseId);
if (found && found.RunCases && testRunCaseStatus.length > 0) {
const runCase = found.RunCases[0];
if (runCase.editState === 'notChanged') {
runCase.status = newStatus;
runCase.editState = 'changed';
} else if (runCase.editState === 'changed') {
runCase.status = newStatus;
} else if (runCase.editState === 'new') {
runCase.status = newStatus;
} else if (runCase.editState === 'deleted') {
// do nothing
}
}
return updatedTestCases;
}
function includeExcludeTestCases(
isInclude: boolean,
keys: number[],
runId: number,
currentTestCases: CaseType[]
): CaseType[] {
const updatedTestCases = [...currentTestCases];
if (isInclude) {
keys.forEach((caseId) => {
const targetCase = updatedTestCases.find((testCase) => testCase.id === caseId);
if (!targetCase) {
console.error('failed to find target case');
return;
}
if (targetCase.RunCases && targetCase.RunCases.length > 0) {
// already included
if (targetCase.RunCases[0].editState === 'notChanged') {
// do nothing
} else if (targetCase.RunCases[0].editState === 'changed') {
// do nothing
} else if (targetCase.RunCases[0].editState === 'new') {
// do nothing
} else if (targetCase.RunCases[0].editState === 'deleted') {
if (targetCase.RunCases[0].id > 0) {
// when id is valid (already included)
targetCase.RunCases[0].editState = 'changed';
} else {
// when id is invalid (has not included)
targetCase.RunCases[0].editState = 'new';
}
}
} else {
const newRunCase = {
id: -1,
runId: runId,
status: 0,
editState: 'new',
} as RunCaseType;
targetCase.RunCases = [newRunCase];
}
});
} else {
keys.forEach((caseId) => {
const targetCase = updatedTestCases.find((testCase) => testCase.id === caseId);
if (!targetCase) {
console.error('failed to find target case');
return;
}
if (!targetCase.RunCases || targetCase.RunCases.length == 0) {
// already excluded
} else {
if (targetCase.RunCases[0].editState === 'notChanged') {
targetCase.RunCases[0].editState = 'deleted';
} else if (targetCase.RunCases[0].editState === 'changed') {
targetCase.RunCases[0].editState = 'deleted';
} else if (targetCase.RunCases[0].editState === 'new') {
targetCase.RunCases[0].editState = 'deleted';
} else if (targetCase.RunCases[0].editState === 'deleted') {
// do nothing
}
}
});
}
return updatedTestCases;
}
async function updateRunCases(jwt: string, runId: number, testCases: CaseType[]) {
const runCases: RunCaseType[] = [];
testCases.forEach((itr) => {
if (itr.RunCases && itr.RunCases.length > 0) {
runCases.push({
id: itr.RunCases[0].id,
caseId: itr.id,
runId: runId,
status: itr.RunCases[0].status,
editState: itr.RunCases[0].editState,
createdAt: '0',
updatedAt: '0',
});
}
});
const fetchOptions = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${jwt}`,
},
body: JSON.stringify(runCases),
};
const url = `${apiServer}/runcases/update?runId=${runId}`;
try {
const response = await fetch(url, fetchOptions);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
return await response.json();
} catch (error: any) {
console.error('Error deleting project:', error);
throw error;
}
}
async function fetchProjectCases(jwt: string, projectId: number) {
const url = `${apiServer}/cases/byproject?projectId=${projectId}`;
try {
const response = await fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${jwt}`,
},
});
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error: any) {
console.error('Error fetching data:', error.message);
}
}
export {
fetchRun,
fetchRuns,
createRun,
updateRun,
deleteRun,
exportRun,
fetchRunCases,
changeStatus,
includeExcludeTestCases,
updateRunCases,
fetchProjectCases,
};