Skip to content

Commit 3062a66

Browse files
author
Eric Oliver
committed
finally! friggin api success. proof of life
1 parent c1d0b57 commit 3062a66

File tree

1 file changed

+172
-71
lines changed

1 file changed

+172
-71
lines changed

test-api.js

Lines changed: 172 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ let host = "localhost"
2121
let port = 3000
2222
let task = "Test task from API client"
2323
let showHelp = false
24+
let verbose = false
2425

2526
for (let i = 0; i < args.length; i++) {
2627
const arg = args[i]
@@ -31,6 +32,8 @@ for (let i = 0; i < args.length; i++) {
3132
host = args[++i] || host
3233
} else if (arg === "--port") {
3334
port = parseInt(args[++i]) || port
35+
} else if (arg === "--verbose" || arg === "-v") {
36+
verbose = true
3437
} else if (arg === "--help" || arg === "-h") {
3538
showHelp = true
3639
} else if (!arg.startsWith("--")) {
@@ -45,14 +48,15 @@ if (showHelp) {
4548
Usage: node test-api.js [options] "Your task here"
4649
4750
Options:
48-
--stream Test SSE streaming endpoint (default: false)
49-
--host API host (default: localhost)
50-
--port API port (default: 3000)
51-
--help Show this help
51+
--stream Test SSE streaming endpoint (default: false)
52+
--verbose Show full JSON payload (default: false)
53+
--host API host (default: localhost)
54+
--port API port (default: 3000)
55+
--help Show this help
5256
5357
Examples:
5458
node test-api.js --stream "where does the vscode extension code store it's mode config files?"
55-
node test-api.js --stream "list your MCP servers"
59+
node test-api.js --verbose --stream "list your MCP servers"
5660
node test-api.js --stream "Write a React component"
5761
node test-api.js --host api.example.com --port 8080 "Debug this code"
5862
`)
@@ -61,10 +65,13 @@ Examples:
6165

6266
const baseUrl = `http://${host}:${port}`
6367

64-
console.log(`🚀 Testing Roo Code Agent API at ${baseUrl}`)
65-
console.log(`📝 Task: "${task}"`)
66-
console.log(`🌊 Streaming: ${useStream ? "enabled" : "disabled"}`)
67-
console.log("")
68+
if (verbose) {
69+
console.log(`🚀 Testing Roo Code Agent API at ${baseUrl}`)
70+
console.log(`📝 Task: "${task}"`)
71+
console.log(`🌊 Streaming: ${useStream ? "enabled" : "disabled"}`)
72+
console.log(`📊 Verbose: ${verbose ? "enabled" : "disabled"}`)
73+
console.log("")
74+
}
6875

6976
/**
7077
* Make HTTP request helper
@@ -103,11 +110,15 @@ function makeRequest(options, data = null) {
103110
* Test basic endpoints
104111
*/
105112
async function testBasicEndpoints() {
106-
console.log("🔍 Testing basic endpoints...\n")
113+
if (verbose) {
114+
console.log("🔍 Testing basic endpoints...\n")
115+
}
107116

108117
// Test health endpoint
109118
try {
110-
console.log("📊 GET /health")
119+
if (verbose) {
120+
console.log("📊 GET /health")
121+
}
111122
const healthResponse = await makeRequest({
112123
hostname: host,
113124
port: port,
@@ -116,22 +127,34 @@ async function testBasicEndpoints() {
116127
headers: { "Content-Type": "application/json" },
117128
})
118129

119-
console.log(` Status: ${healthResponse.statusCode}`)
120-
if (healthResponse.statusCode === 200) {
121-
const health = JSON.parse(healthResponse.body)
122-
console.log(` Health: ${health.status}`)
123-
console.log(` Timestamp: ${health.timestamp}`)
130+
if (verbose) {
131+
console.log(` Status: ${healthResponse.statusCode}`)
132+
if (healthResponse.statusCode === 200) {
133+
const health = JSON.parse(healthResponse.body)
134+
console.log(` Health: ${health.status}`)
135+
console.log(` Timestamp: ${health.timestamp}`)
136+
} else {
137+
console.log(` Error: ${healthResponse.body}`)
138+
}
139+
console.log("")
124140
} else {
125-
console.log(` Error: ${healthResponse.body}`)
141+
if (healthResponse.statusCode !== 200) {
142+
console.log(`❌ Health check failed: ${healthResponse.body}`)
143+
}
126144
}
127-
console.log("")
128145
} catch (error) {
129-
console.log(` ❌ Failed: ${error.message}\n`)
146+
if (verbose) {
147+
console.log(` ❌ Failed: ${error.message}\n`)
148+
} else {
149+
console.log(`❌ Health check failed: ${error.message}`)
150+
}
130151
}
131152

132153
// Test status endpoint
133154
try {
134-
console.log("📈 GET /status")
155+
if (verbose) {
156+
console.log("📈 GET /status")
157+
}
135158
const statusResponse = await makeRequest({
136159
hostname: host,
137160
port: port,
@@ -140,26 +163,38 @@ async function testBasicEndpoints() {
140163
headers: { "Content-Type": "application/json" },
141164
})
142165

143-
console.log(` Status: ${statusResponse.statusCode}`)
144-
if (statusResponse.statusCode === 200) {
145-
const status = JSON.parse(statusResponse.body)
146-
console.log(` Running: ${status.running}`)
147-
console.log(` Requests: ${status.stats?.totalRequests || 0}`)
148-
console.log(` Memory: ${Math.round((status.stats?.memoryUsage?.heapUsed || 0) / 1024 / 1024)}MB`)
166+
if (verbose) {
167+
console.log(` Status: ${statusResponse.statusCode}`)
168+
if (statusResponse.statusCode === 200) {
169+
const status = JSON.parse(statusResponse.body)
170+
console.log(` Running: ${status.running}`)
171+
console.log(` Requests: ${status.stats?.totalRequests || 0}`)
172+
console.log(` Memory: ${Math.round((status.stats?.memoryUsage?.heapUsed || 0) / 1024 / 1024)}MB`)
173+
} else {
174+
console.log(` Error: ${statusResponse.body}`)
175+
}
176+
console.log("")
149177
} else {
150-
console.log(` Error: ${statusResponse.body}`)
178+
if (statusResponse.statusCode !== 200) {
179+
console.log(`❌ Status check failed: ${statusResponse.body}`)
180+
}
151181
}
152-
console.log("")
153182
} catch (error) {
154-
console.log(` ❌ Failed: ${error.message}\n`)
183+
if (verbose) {
184+
console.log(` ❌ Failed: ${error.message}\n`)
185+
} else {
186+
console.log(`❌ Status check failed: ${error.message}`)
187+
}
155188
}
156189
}
157190

158191
/**
159192
* Test regular execute endpoint
160193
*/
161194
async function testExecuteEndpoint() {
162-
console.log("⚡ Testing POST /execute...\n")
195+
if (verbose) {
196+
console.log("⚡ Testing POST /execute...\n")
197+
}
163198

164199
try {
165200
const payload = JSON.stringify({ task })
@@ -178,19 +213,32 @@ async function testExecuteEndpoint() {
178213
payload,
179214
)
180215

181-
console.log(` Status: ${response.statusCode}`)
182-
if (response.statusCode === 200) {
183-
const result = JSON.parse(response.body)
184-
console.log(` Success: ${result.success}`)
185-
console.log(` Message: ${result.message}`)
186-
console.log(` Task: ${result.task}`)
187-
console.log(` Timestamp: ${result.timestamp}`)
216+
if (verbose) {
217+
console.log(` Status: ${response.statusCode}`)
218+
if (response.statusCode === 200) {
219+
const result = JSON.parse(response.body)
220+
console.log(` Success: ${result.success}`)
221+
console.log(` Message: ${result.message}`)
222+
console.log(` Task: ${result.task}`)
223+
console.log(` Timestamp: ${result.timestamp}`)
224+
} else {
225+
console.log(` Error: ${response.body}`)
226+
}
227+
console.log("")
188228
} else {
189-
console.log(` Error: ${response.body}`)
229+
if (response.statusCode === 200) {
230+
const result = JSON.parse(response.body)
231+
console.log(result.message || result.result || "Task completed successfully")
232+
} else {
233+
console.log(`❌ Error: ${response.body}`)
234+
}
190235
}
191-
console.log("")
192236
} catch (error) {
193-
console.log(` ❌ Failed: ${error.message}\n`)
237+
if (verbose) {
238+
console.log(` ❌ Failed: ${error.message}\n`)
239+
} else {
240+
console.log(`❌ Failed: ${error.message}`)
241+
}
194242
}
195243
}
196244

@@ -199,7 +247,9 @@ async function testExecuteEndpoint() {
199247
*/
200248
function testStreamingEndpoint() {
201249
return new Promise((resolve, reject) => {
202-
console.log("🌊 Testing POST /execute/stream (SSE)...\n")
250+
if (verbose) {
251+
console.log("🌊 Testing POST /execute/stream (SSE)...\n")
252+
}
203253

204254
const payload = JSON.stringify({ task })
205255

@@ -217,9 +267,11 @@ function testStreamingEndpoint() {
217267
},
218268
},
219269
(res) => {
220-
console.log(` Status: ${res.statusCode}`)
221-
console.log(` Content-Type: ${res.headers["content-type"]}`)
222-
console.log(" Events:")
270+
if (verbose) {
271+
console.log(` Status: ${res.statusCode}`)
272+
console.log(` Content-Type: ${res.headers["content-type"]}`)
273+
console.log(" Events:")
274+
}
223275

224276
let buffer = ""
225277

@@ -236,50 +288,97 @@ function testStreamingEndpoint() {
236288
const data = JSON.parse(line.slice(6))
237289
const timestamp = new Date(data.timestamp).toLocaleTimeString()
238290

239-
switch (data.type) {
240-
case "start":
241-
console.log(` 🚀 [${timestamp}] ${data.message}: ${data.task}`)
242-
break
243-
case "progress":
244-
console.log(
245-
` ⏳ [${timestamp}] Step ${data.step}/${data.total}: ${data.message}`,
246-
)
247-
break
248-
case "complete":
249-
case "completion":
250-
console.log(` ✅ [${timestamp}] ${data.message}`)
251-
console.log(` 📋 Result: ${data.result}`)
252-
// Close the connection when task completes
253-
console.log(" 🔚 Task completed, closing connection...")
254-
res.destroy()
255-
return
256-
case "error":
257-
console.log(` ❌ [${timestamp}] Error: ${data.error}`)
258-
break
259-
default:
260-
console.log(` 📨 [${timestamp}] ${JSON.stringify(data)}`)
291+
if (verbose) {
292+
switch (data.type) {
293+
case "start":
294+
console.log(` 🚀 [${timestamp}] ${data.message}: ${data.task}`)
295+
break
296+
case "progress":
297+
console.log(
298+
` ⏳ [${timestamp}] Step ${data.step}/${data.total}: ${data.message}`,
299+
)
300+
break
301+
case "complete":
302+
case "completion":
303+
console.log(` ✅ [${timestamp}] ${data.message}`)
304+
console.log(` 📋 Result: ${data.result}`)
305+
// Close the connection when task completes
306+
console.log(" 🔚 Task completed, closing connection...")
307+
res.destroy()
308+
return
309+
case "error":
310+
console.log(` ❌ [${timestamp}] Error: ${data.error}`)
311+
break
312+
default:
313+
console.log(` 📨 [${timestamp}] ${JSON.stringify(data)}`)
314+
}
315+
} else {
316+
// Simple output mode - stream content as it comes without extra newlines
317+
switch (data.type) {
318+
case "start":
319+
// Don't output anything for start
320+
break
321+
case "progress":
322+
// Stream progress messages (this is where LLM response content is)
323+
if (data.message && data.message !== "Processing...") {
324+
process.stdout.write(data.message)
325+
}
326+
break
327+
case "complete":
328+
case "completion":
329+
// Show final result
330+
if (data.result) {
331+
process.stdout.write(data.result)
332+
} else if (data.message) {
333+
process.stdout.write(data.message)
334+
}
335+
// Add final newline
336+
process.stdout.write("\n")
337+
res.destroy()
338+
return
339+
case "error":
340+
console.log(`❌ Error: ${data.error}`)
341+
break
342+
default:
343+
// Stream any other message content
344+
if (data.message) {
345+
process.stdout.write(data.message)
346+
}
347+
}
261348
}
262349
} catch (e) {
263-
console.log(` 📄 Raw: ${line}`)
350+
if (verbose) {
351+
console.log(` 📄 Raw: ${line}`)
352+
}
264353
}
265354
}
266355
}
267356
})
268357

269358
res.on("end", () => {
270-
console.log(" 🔚 Stream ended\n")
359+
if (verbose) {
360+
console.log(" 🔚 Stream ended\n")
361+
}
271362
resolve()
272363
})
273364

274365
res.on("error", (error) => {
275-
console.log(` ❌ Stream error: ${error.message}\n`)
366+
if (verbose) {
367+
console.log(` ❌ Stream error: ${error.message}\n`)
368+
} else {
369+
console.log(`❌ Stream error: ${error.message}`)
370+
}
276371
reject(error)
277372
})
278373
},
279374
)
280375

281376
req.on("error", (error) => {
282-
console.log(` ❌ Request failed: ${error.message}\n`)
377+
if (verbose) {
378+
console.log(` ❌ Request failed: ${error.message}\n`)
379+
} else {
380+
console.log(`❌ Request failed: ${error.message}`)
381+
}
283382
reject(error)
284383
})
285384

@@ -304,7 +403,9 @@ async function runTests() {
304403
await testExecuteEndpoint()
305404
}
306405

307-
console.log("✅ All tests completed successfully!")
406+
if (verbose) {
407+
console.log("✅ All tests completed successfully!")
408+
}
308409
} catch (error) {
309410
console.error("❌ Test failed:", error.message)
310411
process.exit(1)

0 commit comments

Comments
 (0)