mcpField
P
plan-tests

plan-tests

github.com/igmarinTesting & quality2845 installsUpdated 4w ago
Repository

About plan-tests

Plan Tests is a skill for planning Rails tests around the boundary that best proves a behavior. It maps change types to spec types and paths, then requires a minimal failing example and a design checkpoint before implementation continues.

Key features

  1. 01Maps changes to appropriate spec types
  2. 02Suggests conventional spec paths
  3. 03Starts with one minimal failing example
  4. 04Validates failure cause and test boundary
  5. 05Provides a structured test-plan output

Use cases

  1. 01Planning tests for an API contract change
  2. 02Choosing coverage for async job behavior
  3. 03Testing engine routing or host integration
  4. 04Reproducing a bug before fixing it

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/igmarin/rails-agent-skills --skill plan-tests

After installing, type/plan-testsin Claude Code to confirm it loaded.

Bundled filesassets/first_slice_template.md

Details

From the project README

Plan Tests

Quick Reference

Change typeFirst specPathWhy
API contract, params, status code, JSON shapeRequest specspec/requests/Proves the real HTTP contract
Domain rule on a cohesive record or value objectModel specspec/models/Fast feedback on domain behavior
Multi-step orchestration across collaboratorsService specspec/services/Focuses on the workflow boundary
Enqueue/run/retry/discard behaviorJob specspec/jobs/Captures async semantics directly
Critical Turbo/Stimulus or browser-visible flowSystem specspec/system/Use only when browser interaction is the real risk
Engine routing, generators, host integrationEngine specspec/requests/ or engine pathNormal app specs miss engine wiring — see test-engine
Bug fixReproduction specWhere the bug is observedProves the fix and prevents regression

HARD-GATE

CHECKPOINT: Test Design Review

1. Present: Show the failing spec(s) written
2. Ask:
   - Does this test cover the right behavior?
   - Is the boundary correct (request vs service vs model)?
   - Are the most important edge cases represented?
   - Is the failure reason correct (feature missing, not setup error)?
3. Confirm: Proceed after the test design meets the accepted requirements and RED is observed.

Core Process

Start at the highest-value boundary that proves the behavior with the least unnecessary setup.

Steps
  1. Name the behavior: State the user-visible outcome or invariant to prove.
  2. Locate the boundary: Decide where the behavior is observed first — HTTP request, service entry point, model rule, job execution, engine integration, or external adapter. Use the Quick Reference table to map the change type to the right spec type.
  3. Write one failing example: Keep it minimal; one example is enough to open the gate. List additional cases as follow-up coverage.
  4. Suggest the path: Name the likely spec path using normal Rails conventions (e.g. spec/requests/..., spec/services/..., spec/jobs/..., spec/models/...).
  5. Run and validate: Confirm the failure is because the behavior is missing, not because the setup is broken.
  6. Hand off: Continue with the skill that fits the slice — write-tests for general spec writing, test-service for service-layer coverage, or test-engine for engine integration.
Examples
Good: New JSON Endpoint
# Behavior: POST /orders validates params and returns 201 with JSON payload
# First slice: request spec
# Suggested path: spec/requests/orders/create_spec.rb

RSpec.describe "POST /orders", type: :request do
  let(:user) { create(:user) }
  let(:valid_params) { { order: { product_id: create(:product).id, quantity: 1 } } }

  before { sign_in user }

  it "creates an order and returns 201" do
    post orders_path, params: valid_params, as: :json
    expect(response).to have_http_status(:created)
    expect(response.parsed_body["id"]).to be_present
  end
end
Good: New Orchestration Service
# Behavior: Orders::CreateOrder validates inventory, persists, and enqueues follow-up work
# First slice: service spec
# Suggested path: spec/services/orders/create_order_spec.rb

RSpec.describe Orders::CreateOrder do
  subject(:result) { described_class.call(user: user, product: product, quantity: 1) }

  let(:user)    { create(:user) }
  let(:product) { create(:product, stock: 5) }

  it "returns a successful result with the new order" do
    expect(result).to be_success
    expect(result.order).to be_persisted
  end
end
Pitfalls
PitfallWhat to do
Starting with a PORO spec because it is easyEasy ≠ high-signal — choose the boundary that proves the real behavior
Writing three spec types before running anyPick one slice, run it, prove the failure, then proceed
Defaulting to one spec type for everythingMatch the spec type to the layer where the real risk lives (HTTP, domain, async, browser)
Jumping to system specs too earlyReserve for critical browser flows that lower layers cannot prove

Extended Resources (Progressive Disclosure)

Load these files only when their specific content is needed:

  • assets/first_slice_template.md — Use when documenting the test plan; provides a structured template for behavior, boundary decision, opening gate spec, and follow-up coverage

Output Style

When completing test planning, produce a brief structured summary and populate the full plan using assets/first_slice_template.md. The summary must cover:

  • Behavior — user-visible outcome being proved
  • First Slice — spec type, file path, and boundary rationale
  • Opening Gate — expected RED failure message and confirmation that failure reason is "feature missing, not setup error"
  • Follow-up Coverage — bulleted list of additional cases deferred from the initial gate
  • Design Checkpoint — confirmation that behavior, boundary, edge cases, and failure reason are all validated

Comments

Markdown supported