48 lines
1.7 KiB
TypeScript
48 lines
1.7 KiB
TypeScript
/** @jsxImportSource @opentui/solid */
|
|
/**
|
|
* Reproducer for #26560 — TUI crashes with
|
|
* `TypeError: undefined is not an object (evaluating 'f.data.map')`
|
|
* when entering a session whose messages endpoint returns a non-2xx.
|
|
* The failure path is `sync.tsx#sync.session.sync` reading
|
|
* `messages.data!` while the SDK leaves `data` undefined on error.
|
|
*/
|
|
import { describe, expect, test } from "bun:test"
|
|
import { Global } from "@opencode-ai/core/global"
|
|
import { tmpdir } from "../../../fixture/fixture"
|
|
import { directory, json, mount } from "./sync-fixture"
|
|
|
|
const sessionID = "ses_undef"
|
|
|
|
describe("tui sync (#26560)", () => {
|
|
test("entering a session whose messages endpoint errors does not crash sync", async () => {
|
|
const previous = Global.Path.state
|
|
await using tmp = await tmpdir()
|
|
Global.Path.state = tmp.path
|
|
await Bun.write(`${tmp.path}/kv.json`, "{}")
|
|
|
|
const sessionPayload = {
|
|
id: sessionID,
|
|
title: "broken",
|
|
time: { created: 0, updated: 0 },
|
|
version: "1.14.42",
|
|
directory,
|
|
project_id: "proj_test",
|
|
}
|
|
const { app, sync } = await mount((url) => {
|
|
if (url.pathname === `/session/${sessionID}`) return json(sessionPayload)
|
|
if (url.pathname === `/session/${sessionID}/messages`) return json({}, { status: 500 })
|
|
if (url.pathname === `/session/${sessionID}/todo`) return json([])
|
|
if (url.pathname === `/session/${sessionID}/diff`) return json([])
|
|
if (url.pathname === "/session") return json([sessionPayload])
|
|
return undefined
|
|
})
|
|
|
|
try {
|
|
await expect(sync.session.sync(sessionID)).resolves.toBeUndefined()
|
|
} finally {
|
|
app.renderer.destroy()
|
|
Global.Path.state = previous
|
|
}
|
|
})
|
|
})
|