Test Project and Fixture Structure

Audience: contributors adding or relocating a Stella Ops test suite, and anyone maintaining the test consolidation manifest.

This document defines the on-disk layout that test consolidation expects new and migrated suites to follow: where a project lives, where its fixtures live, and how a change to either is routed to the suites that consume it. Following these conventions keeps suites manifest-routable and keeps fixture ownership unambiguous.

Related: Test Suite Consolidation Deep Dive (why these rules exist), Test Trait Taxonomy (how suites are classified), and TEST_MANIFEST.yml (the routing manifest).

Project Placement

Suite typePreferred locationNotes
Module unit/integration testssrc/<Module>/__Tests/<Project>.Tests/Keep ownership local to the module.
Shared library testssrc/__Libraries/__Tests/<Project>.Tests/Use only for cross-module libraries.
Cross-cutting integration/E2E packssrc/__Tests/<Family>/<Project>/Must have explicit manifest routing and fixture ownership.
Production/operator Playwrightsrc/__Tests/playwright/**Manual/nightly first; live stack requirements must stay explicit.
Frontend testssrc/Web/StellaOps.Web/**Split unit, browser E2E, a11y, and live-stack lanes.
Docs samples/templatesdocs/**/samples/** or docs/dev/sdks/plugin-templates/**Sample-only trigger policy; never product-wide by default.

Fixture Placement

Fixture kindPreferred locationPolicy
Module fixturesAdjacent Fixtures/, TestData/, Golden/, or Snapshots/ under the owning test project.Manifest entry required.
Shared seed datasrc/__Tests/__Datasets/**Refresh command and deterministic policy required.
E2E analyzer corpussrc/__Tests/e2e/scanner-analyzer-corpus/fixtures/**Committed seed corpus only; generated large audit corpus remains ignored.
Connector feed fixturessrc/Concelier/__Tests/**/Fixtures/**Offline snapshots; live fetch is not a PR prerequisite.
Generated outputTestResults/, output/, or ignored module output directories.Must not become source-of-truth fixtures.

Fixture Manifest Files

Focused fixture manifests live under docs/technical/testing/fixtures/.

ManifestScopeCurrent roots
scanner-scm-corpus.fixture-manifest.ymlScanner SCM vulnerable-library and call-path corpus1
concelier-connectors.fixture-manifest.ymlConcelier connector feed fixtures52
cross-cutting-tests.fixture-manifest.ymlsrc/__Tests/** fixtures and seed roots17

The files use JSON-compatible YAML for the same reason as TEST_MANIFEST.yml: validation must work with Python standard library only on Gitea runners.

Change Routing Rules

Commands

python .gitea/scripts/test/refresh-fixture-manifests.py
python .gitea/scripts/test/validate-fixture-manifests.py \
  --out TestResults/test-fixture-manifests/summary.json