353 lines
9.2 KiB
TypeScript
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,
|
|
};
|