From 4923c40e99b76147815850d29631a81ae153b2ab Mon Sep 17 00:00:00 2001 From: Maximilian Link Date: Fri, 25 Jul 2025 16:48:21 +0200 Subject: [PATCH] log urls as well --- src/tools/client.ts | 3 ++- src/tools/discoveries.ts | 7 +++++++ src/tools/test-cases.ts | 14 ++++++++++---- src/tools/test-reports.ts | 12 ++++++++++-- src/tools/test-targets.ts | 13 +++++++++++-- src/url.ts | 34 ++++++++++++++++++++++++++++++++++ 6 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 src/url.ts diff --git a/src/tools/client.ts b/src/tools/client.ts index 4279cec..2a015f4 100644 --- a/src/tools/client.ts +++ b/src/tools/client.ts @@ -2,7 +2,8 @@ import type { components, paths } from "../api"; // generated by openapi-typescr import createClient, { Middleware } from "openapi-fetch"; import { loadConfig } from "../config"; -const BASE_URL = process.env.OCTOMIND_API_URL || "https://app.octomind.dev/api"; +export const BASE_URL = + process.env.OCTOMIND_API_URL || "https://app.octomind.dev/api"; type ErrorResponse = components["schemas"]["ZodResponse"] | string | undefined; const client = createClient({ baseUrl: BASE_URL }); diff --git a/src/tools/discoveries.ts b/src/tools/discoveries.ts index 037c37b..585e10b 100644 --- a/src/tools/discoveries.ts +++ b/src/tools/discoveries.ts @@ -1,4 +1,5 @@ import type { components } from "../api"; // generated by openapi-typescript +import { getUrl } from "../url"; import { client, handleError, ListOptions, logJson } from "./client"; export type CreateDiscoveryBody = @@ -44,6 +45,12 @@ export const createDiscovery = async ( } console.log("Discovery created successfully!"); + console.log( + `${await getUrl({ + testCaseId: response.testCaseId ?? "", + entityType: "discovery", + })}`, + ); console.log(`Discovery ID: ${response.discoveryId}`); console.log(`Test Case ID: ${response.testCaseId}`); }; diff --git a/src/tools/test-cases.ts b/src/tools/test-cases.ts index 857eec4..b5061f6 100644 --- a/src/tools/test-cases.ts +++ b/src/tools/test-cases.ts @@ -1,4 +1,5 @@ import type { paths, components } from "../api"; // generated by openapi-typescript +import { getUrl } from "../url"; import { client, handleError, ListOptions, logJson } from "./client"; export type TestCaseResponse = components["schemas"]["TestCaseResponse"]; @@ -105,14 +106,19 @@ export const listTestCases = async ( } console.log("Test Cases:"); - testCases.forEach((testCase, idx) => { + for (let idx = 0; idx < testCases.length; idx++) { + const testCase = testCases[idx]; const idxString = `${idx + 1}. `.padEnd( testCases.length.toString().length + 2, ); const paddingString = " ".repeat(idxString.length); console.log(`${idxString}Description: ${testCase.description}`); console.log(`${paddingString}ID: ${testCase.id}`); - console.log(`${paddingString}Created At: ${testCase.createdAt}`); - console.log(`${paddingString}Updated At: ${testCase.updatedAt}`); - }); + console.log( + `${paddingString}${await getUrl({ + testCaseId: testCase.id, + entityType: "test-case", + })}`, + ); + } }; diff --git a/src/tools/test-reports.ts b/src/tools/test-reports.ts index 49436c1..374e746 100644 --- a/src/tools/test-reports.ts +++ b/src/tools/test-reports.ts @@ -1,4 +1,5 @@ import type { paths, components } from "../api"; // generated by openapi-typescript +import { getUrl } from "../url"; import { client, handleError, ListOptions, logJson } from "./client"; export type ExecuteTestsBody = @@ -84,14 +85,21 @@ export const listTestReport = async ( if ((response.testResults ?? []).length > 0) { console.log("\nTest Results:"); - (response.testResults ?? []).forEach((result) => { + for (const result of response.testResults ?? []) { console.log(`- Test ${result.testCaseId}: ${result.status}`); + console.log( + ` ${await getUrl({ + testReportId: options.testReportId, + testResultId: result.id ?? "", + entityType: "test-result", + })}`, + ); if (result.errorMessage) { console.log(` Error: ${result.errorMessage}`); } if (result.traceUrl) { console.log(` Trace: ${result.traceUrl}`); } - }); + } } }; diff --git a/src/tools/test-targets.ts b/src/tools/test-targets.ts index eec6c0e..01df768 100644 --- a/src/tools/test-targets.ts +++ b/src/tools/test-targets.ts @@ -1,3 +1,4 @@ +import { getUrl } from "../url"; import { client, handleError, ListOptions, logJson } from "./client"; export const getTestTargets = async () => { @@ -21,12 +22,20 @@ export const listTestTargets = async (options: ListOptions): Promise => { } console.log("Test Targets:"); - testTargets.forEach((testTarget, idx) => { + + for (let idx = 0; idx < testTargets.length; idx++) { + const testTarget = testTargets[idx]; const idxString = `${idx + 1}. `.padEnd( testTargets.length.toString().length + 2, ); const paddingString = " ".repeat(idxString.length); console.log(`${idxString}ID: ${testTarget.id}`); console.log(`${paddingString}App: ${testTarget.app}`); - }); + console.log( + `${paddingString}${await getUrl({ + testTargetId: testTarget.id, + entityType: "test-target", + })}`, + ); + } }; diff --git a/src/url.ts b/src/url.ts new file mode 100644 index 0000000..25aa7e7 --- /dev/null +++ b/src/url.ts @@ -0,0 +1,34 @@ +import { loadConfig } from "./config"; +import { BASE_URL } from "./tools/client"; + +export const getUrl = async ( + input: + | { testTargetId: string; entityType: "test-target" } + | { testCaseId: string; entityType: "test-case" } + | { testReportId: string; entityType: "test-report" } + | { + testReportId: string; + testResultId: string; + entityType: "test-result"; + } + | { testCaseId: string; entityType: "discovery" }, +): Promise => { + const relevantBaseUrl = new URL(BASE_URL).origin; + const config = await loadConfig(); + const testTargetId = config.testTargetId; + if (!testTargetId) { + throw new Error("Test target id is not set"); + } + switch (input.entityType) { + case "test-case": + return `${relevantBaseUrl}/testtargets/${testTargetId}/testcases?testCaseId=${input.testCaseId}`; + case "test-target": + return `${relevantBaseUrl}/testtargets/${testTargetId}`; + case "test-report": + return `${relevantBaseUrl}/testtargets/${testTargetId}/testreports/${input.testReportId}`; + case "test-result": + return `${relevantBaseUrl}/testtargets/${testTargetId}/testreports/${input.testReportId}/testresults/${input.testResultId}`; + case "discovery": + return `${relevantBaseUrl}/testtargets/${testTargetId}/testcases/${input.testCaseId}`; + } +};