42 lines
1.3 KiB
Go
42 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"git.cin.su/m/Assistant/contracts/work"
|
|
)
|
|
|
|
func TestDevelopmentGateControllerRequiresSequentialVerifiedEvidence(t *testing.T) {
|
|
now := time.UnixMilli(10)
|
|
gate, err := prepareDevelopmentGate(work.DevelopmentGate{ID: "gate-1", Revision: 1, Stage: work.DevelopmentEvidenceCollected, EvidenceRefs: []string{"evidence-1"}}, now)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
gate.ProposalRef = "proposal-1"
|
|
gate, err = advanceDevelopmentGate(gate, work.DevelopmentProposalCreated, now)
|
|
if err != nil || gate.Revision != 2 {
|
|
t.Fatalf("proposal transition failed: %#v %v", gate, err)
|
|
}
|
|
gate.TaskPacketRef = "task-1"
|
|
gate, err = advanceDevelopmentGate(gate, work.DevelopmentTaskAdmitted, now)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
gate.WorktreeRef = "isolated-worktree"
|
|
gate, err = advanceDevelopmentGate(gate, work.DevelopmentIsolated, now)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
gate.ProducerRunRefs = []work.AgentRunID{"producer"}
|
|
gate.VerifierRunRefs = []work.AgentRunID{"verifier"}
|
|
gate.VerificationEvidence = "verification-1"
|
|
gate, err = advanceDevelopmentGate(gate, work.DevelopmentVerified, now)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := advanceDevelopmentGate(gate, work.DevelopmentPromoted, now); err == nil {
|
|
t.Fatal("promotion bypassed canary")
|
|
}
|
|
}
|