Files
atlantis/server/events/plan_command_runner_test.go
Adam Zahumenský 953de00f80 feat: --silence-no-projects to comments with -d and -p (#2969)
* Expand --silence-no-projects to targeted commands

* Cover other commands, test+docs

* Add more tests, refactor doc

* fix tests

* fix dangling pending VCS statuses

* fix: codeql yaml

* fix: lint
2023-01-24 08:26:24 -06:00

152 lines
4.3 KiB
Go

package events_test
import (
"testing"
. "github.com/petergtz/pegomock"
"github.com/runatlantis/atlantis/server/core/db"
"github.com/runatlantis/atlantis/server/events"
"github.com/runatlantis/atlantis/server/events/command"
"github.com/runatlantis/atlantis/server/events/mocks/matchers"
"github.com/runatlantis/atlantis/server/events/models"
"github.com/runatlantis/atlantis/server/events/models/testdata"
"github.com/runatlantis/atlantis/server/logging"
"github.com/runatlantis/atlantis/server/metrics"
. "github.com/runatlantis/atlantis/testing"
)
func TestPlanCommandRunner_IsSilenced(t *testing.T) {
RegisterMockTestingT(t)
cases := []struct {
Description string
Matched bool
Targeted bool
VCSStatusSilence bool
PrevPlanStored bool // stores a 1/1 passing plan in the backend
ExpVCSStatusSet bool
ExpVCSStatusTotal int
ExpVCSStatusSucc int
ExpSilenced bool
}{
{
Description: "When planning, don't comment but set the 0/0 VCS status",
ExpVCSStatusSet: true,
ExpSilenced: true,
},
{
Description: "When planning with any previous plans, don't comment but set the 0/0 VCS status",
PrevPlanStored: true,
ExpVCSStatusSet: true,
ExpSilenced: true,
},
{
Description: "When planning with unmatched target, don't comment but set the 0/0 VCS status",
Targeted: true,
ExpVCSStatusSet: true,
ExpSilenced: true,
},
{
Description: "When planning with unmatched target and any previous plans, don't comment and maintain VCS status",
Targeted: true,
PrevPlanStored: true,
ExpVCSStatusSet: true,
ExpSilenced: true,
ExpVCSStatusSucc: 1,
ExpVCSStatusTotal: 1,
},
{
Description: "When planning with silenced VCS status, don't do anything",
VCSStatusSilence: true,
ExpVCSStatusSet: false,
ExpSilenced: true,
},
{
Description: "When planning with matching projects, comment as usual",
Matched: true,
ExpVCSStatusSet: true,
ExpSilenced: false,
ExpVCSStatusSucc: 1,
ExpVCSStatusTotal: 1,
},
}
for _, c := range cases {
t.Run(c.Description, func(t *testing.T) {
// create an empty DB
tmp := t.TempDir()
db, err := db.New(tmp)
Ok(t, err)
vcsClient := setup(t, func(tc *TestConfig) {
tc.SilenceNoProjects = true
tc.silenceVCSStatusNoProjects = c.VCSStatusSilence
tc.backend = db
})
scopeNull, _, _ := metrics.NewLoggingScope(logger, "atlantis")
modelPull := models.PullRequest{BaseRepo: testdata.GithubRepo, State: models.OpenPullState, Num: testdata.Pull.Num}
cmd := &events.CommentCommand{Name: command.Plan}
if c.Targeted {
cmd.RepoRelDir = "mydir"
}
ctx := &command.Context{
User: testdata.User,
Log: logging.NewNoopLogger(t),
Scope: scopeNull,
Pull: modelPull,
HeadRepo: testdata.GithubRepo,
Trigger: command.CommentTrigger,
}
if c.PrevPlanStored {
_, err = db.UpdatePullWithResults(modelPull, []command.ProjectResult{
{
Command: command.Plan,
RepoRelDir: "prevdir",
Workspace: "default",
PlanSuccess: &models.PlanSuccess{},
},
})
Ok(t, err)
}
When(projectCommandBuilder.BuildPlanCommands(ctx, cmd)).Then(func(args []Param) ReturnValues {
if c.Matched {
return ReturnValues{[]command.ProjectContext{{CommandName: command.Plan}}, nil}
}
return ReturnValues{[]command.ProjectContext{}, nil}
})
planCommandRunner.Run(ctx, cmd)
timesComment := 1
if c.ExpSilenced {
timesComment = 0
}
vcsClient.VerifyWasCalled(Times(timesComment)).CreateComment(AnyRepo(), AnyInt(), AnyString(), AnyString())
if c.ExpVCSStatusSet {
commitUpdater.VerifyWasCalledOnce().UpdateCombinedCount(
matchers.AnyModelsRepo(),
matchers.AnyModelsPullRequest(),
matchers.EqModelsCommitStatus(models.SuccessCommitStatus),
matchers.EqCommandName(command.Plan),
EqInt(c.ExpVCSStatusSucc),
EqInt(c.ExpVCSStatusTotal),
)
} else {
commitUpdater.VerifyWasCalled(Never()).UpdateCombinedCount(
matchers.AnyModelsRepo(),
matchers.AnyModelsPullRequest(),
matchers.AnyModelsCommitStatus(),
matchers.EqCommandName(command.Plan),
AnyInt(),
AnyInt(),
)
}
})
}
}