概要
前回までに、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();
};
テスト実行
無事にテスト実行できた。
参考