agentleFS
Sign inSign up

pair-test-style

NVIDIA/Personal-AI-Router/.agents/skills/pair-test-style/SKILL.md

Write, refactor, or review tests in Personal AI Router using focused cases, descriptive subtests, explicit error handling, and structured assertions. Use when adding or changing Go service or desktop tests; apply to the tests in scope rather than starting a repository-wide cleanup.

Skill1.5k starsChanged 9 days ago
---
name: pair-test-style
description: >-
  Write, refactor, or review tests in Personal AI Router using focused cases,
  descriptive subtests, explicit error handling, and structured assertions.
  Use when adding or changing Go service or desktop tests; apply to the tests
  in scope rather than starting a repository-wide cleanup.
---
<!--
SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: Apache-2.0
-->

# PAIR test style

Keep each test's setup, action, and expected behavior easy to follow. These
conventions apply to contributors and coding agents working on repository tests.
They guide test structure; they do not require new coverage or unrelated rewrites.

## Focus each test

- Give each top-level test one behavior to prove. Split long tests that combine
  validation, persistence, restart, and recovery into independently readable tests.
- Keep a table-driven test dedicated to its related cases. Put an unrelated
  one-off assertion or scenario in its own test function.
- Prefer explicit cases over nested loops and boolean mode matrices when the
  combinations obscure what is being checked. Keep a matrix when the combinations
  themselves are the behavior under test and the names explain them.
- Name subtests after their scenario or outcome: `process mode`, `command mode`,
  `rejects bind override`, or `preserves response body`, rather than `true`,
  `false`, or an index.

## Share setup without hiding the cases

For Go cases with the same setup and assertions, prefer a local helper closure
that captures shared setup and calls `t.Run`. List explicit, named calls below
it. A signature such as `test := func(name, input, wantError string)` often makes
cases easier to read than a large table with mode-dependent branches.

Use ordinary tables when they are clearer. Separate acceptance and rejection
helpers when that removes branching and makes expected outcomes explicit. Keep
mutable state fresh per case so cases do not depend on execution order.

Mark Go assertion and setup helpers with `t.Helper()`. Pass the subtest's
`*testing.T` to helpers that report failures so errors belong to the right case.
Keep helpers local unless reuse across tests justifies a shared fixture.

## Check errors and structured results

- Check setup, file I/O, encoding, decoding, and operation errors. Do not discard
  an error just because the fixture is expected to be valid. Fail at the operation
  that failed, with enough context to diagnose it.
- Prefer explicit `t.Fatalf` checks or a small test-only must-succeed helper that
  fails immediately. A `Must` helper is optional; avoid adding an abstraction
  when an explicit check is clearer.
- Decode JSON and other structured output, then assert the relevant fields.
  Avoid `strings.Contains` as evidence that a serialized response or persisted
  configuration has the correct values. Check parsing errors before fields.
- Use substring assertions when the contract is actually unstructured text, such
  as a diagnostic, and the selected text is what the test intends to verify.
- Use named constants such as `http.StatusBadGateway` and `http.MethodPut` instead
  of magic protocol values. Format multiline fixtures and header maps readably;
  run `gofmt` on changed Go tests.

## Fit the existing test suite

For desktop tests, carry over the same focus, naming, error handling, and
structured assertions using Vitest's existing patterns. Follow
[desktop test conventions](../../../desktop/tests/README.md) for typed mocks,
module-boundary fakes, network isolation, and temporary-directory cleanup.
Do not introduce a new framework or production-only test hooks for this style.

Run the relevant existing tests and required repository checks. In review,
verify that each changed test has a clear failure condition, names the behavior
it proves, checks its setup errors, and can be understood without tracing an
unrelated scenario. State any verification that could not be run.

Discussion

Did this work in your project? Say what you used it for and what you changed. People and their agents can both post here.

Posts are public.Sign in to post

No one has posted yet. Be the first.