Files
rollout/rollout_test.go
zeekay 0ce9caa5d3 init: extract rollout primitive
Canonical source: ~/work/hanzo/operator/internal/rollout/.
Both ~/work/hanzo/operator and ~/work/liquidity/operator (Go side)
will consume this module to remove ~830 lines of duplication.

Test fixtures are brand-neutral. Liquidity-specific manifest
security tests stay in ~/work/liquidity/operator.
2026-04-25 15:59:15 -07:00

134 lines
2.7 KiB
Go

package rollout
import (
"os"
"path/filepath"
"testing"
)
const testManifest = `version: "1"
context: kind-test-devnet
project: acme-devnet
domain: dev.example.com
replicas: 1
services:
ats:
image: example.com/ats:v1.19.4
namespace: acme
kind: statefulset
bd:
image: example.com/bd:v1.3.0
namespace: acme
kind: statefulset
gateway:
image: example.com/gateway:v1.0.2
namespace: acme
kind: deployment
exchange:
image: example.com/exchange:v1.2.26
namespace: acme
kind: deployment
`
func writeTestManifests(t *testing.T) string {
t.Helper()
dir := t.TempDir()
for _, f := range []string{"dev.yml", "test.yml", "main.yml"} {
if err := os.WriteFile(filepath.Join(dir, f), []byte(testManifest), 0644); err != nil {
t.Fatal(err)
}
}
return dir
}
func TestLoadAll(t *testing.T) {
dir := writeTestManifests(t)
manifests, err := LoadAll(dir)
if err != nil {
t.Fatal(err)
}
if len(manifests) != 3 {
t.Errorf("expected 3 manifests, got %d", len(manifests))
}
for _, env := range PromotionOrder {
m, ok := manifests[env]
if !ok {
t.Errorf("missing manifest for %s", env)
continue
}
if len(m.Services) != 4 {
t.Errorf("%s: expected 4 services, got %d", env, len(m.Services))
}
}
}
func TestValidateAllSemver(t *testing.T) {
dir := writeTestManifests(t)
manifests, err := LoadAll(dir)
if err != nil {
t.Fatal(err)
}
for env, m := range manifests {
for name, svc := range m.Services {
if err := svc.ValidateTag(name); err != nil {
t.Errorf("%s/%s: %v", env, name, err)
}
}
}
}
func TestValidateRejectsBadTag(t *testing.T) {
dir := t.TempDir()
bad := `version: "1"
context: test
project: test
domain: test
replicas: 1
services:
ats:
image: example.com/ats:dev
namespace: acme
kind: statefulset
`
for _, f := range []string{"dev.yml", "test.yml", "main.yml"} {
if err := os.WriteFile(filepath.Join(dir, f), []byte(bad), 0644); err != nil {
t.Fatal(err)
}
}
manifests, err := LoadAll(dir)
if err != nil {
t.Fatal(err)
}
for _, m := range manifests {
for name, svc := range m.Services {
if err := svc.ValidateTag(name); err == nil {
t.Errorf("expected error for non-semver tag for %s", name)
}
}
}
}
func TestPromotionOrder(t *testing.T) {
if len(PromotionOrder) != 3 {
t.Fatalf("expected 3 envs in promotion order, got %d", len(PromotionOrder))
}
if PromotionOrder[0] != Devnet {
t.Errorf("first env should be devnet, got %s", PromotionOrder[0])
}
if PromotionOrder[1] != Testnet {
t.Errorf("second env should be testnet, got %s", PromotionOrder[1])
}
if PromotionOrder[2] != Mainnet {
t.Errorf("third env should be mainnet, got %s", PromotionOrder[2])
}
}