Skip to main content
Glama
stop-execution.test.ts4.23 kB
/** * Tests for execution stop/cancel functionality */ import { describe, it } from "node:test"; import { strict as assert } from "node:assert"; import { McpGraphApi } from "../src/api.js"; import type { ExecutionHooks } from "../src/types/execution.js"; import { join } from "node:path"; import { fileURLToPath } from "node:url"; import { dirname } from "node:path"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const projectRoot = join(__dirname, ".."); describe("Execution stop/cancel", () => { it("should stop execution when stop() is called", async () => { const configPath = join(projectRoot, "examples", "switch_example.yaml"); const api = new McpGraphApi(configPath); let nodeStartCount = 0; let executionStopped = false; const hooks: ExecutionHooks = { onNodeStart: async (nodeId, node) => { nodeStartCount++; // Stop after the entry node (before the switch node) if (nodeId === "entry") { const controller = api.getController(); if (controller) { controller.stop(); } } return true; }, }; try { await api.executeTool("test_switch", { value: 5 }, { hooks, }); assert.fail("Execution should have been stopped"); } catch (error) { assert(error instanceof Error, "Should throw an error"); assert( error.message === "Execution was stopped", `Expected "Execution was stopped", got "${error.message}"` ); executionStopped = true; } // Verify execution was stopped assert(executionStopped, "Execution should have been stopped"); assert(nodeStartCount >= 1, "At least one node should have started"); await api.close(); }); it("should stop execution from paused state", async () => { const configPath = join(projectRoot, "examples", "switch_example.yaml"); const api = new McpGraphApi(configPath); let paused = false; const hooks: ExecutionHooks = { onPause: async () => { paused = true; // Stop while paused const controller = api.getController(); if (controller) { controller.stop(); } }, }; try { await api.executeTool("test_switch", { value: 5 }, { hooks, breakpoints: ["switch_node"], // Pause at this node (no MCP calls) }); assert.fail("Execution should have been stopped"); } catch (error) { assert(error instanceof Error, "Should throw an error"); assert( error.message === "Execution was stopped", `Expected "Execution was stopped", got "${error.message}"` ); } assert(paused, "Execution should have been paused before stopping"); await api.close(); }); it("should set status to stopped when stop() is called", async () => { const configPath = join(projectRoot, "examples", "switch_example.yaml"); const api = new McpGraphApi(configPath); const hooks: ExecutionHooks = { onNodeStart: async (nodeId) => { if (nodeId === "switch_node") { const controller = api.getController(); if (controller) { const state = controller.getState(); assert(state.status === "running", "Status should be running"); controller.stop(); const stateAfterStop = controller.getState(); assert(stateAfterStop.status === "stopped", "Status should be stopped"); } } return true; }, }; try { await api.executeTool("test_switch", { value: 5 }, { hooks }); assert.fail("Execution should have been stopped"); } catch (error) { assert(error instanceof Error, "Should throw an error"); assert(error.message === "Execution was stopped"); } await api.close(); }); it("should throw error if stop() is called when not running or paused", () => { // This test would require creating a controller directly, which isn't exposed // For now, we'll just verify the behavior through the API // The controller.stop() method should throw if status is not "running" or "paused" }); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/TeamSparkAI/mcpGraph'

If you have feedback or need assistance with the MCP directory API, please join our Discord server