Codex-RS Contributors Rust Testing Best Practices
A comprehensive guide to writing high-quality Rust tests at the standard established by the top codex-rs contributors. This skill encodes patterns for test architecture, assertions, mock servers, test data, event-driven testing, determinism, snapshot testing, and integration test infrastructure.
When to Apply
- Writing new tests for any Rust module in codex-rs
- Adding regression tests for a bug fix (3-6 tests per PR)
- Creating integration tests that interact with the Responses API via SSE mocks
- Modifying TUI rendering code that requires snapshot coverage
- Reviewing test code for adherence to codebase conventions
Rule Categories by Priority
| Priority |
Category |
Prefix |
Rules |
Focus |
| CRITICAL |
Test Architecture |
arch- |
6 |
File organization, imports, isolation |
| CRITICAL |
Assertions |
assert- |
5 |
pretty_assertions, whole-object comparison |
| HIGH |
Mock Servers |
mock- |
6 |
wiremock, SSE builders, ResponseMock |
| HIGH |
Test Data |
data- |
5 |
Builders, typed construction, BTreeMap |
| MEDIUM-HIGH |
Event Testing |
event- |
5 |
submit/wait cycles, predicate matching |
| MEDIUM |
Determinism |
det- |
5 |
Stable IDs, environment isolation |
| MEDIUM |
Snapshot Testing |
snap- |
4 |
Insta workflow, buffer rendering |
| LOW-MEDIUM |
Integration Tests |
integ- |
4 |
core_test_support, Bazel compatibility |
Quick Reference
- Test file placement: Sibling
_tests.rs via #[path = "feature_tests.rs"]
- Assertions: Always
use pretty_assertions::assert_eq;
- Object comparison:
assert_eq!(actual, expected) on entire structs
- SSE mocking:
responses::mount_sse_once + responses::sse(vec![ev_*(...)])
- Event waiting:
wait_for_event(codex, |ev| predicate)
- Snapshot tests:
insta::assert_snapshot!(terminal.backend())
- Determinism:
BTreeMap over HashMap, set_deterministic_process_ids
- Binary resolution:
codex_utils_cargo_bin::cargo_bin("name")
- Fixture paths:
codex_utils_cargo_bin::find_resource!("path")
- Sandbox handling:
skip_if_sandbox!() / skip_if_no_network!()
How to Use
- Start with CRITICAL rules (arch, assert) — these apply to every test
- Apply HIGH rules (mock, data) when writing integration tests with API mocks
- Apply MEDIUM-HIGH rules (event) when testing the agent protocol
- Apply MEDIUM rules (det, snap) when tests involve process IDs or UI rendering
- Apply LOW-MEDIUM rules (integ) for cross-crate and build-system compatibility
Reference Files
| File |
Purpose |
references/_sections.md |
Section definitions, ordering, and impact levels |
references/arch-*.md |
Test architecture rules (6 files) |
references/assert-*.md |
Assertion rules (5 files) |
references/mock-*.md |
Mock server rules (6 files) |
references/data-*.md |
Test data rules (5 files) |
references/event-*.md |
Event testing rules (5 files) |
references/det-*.md |
Determinism rules (5 files) |
references/snap-*.md |
Snapshot testing rules (4 files) |
references/integ-*.md |
Integration test rules (4 files) |
assets/templates/_template.md |
Rule file template |
metadata.json |
Skill metadata and version |