Skip to main content

write-test

Write a failing test for a reproduced Metabase bug. Invoked from the /repro workflow when status is REPRODUCED. Determines test type (Clojure/Jest/Cypress), finds the right test file, writes a minimal failing test, runs it, and saves a patch.

Source facts

Repository
metabase/repro-bot
Last source activity
March 11, 2026 at 22:05
Detected SKILL.md language
English
Stars
10
Forks
1

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
write-test
description
Write a failing test for a reproduced Metabase bug. Invoked from the /repro workflow when status is REPRODUCED. Determines test type (Clojure/Jest/Cypress), finds the right test file, writes a minimal failing test, runs it, and saves a patch.
allowed-tools
Read, Edit, Write, Grep, Glob, mcp__metabase-repro__run_test, mcp__metabase-repro__save_test_patch, mcp__metabase-repro__repl_eval
# Write Failing Test This skill is invoked from the `/repro` workflow. The issue ID, repro dir, reproduction status, and root cause are in conversation context from prior phases. ## Determine Test Type | Bug Type | Test Type | Location | |----------|-----------|----------| | Backend logic, query processor, API | **Clojure unit test** | `test/metabase/...` | | Frontend UI behavior, rendering | **Jest unit/component test** | `frontend/test/...` or co-located `*.unit.spec.ts`/`*.unit.spec.tsx` | | End-to-end user workflow, UI interaction | **Cypress acceptance test** | `e2e/test/scenarios/...` | | Mixed (backend + frontend) | **Both** — Clojure test for data + frontend/e2e test for UI | ## Find Relevant Test File Use the root cause to identify source file(s), then locate the corresponding test file: **Backend**: `src/metabase/foo/bar.clj` → `test/metabase/foo/bar_test.clj` **Frontend**: `frontend/src/metabase/foo/Bar.tsx` → `frontend/src/metabase/foo/Bar.unit.spec.tsx` or `frontend/test/metabase/foo/Bar.unit.spec.tsx` **E2E**: UI workflow → `e2e/test/scenarios/<category>/foo.cy.spec.ts` Use Grep to search for existing tests related to the buggy function/component. Consult `CLAUDE.md` in the source worktree for test conventions. ## Choose Test Approach **Backend (Clojure)**: | Root Cause Type | Test Approach | |----------------|--------------| | Query processor bug | `mt/process-query` or `qp/process-query` | | API endpoint bug | `mt/user-http-request` | | Model / data bug | `mt/with-temp` + `t2/select` | | Pure logic / edge case | Direct function call with specific inputs | **Frontend (TypeScript)**: | Root Cause Type | Test Approach | |----------------|--------------| | Component rendering bug | Jest + React Testing Library — render component, assert DOM | | User interaction bug | Cypress — visit page, interact, assert visible result | | Data display / formatting | Jest unit test on the formatting/transform function | | State management bug | Jest — test reducer/action/selector with specific inputs | Look at existing tests in the file for patterns to follow. ## Write the Test Add a new test to the appropriate test file in `./repro/<ISSUE-ID>/source/`. The test should: - **Be minimal** — only test the specific failing behavior - **Follow existing patterns** in the file (imports, fixtures, helpers, assertion style) - **Have a descriptive name** referencing the issue: e.g., `(deftest issue-12345-test ...)`, `it("should handle X (issue #12345)")`, `it("should not show X when Y (metabase#12345)")` - **Assert the correct/expected behavior** — the test should FAIL against the buggy code ## Run the Test ``` mcp__metabase-repro__run_test(repro_dir="repro/<ISSUE-ID>", test_file="test/metabase/foo/bar_test.clj") ``` - **Clojure tests** (`.clj`): Connects to running REPL, adds test/dev paths, requires namespace, runs tests. - **Jest tests** (`.unit.spec.ts(x)`): Runs `yarn test-unit` in the source worktree. - **Cypress tests** (`.cy.spec.ts`): Runs `yarn test-cypress-run` with `CYPRESS_BASE_URL` set. The tool reports whether the test **failed** (expected — demonstrates the bug) or **passed** (unexpected — revisit test logic). ## Generate and Save Diff ``` mcp__metabase-repro__save_test_patch(repro_dir="repro/<ISSUE-ID>") ``` Saves all changes (including new untracked files) to `./repro/<ISSUE-ID>/test-diff.patch`. ## Troubleshooting - **Edit tool failures**: Re-read the file and retry once. If still failing, use Write tool for the complete file. Do NOT use Bash workarounds (`cat >>`, `cp`, `python3 -c`). - **Bash restrictions in CI**: Many Bash commands are blocked. Always use `run_test` MCP tool — do NOT attempt raw shell commands. - **Can't write a useful test**: Note the attempt and reason in the report, move on to Phase 6. - **`run_test` fails twice**: Write an inline REPL snippet instead or skip test execution — the patch is still valuable. - **Large enterprise tests**: If `run_test` times out on a large file in `enterprise/backend/test/`, write a minimal inline REPL snippet instead. - **Node version errors in CI**: Do NOT attempt manual yarn/jest/cypress. Document as "verified by code review, could not execute in CI due to Node version mismatch". - **Jest/Cypress tooling failures**: Save the test patch — it's valid evidence even without execution. Note the tooling error in the report. - **`run_test` returns nil**: Ensure `setup_worktree` was called before `start_metabase`. If Metabase was started first, restart it to pick up test paths. - **Test namespaces unavailable**: Restart Metabase after `setup_worktree`. - **Dynamic column aliases**: For tests involving `lib/desired-column-alias`, retrieve the alias dynamically from `lib/returned-columns` rather than hardcoding. Aliases differ by metadata provider.
View on GitHub