BunとDrizzleでSQLiteのテストを書く

2024/08/03に公開

こんな感じで単体テストが書けます。

単体テスト内でデータベースの作成とマイグレーションが完結する点が便利です。
CloudflareのD1の代わりにBunのSQLiteを使用していてもBunとDrizzleを使用して単体テストが書けます。

import { Database } from "bun:sqlite"
import { drizzle } from "drizzle-orm/bun-sqlite"
import { migrate } from "drizzle-orm/bun-sqlite/migrator"
import { eq } from "drizzle-orm"
import { test, expect } from "bun:test"
import { postsTable } from "./schema"

test("データベースに投稿を書き込む", async () => {
  const sqlite = new Database()

  const db = drizzle(sqlite)

  migrate(db, { migrationsFolder: "./migrations" })

  const postId = crypto.randomUUID()

  await db.insert(postsTable).values({
    id: postId,
    text: "text",
  })

  const post = db
    .select()
    .from(postsTable)
    .where(eq(postsTable.id, postId))
    .get()

  expect(post).not.toBeUndefined()
})

今回使用したschema.tsの中身はこちらです。

export const postsTable = sqliteTable("posts", {
  id: text("uuid", { length: 256 }).notNull().unique(),
  text: text("text", { length: 256 }).notNull(),
})

あとdrizzle.config.tsの中身はこのような感じにしました。

import type { Config } from "drizzle-kit"

export default {
  dialect: "sqlite",
  schema: "src/schema.ts",
  out: "migrations",
  driver: "d1-http",
  dbCredentials: {
    accountId: "account-id",
    databaseId: "database-id",
    token: "token",
  },
} satisfies Config

Discussion