-
Notifications
You must be signed in to change notification settings - Fork 3
/
github_app_test.go
108 lines (96 loc) · 2.83 KB
/
github_app_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package probot_test
import (
"context"
"encoding/json"
"fmt"
"net/http"
"testing"
"time"
"github.com/google/go-github/v48/github"
"github.com/h2non/gock"
"github.com/onsi/gomega"
"github.com/spf13/pflag"
"github.com/airconduct/go-probot"
"github.com/airconduct/go-probot/mock"
)
func TestGitHubAPP(t *testing.T) {
gomega.RegisterTestingT(t)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
f := githubFixture{installationID: 2}
f.Start(ctx)
defer f.Stop()
app := createGitHubApp()
go func() {
if err := app.Run(ctx); err != nil {
panic(err)
}
}()
gomega.Eventually(func(g gomega.Gomega) {
g.Expect(mock.Send(
app.(mock.AppMock[probot.GitHubClient]),
probot.GitHub.IssueComment.Created,
github.IssueCommentEvent{
Action: probot.ToPointer("created"),
Installation: &github.Installation{ID: probot.ToPointer(int64(f.installationID))},
Repo: &github.Repository{
Name: probot.ToPointer("bar"),
Owner: &github.User{Login: probot.ToPointer("foo")},
},
Issue: &github.Issue{Number: probot.ToPointer(1)},
},
)).Should(gomega.Succeed())
}, 5*time.Second, time.Second).Should(gomega.Succeed())
}
func createGitHubApp() probot.App[probot.GitHubClient] {
flags := pflag.NewFlagSet("", pflag.PanicOnError)
app := probot.NewGitHubAPP()
app.AddFlags(flags)
flags.Parse([]string{
"--github.hmac-token-file=examples/github/testdata/hmac_token",
"--github.private-key-file=examples/github/testdata/tls.key",
"--github.appid=1",
"--address=127.0.0.1",
"--port=7772",
"--path=/hook",
})
app.On(probot.GitHub.IssueComment.Created, probot.GitHub.IssueComment.Edited).
WithHandler(probot.GitHub.IssueComment.Handler(func(ctx probot.GitHubIssueCommentContext) {
payload := ctx.Payload()
ctx.Logger().Info("Get IssueComment event", "payload", payload)
owner := *payload.Repo.Owner.Login
repo := *payload.Repo.Name
issueNumber := *payload.Issue.Number
ctx.Must(ctx.Client().Issues.CreateComment(ctx, owner, repo, issueNumber, &github.IssueComment{
Body: probot.ToPointer("Thanks!"),
}))
}))
return app
}
type githubFixture struct {
installationID int
}
func (f githubFixture) Start(ctx context.Context) {
// Mock get token
gock.New("https://api.github.com").
Post(fmt.Sprintf("/app/installations/%d/access_tokens", f.installationID)).
Reply(200).JSON(map[string]interface{}{
"token": "test",
"permissions": map[string]interface{}{
"issues": "write",
}})
//
gock.New("https://api.github.com").
Post("/repos/foo/bar/issues/1/comments").
AddMatcher(func(r1 *http.Request, r2 *gock.Request) (bool, error) {
data := make(map[string]string)
if err := json.NewDecoder(r1.Body).Decode(&data); err != nil {
return false, err
}
return data["body"] == "Thanks!", nil
}).
Reply(200)
}
func (githubFixture) Stop() {
gock.Off()
}