Type session not-found errors (#25818)

This commit is contained in:
Kit Langton
2026-05-05 21:33:47 -04:00
committed by GitHub
parent f5c3d352a1
commit 8555de8189
22 changed files with 623 additions and 132 deletions

View File

@@ -4,6 +4,7 @@ import type * as Scope from "effect/Scope"
import { HttpRouter } from "effect/unstable/http"
import { Flag } from "@opencode-ai/core/flag/flag"
import { createOpencodeClient } from "@opencode-ai/sdk/v2"
import { validateSession } from "../../src/cli/cmd/tui/validate-session"
import { Instance } from "../../src/project/instance"
import { WithInstance } from "../../src/project/with-instance"
import { ExperimentalHttpApiServer } from "../../src/server/routes/instance/httpapi/server"
@@ -13,6 +14,7 @@ import { MessageV2 } from "../../src/session/message-v2"
import { ModelID, ProviderID } from "../../src/provider/schema"
import type { Config } from "@/config/config"
import { Session as SessionNs } from "@/session/session"
import { errorMessage } from "../../src/util/error"
import { TestLLMServer } from "../lib/llm-server"
import path from "path"
import { resetDatabase } from "../fixture/db"
@@ -64,20 +66,23 @@ function client(
directory?: string,
input?: { password?: string; username?: string; headers?: Record<string, string> },
) {
const serverApp = app(backend, input)
const fetch = Object.assign(
async (request: RequestInfo | URL, init?: RequestInit) =>
await serverApp.fetch(request instanceof Request ? request : new Request(request, init)),
{ preconnect: globalThis.fetch.preconnect },
) satisfies typeof globalThis.fetch
return createOpencodeClient({
baseUrl: "http://localhost",
directory,
headers: input?.headers,
fetch,
fetch: serverFetch(backend, input),
})
}
function serverFetch(backend: Backend, input?: { password?: string; username?: string }) {
const serverApp = app(backend, input)
return Object.assign(
async (request: RequestInfo | URL, init?: RequestInit) =>
await serverApp.fetch(request instanceof Request ? request : new Request(request, init)),
{ preconnect: globalThis.fetch.preconnect },
) satisfies typeof globalThis.fetch
}
function authorization(username: string, password: string) {
return `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`
}
@@ -129,6 +134,16 @@ function capture(request: () => Promise<SdkResult>) {
)
}
function captureThrown(request: () => Promise<unknown>) {
return call(async () => {
try {
await request()
} catch (error) {
return error
}
})
}
function expectStatus(request: () => Promise<{ response: Response }>, status: number) {
return call(request).pipe(
Effect.tap((result) => Effect.sync(() => expect(result.response.status).toBe(status))),
@@ -338,6 +353,46 @@ describe("HttpApi SDK", () => {
),
)
parity("matches generated SDK missing session errors across backends", (backend) =>
withStandardProject(backend, ({ sdk }) =>
Effect.gen(function* () {
const sessionID = "ses_missing"
const expected = {
name: "NotFoundError",
data: { message: `Session not found: ${sessionID}` },
}
const missing = yield* capture(() => sdk.session.get({ sessionID }))
const thrown = yield* captureThrown(() => sdk.session.get({ sessionID }, { throwOnError: true }))
expect(missing.error).toEqual(expected)
expect(thrown).toEqual(expected)
return {
status: missing.status,
error: missing.error,
thrown,
}
}),
),
)
parity("formats missing session validation errors for -s", (backend) =>
withStandardProject(backend, ({ directory }) =>
Effect.gen(function* () {
const sessionID = "ses_206f84f18ffeZ6hhD7pFYAiW5T"
const thrown = yield* captureThrown(() =>
validateSession({
url: "http://localhost",
directory,
sessionID,
fetch: serverFetch(backend),
}),
)
expect(errorMessage(thrown)).toBe(`Session not found: ${sessionID}`)
return errorMessage(thrown)
}),
),
)
parity("matches generated SDK basic auth behavior across backends", (backend) =>
withStandardProject(backend, ({ directory }) =>
Effect.gen(function* () {