From e2930e48e570d6008a69442bb20489dfb2819694 Mon Sep 17 00:00:00 2001 From: Luke Kysow Date: Fri, 20 Jul 2018 13:27:25 +0200 Subject: [PATCH] Test bitbucket parsing --- server/events/command_runner.go | 2 +- server/events/command_runner_test.go | 4 +- server/events/event_parser.go | 40 +-- server/events/event_parser_test.go | 211 ++++++++++++- server/events/models/models.go | 4 +- .../testdata/bitbucket-comment-event.json | 292 ++++++++++++++++++ .../bitbucket-pull-event-fulfilled.json | 240 ++++++++++++++ server/events_controller_test.go | 20 +- server/server.go | 4 +- 9 files changed, 770 insertions(+), 47 deletions(-) create mode 100644 server/events/testdata/bitbucket-comment-event.json create mode 100644 server/events/testdata/bitbucket-pull-event-fulfilled.json diff --git a/server/events/command_runner.go b/server/events/command_runner.go index 9457d752e..a89ec10b6 100644 --- a/server/events/command_runner.go +++ b/server/events/command_runner.go @@ -225,7 +225,7 @@ func (c *DefaultCommandRunner) validateCtxAndComment(ctx *CommandContext) bool { return false } - if ctx.Pull.State != models.Open { + if ctx.Pull.State != models.OpenPullState { ctx.Log.Info("command was run on closed pull request") c.VCSClient.CreateComment(ctx.BaseRepo, ctx.Pull.Num, "Atlantis commands can't be run on closed pull requests") // nolint: errcheck return false diff --git a/server/events/command_runner_test.go b/server/events/command_runner_test.go index 7af2e15fc..92894a67b 100644 --- a/server/events/command_runner_test.go +++ b/server/events/command_runner_test.go @@ -128,7 +128,7 @@ func TestRunCommentCommand_ForkPRDisabled(t *testing.T) { setup(t) ch.AllowForkPRs = false // by default it's false so don't need to reset var pull github.PullRequest - modelPull := models.PullRequest{State: models.Open} + modelPull := models.PullRequest{State: models.OpenPullState} When(githubGetter.GetPullRequest(fixtures.GithubRepo, fixtures.Pull.Num)).ThenReturn(&pull, nil) headRepo := fixtures.GithubRepo @@ -147,7 +147,7 @@ func TestRunCommentCommand_ClosedPull(t *testing.T) { pull := &github.PullRequest{ State: github.String("closed"), } - modelPull := models.PullRequest{State: models.Closed} + modelPull := models.PullRequest{State: models.ClosedPullState} When(githubGetter.GetPullRequest(fixtures.GithubRepo, fixtures.Pull.Num)).ThenReturn(pull, nil) When(eventParsing.ParseGithubPull(pull)).ThenReturn(modelPull, modelPull.BaseRepo, fixtures.GithubRepo, nil) diff --git a/server/events/event_parser.go b/server/events/event_parser.go index 6489003b9..40f0082d9 100644 --- a/server/events/event_parser.go +++ b/server/events/event_parser.go @@ -127,12 +127,12 @@ type EventParsing interface { } type EventParser struct { - GithubUser string - GithubToken string - GitlabUser string - GitlabToken string - BitbucketCloudUser string - BitbucketCloudToken string + GithubUser string + GithubToken string + GitlabUser string + GitlabToken string + BitbucketUser string + BitbucketToken string } // GetBitbucketEventType translates the bitbucket header name into a pull @@ -167,13 +167,13 @@ func (e *EventParser) parseCommonBitbucketEventData(event bitbucket.CommonEventD var prState models.PullRequestState switch *event.PullRequest.State { case "OPEN": - prState = models.Open + prState = models.OpenPullState case "MERGED": - prState = models.Closed + prState = models.ClosedPullState case "SUPERSEDED": - prState = models.Closed + prState = models.ClosedPullState case "DECLINE": - prState = models.Closed + prState = models.ClosedPullState default: err = fmt.Errorf("unable to determine pull request state from %q, this is a bug!", *event.PullRequest.State) return @@ -183,8 +183,8 @@ func (e *EventParser) parseCommonBitbucketEventData(event bitbucket.CommonEventD models.Bitbucket, *event.PullRequest.Source.Repository.FullName, *event.PullRequest.Source.Repository.Links.HTML.HREF, - e.BitbucketCloudUser, - e.BitbucketCloudToken) + e.BitbucketUser, + e.BitbucketToken) if err != nil { return } @@ -192,8 +192,8 @@ func (e *EventParser) parseCommonBitbucketEventData(event bitbucket.CommonEventD models.Bitbucket, *event.Repository.FullName, *event.Repository.Links.HTML.HREF, - e.BitbucketCloudUser, - e.BitbucketCloudToken) + e.BitbucketUser, + e.BitbucketToken) if err != nil { return } @@ -315,9 +315,9 @@ func (e *EventParser) ParseGithubPull(pull *github.PullRequest) (pullModel model return } - pullState := models.Closed + pullState := models.ClosedPullState if pull.GetState() == "open" { - pullState = models.Open + pullState = models.OpenPullState } pullModel = models.PullRequest{ @@ -337,9 +337,9 @@ func (e *EventParser) ParseGithubRepo(ghRepo *github.Repository) (models.Repo, e } func (e *EventParser) ParseGitlabMergeEvent(event gitlab.MergeEvent) (pull models.PullRequest, eventType models.PullRequestEventType, baseRepo models.Repo, headRepo models.Repo, user models.User, err error) { - modelState := models.Closed + modelState := models.ClosedPullState if event.ObjectAttributes.State == gitlabPullOpened { - modelState = models.Open + modelState = models.OpenPullState } // GitLab also has a "merged" state, but we map that to Closed so we don't // need to check for it. @@ -406,9 +406,9 @@ func (e *EventParser) ParseGitlabMergeCommentEvent(event gitlab.MergeCommentEven // from the merge request, the only caller of this function already has that // data. This means we can construct the pull request object correctly. func (e *EventParser) ParseGitlabMergeRequest(mr *gitlab.MergeRequest, baseRepo models.Repo) models.PullRequest { - pullState := models.Closed + pullState := models.ClosedPullState if mr.State == gitlabPullOpened { - pullState = models.Open + pullState = models.OpenPullState } // GitLab also has a "merged" state, but we map that to Closed so we don't // need to check for it. diff --git a/server/events/event_parser_test.go b/server/events/event_parser_test.go index 6e50f4f13..6d94ad772 100644 --- a/server/events/event_parser_test.go +++ b/server/events/event_parser_test.go @@ -16,6 +16,8 @@ package events_test import ( "encoding/json" "fmt" + "io/ioutil" + "path/filepath" "strings" "testing" @@ -29,10 +31,12 @@ import ( ) var parser = events.EventParser{ - GithubUser: "github-user", - GithubToken: "github-token", - GitlabUser: "gitlab-user", - GitlabToken: "gitlab-token", + GithubUser: "github-user", + GithubToken: "github-token", + GitlabUser: "gitlab-user", + GitlabToken: "gitlab-token", + BitbucketUser: "bitbucket-user", + BitbucketToken: "bitbucket-token", } func TestParseGithubRepo(t *testing.T) { @@ -144,7 +148,7 @@ func TestParseGithubPullEvent(t *testing.T) { Branch: Pull.Head.GetRef(), HeadCommit: Pull.Head.GetSHA(), Num: Pull.GetNumber(), - State: models.Open, + State: models.OpenPullState, BaseRepo: expBaseRepo, }, actPull) Equals(t, models.OpenedPullEvent, evType) @@ -254,7 +258,7 @@ func TestParseGithubPull(t *testing.T) { Branch: Pull.Head.GetRef(), HeadCommit: Pull.Head.GetSHA(), Num: Pull.GetNumber(), - State: models.Open, + State: models.OpenPullState, BaseRepo: expBaseRepo, }, pullRes) Equals(t, expBaseRepo, actBaseRepo) @@ -287,7 +291,7 @@ func TestParseGitlabMergeEvent(t *testing.T) { Num: 1, HeadCommit: "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", Branch: "ms-viewport", - State: models.Open, + State: models.OpenPullState, BaseRepo: expBaseRepo, }, pull) Equals(t, models.OpenedPullEvent, evType) @@ -310,7 +314,7 @@ func TestParseGitlabMergeEvent(t *testing.T) { event.ObjectAttributes.State = "closed" pull, _, _, _, _, err = parser.ParseGitlabMergeEvent(*event) Ok(t, err) - Equals(t, models.Closed, pull.State) + Equals(t, models.ClosedPullState, pull.State) } func TestParseGitlabMergeEvent_ActionType(t *testing.T) { @@ -376,14 +380,14 @@ func TestParseGitlabMergeRequest(t *testing.T) { Num: 8, HeadCommit: "0b4ac85ea3063ad5f2974d10cd68dd1f937aaac2", Branch: "abc", - State: models.Open, + State: models.OpenPullState, BaseRepo: repo, }, pull) t.Log("If the state is closed, should set field correctly.") event.State = "closed" pull = parser.ParseGitlabMergeRequest(event, repo) - Equals(t, models.Closed, pull.State) + Equals(t, models.ClosedPullState, pull.State) } func TestParseGitlabMergeCommentEvent(t *testing.T) { @@ -515,6 +519,193 @@ func TestCommentCommand_String(t *testing.T) { }).String()) } +func TestParseBitbucketCloudCommentEvent_EmptyString(t *testing.T) { + parser := events.EventParser{} + _, _, _, _, _, err := parser.ParseBitbucketCloudCommentEvent([]byte("")) + ErrEquals(t, "parsing json: unexpected end of JSON input", err) +} + +func TestParseBitbucketCloudCommentEvent_EmptyObject(t *testing.T) { + parser := events.EventParser{} + _, _, _, _, _, err := parser.ParseBitbucketCloudCommentEvent([]byte("{}")) + ErrEquals(t, "Key: 'CommentEvent.CommonEventData.Actor' Error:Field validation for 'Actor' failed on the 'required' tag\nKey: 'CommentEvent.CommonEventData.Repository' Error:Field validation for 'Repository' failed on the 'required' tag\nKey: 'CommentEvent.CommonEventData.PullRequest' Error:Field validation for 'PullRequest' failed on the 'required' tag\nKey: 'CommentEvent.Comment' Error:Field validation for 'Comment' failed on the 'required' tag", err) +} + +func TestParseBitbucketCloudCommentEvent_CommitHashMissing(t *testing.T) { + path := filepath.Join("testdata", "bitbucket-comment-event.json") + bytes, err := ioutil.ReadFile(path) + if err != nil { + Ok(t, err) + } + emptyCommitHash := strings.Replace(string(bytes), ` "hash": "e0624da46d3a",`, "", -1) + _, _, _, _, _, err = parser.ParseBitbucketCloudCommentEvent([]byte(emptyCommitHash)) + ErrEquals(t, "Key: 'CommentEvent.CommonEventData.PullRequest.Source.Commit.Hash' Error:Field validation for 'Hash' failed on the 'required' tag", err) +} + +func TestParseBitbucketCloudCommentEvent_ValidEvent(t *testing.T) { + path := filepath.Join("testdata", "bitbucket-comment-event.json") + bytes, err := ioutil.ReadFile(path) + if err != nil { + Ok(t, err) + } + pull, baseRepo, headRepo, user, comment, err := parser.ParseBitbucketCloudCommentEvent(bytes) + Ok(t, err) + expBaseRepo := models.Repo{ + FullName: "lkysow/atlantis-example", + Owner: "lkysow", + Name: "atlantis-example", + CloneURL: "https://bitbucket-user:bitbucket-token@bitbucket.org/lkysow/atlantis-example.git", + SanitizedCloneURL: "https://bitbucket.org/lkysow/atlantis-example.git", + VCSHost: models.VCSHost{ + Hostname: "bitbucket.org", + Type: models.Bitbucket, + }, + } + Equals(t, expBaseRepo, baseRepo) + Equals(t, models.PullRequest{ + Num: 2, + HeadCommit: "e0624da46d3a", + URL: "https://bitbucket.org/lkysow/atlantis-example/pull-requests/2", + Branch: "lkysow/maintf-edited-online-with-bitbucket-1532029690581", + Author: "lkysow", + State: models.ClosedPullState, + BaseRepo: expBaseRepo, + }, pull) + Equals(t, models.Repo{ + FullName: "lkysow-fork/atlantis-example", + Owner: "lkysow-fork", + Name: "atlantis-example", + CloneURL: "https://bitbucket-user:bitbucket-token@bitbucket.org/lkysow-fork/atlantis-example.git", + SanitizedCloneURL: "https://bitbucket.org/lkysow-fork/atlantis-example.git", + VCSHost: models.VCSHost{ + Hostname: "bitbucket.org", + Type: models.Bitbucket, + }, + }, headRepo) + Equals(t, models.User{ + Username: "lkysow", + }, user) + Equals(t, "my comment", comment) +} + +func TestParseBitbucketCloudCommentEvent_MultipleStates(t *testing.T) { + path := filepath.Join("testdata", "bitbucket-comment-event.json") + bytes, err := ioutil.ReadFile(path) + if err != nil { + Ok(t, err) + } + + cases := []struct { + pullState string + exp models.PullRequestState + }{ + { + "OPEN", + models.OpenPullState, + }, + { + "MERGED", + models.ClosedPullState, + }, + { + "SUPERSEDED", + models.ClosedPullState, + }, + { + "DECLINE", + models.ClosedPullState, + }, + } + + for _, c := range cases { + t.Run(c.pullState, func(t *testing.T) { + withState := strings.Replace(string(bytes), `"state": "MERGED"`, fmt.Sprintf(`"state": "%s"`, c.pullState), -1) + pull, _, _, _, _, err := parser.ParseBitbucketCloudCommentEvent([]byte(withState)) + Ok(t, err) + Equals(t, c.exp, pull.State) + }) + } +} + +func TestParseBitbucketCloudPullEvent_ValidEvent(t *testing.T) { + path := filepath.Join("testdata", "bitbucket-pull-event-fulfilled.json") + bytes, err := ioutil.ReadFile(path) + if err != nil { + Ok(t, err) + } + pull, baseRepo, headRepo, user, err := parser.ParseBitbucketCloudPullEvent(bytes) + Ok(t, err) + expBaseRepo := models.Repo{ + FullName: "lkysow/atlantis-example", + Owner: "lkysow", + Name: "atlantis-example", + CloneURL: "https://bitbucket-user:bitbucket-token@bitbucket.org/lkysow/atlantis-example.git", + SanitizedCloneURL: "https://bitbucket.org/lkysow/atlantis-example.git", + VCSHost: models.VCSHost{ + Hostname: "bitbucket.org", + Type: models.Bitbucket, + }, + } + Equals(t, expBaseRepo, baseRepo) + Equals(t, models.PullRequest{ + Num: 2, + HeadCommit: "e0624da46d3a", + URL: "https://bitbucket.org/lkysow/atlantis-example/pull-requests/2", + Branch: "lkysow/maintf-edited-online-with-bitbucket-1532029690581", + Author: "lkysow", + State: models.ClosedPullState, + BaseRepo: expBaseRepo, + }, pull) + Equals(t, models.Repo{ + FullName: "lkysow-fork/atlantis-example", + Owner: "lkysow-fork", + Name: "atlantis-example", + CloneURL: "https://bitbucket-user:bitbucket-token@bitbucket.org/lkysow-fork/atlantis-example.git", + SanitizedCloneURL: "https://bitbucket.org/lkysow-fork/atlantis-example.git", + VCSHost: models.VCSHost{ + Hostname: "bitbucket.org", + Type: models.Bitbucket, + }, + }, headRepo) + Equals(t, models.User{ + Username: "lkysow", + }, user) +} + +func TestGetBitbucketEventType(t *testing.T) { + cases := []struct { + header string + exp models.PullRequestEventType + }{ + { + header: "pullrequest:created", + exp: models.OpenedPullEvent, + }, + { + header: "pullrequest:updated", + exp: models.UpdatedPullEvent, + }, + { + header: "pullrequest:fulfilled", + exp: models.ClosedPullEvent, + }, + { + header: "pullrequest:rejected", + exp: models.ClosedPullEvent, + }, + { + header: "random", + exp: models.OtherPullEvent, + }, + } + for _, c := range cases { + t.Run(c.header, func(t *testing.T) { + act := parser.GetBitbucketEventType(c.header) + Equals(t, c.exp, act) + }) + } +} + var mergeEventJSON = `{ "object_kind": "merge_request", "user": { diff --git a/server/events/models/models.go b/server/events/models/models.go index aefea4499..e26e3fd06 100644 --- a/server/events/models/models.go +++ b/server/events/models/models.go @@ -130,8 +130,8 @@ type PullRequest struct { type PullRequestState int const ( - Open PullRequestState = iota - Closed + OpenPullState PullRequestState = iota + ClosedPullState ) type PullRequestEventType int diff --git a/server/events/testdata/bitbucket-comment-event.json b/server/events/testdata/bitbucket-comment-event.json new file mode 100644 index 000000000..9bf283992 --- /dev/null +++ b/server/events/testdata/bitbucket-comment-event.json @@ -0,0 +1,292 @@ +{ + "comment": { + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/comments/70506195" + }, + "html": { + "href": "https://bitbucket.org/lkysow/atlantis-example/pull-requests/2/_/diff#comment-70506195" + } + }, + "deleted": false, + "pullrequest": { + "type": "pullrequest", + "id": 2, + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2" + }, + "html": { + "href": "https://bitbucket.org/lkysow/atlantis-example/pull-requests/2" + } + }, + "title": "main.tf edited online with Bitbucket" + }, + "content": { + "raw": "my comment", + "markup": "markdown", + "html": "my comment", + "type": "rendered" + }, + "created_on": "2018-07-19T19:51:50.607374+00:00", + "user": { + "username": "lkysow", + "display_name": "Luke", + "account_id": "557058:dc3817de-68b5-45cd-b81c-5c39d2560090", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/users/lkysow" + }, + "html": { + "href": "https://bitbucket.org/lkysow/" + }, + "avatar": { + "href": "https://bitbucket.org/account/lkysow/avatar/" + } + }, + "type": "user", + "uuid": "{bf34a99b-8a11-452c-8fbc-bdffc340e584}" + }, + "updated_on": "2018-07-19T19:51:50.615436+00:00", + "type": "pullrequest_comment", + "id": 70506195 + }, + "pullrequest": { + "type": "pullrequest", + "description": "main.tf edited online with Bitbucket", + "links": { + "decline": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/decline" + }, + "commits": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/commits" + }, + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2" + }, + "comments": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/comments" + }, + "merge": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/merge" + }, + "html": { + "href": "https://bitbucket.org/lkysow/atlantis-example/pull-requests/2" + }, + "activity": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/activity" + }, + "diff": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/diff" + }, + "approve": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/approve" + }, + "statuses": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/statuses" + } + }, + "title": "main.tf edited online with Bitbucket", + "close_source_branch": true, + "reviewers": [], + "id": 2, + "destination": { + "commit": { + "hash": "1ed8205eec00", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/commit/1ed8205eec00" + } + } + }, + "branch": { + "name": "master" + }, + "repository": { + "full_name": "lkysow/atlantis-example", + "type": "repository", + "name": "atlantis-example", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example" + }, + "html": { + "href": "https://bitbucket.org/lkysow/atlantis-example" + }, + "avatar": { + "href": "https://bytebucket.org/ravatar/%7B94189367-116b-436a-9f77-2314b97a6067%7D?ts=default" + } + }, + "uuid": "{94189367-116b-436a-9f77-2314b97a6067}" + } + }, + "comment_count": 10, + "summary": { + "raw": "main.tf edited online with Bitbucket", + "markup": "markdown", + "html": "

main.tf edited online with Bitbucket

", + "type": "rendered" + }, + "source": { + "commit": { + "hash": "e0624da46d3a", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow-fork/atlantis-example/commit/e0624da46d3a" + } + } + }, + "branch": { + "name": "lkysow/maintf-edited-online-with-bitbucket-1532029690581" + }, + "repository": { + "full_name": "lkysow-fork/atlantis-example", + "type": "repository", + "name": "atlantis-example", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow-fork/atlantis-example" + }, + "html": { + "href": "https://bitbucket.org/lkysow-fork/atlantis-example" + }, + "avatar": { + "href": "https://bytebucket.org/ravatar/%7B94189367-116b-436a-9f77-2314b97a6067%7D?ts=default" + } + }, + "uuid": "{94189367-116b-436a-9f77-2314b97a6067}" + } + }, + "state": "MERGED", + "author": { + "username": "lkysow", + "display_name": "Luke", + "account_id": "557058:dc3817de-68b5-45cd-b81c-5c39d2560090", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/users/lkysow" + }, + "html": { + "href": "https://bitbucket.org/lkysow/" + }, + "avatar": { + "href": "https://bitbucket.org/account/lkysow/avatar/" + } + }, + "type": "user", + "uuid": "{bf34a99b-8a11-452c-8fbc-bdffc340e584}" + }, + "created_on": "2018-07-19T19:48:14.228611+00:00", + "participants": [ + { + "type": "participant", + "user": { + "username": "lkysow", + "display_name": "Luke", + "account_id": "557058:dc3817de-68b5-45cd-b81c-5c39d2560090", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/users/lkysow" + }, + "html": { + "href": "https://bitbucket.org/lkysow/" + }, + "avatar": { + "href": "https://bitbucket.org/account/lkysow/avatar/" + } + }, + "type": "user", + "uuid": "{bf34a99b-8a11-452c-8fbc-bdffc340e584}" + }, + "role": "PARTICIPANT", + "approved": true, + "participated_on": "2018-07-19T19:51:24.190902+00:00" + } + ], + "reason": "", + "updated_on": "2018-07-19T19:51:50.705732+00:00", + "merge_commit": { + "hash": "c21506eeea5f", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/commit/c21506eeea5f" + } + } + }, + "closed_by": { + "username": "lkysow", + "display_name": "Luke", + "account_id": "557058:dc3817de-68b5-45cd-b81c-5c39d2560090", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/users/lkysow" + }, + "html": { + "href": "https://bitbucket.org/lkysow/" + }, + "avatar": { + "href": "https://bitbucket.org/account/lkysow/avatar/" + } + }, + "type": "user", + "uuid": "{bf34a99b-8a11-452c-8fbc-bdffc340e584}" + }, + "task_count": 0 + }, + "actor": { + "username": "lkysow", + "display_name": "Luke", + "account_id": "557058:dc3817de-68b5-45cd-b81c-5c39d2560090", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/users/lkysow" + }, + "html": { + "href": "https://bitbucket.org/lkysow/" + }, + "avatar": { + "href": "https://bitbucket.org/account/lkysow/avatar/" + } + }, + "type": "user", + "uuid": "{bf34a99b-8a11-452c-8fbc-bdffc340e584}" + }, + "repository": { + "scm": "git", + "website": "", + "name": "atlantis-example", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example" + }, + "html": { + "href": "https://bitbucket.org/lkysow/atlantis-example" + }, + "avatar": { + "href": "https://bytebucket.org/ravatar/%7B94189367-116b-436a-9f77-2314b97a6067%7D?ts=default" + } + }, + "full_name": "lkysow/atlantis-example", + "owner": { + "username": "lkysow", + "display_name": "Luke", + "account_id": "557058:dc3817de-68b5-45cd-b81c-5c39d2560090", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/users/lkysow" + }, + "html": { + "href": "https://bitbucket.org/lkysow/" + }, + "avatar": { + "href": "https://bitbucket.org/account/lkysow/avatar/" + } + }, + "type": "user", + "uuid": "{bf34a99b-8a11-452c-8fbc-bdffc340e584}" + }, + "type": "repository", + "is_private": false, + "uuid": "{94189367-116b-436a-9f77-2314b97a6067}" + } +} \ No newline at end of file diff --git a/server/events/testdata/bitbucket-pull-event-fulfilled.json b/server/events/testdata/bitbucket-pull-event-fulfilled.json new file mode 100644 index 000000000..e35cecdcc --- /dev/null +++ b/server/events/testdata/bitbucket-pull-event-fulfilled.json @@ -0,0 +1,240 @@ +{ + "pullrequest": { + "type": "pullrequest", + "description": "main.tf edited online with Bitbucket", + "links": { + "decline": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/decline" + }, + "commits": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/commits" + }, + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2" + }, + "comments": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/comments" + }, + "merge": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/merge" + }, + "html": { + "href": "https://bitbucket.org/lkysow/atlantis-example/pull-requests/2" + }, + "activity": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/activity" + }, + "diff": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/diff" + }, + "approve": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/approve" + }, + "statuses": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/pullrequests/2/statuses" + } + }, + "title": "main.tf edited online with Bitbucket", + "close_source_branch": true, + "reviewers": [], + "id": 2, + "destination": { + "commit": { + "hash": "1ed8205eec00", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/commit/1ed8205eec00" + } + } + }, + "branch": { + "name": "master" + }, + "repository": { + "full_name": "lkysow/atlantis-example", + "type": "repository", + "name": "atlantis-example", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example" + }, + "html": { + "href": "https://bitbucket.org/lkysow/atlantis-example" + }, + "avatar": { + "href": "https://bytebucket.org/ravatar/%7B94189367-116b-436a-9f77-2314b97a6067%7D?ts=default" + } + }, + "uuid": "{94189367-116b-436a-9f77-2314b97a6067}" + } + }, + "comment_count": 9, + "summary": { + "raw": "main.tf edited online with Bitbucket", + "markup": "markdown", + "html": "

main.tf edited online with Bitbucket

", + "type": "rendered" + }, + "source": { + "commit": { + "hash": "e0624da46d3a", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow-fork/atlantis-example/commit/e0624da46d3a" + } + } + }, + "branch": { + "name": "lkysow/maintf-edited-online-with-bitbucket-1532029690581" + }, + "repository": { + "full_name": "lkysow-fork/atlantis-example", + "type": "repository", + "name": "atlantis-example", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow-fork/atlantis-example" + }, + "html": { + "href": "https://bitbucket.org/lkysow-fork/atlantis-example" + }, + "avatar": { + "href": "https://bytebucket.org/ravatar/%7B94189367-116b-436a-9f77-2314b97a6067%7D?ts=default" + } + }, + "uuid": "{94189367-116b-436a-9f77-2314b97a6067}" + } + }, + "state": "MERGED", + "author": { + "username": "lkysow", + "display_name": "Luke", + "account_id": "557058:dc3817de-68b5-45cd-b81c-5c39d2560090", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/users/lkysow" + }, + "html": { + "href": "https://bitbucket.org/lkysow/" + }, + "avatar": { + "href": "https://bitbucket.org/account/lkysow/avatar/" + } + }, + "type": "user", + "uuid": "{bf34a99b-8a11-452c-8fbc-bdffc340e584}" + }, + "created_on": "2018-07-19T19:48:14.228611+00:00", + "participants": [ + { + "type": "participant", + "user": { + "username": "lkysow", + "display_name": "Luke", + "account_id": "557058:dc3817de-68b5-45cd-b81c-5c39d2560090", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/users/lkysow" + }, + "html": { + "href": "https://bitbucket.org/lkysow/" + }, + "avatar": { + "href": "https://bitbucket.org/account/lkysow/avatar/" + } + }, + "type": "user", + "uuid": "{bf34a99b-8a11-452c-8fbc-bdffc340e584}" + }, + "role": "PARTICIPANT", + "approved": true, + "participated_on": "2018-07-19T19:51:24.190902+00:00" + } + ], + "reason": "", + "updated_on": "2018-07-19T19:51:49.774941+00:00", + "merge_commit": { + "hash": "c21506eeea5f", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example/commit/c21506eeea5f" + } + } + }, + "closed_by": { + "username": "lkysow", + "display_name": "Luke", + "account_id": "557058:dc3817de-68b5-45cd-b81c-5c39d2560090", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/users/lkysow" + }, + "html": { + "href": "https://bitbucket.org/lkysow/" + }, + "avatar": { + "href": "https://bitbucket.org/account/lkysow/avatar/" + } + }, + "type": "user", + "uuid": "{bf34a99b-8a11-452c-8fbc-bdffc340e584}" + }, + "task_count": 0 + }, + "actor": { + "username": "lkysow", + "display_name": "Luke", + "account_id": "557058:dc3817de-68b5-45cd-b81c-5c39d2560090", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/users/lkysow" + }, + "html": { + "href": "https://bitbucket.org/lkysow/" + }, + "avatar": { + "href": "https://bitbucket.org/account/lkysow/avatar/" + } + }, + "type": "user", + "uuid": "{bf34a99b-8a11-452c-8fbc-bdffc340e584}" + }, + "repository": { + "scm": "git", + "website": "", + "name": "atlantis-example", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/repositories/lkysow/atlantis-example" + }, + "html": { + "href": "https://bitbucket.org/lkysow/atlantis-example" + }, + "avatar": { + "href": "https://bytebucket.org/ravatar/%7B94189367-116b-436a-9f77-2314b97a6067%7D?ts=default" + } + }, + "full_name": "lkysow/atlantis-example", + "owner": { + "username": "lkysow", + "display_name": "Luke", + "account_id": "557058:dc3817de-68b5-45cd-b81c-5c39d2560090", + "links": { + "self": { + "href": "https://api.bitbucket.org/2.0/users/lkysow" + }, + "html": { + "href": "https://bitbucket.org/lkysow/" + }, + "avatar": { + "href": "https://bitbucket.org/account/lkysow/avatar/" + } + }, + "type": "user", + "uuid": "{bf34a99b-8a11-452c-8fbc-bdffc340e584}" + }, + "type": "repository", + "is_private": false, + "uuid": "{94189367-116b-436a-9f77-2314b97a6067}" + } +} \ No newline at end of file diff --git a/server/events_controller_test.go b/server/events_controller_test.go index 3fd452c76..a3bda4b43 100644 --- a/server/events_controller_test.go +++ b/server/events_controller_test.go @@ -311,7 +311,7 @@ func TestPost_GitlabMergeRequestInvalid(t *testing.T) { req.Header.Set(gitlabHeader, "value") When(gl.ParseAndValidate(req, secret)).ThenReturn(gitlabMergeEvent, nil) repo := models.Repo{} - pullRequest := models.PullRequest{State: models.Closed} + pullRequest := models.PullRequest{State: models.ClosedPullState} When(p.ParseGitlabMergeEvent(gitlabMergeEvent)).ThenReturn(pullRequest, models.OpenedPullEvent, repo, repo, models.User{}, errors.New("err")) w := httptest.NewRecorder() e.Post(w, req) @@ -345,7 +345,7 @@ func TestPost_GitlabMergeRequestNotWhitelisted(t *testing.T) { Ok(t, err) When(gl.ParseAndValidate(req, secret)).ThenReturn(gitlabMergeEvent, nil) repo := models.Repo{} - pullRequest := models.PullRequest{State: models.Closed} + pullRequest := models.PullRequest{State: models.ClosedPullState} When(p.ParseGitlabMergeEvent(gitlabMergeEvent)).ThenReturn(pullRequest, models.OpenedPullEvent, repo, repo, models.User{}, nil) w := httptest.NewRecorder() @@ -376,7 +376,7 @@ func TestPost_GitlabMergeRequestUnsupportedAction(t *testing.T) { gitlabMergeEvent.ObjectAttributes.Action = "unsupported" When(gl.ParseAndValidate(req, secret)).ThenReturn(gitlabMergeEvent, nil) repo := models.Repo{} - pullRequest := models.PullRequest{State: models.Closed} + pullRequest := models.PullRequest{State: models.ClosedPullState} When(p.ParseGitlabMergeEvent(gitlabMergeEvent)).ThenReturn(pullRequest, repo, repo, models.User{}, nil) w := httptest.NewRecorder() @@ -395,7 +395,7 @@ func TestPost_GithubPullRequestClosedErrCleaningPull(t *testing.T) { event := `{"action": "closed"}` When(v.Validate(req, secret)).ThenReturn([]byte(event), nil) repo := models.Repo{} - pull := models.PullRequest{State: models.Closed} + pull := models.PullRequest{State: models.ClosedPullState} When(p.ParseGithubPullEvent(matchers.AnyPtrToGithubPullRequestEvent())).ThenReturn(pull, models.OpenedPullEvent, repo, repo, models.User{}, nil) When(c.CleanUpPull(repo, pull)).ThenReturn(errors.New("cleanup err")) w := httptest.NewRecorder() @@ -412,7 +412,7 @@ func TestPost_GitlabMergeRequestClosedErrCleaningPull(t *testing.T) { gitlabMergeEvent.ObjectAttributes.Action = "close" When(gl.ParseAndValidate(req, secret)).ThenReturn(gitlabMergeEvent, nil) repo := models.Repo{} - pullRequest := models.PullRequest{State: models.Closed} + pullRequest := models.PullRequest{State: models.ClosedPullState} When(p.ParseGitlabMergeEvent(gitlabMergeEvent)).ThenReturn(pullRequest, models.OpenedPullEvent, repo, repo, models.User{}, nil) When(c.CleanUpPull(repo, pullRequest)).ThenReturn(errors.New("err")) w := httptest.NewRecorder() @@ -430,7 +430,7 @@ func TestPost_GithubClosedPullRequestSuccess(t *testing.T) { event := `{"action": "closed"}` When(v.Validate(req, secret)).ThenReturn([]byte(event), nil) repo := models.Repo{} - pull := models.PullRequest{State: models.Closed} + pull := models.PullRequest{State: models.ClosedPullState} When(p.ParseGithubPullEvent(matchers.AnyPtrToGithubPullRequestEvent())).ThenReturn(pull, models.OpenedPullEvent, repo, repo, models.User{}, nil) When(c.CleanUpPull(repo, pull)).ThenReturn(nil) w := httptest.NewRecorder() @@ -446,7 +446,7 @@ func TestPost_GitlabMergeRequestSuccess(t *testing.T) { req.Header.Set(gitlabHeader, "value") When(gl.ParseAndValidate(req, secret)).ThenReturn(gitlabMergeEvent, nil) repo := models.Repo{} - pullRequest := models.PullRequest{State: models.Closed} + pullRequest := models.PullRequest{State: models.ClosedPullState} When(p.ParseGitlabMergeEvent(gitlabMergeEvent)).ThenReturn(pullRequest, models.OpenedPullEvent, repo, repo, models.User{}, nil) w := httptest.NewRecorder() e.Post(w, req) @@ -491,20 +491,20 @@ func TestPost_PullOpenedOrUpdated(t *testing.T) { gitlabMergeEvent.ObjectAttributes.Action = c.Action When(gl.ParseAndValidate(req, secret)).ThenReturn(gitlabMergeEvent, nil) repo := models.Repo{} - pullRequest := models.PullRequest{State: models.Closed} + pullRequest := models.PullRequest{State: models.ClosedPullState} When(p.ParseGitlabMergeEvent(gitlabMergeEvent)).ThenReturn(pullRequest, models.OpenedPullEvent, repo, repo, models.User{}, nil) case models.Github: req.Header.Set(githubHeader, "pull_request") event := fmt.Sprintf(`{"action": "%s"}`, c.Action) When(v.Validate(req, secret)).ThenReturn([]byte(event), nil) repo := models.Repo{} - pull := models.PullRequest{State: models.Closed} + pull := models.PullRequest{State: models.ClosedPullState} When(p.ParseGithubPullEvent(matchers.AnyPtrToGithubPullRequestEvent())).ThenReturn(pull, models.OpenedPullEvent, repo, repo, models.User{}, nil) } w := httptest.NewRecorder() e.Post(w, req) responseContains(t, w, http.StatusOK, "Processing...") - cr.VerifyWasCalledOnce().RunAutoplanCommand(models.Repo{}, models.Repo{}, models.PullRequest{State: models.Closed}, models.User{}) + cr.VerifyWasCalledOnce().RunAutoplanCommand(models.Repo{}, models.Repo{}, models.PullRequest{State: models.ClosedPullState}, models.User{}) }) } } diff --git a/server/server.go b/server/server.go index cb5263405..138111023 100644 --- a/server/server.go +++ b/server/server.go @@ -237,8 +237,8 @@ func NewServer(userConfig UserConfig, config Config) (*Server, error) { GitlabUser: userConfig.GitlabUser, GitlabToken: userConfig.GitlabToken, // todo: fill in properly - BitbucketCloudUser: "lkysow", - BitbucketCloudToken: os.Getenv("BITBUCKET_TOKEN"), + BitbucketUser: "lkysow", + BitbucketToken: os.Getenv("BITBUCKET_TOKEN"), } commentParser := &events.CommentParser{ GithubUser: userConfig.GithubUser,