rdev/internal/adapter/gcs/provisioner_test.go
jordan adcea2fc1f
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
fix(templates): upgrade Go to 1.25 and fix Woodpecker syntax
## Template Version Alignment
- Go: 1.23 → 1.25 across all templates (go.work, go.mod, Dockerfiles, CI)
- Alpine: latest → 3.19 (explicit version pinning)
- Woodpecker: failure:retry → failure:ignore (invalid syntax fix)

## SDLC Tree Fixes (slackpath-5-full-lifecycle)
Fixed merge failures by correcting lifecycle flow:

1. **Branch Creation**: Added missing create-branch step (planned → ready)
   - Bug: Merge command requires feature.Branch field to be set
   - Fix: POST /projects/{id}/sdlc/features/{slug}/branch

2. **Artifact Status**: Changed approval to pass for execution artifacts
   - Bug: Review/audit/QA need status="passed" not "approved"
   - Fix: /artifacts/{type}/approve → /artifacts/{type}/pass
   - Added: pass-qa step after wait-qa

3. **Phase Transition Order**: Reordered merge phase transition
   - Bug: Merge command checks if phase == "merge" first
   - Fix: transition-to-merge BEFORE merge-feature (not after)

## GCS Provisioner Fix
- Replaced deprecated option.WithCredentialsFile with env var approach
- Now uses GOOGLE_APPLICATION_CREDENTIALS for ADC (Application Default Credentials)
- Avoids security risk from deprecated credential options
- Fixed test: Added ComponentTypeGCS to ValidComponentTypes test

## Critical Rules Added
- Version alignment: All template versions must stay in sync
- When updating versions, grep entire templates/ tree

## Files Changed
- 27 template files: Go version + Woodpecker syntax
- 1 tree file: SDLC lifecycle flow corrections
- 1 CLAUDE.md: Version alignment rule
- 1 GCS provisioner: Deprecated API fix
- 1 test file: Added missing component type

Root cause: Skeleton templates lagged behind Go 1.25 release and had
invalid Woodpecker syntax. SDLC tree skipped required branch creation
and used wrong artifact approval endpoints.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-08 23:57:38 -07:00

73 lines
1.6 KiB
Go

package gcs
import (
"testing"
)
func TestSanitizeForGCP(t *testing.T) {
tests := []struct {
input string
expected string
}{
{"my-project", "my-project"},
{"My_Project", "my-project"},
{"test@123", "test-123"},
{"--edge--", "edge"},
{"UPPERCASE", "uppercase"},
{"spaces and stuff", "spaces-and-stuff"},
{"special!@#$%chars", "special-chars"},
}
for _, tt := range tests {
t.Run(tt.input, func(t *testing.T) {
result := sanitizeForGCP(tt.input)
if result != tt.expected {
t.Errorf("sanitizeForGCP(%q) = %q, want %q", tt.input, result, tt.expected)
}
})
}
}
func TestBucketNameFor(t *testing.T) {
p := &Provisioner{}
tests := []struct {
projectID string
expected string
}{
{"my-app", "project-my-app-media"},
{"Test_App", "project-test-app-media"},
{"app123", "project-app123-media"},
}
for _, tt := range tests {
t.Run(tt.projectID, func(t *testing.T) {
result := p.bucketNameFor(tt.projectID)
if result != tt.expected {
t.Errorf("bucketNameFor(%q) = %q, want %q", tt.projectID, result, tt.expected)
}
})
}
}
func TestServiceAccountEmailFor(t *testing.T) {
p := &Provisioner{
gcpProjectID: "threesix-prod",
}
tests := []struct {
projectID string
expected string
}{
{"my-app", "project-my-app-storage@threesix-prod.iam.gserviceaccount.com"},
{"Test_App", "project-test-app-storage@threesix-prod.iam.gserviceaccount.com"},
}
for _, tt := range tests {
t.Run(tt.projectID, func(t *testing.T) {
result := p.serviceAccountEmailFor(tt.projectID)
if result != tt.expected {
t.Errorf("serviceAccountEmailFor(%q) = %q, want %q", tt.projectID, result, tt.expected)
}
})
}
}