mirror of https://github.com/matrix-org/go-neb.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
246 lines
11 KiB
246 lines
11 KiB
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"
|
|
"maunium.net/go/mautrix"
|
|
mevt "maunium.net/go/mautrix/event"
|
|
)
|
|
|
|
var roomID = "!testroom:id"
|
|
|
|
func TestGithubWebhook(t *testing.T) {
|
|
database.SetServiceDB(&database.NopStorage{})
|
|
|
|
// Intercept message sending to Matrix and mock responses
|
|
msgs := []mevt.MessageEventContent{}
|
|
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 mevt.MessageEventContent
|
|
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, _ := mautrix.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)
|
|
}
|