test: migrate negative tokens regression to Effect runner (#27141)

This commit is contained in:
Kit Langton
2026-05-12 20:32:23 +00:00
committed by GitHub
parent dc9d6a08cb
commit 2017dc165c
@@ -5,11 +5,10 @@
// negative. The pre-fix `safe()` clamp only guarded against non-finite. The // negative. The pre-fix `safe()` clamp only guarded against non-finite. The
// strict `NonNegativeInt` schema then made every load of the message list // strict `NonNegativeInt` schema then made every load of the message list
// fail to encode, killing Desktop boot for every user with such a row. // fail to encode, killing Desktop boot for every user with such a row.
import { afterEach, describe, expect } from "bun:test" import { describe, expect } from "bun:test"
import { Effect } from "effect" import { Effect } from "effect"
import { eq } from "drizzle-orm" import { eq } from "drizzle-orm"
import { ModelID, ProviderID } from "../../src/provider/schema" import { ModelID, ProviderID } from "../../src/provider/schema"
import { WithInstance } from "../../src/project/with-instance"
import { Server } from "../../src/server/server" import { Server } from "../../src/server/server"
import { SessionPaths } from "../../src/server/routes/instance/httpapi/groups/session" import { SessionPaths } from "../../src/server/routes/instance/httpapi/groups/session"
import { Session } from "@/session/session" import { Session } from "@/session/session"
@@ -17,21 +16,13 @@ import { MessageID, PartID } from "../../src/session/schema"
import * as Database from "@/storage/db" import * as Database from "@/storage/db"
import { PartTable } from "@/session/session.sql" import { PartTable } from "@/session/session.sql"
import { resetDatabase } from "../fixture/db" import { resetDatabase } from "../fixture/db"
import { disposeAllInstances, tmpdir } from "../fixture/fixture" import { TestInstance } from "../fixture/fixture"
import { it } from "../lib/effect" import { testEffect } from "../lib/effect"
afterEach(async () => { const it = testEffect(Session.defaultLayer)
await disposeAllInstances()
await resetDatabase()
})
function seedNegativeTokenSession(directory: string) { function seedNegativeTokenSession() {
return Effect.promise(async () => return Effect.gen(function* () {
WithInstance.provide({
directory,
fn: () =>
Effect.runPromise(
Effect.gen(function* () {
const session = yield* Session.Service const session = yield* Session.Service
const info = yield* session.create({}) const info = yield* session.create({})
const message = yield* session.updateMessage({ const message = yield* session.updateMessage({
@@ -71,27 +62,20 @@ function seedNegativeTokenSession(directory: string) {
) )
return info.id return info.id
}).pipe(Effect.provide(Session.defaultLayer)), })
),
}),
)
} }
describe("messages endpoint tolerates legacy negative token counts", () => { describe("messages endpoint tolerates legacy negative token counts", () => {
it.live( it.instance(
"returns 200 even when a step-finish part has tokens.output < 0", "returns 200 even when a step-finish part has tokens.output < 0",
Effect.acquireRelease(
Effect.promise(() => tmpdir({ config: { formatter: false, lsp: false } })),
(tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()),
).pipe(
Effect.flatMap((tmp) =>
Effect.gen(function* () { Effect.gen(function* () {
const sessionID = yield* seedNegativeTokenSession(tmp.path) yield* Effect.addFinalizer(() => Effect.promise(() => resetDatabase()))
const url = `${SessionPaths.messages.replace(":sessionID", sessionID)}?limit=80&directory=${encodeURIComponent(tmp.path)}` const test = yield* TestInstance
const sessionID = yield* seedNegativeTokenSession()
const url = `${SessionPaths.messages.replace(":sessionID", sessionID)}?limit=80&directory=${encodeURIComponent(test.directory)}`
const res = yield* Effect.promise(async () => Server.Default().app.request(url)) const res = yield* Effect.promise(async () => Server.Default().app.request(url))
expect(res.status, "messages endpoint 400'd on legacy negative tokens").not.toBe(400) expect(res.status, "messages endpoint 400'd on legacy negative tokens").not.toBe(400)
}), }),
), { git: true, config: { formatter: false, lsp: false } },
),
) )
}) })