Testing Infrastructure — Repo Survey¶
Date: 2026-04-13
Purpose: Ground-truth audit of current test surfaces across all AzureLocal sibling repos.
Used by: ADR-0004 — testing toolset classification
Summary table¶
| Repo | Has tests | Frameworks | What it tests | CI test job | MAPROOM / TRAILHEAD |
|---|---|---|---|---|---|
| azurelocal-avd | ✓ | Pester 5, Python jsonschema | Config loading, schema validation, AVD deployment scripts | ci-powershell.yml — Pester + PSScriptAnalyzer | — |
| azurelocal-sofs-fslogix | ✓ | Pester 5 | SOFS single/triple layout, state management, schema validation | validate-automation.yml — Pester, PSScriptAnalyzer, Terraform, Bicep, Ansible | — |
| azurelocal-loadtools | ✓ | Pester 5, pytest | ConfigManager, Logger, ReportGenerator, StateManager modules; code coverage via JaCoCo | run-tests.yml — Pester with coverage, PSScriptAnalyzer | — |
| azurelocal-vm-conversion-toolkit | ✗ | — | Nothing | None (docs/structure validation only) | — |
| azurelocal-toolkit | ✗ | — | Nothing (empty tests/) | None (docs/structure validation only) | — |
| azurelocal-copilot | ✗ | — | Nothing | None | — |
| azurelocal-training | ✗ | — | Nothing | None | — |
| azurelocal-nutanix-migration | ✗ | — | Nothing | None | — |
| azurelocal-ranger | ✓ | Pester 5 (MAPROOM), field scripts (TRAILHEAD) | Unit (8): Config, DriftDetection, NetworkDevice, Outputs, Runtime, Simulation, StorageNetworkingCollector, WorkloadIdentityAzureCollector; Integration: EndToEnd | publish-psgallery.yml — Pester on release; validate.yml — manifest/import | ✓ Both |
| azurelocal-s2d-cartographer | ✓ | Pester 5 (MAPROOM), field scripts (TRAILHEAD) | Unit (9): S2D capacity, health, disk, reserve, efficiency, storage pool, volume, FQDN resolution; Integration: synthetic cluster | validate.yml — Pester unit tests on PR/push with result publishing | ✓ Both (origin) |
| azurelocal-surveyor | ✓ | Vitest (TypeScript) | Parity calculations, engine logic; type checking, linting | ci.yml — npm run test (Vitest), typecheck, lint, build | — |
Per-repo detail¶
azurelocal-avd¶
Current surface: Pester tests cover the config-loader module and schema validation. Python jsonschema validates variables.example.yml against the JSON Schema. PSScriptAnalyzer runs on all PS scripts.
Unmet needs:
- No integration tests — deployment scripts aren't tested against a synthetic AVD environment.
- No fixture-based testing for host pool shape (candidate: MAPROOM
avd_azure_localfixture type). - No user-journey validation (candidate: STORYBOARD when it ships).
Proposed toolset mapping:
| Need | Toolset | Phase |
|---|---|---|
| Host pool shape assertions | MAPROOM (avd_azure_local fixture type) | Phase 2 prep (v0.2.0 schema) |
| AVD user-journey validation | STORYBOARD | v0.3.0 |
azurelocal-sofs-fslogix¶
Current surface: Pester tests cover SOFS deployment scripts for single-node and triple-node layouts, plus state management. Multi-tool CI (Terraform, Bicep, Ansible) validates IaC files.
Unmet needs:
- No fixture-based testing for FSLogix profile container shape.
- Load validation (file-share I/O patterns) not tested (candidate: PULSE).
Proposed toolset mapping:
| Need | Toolset | Phase |
|---|---|---|
| FSLogix profile shape assertions | MAPROOM (sofs_azure_local fixture type) | Phase 2 prep (v0.2.0 schema) |
| File-share load profiles | PULSE | v0.3.0 |
azurelocal-loadtools¶
Current surface: Most mature testing in the org — Pester with JaCoCo code coverage, PSScriptAnalyzer, multi-tool IaC validation. Tests the load tool's own modules (ConfigManager, Logger, ReportGenerator, StateManager).
Unmet needs:
- Tests cover the tool, not the load profiles it emits. No assertions about whether a given profile is valid for a given cluster shape.
- Coverage-to-expected-cluster-shape correlation is manual today (candidate: PULSE).
Proposed toolset mapping:
| Need | Toolset | Phase |
|---|---|---|
| Load-profile shape validation | PULSE | v0.3.0 |
azurelocal-vm-conversion-toolkit¶
Current surface: None. No test files, no test CI step.
Unmet needs (everything):
- Script-level unit tests for the conversion toolkit scripts.
- Pre/post inventory diffing — assert no workloads, disks, or NICs are dropped during conversion (candidate: LEDGER).
Proposed toolset mapping:
| Need | Toolset | Phase |
|---|---|---|
| Unit tests (repo-local first) | Pester 5 (repo-local) | Phase 3 forcing function |
| Inventory diffing contract | LEDGER | v0.3.0 (after local tests established) |
azurelocal-toolkit¶
Current surface: None. Empty tests/ directory.
Unmet needs: Unit tests for shared PS modules (CanonicalVariable, config-loader, registry-variable, Generate-SolutionConfig). PSScriptAnalyzer at minimum.
Proposed toolset mapping: Pester 5 (repo-local), no platform toolset needed until module contracts are defined.
azurelocal-copilot¶
Current surface: None.
Unmet needs: Copilot instructions validation — assert .github/copilot-instructions.md is well-formed, references valid platform paths. No platform toolset maps cleanly today; this is repo-local work.
azurelocal-training¶
Current surface: None.
Unmet needs: Lab environment reproducibility tests — assert a training lab can be stood up cleanly (candidate: OUTPOST, rejected as testing tool; this belongs in Phase 5 templates). Docs build CI is the primary quality gate.
azurelocal-nutanix-migration¶
Current surface: None.
Unmet needs:
- Migration runbook validation — assert checklists are complete, scripts are syntactically valid.
- Post-migration inventory diffing (candidate: LEDGER).
Proposed toolset mapping:
| Need | Toolset | Phase |
|---|---|---|
| Script/checklist validation (repo-local) | Pester 5 | Phase 3 |
| Post-migration inventory diff | LEDGER | v0.3.0 |
azurelocal-ranger¶
Current surface: MAPROOM unit tests (8 test files) and TRAILHEAD field validation scripts. Confirms that the MAPROOM/TRAILHEAD pattern generalises beyond S2D — Ranger is an assessment tool, not a cluster fabric. This is the second consumer that proves the framework abstraction holds.
Unmet needs: None critical for Phase 2. Ranger will be the second consumer migrated to platform MAPROOM in Phase 2.
azurelocal-s2d-cartographer¶
Current surface: Origin of MAPROOM and TRAILHEAD. Nine Pester unit test files covering S2D capacity, health, disk management, storage pool, and volume calculations. Integration test via synthetic cluster fixture. TRAILHEAD field scripts for live cluster validation.
Phase 2 action: S2DCartographer migrates from its own MAPROOM copy to the platform-managed AzureLocal.Maproom module. The IIC canon moves to platform/testing/iic-canon/ and iic-cluster-01.json is renamed to iic-azure-local-01.json (see ADR-0004 §consequences).
azurelocal-surveyor¶
Current surface: Vitest (TypeScript/React) — unit tests for parity calculations and engine logic. Type checking, linting, and build validation in CI.
Notes: Surveyor is a web application. The MAPROOM/TRAILHEAD/Pester paradigm does not apply. Surveyor's test surface is complete for its paradigm. No platform testing toolset maps to it.
IaC pre-deploy assertion gap¶
azurelocal-toolkit, azurelocal-avd, and azurelocal-sofs-fslogix all run IaC (Bicep, Terraform, ARM, Ansible) through CI. Current CI validates syntax (bicep build, tflint, arm-ttk) but makes no shape assertions — there is no check that a template produces the expected resource types and properties before it is deployed. This gap will affect every future workload repo (azurelocal-aks, azurelocal-sql-ha, azurelocal-sql-mi, azurelocal-vms, azurelocal-ml-ai, azurelocal-iot, azurelocal-custom-images). Addressed by BLUEPRINT (ADR-0004, deferred to v0.3.0).
Observations for Phase 2¶
- MAPROOM generalises cleanly to at least one non-S2D consumer today (Ranger). The pattern holds.
- Six repos have zero test infrastructure. Phase 3's reusable workflow rollout (
reusable-ps-module-ci.yml,reusable-iac-validate.yml) is the practical forcing function to get them testing — the workflows require test hooks. - IIC canon rename (
iic-cluster-01.json→iic-azure-local-01.json) is the only breaking change Phase 2 introduces to existing consumers. Both S2DCartographer and Ranger are migrated in Phase 2, so the break is absorbed in the same phase. - Deferred toolsets (COMPASS, LEDGER, PULSE, STORYBOARD) each have exactly one or two plausible consumers today. None are ready to design a platform contract without the consumer repos establishing their own test surfaces first.