0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

使い捨てテストDB環境のtestcontainersをNeo4j + Honoで試してみたメモ

Posted at

概要

前回までに、Postgresqlのテストコンテナを使ったりパイプラインで動かしたりした。

今回は、グラフDBであるNeo4jのテストにtestcontainersを使ってみようと思う。

この時点のソースコード

claude codeによるリファクタリングレポート ( 今回の修正のフィードバックをドキュメントにしてください、と指示 )

ソースコード

前提

GraphDBのドライバーを下記のように環境変数を使って取得しているものとする。

packages/graph-database/src/driver.ts
import neo4j, { type Driver } from 'neo4j-driver';

let driver: Driver;
export const getDriver = (
  ur = process.env.NEO4J_URL,
  us = process.env.NEO4J_USER,
  p = process.env.NEO4J_PASSWORD,
) => {
  if (ur === undefined || us === undefined || p === undefined) {
    throw new Error('Missing required environment variables');
  }
  driver = neo4j.driver(ur, neo4j.auth.basic(us, p));
  return driver;
};

// アプリケーション終了時にドライバーを閉じる
process.on('exit', async () => {
  if (!driver) {
    return;
  }
  await driver.close();
});

テストコード

apps/backend/test/integrations/graph-scenario.spec.ts
import { beforeEach, describe, expect, it } from 'vitest';
import { useNeo4J } from './neo4j-test-utils';

describe('GraphDBシナリオ統合テスト', async () => {
  await useNeo4J(async ({ app, env, driver }) => {
    /** ------------------------------
     * テスト用データ
     * ------------------------------ */
    const VALID_SCENARIO_ID = '550e8400-e29b-41d4-a716-446655440000';
    const VALID_SCENARIO_DATA = {
      title: 'テストシナリオ',
      overview: 'これはテスト用のシナリオです。GraphDBに保存されます。',
    };

    /** ------------------------------
     * API呼び出しヘルパー
     * ------------------------------ */
    const putScenario = ({ scenarioId, data }: { scenarioId: string; data: object }) =>
      app.request(
        `/api/graph-scenarios/${scenarioId}`,
        {
          method: 'PUT',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify(data),
        },
        env,
      );

    beforeEach(async () => {
      // 事前処理があればここで実施
      // const session = driver.session();
      // await session.run(``,{});
      // session.close();
    });
    /** ------------------------------
     * シナリオテスト
     * ------------------------------ */
    it('GraphDBにシナリオを作成できる', async () => {
      const res = await putScenario({
        scenarioId: VALID_SCENARIO_ID,
        data: VALID_SCENARIO_DATA,
      });
      expect(res.status).toBe(200);
      expect(await res.json()).toEqual({ id: VALID_SCENARIO_ID, ...VALID_SCENARIO_DATA });
    });

  });
});

テスト用ヘルパー

apps/backend/test/integrations/neo4j-test-utils.ts
import { Neo4jContainer } from '@testcontainers/neo4j';
import { auth, driver as createDriver, type Driver } from 'neo4j-driver';
import app from '../../src'; // 実際のHonoアプリケーションをインポート

export const useNeo4J = async (
  callback: (neo4jConfig: {
    driver: Driver;
    app: typeof app;
    env: Record<string, string>;
  }) => Promise<void>,
) => {
  const container = await new Neo4jContainer('neo4j').start();

  const url = container.getBoltUri();
  const user = container.getUsername();
  const password = container.getPassword();
  const driver = createDriver(url, auth.basic(user, password));

  // Neo4j環境変数を設定(Honoアプリが接続できるように)
  process.env.NEO4J_URL = url;
  process.env.NEO4J_USER = user;
  process.env.NEO4J_PASSWORD = password;
  const env = {
    CLOUDFLARE_ENV: 'test',
    NEO4J_URL: url,
    NEO4J_USER: user,
    NEO4J_PASSWORD: password,
  };
  await callback({ driver, app, env });

  await driver.close();
};

テスト実行

無事にテスト実行できた。

image.png

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?