From df2d4a786d891b0902a02848f4f5acaf55d8b001 Mon Sep 17 00:00:00 2001 From: nrslib <38722970+nrslib@users.noreply.github.com> Date: Wed, 4 Mar 2026 01:57:49 +0900 Subject: [PATCH] =?UTF-8?q?test:=20E2E=20=E3=83=97=E3=83=AD=E3=83=90?= =?UTF-8?q?=E3=82=A4=E3=83=80=E3=83=BC=E5=88=A5=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=92=E3=82=B3=E3=83=B3=E3=83=95=E3=82=A3=E3=82=B0=E3=83=AC?= =?UTF-8?q?=E3=83=99=E3=83=AB=E3=81=A7=E5=88=B6=E5=BE=A1=E3=81=97=20JSON?= =?UTF-8?q?=20=E3=83=AC=E3=83=9D=E3=83=BC=E3=83=88=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit プロバイダー固有テストの skip ロジックをテストファイルから vitest.config.e2e.provider.ts に移動。 JSON レポート出力を追加し e2e/results/ を gitignore に追加。 --- .gitignore | 3 +++ e2e/specs/cli-export-cc.e2e.ts | 2 +- e2e/specs/codex-permission-mode.e2e.ts | 5 +--- e2e/specs/opencode-conversation.e2e.ts | 23 +----------------- package.json | 10 ++++---- vitest.config.e2e.base.ts | 1 + vitest.config.e2e.provider.ts | 33 ++++++++++++++++++-------- 7 files changed, 35 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index a93ef3b..253b2c8 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,9 @@ npm-debug.log* # Test coverage coverage/ +# E2E test results +e2e/results/ + # Environment .env .env.local diff --git a/e2e/specs/cli-export-cc.e2e.ts b/e2e/specs/cli-export-cc.e2e.ts index 7181106..c93acc7 100644 --- a/e2e/specs/cli-export-cc.e2e.ts +++ b/e2e/specs/cli-export-cc.e2e.ts @@ -64,7 +64,7 @@ describe('E2E: Export-cc command (takt export-cc)', () => { const pieceFiles = readdirSync(piecesDir); expect(pieceFiles.length).toBeGreaterThan(0); - const personasDir = join(skillDir, 'personas'); + const personasDir = join(skillDir, 'facets', 'personas'); expect(existsSync(personasDir)).toBe(true); const personaFiles = readdirSync(personasDir); expect(personaFiles.length).toBeGreaterThan(0); diff --git a/e2e/specs/codex-permission-mode.e2e.ts b/e2e/specs/codex-permission-mode.e2e.ts index bf3e876..16f1577 100644 --- a/e2e/specs/codex-permission-mode.e2e.ts +++ b/e2e/specs/codex-permission-mode.e2e.ts @@ -5,9 +5,6 @@ import { createIsolatedEnv, type IsolatedEnv, updateIsolatedConfig } from '../he import { createLocalRepo, type LocalRepo } from '../helpers/test-repo'; import { runTakt } from '../helpers/takt-runner'; -const provider = process.env.TAKT_E2E_PROVIDER; -const codexIt = provider === 'codex' ? it : it.skip; - describe('E2E: Codex permission mode readonly/full', () => { let isolatedEnv: IsolatedEnv; let repo: LocalRepo; @@ -48,7 +45,7 @@ describe('E2E: Codex permission mode readonly/full', () => { try { isolatedEnv.cleanup(); } catch { /* best-effort */ } }); - codexIt('readonly で失敗し full で成功する', () => { + it('readonly で失敗し full で成功する', () => { updateIsolatedConfig(isolatedEnv.taktDir, { provider_profiles: { codex: { default_permission_mode: 'readonly' }, diff --git a/e2e/specs/opencode-conversation.e2e.ts b/e2e/specs/opencode-conversation.e2e.ts index 4130e42..086074b 100644 --- a/e2e/specs/opencode-conversation.e2e.ts +++ b/e2e/specs/opencode-conversation.e2e.ts @@ -1,31 +1,10 @@ -/** - * OpenCode real E2E conversation test. - * - * Tests the full stack with a real OpenCode server: - * OpenCodeProvider → callOpenCode → OpenCodeClient → createOpencode (real server) - * - * Skipped automatically if the opencode binary is not found. - * Run with: npm run test:e2e:opencode - */ - import { describe, it, expect, afterAll } from 'vitest'; -import { execSync } from 'node:child_process'; import { resetSharedServer } from '../../src/infra/opencode/client.js'; import { OpenCodeProvider } from '../../src/infra/providers/opencode.js'; -function isOpencodeAvailable(): boolean { - try { - execSync('which opencode', { stdio: 'ignore' }); - return true; - } catch { - return false; - } -} - const MODEL = process.env.OPENCODE_E2E_MODEL ?? 'minimax/MiniMax-M2.5-highspeed'; -const enabled = isOpencodeAvailable() && process.env.TAKT_E2E_PROVIDER === 'opencode'; -describe.skipIf(!enabled)('OpenCode real E2E conversation', () => { +describe('OpenCode real E2E conversation', () => { afterAll(() => { resetSharedServer(); }); diff --git a/package.json b/package.json index 2267d13..606e90a 100644 --- a/package.json +++ b/package.json @@ -15,13 +15,13 @@ "test": "vitest run", "test:watch": "vitest", "test:e2e": "tmp=\"$(mktemp -t takt-e2e.XXXXXX)\"; npm run test:e2e:mock >\"$tmp\" 2>&1; code=$?; cat \"$tmp\"; if grep -q \"error connecting to api.github.com\" \"$tmp\"; then echo \"[takt] GitHub connectivity error detected in E2E output\"; code=1; fi; rm -f \"$tmp\"; if [ \"$code\" -eq 0 ]; then msg='test:e2e passed'; else msg=\"test:e2e failed (exit=$code)\"; fi; if command -v osascript >/dev/null 2>&1; then osascript -e \"display notification \\\"$msg\\\" with title \\\"takt\\\" subtitle \\\"E2E\\\"\" >/dev/null 2>&1 || true; fi; echo \"[takt] $msg\"; exit $code", - "test:e2e:mock": "TAKT_E2E_PROVIDER=mock vitest run --config vitest.config.e2e.mock.ts --reporter=verbose", + "test:e2e:mock": "TAKT_E2E_PROVIDER=mock vitest run --config vitest.config.e2e.mock.ts --outputFile.json=e2e/results/mock.json", "test:e2e:all": "npm run test:e2e:mock && npm run test:e2e:provider", "test:e2e:provider": "npm run test:e2e:provider:claude && npm run test:e2e:provider:codex", - "test:e2e:provider:claude": "TAKT_E2E_PROVIDER=claude vitest run --config vitest.config.e2e.provider.ts --reporter=verbose", - "test:e2e:provider:codex": "TAKT_E2E_PROVIDER=codex vitest run --config vitest.config.e2e.provider.ts --reporter=verbose", - "test:e2e:provider:opencode": "TAKT_E2E_PROVIDER=opencode vitest run --config vitest.config.e2e.provider.ts --reporter=verbose", - "test:e2e:provider:cursor": "TAKT_AUTO_PR=false TAKT_E2E_PROVIDER=cursor vitest run --config vitest.config.e2e.cursor.ts --reporter=verbose", + "test:e2e:provider:claude": "TAKT_E2E_PROVIDER=claude vitest run --config vitest.config.e2e.provider.ts --outputFile.json=e2e/results/claude.json", + "test:e2e:provider:codex": "TAKT_E2E_PROVIDER=codex vitest run --config vitest.config.e2e.provider.ts --outputFile.json=e2e/results/codex.json", + "test:e2e:provider:opencode": "TAKT_E2E_PROVIDER=opencode vitest run --config vitest.config.e2e.provider.ts --outputFile.json=e2e/results/opencode.json", + "test:e2e:provider:cursor": "TAKT_AUTO_PR=false TAKT_E2E_PROVIDER=cursor vitest run --config vitest.config.e2e.cursor.ts --outputFile.json=e2e/results/cursor.json", "test:e2e:claude": "npm run test:e2e:provider:claude", "test:e2e:codex": "npm run test:e2e:provider:codex", "test:e2e:opencode": "npm run test:e2e:provider:opencode", diff --git a/vitest.config.e2e.base.ts b/vitest.config.e2e.base.ts index 4e0f413..49737cd 100644 --- a/vitest.config.e2e.base.ts +++ b/vitest.config.e2e.base.ts @@ -13,4 +13,5 @@ export const e2eBaseTestConfig: UserConfig['test'] = { singleThread: true, }, }, + reporters: ['verbose', 'json'], }; diff --git a/vitest.config.e2e.provider.ts b/vitest.config.e2e.provider.ts index a6d93e3..0a9ecf0 100644 --- a/vitest.config.e2e.provider.ts +++ b/vitest.config.e2e.provider.ts @@ -1,20 +1,33 @@ import { defineConfig } from 'vitest/config'; import { e2eBaseTestConfig } from './vitest.config.e2e.base'; +const provider = process.env.TAKT_E2E_PROVIDER; +if (!provider) { + throw new Error('TAKT_E2E_PROVIDER must be set'); +} + +const commonTests = [ + 'e2e/specs/add-and-run.e2e.ts', + 'e2e/specs/worktree.e2e.ts', + 'e2e/specs/pipeline.e2e.ts', + 'e2e/specs/github-issue.e2e.ts', + 'e2e/specs/structured-output.e2e.ts', + 'e2e/specs/team-leader.e2e.ts', + 'e2e/specs/team-leader-worker-pool.e2e.ts', + 'e2e/specs/team-leader-refill-threshold.e2e.ts', +]; + +const providerSpecificTests: Record = { + codex: ['e2e/specs/codex-permission-mode.e2e.ts'], + opencode: ['e2e/specs/opencode-conversation.e2e.ts'], +}; + export default defineConfig({ test: { ...e2eBaseTestConfig, include: [ - 'e2e/specs/add-and-run.e2e.ts', - 'e2e/specs/worktree.e2e.ts', - 'e2e/specs/pipeline.e2e.ts', - 'e2e/specs/github-issue.e2e.ts', - 'e2e/specs/structured-output.e2e.ts', - 'e2e/specs/codex-permission-mode.e2e.ts', - 'e2e/specs/opencode-conversation.e2e.ts', - 'e2e/specs/team-leader.e2e.ts', - 'e2e/specs/team-leader-worker-pool.e2e.ts', - 'e2e/specs/team-leader-refill-threshold.e2e.ts', + ...commonTests, + ...(providerSpecificTests[provider] ?? []), ], }, });