mirror of https://github.com/matrix-org/go-neb.git
Kegan Dougal
8 years ago
3 changed files with 247 additions and 3 deletions
-
3src/github.com/matrix-org/go-neb/services/github/github_webhook.go
-
245src/github.com/matrix-org/go-neb/services/github/github_webhook_test.go
-
2src/github.com/matrix-org/go-neb/services/travisci/travisci.go
@ -0,0 +1,245 @@ |
|||
package github |
|||
|
|||
import ( |
|||
"bytes" |
|||
"encoding/json" |
|||
"fmt" |
|||
"io/ioutil" |
|||
"net/http" |
|||
"net/http/httptest" |
|||
"strings" |
|||
"testing" |
|||
|
|||
"github.com/matrix-org/go-neb/database" |
|||
"github.com/matrix-org/go-neb/testutils" |
|||
"github.com/matrix-org/go-neb/types" |
|||
"github.com/matrix-org/gomatrix" |
|||
) |
|||
|
|||
var roomID = "!testroom:id" |
|||
|
|||
func TestGithubWebhook(t *testing.T) { |
|||
database.SetServiceDB(&database.NopStorage{}) |
|||
|
|||
// Intercept message sending to Matrix and mock responses
|
|||
msgs := []gomatrix.TextMessage{} |
|||
matrixTrans := struct{ testutils.MockTransport }{} |
|||
matrixTrans.RT = func(req *http.Request) (*http.Response, error) { |
|||
if !strings.Contains(req.URL.String(), "/send/m.room.message") { |
|||
return nil, fmt.Errorf("Unhandled URL: %s", req.URL.String()) |
|||
} |
|||
var msg gomatrix.TextMessage |
|||
if err := json.NewDecoder(req.Body).Decode(&msg); err != nil { |
|||
return nil, fmt.Errorf("Failed to decode request JSON: %s", err) |
|||
} |
|||
msgs = append(msgs, msg) |
|||
return &http.Response{ |
|||
StatusCode: 200, |
|||
Body: ioutil.NopCloser(bytes.NewBufferString(`{"event_id":"$yup:event"}`)), |
|||
}, nil |
|||
} |
|||
matrixCli, _ := gomatrix.NewClient("https://hyrule", "@ghwebhook:hyrule", "its_a_secret") |
|||
matrixCli.Client = &http.Client{Transport: matrixTrans} |
|||
|
|||
// create the service
|
|||
ghwh := makeService(t) |
|||
if ghwh == nil { |
|||
t.Fatal("TestGithubWebhook Failed to create service") |
|||
} |
|||
|
|||
// inject the webhook event request
|
|||
req, err := http.NewRequest( |
|||
"POST", "https://neb.endpoint/gh-webhook-service", bytes.NewBufferString(` |
|||
{ |
|||
"action": "closed", |
|||
"issue": { |
|||
"url": "https://api.github.com/repos/DummyAccount/reponame/issues/15", |
|||
"repository_url": "https://api.github.com/repos/DummyAccount/reponame", |
|||
"labels_url": "https://api.github.com/repos/DummyAccount/reponame/issues/15/labels{/name}", |
|||
"comments_url": "https://api.github.com/repos/DummyAccount/reponame/issues/15/comments", |
|||
"events_url": "https://api.github.com/repos/DummyAccount/reponame/issues/15/events", |
|||
"html_url": "https://github.com/DummyAccount/reponame/issues/15", |
|||
"id": 159196956, |
|||
"number": 15, |
|||
"title": "aaaaaa", |
|||
"user": { |
|||
"login": "DummyAccount", |
|||
"id": 7190048, |
|||
"avatar_url": "https://avatars.githubusercontent.com/u/7190048?v=3", |
|||
"gravatar_id": "", |
|||
"url": "https://api.github.com/users/DummyAccount", |
|||
"html_url": "https://github.com/DummyAccount", |
|||
"followers_url": "https://api.github.com/users/DummyAccount/followers", |
|||
"following_url": "https://api.github.com/users/DummyAccount/following{/other_user}", |
|||
"gists_url": "https://api.github.com/users/DummyAccount/gists{/gist_id}", |
|||
"starred_url": "https://api.github.com/users/DummyAccount/starred{/owner}{/repo}", |
|||
"subscriptions_url": "https://api.github.com/users/DummyAccount/subscriptions", |
|||
"organizations_url": "https://api.github.com/users/DummyAccount/orgs", |
|||
"repos_url": "https://api.github.com/users/DummyAccount/repos", |
|||
"events_url": "https://api.github.com/users/DummyAccount/events{/privacy}", |
|||
"received_events_url": "https://api.github.com/users/DummyAccount/received_events", |
|||
"type": "User", |
|||
"site_admin": false |
|||
}, |
|||
"labels": [ |
|||
|
|||
], |
|||
"state": "closed", |
|||
"locked": false, |
|||
"assignee": null, |
|||
"milestone": null, |
|||
"comments": 1, |
|||
"created_at": "2016-06-08T15:40:44Z", |
|||
"updated_at": "2016-06-08T15:41:36Z", |
|||
"closed_at": "2016-06-08T15:41:36Z", |
|||
"body": "" |
|||
}, |
|||
"repository": { |
|||
"id": 21138172, |
|||
"name": "reponame", |
|||
"full_name": "DummyAccount/reponame", |
|||
"owner": { |
|||
"login": "DummyAccount", |
|||
"id": 7190048, |
|||
"avatar_url": "https://avatars.githubusercontent.com/u/7190048?v=3", |
|||
"gravatar_id": "", |
|||
"url": "https://api.github.com/users/DummyAccount", |
|||
"html_url": "https://github.com/DummyAccount", |
|||
"followers_url": "https://api.github.com/users/DummyAccount/followers", |
|||
"following_url": "https://api.github.com/users/DummyAccount/following{/other_user}", |
|||
"gists_url": "https://api.github.com/users/DummyAccount/gists{/gist_id}", |
|||
"starred_url": "https://api.github.com/users/DummyAccount/starred{/owner}{/repo}", |
|||
"subscriptions_url": "https://api.github.com/users/DummyAccount/subscriptions", |
|||
"organizations_url": "https://api.github.com/users/DummyAccount/orgs", |
|||
"repos_url": "https://api.github.com/users/DummyAccount/repos", |
|||
"events_url": "https://api.github.com/users/DummyAccount/events{/privacy}", |
|||
"received_events_url": "https://api.github.com/users/DummyAccount/received_events", |
|||
"type": "User", |
|||
"site_admin": false |
|||
}, |
|||
"private": false, |
|||
"html_url": "https://github.com/DummyAccount/reponame", |
|||
"description": "Android Development Device Monitor", |
|||
"fork": false, |
|||
"url": "https://api.github.com/repos/DummyAccount/reponame", |
|||
"forks_url": "https://api.github.com/repos/DummyAccount/reponame/forks", |
|||
"keys_url": "https://api.github.com/repos/DummyAccount/reponame/keys{/key_id}", |
|||
"collaborators_url": "https://api.github.com/repos/DummyAccount/reponame/collaborators{/collaborator}", |
|||
"teams_url": "https://api.github.com/repos/DummyAccount/reponame/teams", |
|||
"hooks_url": "https://api.github.com/repos/DummyAccount/reponame/hooks", |
|||
"issue_events_url": "https://api.github.com/repos/DummyAccount/reponame/issues/events{/number}", |
|||
"events_url": "https://api.github.com/repos/DummyAccount/reponame/events", |
|||
"assignees_url": "https://api.github.com/repos/DummyAccount/reponame/assignees{/user}", |
|||
"branches_url": "https://api.github.com/repos/DummyAccount/reponame/branches{/branch}", |
|||
"tags_url": "https://api.github.com/repos/DummyAccount/reponame/tags", |
|||
"blobs_url": "https://api.github.com/repos/DummyAccount/reponame/git/blobs{/sha}", |
|||
"git_tags_url": "https://api.github.com/repos/DummyAccount/reponame/git/tags{/sha}", |
|||
"git_refs_url": "https://api.github.com/repos/DummyAccount/reponame/git/refs{/sha}", |
|||
"trees_url": "https://api.github.com/repos/DummyAccount/reponame/git/trees{/sha}", |
|||
"statuses_url": "https://api.github.com/repos/DummyAccount/reponame/statuses/{sha}", |
|||
"languages_url": "https://api.github.com/repos/DummyAccount/reponame/languages", |
|||
"stargazers_url": "https://api.github.com/repos/DummyAccount/reponame/stargazers", |
|||
"contributors_url": "https://api.github.com/repos/DummyAccount/reponame/contributors", |
|||
"subscribers_url": "https://api.github.com/repos/DummyAccount/reponame/subscribers", |
|||
"subscription_url": "https://api.github.com/repos/DummyAccount/reponame/subscription", |
|||
"commits_url": "https://api.github.com/repos/DummyAccount/reponame/commits{/sha}", |
|||
"git_commits_url": "https://api.github.com/repos/DummyAccount/reponame/git/commits{/sha}", |
|||
"comments_url": "https://api.github.com/repos/DummyAccount/reponame/comments{/number}", |
|||
"issue_comment_url": "https://api.github.com/repos/DummyAccount/reponame/issues/comments{/number}", |
|||
"contents_url": "https://api.github.com/repos/DummyAccount/reponame/contents/{+path}", |
|||
"compare_url": "https://api.github.com/repos/DummyAccount/reponame/compare/{base}...{head}", |
|||
"merges_url": "https://api.github.com/repos/DummyAccount/reponame/merges", |
|||
"archive_url": "https://api.github.com/repos/DummyAccount/reponame/{archive_format}{/ref}", |
|||
"downloads_url": "https://api.github.com/repos/DummyAccount/reponame/downloads", |
|||
"issues_url": "https://api.github.com/repos/DummyAccount/reponame/issues{/number}", |
|||
"pulls_url": "https://api.github.com/repos/DummyAccount/reponame/pulls{/number}", |
|||
"milestones_url": "https://api.github.com/repos/DummyAccount/reponame/milestones{/number}", |
|||
"notifications_url": "https://api.github.com/repos/DummyAccount/reponame/notifications{?since,all,participating}", |
|||
"labels_url": "https://api.github.com/repos/DummyAccount/reponame/labels{/name}", |
|||
"releases_url": "https://api.github.com/repos/DummyAccount/reponame/releases{/id}", |
|||
"deployments_url": "https://api.github.com/repos/DummyAccount/reponame/deployments", |
|||
"created_at": "2014-06-23T18:51:33Z", |
|||
"updated_at": "2015-07-22T07:42:19Z", |
|||
"pushed_at": "2015-07-22T07:42:19Z", |
|||
"git_url": "git://github.com/DummyAccount/reponame.git", |
|||
"ssh_url": "git@github.com:DummyAccount/reponame.git", |
|||
"clone_url": "https://github.com/DummyAccount/reponame.git", |
|||
"svn_url": "https://github.com/DummyAccount/reponame", |
|||
"homepage": null, |
|||
"size": 725, |
|||
"stargazers_count": 0, |
|||
"watchers_count": 0, |
|||
"language": "Java", |
|||
"has_issues": true, |
|||
"has_downloads": true, |
|||
"has_wiki": true, |
|||
"has_pages": false, |
|||
"forks_count": 1, |
|||
"mirror_url": null, |
|||
"open_issues_count": 0, |
|||
"forks": 1, |
|||
"open_issues": 0, |
|||
"watchers": 0, |
|||
"default_branch": "master" |
|||
}, |
|||
"sender": { |
|||
"login": "DummyAccount", |
|||
"id": 7190048, |
|||
"avatar_url": "https://avatars.githubusercontent.com/u/7190048?v=3", |
|||
"gravatar_id": "", |
|||
"url": "https://api.github.com/users/DummyAccount", |
|||
"html_url": "https://github.com/DummyAccount", |
|||
"followers_url": "https://api.github.com/users/DummyAccount/followers", |
|||
"following_url": "https://api.github.com/users/DummyAccount/following{/other_user}", |
|||
"gists_url": "https://api.github.com/users/DummyAccount/gists{/gist_id}", |
|||
"starred_url": "https://api.github.com/users/DummyAccount/starred{/owner}{/repo}", |
|||
"subscriptions_url": "https://api.github.com/users/DummyAccount/subscriptions", |
|||
"organizations_url": "https://api.github.com/users/DummyAccount/orgs", |
|||
"repos_url": "https://api.github.com/users/DummyAccount/repos", |
|||
"events_url": "https://api.github.com/users/DummyAccount/events{/privacy}", |
|||
"received_events_url": "https://api.github.com/users/DummyAccount/received_events", |
|||
"type": "User", |
|||
"site_admin": false |
|||
} |
|||
} |
|||
`), |
|||
) |
|||
if err != nil { |
|||
t.Fatalf("TestGithubWebhook Failed to create webhook request: %s", err) |
|||
} |
|||
req.Header.Set("X-GitHub-Event", "issues") |
|||
req.Header.Set("Content-Type", "application/json") |
|||
mockWriter := httptest.NewRecorder() |
|||
ghwh.OnReceiveWebhook(mockWriter, req, matrixCli) |
|||
|
|||
// check response
|
|||
if mockWriter.Code != 200 { |
|||
t.Fatalf("TestGithubWebhook Expected response 200 OK, got %d", mockWriter.Code) |
|||
} |
|||
if len(msgs) != 1 { |
|||
t.Fatalf("TestGithubWebhook Expected sent 1 msg, sent %d", len(msgs)) |
|||
} |
|||
} |
|||
|
|||
func makeService(t *testing.T) *WebhookService { |
|||
srv, err := types.CreateService("id", WebhookServiceType, "@ghwebhook:hyrule", []byte( |
|||
`{ |
|||
"ClientUserID": "@alice:hyrule", |
|||
"RealmID": "ghrealm", |
|||
"Rooms":{ |
|||
"`+roomID+`": { |
|||
"Repos": { |
|||
"DummyAccount/reponame": { |
|||
"Events": ["issues"] |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}`, |
|||
)) |
|||
if err != nil { |
|||
t.Error("Failed to create GH webhook service: ", err) |
|||
return nil |
|||
} |
|||
return srv.(*WebhookService) |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue