Files
acdl/tests/test_release_logic.py
T
Jon Chery 90be5839ab feat(P26): 3 platform pipelines + release job with semver/tag updates
Phase 26 — platform-pipelines-and-release-automation:

- platform-test.yml: PR pipeline (lint + unit-test + integration-test +
  schema-validation) replacing ci.yml for PRs; integration-test runs
  run_platform.sh --check-only for every contracts/*.yaml
- primitives-plan.yml: PR pipeline with matrix over all 9 L1 primitives
  (s3, vpc, ecs-cluster, ecs-service, iam-role, alb, ecr, cloudfront, waf)
- patterns-plan.yml: PR pipeline with matrix over all 2 L2 modules
  (static-assets, microservice)
- release.yml: push-to-main pipeline computing next semver tag (PATCH for
  regular phases, MINOR for milestone completions), updating floating
  MAJOR.MINOR + MAJOR tags, and creating GitHub releases
- run_primitive_plan.sh: plan-only/check-only runner for a single L1
  primitive (adapter compile + structure validation offline)
- run_pattern_plan.sh: plan-only/check-only runner for a single L2 pattern
  (environment check + contract validate + resolve + adapter + structure
  validation offline)
- contracts/microservice.yaml: sample consumer contract for the
  microservice L2 module (schema-compliant scalar inputs)
- instance.json for 8 L1 primitives (vpc, ecs-cluster, ecs-service,
  iam-role, alb, ecr, cloudfront, waf) so the primitives-plan matrix can
  run the adapter offline; s3 already had one
- tests/test_release_logic.py: unit test for semver computation
  (PATCH bump, MINOR bump on milestone, floating tag format)
- tests/test_pipeline_contract.py: 19 new tests validating the 4 platform
  workflows exist and conform (stages, matrices, triggers, permissions)

DEVIATION: The microservice pattern (run_pattern_plan.sh --check-only
microservice + run_platform.sh --check-only contracts/microservice.yaml)
fails at the adapter stage due to a pre-existing resolver ref-id mismatch
for multi-resource L1s (resolver emits ref:vpc.subnet_ids but the expanded
resource id is vpc-subnet). This predates Phase 26 and is out of scope for
pipeline automation; the static-assets pattern passes end-to-end. The
microservice contract is schema-valid and resolves correctly (11
resources); only the adapter compilation of multi-resource L1 refs fails.

VERIFICATION:
- bash scripts/run_ci.sh: PASS (lint + test + check-only)
- python3 -m pytest tests/ -v: 266 passed
- bash scripts/run_primitive_plan.sh --check-only s3: PASS
- bash scripts/run_pattern_plan.sh --check-only static-assets: PASS
- All 9 primitives pass run_primitive_plan.sh --check-only
- All instance.json validate against stack.schema.json

---ci---
project: acdl
phase: 26
milestone: v1.7
status: execute
---/ci---
2026-07-22 20:13:36 +00:00

48 lines
1.7 KiB
Python

"""Test the release semver computation logic (D-057)."""
import pytest
def compute_next_version(latest_tag, is_milestone_complete):
"""Compute the next semver tag from the latest tag + milestone flag."""
parts = latest_tag.lstrip("v").split(".")
major, minor, patch = int(parts[0]), int(parts[1]), int(parts[2])
if is_milestone_complete:
minor += 1
patch = 0
else:
patch += 1
new_tag = f"v{major}.{minor}.{patch}"
major_minor_tag = f"v{major}.{minor}"
major_tag = f"v{major}"
return new_tag, major_minor_tag, major_tag
class TestComputeNextVersion:
def test_regular_phase_bumps_patch(self):
assert compute_next_version("v1.6.0", False) == ("v1.6.1", "v1.6", "v1")
def test_milestone_complete_bumps_minor(self):
assert compute_next_version("v1.6.5", True) == ("v1.7.0", "v1.7", "v1")
def test_milestone_complete_resets_patch(self):
assert compute_next_version("v1.6.0", True) == ("v1.7.0", "v1.7", "v1")
def test_major_bump(self):
# Not implemented yet (major milestones are manual), but test the tag format
tag, mj, m = compute_next_version("v2.3.4", True)
assert tag == "v2.4.0"
assert mj == "v2.4"
assert m == "v2"
def test_floating_tags_match_major_minor(self):
tag, mj, m = compute_next_version("v1.7.3", False)
assert mj == "v1.7"
assert m == "v1"
assert tag == "v1.7.4"
def test_v1_tag_advances_with_minor(self):
# When minor bumps, v1 tag still points at the latest (force-moved)
tag, mj, m = compute_next_version("v1.6.5", True)
assert m == "v1"
assert tag == "v1.7.0"