mirror of
https://git.vectorsigma.ru/public/atlantis.git
synced 2026-07-29 06:28:17 +00:00
387 lines
14 KiB
Go
387 lines
14 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 server_test
|
|
|
|
import (
|
|
"bytes"
|
|
"net/http"
|
|
"testing"
|
|
|
|
"github.com/lkysow/go-gitlab"
|
|
. "github.com/petergtz/pegomock"
|
|
"github.com/runatlantis/atlantis/server"
|
|
. "github.com/runatlantis/atlantis/testing"
|
|
)
|
|
|
|
var parser = server.DefaultGitlabRequestParserValidator{}
|
|
|
|
func TestValidate_InvalidSecret(t *testing.T) {
|
|
t.Log("If the secret header is set and doesn't match expected an error is returned")
|
|
RegisterMockTestingT(t)
|
|
buf := bytes.NewBufferString("")
|
|
req, err := http.NewRequest("POST", "http://localhost/event", buf)
|
|
Ok(t, err)
|
|
req.Header.Set("X-Gitlab-Token", "does-not-match")
|
|
_, err = parser.ParseAndValidate(req, []byte("secret"))
|
|
Assert(t, err != nil, "should be an error")
|
|
Equals(t, "header X-Gitlab-Token=does-not-match did not match expected secret", err.Error())
|
|
}
|
|
|
|
func TestValidate_ValidSecret(t *testing.T) {
|
|
t.Log("If the secret header matches then the event is returned")
|
|
RegisterMockTestingT(t)
|
|
buf := bytes.NewBufferString(mergeEventJSON)
|
|
req, err := http.NewRequest("POST", "http://localhost/event", buf)
|
|
Ok(t, err)
|
|
req.Header.Set("X-Gitlab-Token", "secret")
|
|
req.Header.Set("X-Gitlab-Event", "Merge Request Hook")
|
|
b, err := parser.ParseAndValidate(req, []byte("secret"))
|
|
Ok(t, err)
|
|
Equals(t, "Gitlab Test", b.(gitlab.MergeEvent).Project.Name)
|
|
}
|
|
|
|
func TestValidate_NoSecret(t *testing.T) {
|
|
t.Log("If there is no secret then we ignore the secret header and return the event")
|
|
RegisterMockTestingT(t)
|
|
buf := bytes.NewBufferString(mergeEventJSON)
|
|
req, err := http.NewRequest("POST", "http://localhost/event", buf)
|
|
Ok(t, err)
|
|
req.Header.Set("X-Gitlab-Token", "random secret")
|
|
req.Header.Set("X-Gitlab-Event", "Merge Request Hook")
|
|
b, err := parser.ParseAndValidate(req, nil)
|
|
Ok(t, err)
|
|
Equals(t, "Gitlab Test", b.(gitlab.MergeEvent).Project.Name)
|
|
}
|
|
|
|
func TestValidate_InvalidMergeEvent(t *testing.T) {
|
|
t.Log("If the merge event is malformed there should be an error")
|
|
RegisterMockTestingT(t)
|
|
buf := bytes.NewBufferString("{")
|
|
req, err := http.NewRequest("POST", "http://localhost/event", buf)
|
|
Ok(t, err)
|
|
req.Header.Set("X-Gitlab-Event", "Merge Request Hook")
|
|
_, err = parser.ParseAndValidate(req, nil)
|
|
Assert(t, err != nil, "should be an error")
|
|
Equals(t, "unexpected end of JSON input", err.Error())
|
|
}
|
|
|
|
func TestValidate_InvalidMergeCommentEvent(t *testing.T) {
|
|
t.Log("If the merge comment event is malformed there should be an error")
|
|
RegisterMockTestingT(t)
|
|
buf := bytes.NewBufferString("{")
|
|
req, err := http.NewRequest("POST", "http://localhost/event", buf)
|
|
Ok(t, err)
|
|
req.Header.Set("X-Gitlab-Event", "Note Hook")
|
|
_, err = parser.ParseAndValidate(req, nil)
|
|
Assert(t, err != nil, "should be an error")
|
|
Equals(t, "unexpected end of JSON input", err.Error())
|
|
}
|
|
|
|
func TestValidate_UnrecognizedEvent(t *testing.T) {
|
|
t.Log("If the event is not one we care about we return nil")
|
|
RegisterMockTestingT(t)
|
|
buf := bytes.NewBufferString("")
|
|
req, err := http.NewRequest("POST", "http://localhost/event", buf)
|
|
Ok(t, err)
|
|
req.Header.Set("X-Gitlab-Event", "Random Event")
|
|
event, err := parser.ParseAndValidate(req, nil)
|
|
Ok(t, err)
|
|
Equals(t, nil, event)
|
|
}
|
|
|
|
func TestValidate_ValidMergeEvent(t *testing.T) {
|
|
t.Log("If the merge event is valid it should be returned")
|
|
RegisterMockTestingT(t)
|
|
buf := bytes.NewBufferString(mergeEventJSON)
|
|
req, err := http.NewRequest("POST", "http://localhost/event", buf)
|
|
Ok(t, err)
|
|
req.Header.Set("X-Gitlab-Event", "Merge Request Hook")
|
|
b, err := parser.ParseAndValidate(req, nil)
|
|
Ok(t, err)
|
|
Equals(t, "Gitlab Test", b.(gitlab.MergeEvent).Project.Name)
|
|
RegisterMockTestingT(t)
|
|
}
|
|
|
|
func TestValidate_ValidMergeCommentEvent(t *testing.T) {
|
|
t.Log("If the merge comment event is valid it should be returned")
|
|
RegisterMockTestingT(t)
|
|
buf := bytes.NewBufferString(mergeCommentEventJSON)
|
|
req, err := http.NewRequest("POST", "http://localhost/event", buf)
|
|
Ok(t, err)
|
|
req.Header.Set("X-Gitlab-Event", "Note Hook")
|
|
b, err := parser.ParseAndValidate(req, nil)
|
|
Ok(t, err)
|
|
Equals(t, "Gitlab Test", b.(gitlab.MergeCommentEvent).Project.Name)
|
|
RegisterMockTestingT(t)
|
|
}
|
|
|
|
var mergeEventJSON = `{
|
|
"object_kind": "merge_request",
|
|
"user": {
|
|
"name": "Administrator",
|
|
"username": "root",
|
|
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
|
|
},
|
|
"project": {
|
|
"id": 1,
|
|
"name":"Gitlab Test",
|
|
"description":"Aut reprehenderit ut est.",
|
|
"web_url":"http://example.com/gitlabhq/gitlab-test",
|
|
"avatar_url":null,
|
|
"git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
|
|
"git_http_url":"https://example.com/gitlabhq/gitlab-test.git",
|
|
"namespace":"GitlabHQ",
|
|
"visibility_level":20,
|
|
"path_with_namespace":"gitlabhq/gitlab-test",
|
|
"default_branch":"master",
|
|
"homepage":"http://example.com/gitlabhq/gitlab-test",
|
|
"url":"https://example.com/gitlabhq/gitlab-test.git",
|
|
"ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
|
|
"http_url":"https://example.com/gitlabhq/gitlab-test.git"
|
|
},
|
|
"repository": {
|
|
"name": "Gitlab Test",
|
|
"url": "https://example.com/gitlabhq/gitlab-test.git",
|
|
"description": "Aut reprehenderit ut est.",
|
|
"homepage": "http://example.com/gitlabhq/gitlab-test"
|
|
},
|
|
"object_attributes": {
|
|
"id": 99,
|
|
"target_branch": "master",
|
|
"source_branch": "ms-viewport",
|
|
"source_project_id": 14,
|
|
"author_id": 51,
|
|
"assignee_id": 6,
|
|
"title": "MS-Viewport",
|
|
"created_at": "2013-12-03T17:23:34Z",
|
|
"updated_at": "2013-12-03T17:23:34Z",
|
|
"st_commits": null,
|
|
"st_diffs": null,
|
|
"milestone_id": null,
|
|
"state": "opened",
|
|
"merge_status": "unchecked",
|
|
"target_project_id": 14,
|
|
"iid": 1,
|
|
"description": "",
|
|
"source": {
|
|
"name":"Awesome Project",
|
|
"description":"Aut reprehenderit ut est.",
|
|
"web_url":"http://example.com/awesome_space/awesome_project",
|
|
"avatar_url":null,
|
|
"git_ssh_url":"git@example.com:awesome_space/awesome_project.git",
|
|
"git_http_url":"http://example.com/awesome_space/awesome_project.git",
|
|
"namespace":"Awesome Space",
|
|
"visibility_level":20,
|
|
"path_with_namespace":"awesome_space/awesome_project",
|
|
"default_branch":"master",
|
|
"homepage":"http://example.com/awesome_space/awesome_project",
|
|
"url":"http://example.com/awesome_space/awesome_project.git",
|
|
"ssh_url":"git@example.com:awesome_space/awesome_project.git",
|
|
"http_url":"http://example.com/awesome_space/awesome_project.git"
|
|
},
|
|
"target": {
|
|
"name":"Awesome Project",
|
|
"description":"Aut reprehenderit ut est.",
|
|
"web_url":"http://example.com/awesome_space/awesome_project",
|
|
"avatar_url":null,
|
|
"git_ssh_url":"git@example.com:awesome_space/awesome_project.git",
|
|
"git_http_url":"http://example.com/awesome_space/awesome_project.git",
|
|
"namespace":"Awesome Space",
|
|
"visibility_level":20,
|
|
"path_with_namespace":"awesome_space/awesome_project",
|
|
"default_branch":"master",
|
|
"homepage":"http://example.com/awesome_space/awesome_project",
|
|
"url":"http://example.com/awesome_space/awesome_project.git",
|
|
"ssh_url":"git@example.com:awesome_space/awesome_project.git",
|
|
"http_url":"http://example.com/awesome_space/awesome_project.git"
|
|
},
|
|
"last_commit": {
|
|
"id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
|
|
"message": "fixed readme",
|
|
"timestamp": "2012-01-03T23:36:29+02:00",
|
|
"url": "http://example.com/awesome_space/awesome_project/commits/da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
|
|
"author": {
|
|
"name": "GitLab dev user",
|
|
"email": "gitlabdev@dv6700.(none)"
|
|
}
|
|
},
|
|
"work_in_progress": false,
|
|
"url": "http://example.com/diaspora/merge_requests/1",
|
|
"action": "open",
|
|
"assignee": {
|
|
"name": "User1",
|
|
"username": "user1",
|
|
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
|
|
}
|
|
},
|
|
"labels": [{
|
|
"id": 206,
|
|
"title": "API",
|
|
"color": "#ffffff",
|
|
"project_id": 14,
|
|
"created_at": "2013-12-03T17:15:43Z",
|
|
"updated_at": "2013-12-03T17:15:43Z",
|
|
"template": false,
|
|
"description": "API related issues",
|
|
"type": "ProjectLabel",
|
|
"group_id": 41
|
|
}],
|
|
"changes": {
|
|
"updated_by_id": [null, 1],
|
|
"updated_at": ["2017-09-15 16:50:55 UTC", "2017-09-15 16:52:00 UTC"],
|
|
"labels": {
|
|
"previous": [{
|
|
"id": 206,
|
|
"title": "API",
|
|
"color": "#ffffff",
|
|
"project_id": 14,
|
|
"created_at": "2013-12-03T17:15:43Z",
|
|
"updated_at": "2013-12-03T17:15:43Z",
|
|
"template": false,
|
|
"description": "API related issues",
|
|
"type": "ProjectLabel",
|
|
"group_id": 41
|
|
}],
|
|
"current": [{
|
|
"id": 205,
|
|
"title": "Platform",
|
|
"color": "#123123",
|
|
"project_id": 14,
|
|
"created_at": "2013-12-03T17:15:43Z",
|
|
"updated_at": "2013-12-03T17:15:43Z",
|
|
"template": false,
|
|
"description": "Platform related issues",
|
|
"type": "ProjectLabel",
|
|
"group_id": 41
|
|
}]
|
|
}
|
|
}
|
|
}`
|
|
|
|
var mergeCommentEventJSON = `{
|
|
"object_kind": "note",
|
|
"user": {
|
|
"name": "Administrator",
|
|
"username": "root",
|
|
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
|
|
},
|
|
"project_id": 5,
|
|
"project":{
|
|
"id": 5,
|
|
"name":"Gitlab Test",
|
|
"description":"Aut reprehenderit ut est.",
|
|
"web_url":"http://example.com/gitlabhq/gitlab-test",
|
|
"avatar_url":null,
|
|
"git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
|
|
"git_http_url":"https://example.com/gitlabhq/gitlab-test.git",
|
|
"namespace":"Gitlab Org",
|
|
"visibility_level":10,
|
|
"path_with_namespace":"gitlabhq/gitlab-test",
|
|
"default_branch":"master",
|
|
"homepage":"http://example.com/gitlabhq/gitlab-test",
|
|
"url":"https://example.com/gitlabhq/gitlab-test.git",
|
|
"ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
|
|
"http_url":"https://example.com/gitlabhq/gitlab-test.git"
|
|
},
|
|
"repository":{
|
|
"name": "Gitlab Test",
|
|
"url": "http://localhost/gitlab-org/gitlab-test.git",
|
|
"description": "Aut reprehenderit ut est.",
|
|
"homepage": "http://example.com/gitlab-org/gitlab-test"
|
|
},
|
|
"object_attributes": {
|
|
"id": 1244,
|
|
"note": "This MR needs work.",
|
|
"noteable_type": "MergeRequest",
|
|
"author_id": 1,
|
|
"created_at": "2015-05-17",
|
|
"updated_at": "2015-05-17",
|
|
"project_id": 5,
|
|
"attachment": null,
|
|
"line_code": null,
|
|
"commit_id": "",
|
|
"noteable_id": 7,
|
|
"system": false,
|
|
"st_diff": null,
|
|
"url": "http://example.com/gitlab-org/gitlab-test/merge_requests/1#note_1244"
|
|
},
|
|
"merge_request": {
|
|
"id": 7,
|
|
"target_branch": "markdown",
|
|
"source_branch": "master",
|
|
"source_project_id": 5,
|
|
"author_id": 8,
|
|
"assignee_id": 28,
|
|
"title": "Tempora et eos debitis quae laborum et.",
|
|
"created_at": "2015-03-01 20:12:53 UTC",
|
|
"updated_at": "2015-03-21 18:27:27 UTC",
|
|
"milestone_id": 11,
|
|
"state": "opened",
|
|
"merge_status": "cannot_be_merged",
|
|
"target_project_id": 5,
|
|
"iid": 1,
|
|
"description": "Et voluptas corrupti assumenda temporibus. Architecto cum animi eveniet amet asperiores. Vitae numquam voluptate est natus sit et ad id.",
|
|
"position": 0,
|
|
"source":{
|
|
"name":"Gitlab Test",
|
|
"description":"Aut reprehenderit ut est.",
|
|
"web_url":"http://example.com/gitlab-org/gitlab-test",
|
|
"avatar_url":null,
|
|
"git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
|
|
"git_http_url":"https://example.com/gitlab-org/gitlab-test.git",
|
|
"namespace":"Gitlab Org",
|
|
"visibility_level":10,
|
|
"path_with_namespace":"gitlab-org/gitlab-test",
|
|
"default_branch":"master",
|
|
"homepage":"http://example.com/gitlab-org/gitlab-test",
|
|
"url":"https://example.com/gitlab-org/gitlab-test.git",
|
|
"ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
|
|
"http_url":"https://example.com/gitlab-org/gitlab-test.git",
|
|
"git_http_url":"https://example.com/gitlab-org/gitlab-test.git"
|
|
},
|
|
"target": {
|
|
"name":"Gitlab Test",
|
|
"description":"Aut reprehenderit ut est.",
|
|
"web_url":"http://example.com/gitlabhq/gitlab-test",
|
|
"avatar_url":null,
|
|
"git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
|
|
"git_http_url":"https://example.com/gitlabhq/gitlab-test.git",
|
|
"namespace":"Gitlab Org",
|
|
"visibility_level":10,
|
|
"path_with_namespace":"gitlabhq/gitlab-test",
|
|
"default_branch":"master",
|
|
"homepage":"http://example.com/gitlabhq/gitlab-test",
|
|
"url":"https://example.com/gitlabhq/gitlab-test.git",
|
|
"ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
|
|
"http_url":"https://example.com/gitlabhq/gitlab-test.git"
|
|
},
|
|
"last_commit": {
|
|
"id": "562e173be03b8ff2efb05345d12df18815438a4b",
|
|
"message": "Merge branch 'another-branch' into 'master'\n\nCheck in this test\n",
|
|
"timestamp": "2002-10-02T10:00:00-05:00",
|
|
"url": "http://example.com/gitlab-org/gitlab-test/commit/562e173be03b8ff2efb05345d12df18815438a4b",
|
|
"author": {
|
|
"name": "John Smith",
|
|
"email": "john@example.com"
|
|
}
|
|
},
|
|
"work_in_progress": false,
|
|
"assignee": {
|
|
"name": "User1",
|
|
"username": "user1",
|
|
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
|
|
}
|
|
}
|
|
}`
|