Co-authored-by: Mathias <mthbqv@gmail.com>
This commit was merged in pull request #73.
This commit is contained in:
@@ -20,22 +20,31 @@ func TestEvaluateShipGate(t *testing.T) {
|
||||
name string
|
||||
runs []gitea.WorkflowRun
|
||||
bp *gitea.BranchProtection
|
||||
risk riskTier
|
||||
wantMerge bool
|
||||
wantCI string
|
||||
}{
|
||||
{"all green → merge", []gitea.WorkflowRun{run("completed", "success")}, open, true, "success"},
|
||||
{"in_progress → no merge", []gitea.WorkflowRun{run("in_progress", "")}, open, false, "pending"},
|
||||
{"queued → no merge", []gitea.WorkflowRun{run("queued", "")}, open, false, "pending"},
|
||||
{"failed → no merge", []gitea.WorkflowRun{run("completed", "failure")}, open, false, "failed"},
|
||||
{"cancelled → no merge (fail-closed)", []gitea.WorkflowRun{run("completed", "cancelled")}, open, false, "failed"},
|
||||
{"no runs → no merge (no CI gate)", nil, open, false, "none"},
|
||||
{"mixed success+queued → no merge", []gitea.WorkflowRun{run("completed", "success"), run("queued", "")}, open, false, "pending"},
|
||||
{"green but protected → no merge", []gitea.WorkflowRun{run("completed", "success")}, protected, false, "success"},
|
||||
{"no runs + protected → no merge", nil, protected, false, "none"},
|
||||
{"all green → merge", []gitea.WorkflowRun{run("completed", "success")}, open, riskLow, true, "success"},
|
||||
{"in_progress → no merge", []gitea.WorkflowRun{run("in_progress", "")}, open, riskLow, false, "pending"},
|
||||
{"queued → no merge", []gitea.WorkflowRun{run("queued", "")}, open, riskLow, false, "pending"},
|
||||
{"failed → no merge", []gitea.WorkflowRun{run("completed", "failure")}, open, riskLow, false, "failed"},
|
||||
{"cancelled → no merge (fail-closed)", []gitea.WorkflowRun{run("completed", "cancelled")}, open, riskLow, false, "failed"},
|
||||
{"no runs → no merge (no CI gate)", nil, open, riskLow, false, "none"},
|
||||
{"mixed success+queued → no merge", []gitea.WorkflowRun{run("completed", "success"), run("queued", "")}, open, riskLow, false, "pending"},
|
||||
{"green but protected → no merge", []gitea.WorkflowRun{run("completed", "success")}, protected, riskLow, false, "success"},
|
||||
{"no runs + protected → no merge", nil, protected, riskLow, false, "none"},
|
||||
// gitea-mcp#63: the tier is an input. Green CI never overrides it; unclassified is not low.
|
||||
{"green + risk/medium → no merge", []gitea.WorkflowRun{run("completed", "success")}, open, riskMedium, false, "success"},
|
||||
{"green + risk/high → no merge", []gitea.WorkflowRun{run("completed", "success")}, open, riskHigh, false, "success"},
|
||||
{"green + no risk label → no merge", []gitea.WorkflowRun{run("completed", "success")}, open, riskNone, false, "success"},
|
||||
{"green + ambiguous labels → no merge", []gitea.WorkflowRun{run("completed", "success")}, open, riskAmbiguous, false, "success"},
|
||||
{"green + unknown value → no merge", []gitea.WorkflowRun{run("completed", "success")}, open, riskUnknown, false, "success"},
|
||||
{"green + unreadable issue → no merge", []gitea.WorkflowRun{run("completed", "success")}, open, riskUnreadable, false, "success"},
|
||||
{"green + the zero tier → no merge (a forgotten field must not mean low)", []gitea.WorkflowRun{run("completed", "success")}, open, riskTier(""), false, "success"},
|
||||
}
|
||||
for _, tc := range tests {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
g := evaluateShipGate(tc.runs, tc.bp)
|
||||
g := evaluateShipGate(tc.runs, tc.bp, tc.risk)
|
||||
if g.merge != tc.wantMerge {
|
||||
t.Errorf("merge = %v, want %v (reason: %q)", g.merge, tc.wantMerge, g.reason)
|
||||
}
|
||||
@@ -51,3 +60,41 @@ func TestEvaluateShipGate(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestClassifyRisk(t *testing.T) {
|
||||
l := func(names ...string) []gitea.Label {
|
||||
out := make([]gitea.Label, len(names))
|
||||
for i, n := range names {
|
||||
out[i] = gitea.Label{Name: n}
|
||||
}
|
||||
return out
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
labels []gitea.Label
|
||||
want riskTier
|
||||
}{
|
||||
{"low", l("risk/low"), riskLow},
|
||||
{"medium", l("risk/medium"), riskMedium},
|
||||
{"high", l("risk/high"), riskHigh},
|
||||
{"low among others", l("type/fix", "risk/low", "size/s"), riskLow},
|
||||
{"none", l("type/fix"), riskNone},
|
||||
{"no labels", nil, riskNone},
|
||||
{"two different", l("risk/low", "risk/high"), riskAmbiguous},
|
||||
{"two identical", l("risk/low", "risk/low"), riskAmbiguous},
|
||||
{"unknown value", l("risk/extreme"), riskUnknown},
|
||||
{"empty value", l("risk/"), riskUnknown},
|
||||
{"wrong case", l("Risk/Low"), riskNone},
|
||||
{"value case matters: risk/Low is unknown, not low", l("risk/Low"), riskUnknown},
|
||||
{"trailing space in the value is unknown, not low", l("risk/low "), riskUnknown},
|
||||
{"leading space in the value is unknown, not low", l("risk/ low"), riskUnknown},
|
||||
{"prefix only inside a name", l("not-risk/low"), riskNone},
|
||||
}
|
||||
for _, tc := range tests {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
if got := classifyRisk(tc.labels); got != tc.want {
|
||||
t.Errorf("classifyRisk(%v) = %q, want %q", tc.labels, got, tc.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user