fix(effect-drizzle-sqlite): support pipeable transactions

This commit is contained in:
Kit Langton
2026-05-02 23:23:32 -04:00
parent 89efce865d
commit e4ae265d8f
2 changed files with 68 additions and 39 deletions
@@ -104,22 +104,18 @@ describe("effect drizzle sqlite", () => {
testEffect("runs synchronous Effect programs inside transactions", () =>
Effect.gen(function* () {
yield* db.withTransaction((tx) =>
Effect.gen(function* () {
yield* tx.insert(users).values({ id: 1, name: "Ada" })
return yield* tx.select().from(users)
}),
)
yield* Effect.gen(function* () {
yield* db.insert(users).values({ id: 1, name: "Ada" })
return yield* db.select().from(users)
}).pipe(db.withTransaction)
expect(yield* db.select().from(users)).toEqual([{ id: 1, name: "Ada" }])
const exit = yield* Effect.exit(
db.withTransaction((tx) =>
Effect.gen(function* () {
yield* tx.insert(users).values({ id: 2, name: "Grace" })
return yield* Effect.fail("rollback")
}),
),
Effect.gen(function* () {
yield* db.insert(users).values({ id: 2, name: "Grace" })
return yield* Effect.fail("rollback")
}).pipe(db.withTransaction),
)
expect(Exit.isFailure(exit)).toBe(true)
@@ -127,6 +123,24 @@ describe("effect drizzle sqlite", () => {
}),
)
testEffect("supports pipeable transactions using the same database service", () =>
Effect.gen(function* () {
const exit = yield* Effect.gen(function* () {
yield* db.insert(users).values({ id: 1, name: "Ada" })
return yield* Effect.fail("rollback")
}).pipe(db.withTransaction, Effect.exit)
expect(Exit.isFailure(exit)).toBe(true)
expect(yield* db.select().from(users)).toEqual([])
yield* Effect.gen(function* () {
yield* db.insert(users).values({ id: 2, name: "Grace" })
}).pipe(db.withTransaction)
expect(yield* db.select().from(users)).toEqual([{ id: 2, name: "Grace" }])
}),
)
testEffect("wraps query failures with query text and parameters", () =>
Effect.gen(function* () {
const exit = yield* Effect.exit(db.insert(posts).values({ id: 1, user_id: 404, title: "Missing" }))