Files
atlantis/server/events/commit_status_updater_test.go
Sarvar Muminov 90e92e3a13 chore: move CommandContext and CommandResult to models (#193) (#2093)
* Moved CommandContext and CommandResult to models (#193)

* Moved CommandContext and CommandResult to models

* move from models to command

rename CommandContext -> Context
rename CommandResult -> Result

* moved command related helpers into command package

* move ProjectCommandContext and ProjectResult to command/project package

* move project command context and project result

* revert unrelated code

* move tests

* fix left over

* fix linting

* fix tests

* remove unused import

* fix project context dependencies

* fix depenedecies

* fix typo
2022-03-21 10:36:13 -07:00

261 lines
6.9 KiB
Go

// Copyright 2017 HootSuite Media Inc.
//
// Licensed under the Apache License, Version 2.0 (the License);
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an AS IS BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Modified hereafter by contributors to runatlantis/atlantis.
package events_test
import (
"fmt"
"testing"
. "github.com/petergtz/pegomock"
"github.com/runatlantis/atlantis/server/events"
"github.com/runatlantis/atlantis/server/events/command"
"github.com/runatlantis/atlantis/server/events/models"
"github.com/runatlantis/atlantis/server/events/vcs/mocks"
. "github.com/runatlantis/atlantis/testing"
)
func TestUpdateCombined(t *testing.T) {
cases := []struct {
status models.CommitStatus
command command.Name
expDescrip string
}{
{
status: models.PendingCommitStatus,
command: command.Plan,
expDescrip: "Plan in progress...",
},
{
status: models.FailedCommitStatus,
command: command.Plan,
expDescrip: "Plan failed.",
},
{
status: models.SuccessCommitStatus,
command: command.Plan,
expDescrip: "Plan succeeded.",
},
{
status: models.PendingCommitStatus,
command: command.Apply,
expDescrip: "Apply in progress...",
},
{
status: models.FailedCommitStatus,
command: command.Apply,
expDescrip: "Apply failed.",
},
{
status: models.SuccessCommitStatus,
command: command.Apply,
expDescrip: "Apply succeeded.",
},
}
for _, c := range cases {
t.Run(c.expDescrip, func(t *testing.T) {
RegisterMockTestingT(t)
client := mocks.NewMockClient()
s := events.DefaultCommitStatusUpdater{Client: client, StatusName: "atlantis"}
err := s.UpdateCombined(models.Repo{}, models.PullRequest{}, c.status, c.command)
Ok(t, err)
expSrc := fmt.Sprintf("atlantis/%s", c.command)
client.VerifyWasCalledOnce().UpdateStatus(models.Repo{}, models.PullRequest{}, c.status, expSrc, c.expDescrip, "")
})
}
}
func TestUpdateCombinedCount(t *testing.T) {
cases := []struct {
status models.CommitStatus
command command.Name
numSuccess int
numTotal int
expDescrip string
}{
{
status: models.PendingCommitStatus,
command: command.Plan,
numSuccess: 0,
numTotal: 2,
expDescrip: "0/2 projects planned successfully.",
},
{
status: models.FailedCommitStatus,
command: command.Plan,
numSuccess: 1,
numTotal: 2,
expDescrip: "1/2 projects planned successfully.",
},
{
status: models.SuccessCommitStatus,
command: command.Plan,
numSuccess: 2,
numTotal: 2,
expDescrip: "2/2 projects planned successfully.",
},
{
status: models.FailedCommitStatus,
command: command.Apply,
numSuccess: 0,
numTotal: 2,
expDescrip: "0/2 projects applied successfully.",
},
{
status: models.PendingCommitStatus,
command: command.Apply,
numSuccess: 1,
numTotal: 2,
expDescrip: "1/2 projects applied successfully.",
},
{
status: models.SuccessCommitStatus,
command: command.Apply,
numSuccess: 2,
numTotal: 2,
expDescrip: "2/2 projects applied successfully.",
},
}
for _, c := range cases {
t.Run(c.expDescrip, func(t *testing.T) {
RegisterMockTestingT(t)
client := mocks.NewMockClient()
s := events.DefaultCommitStatusUpdater{Client: client, StatusName: "atlantis-test"}
err := s.UpdateCombinedCount(models.Repo{}, models.PullRequest{}, c.status, c.command, c.numSuccess, c.numTotal)
Ok(t, err)
expSrc := fmt.Sprintf("%s/%s", s.StatusName, c.command)
client.VerifyWasCalledOnce().UpdateStatus(models.Repo{}, models.PullRequest{}, c.status, expSrc, c.expDescrip, "")
})
}
}
// Test that it sets the "source" properly depending on if the project is
// named or not.
func TestDefaultCommitStatusUpdater_UpdateProjectSrc(t *testing.T) {
RegisterMockTestingT(t)
cases := []struct {
projectName string
repoRelDir string
workspace string
expSrc string
}{
{
projectName: "name",
repoRelDir: ".",
workspace: "default",
expSrc: "atlantis/plan: name",
},
{
projectName: "",
repoRelDir: "dir1/dir2",
workspace: "workspace",
expSrc: "atlantis/plan: dir1/dir2/workspace",
},
}
for _, c := range cases {
t.Run(c.expSrc, func(t *testing.T) {
client := mocks.NewMockClient()
s := events.DefaultCommitStatusUpdater{Client: client, StatusName: "atlantis"}
err := s.UpdateProject(command.ProjectContext{
ProjectName: c.projectName,
RepoRelDir: c.repoRelDir,
Workspace: c.workspace,
},
command.Plan,
models.PendingCommitStatus,
"url")
Ok(t, err)
client.VerifyWasCalledOnce().UpdateStatus(models.Repo{}, models.PullRequest{}, models.PendingCommitStatus, c.expSrc, "Plan in progress...", "url")
})
}
}
// Test that it uses the right words in the description.
func TestDefaultCommitStatusUpdater_UpdateProject(t *testing.T) {
RegisterMockTestingT(t)
cases := []struct {
status models.CommitStatus
cmd command.Name
expDescrip string
}{
{
models.PendingCommitStatus,
command.Plan,
"Plan in progress...",
},
{
models.FailedCommitStatus,
command.Plan,
"Plan failed.",
},
{
models.SuccessCommitStatus,
command.Plan,
"Plan succeeded.",
},
{
models.PendingCommitStatus,
command.Apply,
"Apply in progress...",
},
{
models.FailedCommitStatus,
command.Apply,
"Apply failed.",
},
{
models.SuccessCommitStatus,
command.Apply,
"Apply succeeded.",
},
}
for _, c := range cases {
t.Run(c.expDescrip, func(t *testing.T) {
client := mocks.NewMockClient()
s := events.DefaultCommitStatusUpdater{Client: client, StatusName: "atlantis"}
err := s.UpdateProject(command.ProjectContext{
RepoRelDir: ".",
Workspace: "default",
},
c.cmd,
c.status,
"url")
Ok(t, err)
client.VerifyWasCalledOnce().UpdateStatus(models.Repo{}, models.PullRequest{}, c.status, fmt.Sprintf("atlantis/%s: ./default", c.cmd.String()), c.expDescrip, "url")
})
}
}
// Test that we can set the status name.
func TestDefaultCommitStatusUpdater_UpdateProjectCustomStatusName(t *testing.T) {
RegisterMockTestingT(t)
client := mocks.NewMockClient()
s := events.DefaultCommitStatusUpdater{Client: client, StatusName: "custom"}
err := s.UpdateProject(command.ProjectContext{
RepoRelDir: ".",
Workspace: "default",
},
command.Apply,
models.SuccessCommitStatus,
"url")
Ok(t, err)
client.VerifyWasCalledOnce().UpdateStatus(models.Repo{}, models.PullRequest{},
models.SuccessCommitStatus, "custom/apply: ./default", "Apply succeeded.", "url")
}