write-tests

Write tests for Syncpack using the TestBuilder pattern. Use when adding tests for commands, validation logic, or any new functionality. Covers TestBuilder API, assertion patterns, and common test scenarios.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "write-tests" with this command: npx skills add jamiemason/syncpack/jamiemason-syncpack-write-tests

Write Tests

Guide for writing tests in Syncpack using the TestBuilder pattern.

TDD Workflow (Mandatory)

  1. Study existing tests — Read 2-3 tests in same file, identify the pattern, match it exactly
  2. Write failing test — Never invent APIs; read source to see what exists
  3. Verify it fails — Run just test to confirm
  4. Ask user to confirm — Get approval before implementing
  5. Implement minimal code — Only what's needed to pass
  6. Clean up — Run just format, fix warnings, refactor if needed

Golden Rule

Always use TestBuilder — Never manually construct Context in tests.

Quick Start

use {
  crate::{
    instance_state::{FixableInstance::*, InstanceState, ValidInstance::*},
    test::{
      builder::TestBuilder,
      expect::{expect, ExpectedInstance},
    },
  },
  serde_json::json,
};

#[test]
fn test_descriptive_name() {
    let ctx = TestBuilder::new()
        .with_packages(vec![
            json!({"name": "pkg-a", "dependencies": {"react": "17.0.0"}}),
        ])
        .with_version_group(json!({
            "dependencies": ["react"],
            "pinVersion": "18.0.0"
        }))
        .build_and_visit_packages();

    expect(&ctx).to_have_instances(vec![
        ExpectedInstance {
            state: InstanceState::fixable(DiffersToPin),
            dependency_name: "react",
            id: "react in /dependencies of pkg-a",
            actual: "17.0.0",
            expected: Some("18.0.0"),
            overridden: None,
        },
    ]);
}

TestBuilder Methods

Packages

.with_package(json!({...}))           // Single package
.with_packages(vec![json!({...})])    // Multiple packages

Version Groups

.with_version_group(json!({...}))     // Single group
.with_version_groups(vec![...])       // Multiple groups

Configuration

.with_config(json!({...}))            // Custom config
.with_semver_group(json!({...}))      // Semver rules
.with_strict(true)                    // Strict mode

Registry (for update command)

.with_registry_updates(json!({"react": ["17.0.0", "18.0.0"]}))
.with_update_target(UpdateTarget::Latest)

Build

.build()                              // Without visiting (rare)
.build_and_visit_packages()           // With visiting (most common)

Location String Format

{dependency} in {location} of {package}

Examples:

  • "react in /dependencies of pkg-a"
  • "lodash in /devDependencies of pkg-b"
  • "pnpm in /packageManager of pkg-c"

Running Tests

just test                              # All tests
cargo test test_name -- --nocapture   # Specific test with output
cargo test banned_test                 # Tests matching pattern

Test Organisation

  • Integration tests: src/visit_packages/*_test.rs (preferred)
  • Unit tests: Co-located as *_test.rs (e.g., src/foo.rssrc/foo_test.rs)
  • Test utilities: src/test/builder.rs, src/test/expect.rs

Common Patterns

→ Full patterns and examples: patterns.md

Good Test Examples

Study these files:

  • src/visit_packages/banned_test.rs — Comprehensive examples
  • src/visit_packages/pinned_test.rs — Version group testing
  • src/visit_packages/preferred_semver_test.rs — Local package and highest/lowest semver handling

Common Mistakes

WrongRight
Context { ... }TestBuilder::new()...
.build() then check states.build_and_visit_packages()
ctx.instances[0].find(|i| i.dependency.name == "react")

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

signal-over-noise

No summary provided by upstream source.

Repository SourceNeeds Review
General

fix-bug

No summary provided by upstream source.

Repository SourceNeeds Review
General

add-feature

No summary provided by upstream source.

Repository SourceNeeds Review