Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions pkg/cli/checks_command.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ func FetchChecksResult(repoOverride string, prNumber string) (*ChecksResult, err
}

state := classifyCheckState(checkRuns, statuses)
requiredState := classifyCheckState(checkRuns, policyStatuses(statuses))
requiredState := classifyCheckState(checkRuns, filterCommitStatusesToPolicyChecks(statuses))

return &ChecksResult{
State: state,
Expand Down Expand Up @@ -318,10 +318,10 @@ func isPolicyCheck(name string) bool {
return false
}

// policyStatuses returns only the commit statuses whose context matches a policy/account-gate
// filterCommitStatusesToPolicyChecks returns only the commit statuses whose context matches a policy/account-gate
// pattern. Used to compute required_state, which excludes optional third-party commit statuses
// (e.g. Vercel, Netlify deployments) but still surfaces policy_blocked when policy gates fail.
func policyStatuses(statuses []PRCommitStatus) []PRCommitStatus {
func filterCommitStatusesToPolicyChecks(statuses []PRCommitStatus) []PRCommitStatus {
if len(statuses) == 0 {
return nil
}
Expand Down
18 changes: 9 additions & 9 deletions pkg/cli/checks_command_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ func TestRequiredStateIgnoresCommitStatusFailures(t *testing.T) {
assert.Equal(t, CheckStateFailed, aggregate, "aggregate state should be failed when commit status fails")

// required_state excludes non-policy commit statuses.
required := classifyCheckState(runs, policyStatuses(statuses))
required := classifyCheckState(runs, filterCommitStatusesToPolicyChecks(statuses))
assert.Equal(t, CheckStateSuccess, required, "required_state should be success when check runs all pass and only Vercel fails")
}

Expand All @@ -314,7 +314,7 @@ func TestRequiredStateNetlifyDeployFailure(t *testing.T) {
aggregate := classifyCheckState(runs, statuses)
assert.Equal(t, CheckStateFailed, aggregate, "aggregate state should be failed for Netlify failure")

required := classifyCheckState(runs, policyStatuses(statuses))
required := classifyCheckState(runs, filterCommitStatusesToPolicyChecks(statuses))
assert.Equal(t, CheckStateSuccess, required, "required_state should be success when only Netlify fails")
}

Expand All @@ -331,7 +331,7 @@ func TestRequiredStateCheckRunFailureStillFails(t *testing.T) {
aggregate := classifyCheckState(runs, statuses)
assert.Equal(t, CheckStateFailed, aggregate, "aggregate state should be failed when check run fails")

required := classifyCheckState(runs, policyStatuses(statuses))
required := classifyCheckState(runs, filterCommitStatusesToPolicyChecks(statuses))
assert.Equal(t, CheckStateFailed, required, "required_state should be failed when a check run fails")
}

Expand All @@ -346,7 +346,7 @@ func TestRequiredStateNoCheckRunsOnlyCommitStatus(t *testing.T) {
aggregate := classifyCheckState(nil, statuses)
assert.Equal(t, CheckStateSuccess, aggregate, "aggregate state should be success")

required := classifyCheckState(nil, policyStatuses(statuses))
required := classifyCheckState(nil, filterCommitStatusesToPolicyChecks(statuses))
assert.Equal(t, CheckStateNoChecks, required, "required_state should be no_checks when there are no check runs and no policy statuses")
}

Expand All @@ -362,12 +362,12 @@ func TestRequiredStatePolicyCommitStatusStillSurfaced(t *testing.T) {
}

// required_state should be policy_blocked (not success), because the policy gate failed.
required := classifyCheckState(runs, policyStatuses(statuses))
required := classifyCheckState(runs, filterCommitStatusesToPolicyChecks(statuses))
assert.Equal(t, CheckStatePolicyBlocked, required, "required_state should be policy_blocked when a policy commit status fails")
}

// ---------------------------------------------------------------------------
// policyStatuses – filter helper tests
// filterCommitStatusesToPolicyChecks – filter helper tests
// ---------------------------------------------------------------------------

func TestPolicyStatuses_FiltersNonPolicy(t *testing.T) {
Copy link

Copilot AI Mar 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test function name still uses the old helper name (TestPolicyStatuses_*) even though the helper was renamed to filterCommitStatusesToPolicyChecks. Renaming the test to match the new helper will keep go test -run and failure output discoverable and consistent with the code under test.

This issue also appears on line 384 of the same file.

Copilot uses AI. Check for mistakes.
Expand All @@ -376,14 +376,14 @@ func TestPolicyStatuses_FiltersNonPolicy(t *testing.T) {
{Context: "netlify/deploy", State: "failure"},
{Context: "branch protection rule check", State: "failure"},
}
filtered := policyStatuses(statuses)
filtered := filterCommitStatusesToPolicyChecks(statuses)
require.Len(t, filtered, 1, "should retain only policy statuses")
assert.Equal(t, "branch protection rule check", filtered[0].Context)
}

func TestPolicyStatuses_EmptyInput(t *testing.T) {
assert.Nil(t, policyStatuses(nil), "nil input should return nil")
assert.Nil(t, policyStatuses([]PRCommitStatus{}), "empty input should return nil")
assert.Nil(t, filterCommitStatusesToPolicyChecks(nil), "nil input should return nil")
assert.Nil(t, filterCommitStatusesToPolicyChecks([]PRCommitStatus{}), "empty input should return nil")
}

func TestClassifyGHAPIError_NotFound(t *testing.T) {
Expand Down
4 changes: 2 additions & 2 deletions pkg/cli/codemod_activation_outputs.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import (

var activationOutputsCodemodLog = logger.New("cli:codemod_activation_outputs")

// getActivationOutputsCodemod creates a codemod for transforming needs.activation.outputs.* to steps.sanitized.outputs.*
func getActivationOutputsCodemod() Codemod {
// newActivationOutputsCodemod creates a codemod for transforming needs.activation.outputs.* to steps.sanitized.outputs.*
func newActivationOutputsCodemod() Codemod {
return Codemod{
ID: "activation-outputs-to-sanitized-step",
Name: "Transform activation outputs to sanitized step",
Expand Down
4 changes: 2 additions & 2 deletions pkg/cli/codemod_activation_outputs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
)

func TestActivationOutputsCodemod(t *testing.T) {
codemod := getActivationOutputsCodemod()
codemod := newActivationOutputsCodemod()

tests := []struct {
name string
Expand Down Expand Up @@ -198,7 +198,7 @@ Some other content: "${{ github.event.issue.number }}"
}

func TestActivationOutputsCodemodMetadata(t *testing.T) {
codemod := getActivationOutputsCodemod()
codemod := newActivationOutputsCodemod()

assert.Equal(t, "activation-outputs-to-sanitized-step", codemod.ID)
assert.Equal(t, "Transform activation outputs to sanitized step", codemod.Name)
Expand Down
2 changes: 1 addition & 1 deletion pkg/cli/fix_codemods.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func GetAllCodemods() []Codemod {
getMCPModeToTypeCodemod(),
getInstallScriptURLCodemod(),
getBashAnonymousRemovalCodemod(), // Replace bash: with bash: false
getActivationOutputsCodemod(), // Transform needs.activation.outputs.* to steps.sanitized.outputs.*
newActivationOutputsCodemod(), // Transform needs.activation.outputs.* to steps.sanitized.outputs.*
getRolesToOnRolesCodemod(), // Move top-level roles to on.roles
getBotsToOnBotsCodemod(), // Move top-level bots to on.bots
getEngineStepsToTopLevelCodemod(), // Move engine.steps to top-level steps
Expand Down
Loading