test: migrate negative tokens regression to Effect runner (#27141)
This commit is contained in:
@@ -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 } },
|
||||||
),
|
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user