@smartbear/mcp
Version:
MCP server for interacting SmartBear Products
309 lines (308 loc) • 11.9 kB
JavaScript
import { QMETRY_PATHS } from "../config/rest-endpoints.js";
import { DEFAULT_BULK_UPDATE_EXECUTION_STATUS_PAYLOAD, DEFAULT_CREATE_TESTSUITE_PAYLOAD, DEFAULT_FETCH_EXECUTIONS_BY_TESTSUITE_PAYLOAD, DEFAULT_FETCH_LINKED_ISSUES_BY_TESTCASE_RUN_PAYLOAD, DEFAULT_FETCH_TESTCASE_RUNS_BY_TESTSUITE_RUN_PAYLOAD, DEFAULT_FETCH_TESTCASES_BY_TESTSUITE_PAYLOAD, DEFAULT_FETCH_TESTSUITES_FOR_TESTCASE_PAYLOAD, DEFAULT_FETCH_TESTSUITES_PAYLOAD, DEFAULT_LINKED_PLATFORMS_TO_TESTSUITE_PAYLOAD, DEFAULT_LINKED_TESTCASE_TO_TESTSUITE_PAYLOAD, DEFAULT_REQLINKED_TESTCASE_TO_TESTSUITE_PAYLOAD, DEFAULT_UPDATE_TESTSUITE_PAYLOAD, } from "../types/testsuite.js";
import { qmetryRequest } from "./api/client-api.js";
import { resolveDefaults } from "./utils.js";
/**
* Create test suites.
* @throws If `parentFolderId` or `name` are missing/invalid.
*/
export async function createTestSuites(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
const body = {
...DEFAULT_CREATE_TESTSUITE_PAYLOAD,
...payload,
};
if (typeof body.parentFolderId !== "string") {
throw new Error("[createTestSuites] Missing or invalid required parameter: 'parentFolderId'.");
}
if (typeof body.name !== "string") {
throw new Error("[createTestSuites] Missing or invalid required parameter: 'name'.");
}
return qmetryRequest({
method: "POST",
path: QMETRY_PATHS.TESTSUITE.CREATE_UPDATE_TS,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body,
});
}
/**
* Update test suites.
* @throws If `id` or `entityKey` or `TsFolderID` are missing/invalid.
*/
export async function updateTestSuite(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
const body = {
...DEFAULT_UPDATE_TESTSUITE_PAYLOAD,
...payload,
};
if (typeof body.id !== "number") {
throw new Error("[updateTestSuite] Missing or invalid required parameter: 'id'.");
}
if (typeof body.entityKey !== "string") {
throw new Error("[updateTestSuite] Missing or invalid required parameter: 'entityKey'.");
}
if (typeof body.TsFolderID !== "number") {
throw new Error("[updateTestSuite] Missing or invalid required parameter: 'TsFolderID'.");
}
return qmetryRequest({
method: "PUT",
path: QMETRY_PATHS.TESTSUITE.CREATE_UPDATE_TS,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body,
});
}
/**
* Fetches a list of test suites.
* @throws If `viewId` or `folderPath` are missing/invalid.
*/
export async function fetchTestSuites(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
const body = {
...DEFAULT_FETCH_TESTSUITES_PAYLOAD,
...payload,
};
if (typeof body.viewId !== "number") {
throw new Error("[fetchTestSuites] Missing or invalid required parameter: 'viewId'.");
}
if (typeof body.folderPath !== "string") {
throw new Error("[fetchTestSuites] Missing or invalid required parameter: 'folderPath'.");
}
return qmetryRequest({
method: "POST",
path: QMETRY_PATHS.TESTSUITE.GET_TS_LIST,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body,
});
}
/**
* Fetches test suites to link with test case.
* @throws If `tsFolderID` is missing/invalid.
*/
export async function fetchTestSuitesForTestCase(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
const body = {
...DEFAULT_FETCH_TESTSUITES_FOR_TESTCASE_PAYLOAD,
...payload,
};
if (typeof body.tsFolderID !== "number") {
throw new Error("[fetchTestSuitesForTestCase] Missing or invalid required parameter: 'tsFolderID'.");
}
return qmetryRequest({
method: "POST",
path: QMETRY_PATHS.TESTSUITE.GET_TS_LIST_FOR_TC,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body,
});
}
/**
* Fetches test cases linked to a given test suite.
* @throws If `tsID` is missing/invalid.
*/
export async function fetchTestCasesByTestSuite(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
const body = {
...DEFAULT_FETCH_TESTCASES_BY_TESTSUITE_PAYLOAD,
...payload,
};
if (typeof body.tsID !== "number") {
throw new Error("[fetchTestCasesByTestSuite] Missing or invalid required parameter: 'tsID'.");
}
return qmetryRequest({
method: "POST",
path: QMETRY_PATHS.TESTSUITE.GET_TESTCASES_BY_TESTSUITE,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body,
});
}
/**
* Fetches executions for a given test suite.
* @throws If `tsID` is missing/invalid.
*/
export async function fetchExecutionsByTestSuite(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
const body = {
...DEFAULT_FETCH_EXECUTIONS_BY_TESTSUITE_PAYLOAD,
...payload,
};
if (typeof body.tsID !== "number") {
throw new Error("[fetchExecutionsByTestSuite] Missing or invalid required parameter: 'tsID'.");
}
return qmetryRequest({
method: "POST",
path: QMETRY_PATHS.TESTSUITE.GET_EXECUTIONS_BY_TESTSUITE,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body,
});
}
/**
* Fetches test case runs for a given test suite run ID.
* @throws If `tsrunID` or `viewId` is missing/invalid.
*/
export async function fetchTestCaseRunsByTestSuiteRun(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
const body = {
...DEFAULT_FETCH_TESTCASE_RUNS_BY_TESTSUITE_RUN_PAYLOAD,
...payload,
};
if (typeof body.tsrunID !== "string" || !body.tsrunID) {
throw new Error("[fetchTestCaseRunsByTestSuiteRun] Missing or invalid required parameter: 'tsrunID'.");
}
if (typeof body.viewId !== "number") {
throw new Error("[fetchTestCaseRunsByTestSuiteRun] Missing or invalid required parameter: 'viewId'.");
}
return qmetryRequest({
method: "POST",
path: QMETRY_PATHS.TESTSUITE.GET_TESTCASE_RUNS_BY_TESTSUITE_RUN,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body,
});
}
/**
* Fetches linked issues for a specific test case run.
* @throws If `entityId` is missing/invalid.
*/
export async function fetchLinkedIssuesByTestCaseRun(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
const body = {
...DEFAULT_FETCH_LINKED_ISSUES_BY_TESTCASE_RUN_PAYLOAD,
...payload,
};
if (typeof body.entityId !== "number") {
throw new Error("[fetchLinkedIssuesByTestCaseRun] Missing or invalid required parameter: 'entityId'.");
}
return qmetryRequest({
method: "POST",
path: QMETRY_PATHS.TESTSUITE.GET_LINKED_ISSUES_BY_TESTCASE_RUN,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body,
});
}
/**
* Link test cases to a test suite.
* @throws If `tcID` or `tcVersionID` are missing/invalid.
*/
export async function linkTestCasesToTestSuite(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
const body = {
...DEFAULT_LINKED_TESTCASE_TO_TESTSUITE_PAYLOAD,
...payload,
};
if (typeof body.tsID !== "number") {
throw new Error("[linkTestCasesToTestSuite] Missing or invalid required parameter: 'tsID'.");
}
if (!body.tcvdIDs) {
throw new Error("[linkTestCasesToTestSuite] 'tcvdIDs' must be provided.");
}
return qmetryRequest({
method: "PUT",
path: QMETRY_PATHS.TESTSUITE.LINKED_TESTCASES_TO_TESTSUITE,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body,
});
}
/**
* Requirements Linked test cases to a test suite.
* @throws If `tcID` or `rqVersionIds` are missing/invalid.
*/
export async function reqLinkedTestCasesToTestSuite(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
const body = {
...DEFAULT_REQLINKED_TESTCASE_TO_TESTSUITE_PAYLOAD,
...payload,
};
if (typeof body.tsID !== "number") {
throw new Error("[reqLinkedTestCasesToTestSuite] Missing or invalid required parameter: 'tsID'.");
}
if (!body.tcvdIDs) {
throw new Error("[reqLinkedTestCasesToTestSuite] 'tcvdIDs' must be provided.");
}
return qmetryRequest({
method: "PUT",
path: QMETRY_PATHS.TESTSUITE.LINKED_TESTCASES_TO_TESTSUITE,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body,
});
}
/**
* Link platforms to a test suite.
* @throws If `qmTsId` or `qmPlatformId` are missing/invalid.
*/
export async function linkPlatformsToTestSuite(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
const body = {
...DEFAULT_LINKED_PLATFORMS_TO_TESTSUITE_PAYLOAD,
...payload,
};
if (typeof body.qmTsId !== "number") {
throw new Error("[linkPlatformsToTestSuite] Missing or invalid required parameter: 'qmTsId'.");
}
if (!body.qmPlatformId ||
typeof body.qmPlatformId !== "string" ||
body.qmPlatformId.trim().length === 0) {
throw new Error("[linkPlatformsToTestSuite] Missing or invalid required parameter: 'qmPlatformId'. It must be a non-empty comma-separated string of Platform IDs.");
}
return qmetryRequest({
method: "PUT",
path: QMETRY_PATHS.TESTSUITE.LINK_PLATFORMS_TO_TESTSUITE,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body,
});
}
/**
* Bulk update execution status for test case runs.
* @throws If `entityIDs`, `entityType`, `qmTsRunId`, or `runStatusID` are missing/invalid.
*/
export async function bulkUpdateExecutionStatus(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
const body = {
...DEFAULT_BULK_UPDATE_EXECUTION_STATUS_PAYLOAD,
...payload,
};
if (!body.entityIDs ||
typeof body.entityIDs !== "string" ||
body.entityIDs.trim().length === 0) {
throw new Error("[bulkUpdateExecutionStatus] Missing or invalid required parameter: 'entityIDs'. It must be a non-empty comma-separated string of Test Case Run IDs.");
}
if (!body.entityType ||
(body.entityType !== "TCR" && body.entityType !== "TCSR")) {
throw new Error("[bulkUpdateExecutionStatus] Missing or invalid required parameter: 'entityType'. Must be 'TCR' or 'TCSR'.");
}
if (!body.qmTsRunId ||
typeof body.qmTsRunId !== "string" ||
body.qmTsRunId.trim().length === 0) {
throw new Error("[bulkUpdateExecutionStatus] Missing or invalid required parameter: 'qmTsRunId'. It must be a non-empty string.");
}
if (typeof body.runStatusID !== "number") {
throw new Error("[bulkUpdateExecutionStatus] Missing or invalid required parameter: 'runStatusID'. It must be a number.");
}
return qmetryRequest({
method: "PUT",
path: QMETRY_PATHS.TESTSUITE.BULK_UPDATE_EXECUTION_STATUS,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body,
});
}