From 5946dba47d28bdb1fb103e44a09cf126eef2c8d0 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 4 Apr 2026 01:51:48 +0900 Subject: [PATCH] ci: run publish workflow tests via bun test --- .github/workflows/publish.yml | 82 +-------------------------------- script/publish-workflow.test.ts | 22 +++++++++ 2 files changed, 24 insertions(+), 80 deletions(-) create mode 100644 script/publish-workflow.test.ts diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3847e59d4..72252bac8 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -45,86 +45,8 @@ jobs: env: BUN_INSTALL_ALLOW_SCRIPTS: "@ast-grep/napi" - - name: Run mock-heavy tests (isolated) - run: | - # These files use mock.module() which pollutes module cache - # Run them in separate processes to prevent cross-file contamination - bun test src/plugin-handlers - bun test src/hooks/atlas - bun test src/hooks/compaction-context-injector - bun test src/features/tmux-subagent - bun test src/cli/doctor/formatter.test.ts - bun test src/cli/doctor/format-default.test.ts - bun test src/tools/call-omo-agent/sync-executor.test.ts - bun test src/tools/call-omo-agent/session-creator.test.ts - bun test src/tools/session-manager - bun test src/features/opencode-skill-loader/loader.test.ts - bun test src/hooks/anthropic-context-window-limit-recovery/recovery-hook.test.ts - bun test src/hooks/anthropic-context-window-limit-recovery/executor.test.ts - # src/shared mock-heavy files (mock.module pollutes connected-providers-cache and legacy-plugin-warning) - bun test src/shared/model-capabilities.test.ts - bun test src/shared/log-legacy-plugin-startup-warning.test.ts - bun test src/shared/model-error-classifier.test.ts - bun test src/shared/opencode-message-dir.test.ts - # session-recovery mock isolation (recover-tool-result-missing mocks ./storage) - bun test src/hooks/session-recovery/recover-tool-result-missing.test.ts - # legacy-plugin-toast mock isolation (hook.test.ts mocks ./auto-migrate) - bun test src/hooks/legacy-plugin-toast/hook.test.ts - # src/plugin - ALL isolated (mock.module pollution crosses between files) - for f in $(find src/plugin -name '*.test.ts' | sort); do bun test "$f"; done - # src/features/background-agent - ALL isolated (mock.module pollution) - for f in $(find src/features/background-agent -name '*.test.ts' | sort); do bun test "$f"; done - - - name: Run remaining tests - run: | - # Enumerate subdirectories/files explicitly to EXCLUDE mock-heavy files - # that were already run in isolation above. - # Excluded from src/shared: model-capabilities, log-legacy-plugin-startup-warning, model-error-classifier, opencode-message-dir - # Excluded from src/cli: doctor/formatter.test.ts, doctor/format-default.test.ts - # Excluded from src/tools: call-omo-agent/sync-executor.test.ts, call-omo-agent/session-creator.test.ts, session-manager (all) - # Excluded from src/hooks/anthropic-context-window-limit-recovery: recovery-hook.test.ts, executor.test.ts - # Excluded: src/plugin/* (all run isolated above) - # Excluded: src/features/background-agent/* (all run isolated above) - # Build src/shared file list excluding mock-heavy files already run in isolation - SHARED_FILES=$(find src/shared -name '*.test.ts' \ - ! -name 'model-capabilities.test.ts' \ - ! -name 'log-legacy-plugin-startup-warning.test.ts' \ - ! -name 'model-error-classifier.test.ts' \ - ! -name 'opencode-message-dir.test.ts' \ - | sort | tr '\n' ' ') - # plugin and background-agent fully isolated above — excluded from remaining - bun test bin script src/config src/mcp src/index.test.ts \ - src/agents $SHARED_FILES \ - src/cli/run src/cli/config-manager src/cli/mcp-oauth \ - src/cli/index.test.ts src/cli/install.test.ts src/cli/model-fallback.test.ts \ - src/cli/config-manager.test.ts \ - src/cli/doctor/runner.test.ts src/cli/doctor/checks \ - src/tools/ast-grep src/tools/background-task src/tools/delegate-task \ - src/tools/glob src/tools/grep src/tools/interactive-bash \ - src/tools/look-at src/tools/lsp \ - src/tools/skill src/tools/skill-mcp src/tools/slashcommand src/tools/task \ - src/tools/call-omo-agent/background-agent-executor.test.ts \ - src/tools/call-omo-agent/background-executor.test.ts \ - src/tools/call-omo-agent/subagent-session-creator.test.ts \ - src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery-sdk.test.ts src/hooks/anthropic-context-window-limit-recovery/parser.test.ts src/hooks/anthropic-context-window-limit-recovery/pruning-deduplication.test.ts src/hooks/anthropic-context-window-limit-recovery/recovery-deduplication.test.ts src/hooks/anthropic-context-window-limit-recovery/storage.test.ts \ - src/hooks/session-recovery/detect-error-type.test.ts src/hooks/session-recovery/index.test.ts src/hooks/session-recovery/recover-empty-content-message-sdk.test.ts src/hooks/session-recovery/resume.test.ts src/hooks/session-recovery/storage \ - src/hooks/legacy-plugin-toast/auto-migrate.test.ts \ - src/hooks/claude-code-compatibility \ - src/hooks/context-injection \ - src/hooks/provider-toast \ - src/hooks/session-notification \ - src/hooks/sisyphus \ - src/hooks/todo-continuation-enforcer \ - src/features/builtin-commands \ - src/features/builtin-skills \ - src/features/claude-code-session-state \ - src/features/hook-message-injector \ - src/features/opencode-skill-loader/config-source-discovery.test.ts \ - src/features/opencode-skill-loader/merger.test.ts \ - src/features/opencode-skill-loader/skill-content.test.ts \ - src/features/opencode-skill-loader/blocking.test.ts \ - src/features/opencode-skill-loader/async-loader.test.ts \ - src/features/skill-mcp-manager + - name: Run tests + run: bun test typecheck: runs-on: ubuntu-latest diff --git a/script/publish-workflow.test.ts b/script/publish-workflow.test.ts new file mode 100644 index 000000000..b690a856a --- /dev/null +++ b/script/publish-workflow.test.ts @@ -0,0 +1,22 @@ +import { describe, expect, test } from "bun:test" +import { readFileSync } from "node:fs" + +const workflowPaths = [ + new URL("../.github/workflows/ci.yml", import.meta.url), + new URL("../.github/workflows/publish.yml", import.meta.url), +] + +describe("test workflows", () => { + test("use a single plain bun test step without isolated split hacks", () => { + for (const workflowPath of workflowPaths) { + // given + const workflow = readFileSync(workflowPath, "utf8") + + // then + expect(workflow).toContain("- name: Run tests") + expect(workflow).toContain("run: bun test") + expect(workflow).not.toContain("Run mock-heavy tests (isolated)") + expect(workflow).not.toContain("Run remaining tests") + } + }) +})