Skip to content

Commit ea8c87e

Browse files
authored
Merge pull request #145 from codingpot/feat-gh-1
feat: add GitHub interface/impl
2 parents 89e5a49 + f5630bb commit ea8c87e

File tree

7 files changed

+188
-0
lines changed

7 files changed

+188
-0
lines changed

server/generate.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
//go:generate mockgen -source pkg/handlers/gh/gh.go -destination internal/mock_gh/mock_gh.go GitHubService
2+
package main

server/go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@ go 1.16
44

55
require (
66
github.com/daixiang0/gci v0.2.8
7+
github.com/golang/mock v1.4.4
78
github.com/google/go-cmp v0.5.6
9+
github.com/google/go-github/v36 v36.0.0
810
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0
911
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
1012
github.com/prometheus/client_golang v1.11.0
1113
github.com/prometheus/common v0.29.0 // indirect
1214
github.com/sirupsen/logrus v1.8.1
1315
github.com/stretchr/testify v1.6.1
1416
golang.org/x/net v0.0.0-20210614182718-04defd469f4e
17+
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c
1518
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 // indirect
1619
google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84 // indirect
1720
google.golang.org/grpc v1.38.0

server/go.sum

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU
8686
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
8787
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
8888
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
89+
github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=
8990
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
9091
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
9192
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -117,6 +118,10 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
117118
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
118119
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
119120
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
121+
github.com/google/go-github/v36 v36.0.0 h1:ndCzM616/oijwufI7nBRa+5eZHLldT+4yIB68ib5ogs=
122+
github.com/google/go-github/v36 v36.0.0/go.mod h1:LFlKC047IOqiglRGNqNb9s/iAPTnnjtlshm+bxp+kwk=
123+
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
124+
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
120125
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
121126
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
122127
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
@@ -228,6 +233,7 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
228233
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
229234
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
230235
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
236+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
231237
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
232238
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
233239
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -301,6 +307,7 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr
301307
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
302308
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
303309
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
310+
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c h1:pkQiBZBvdos9qq4wBAHqlzuZHEXo07pqV06ef90u1WI=
304311
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
305312
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
306313
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -439,6 +446,7 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7
439446
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
440447
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
441448
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
449+
google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc=
442450
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
443451
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
444452
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=

server/internal/ghv3/ghv3.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Package ghv3 provides GitHub V3 API implementation.
2+
package ghv3
3+
4+
import (
5+
"context"
6+
7+
"github.com/codingpot/pr12er/server/pkg/handlers/gh"
8+
"github.com/google/go-github/v36/github"
9+
"golang.org/x/oauth2"
10+
)
11+
12+
const (
13+
owner = "codingpot"
14+
repoName = "pr12er"
15+
)
16+
17+
// GitHubV3 is the v3 implementation of gh.GitHubService.
18+
type GitHubV3 struct {
19+
client *github.Client
20+
}
21+
22+
// CreateIssue create an issue.
23+
func (g GitHubV3) CreateIssue(title, body string, labels []string) (*gh.GitHubIssue, error) {
24+
create, _, err := g.client.Issues.Create(
25+
context.Background(),
26+
owner,
27+
repoName,
28+
&github.IssueRequest{
29+
Title: &title,
30+
Body: &body,
31+
Labels: &labels,
32+
})
33+
34+
if create == nil || err != nil {
35+
return nil, err
36+
}
37+
return &gh.GitHubIssue{URL: create.GetHTMLURL()}, err
38+
}
39+
40+
// Ensure the GitHubV3 implements gh.GitHubService interface.
41+
var _ gh.GitHubService = (*GitHubV3)(nil)
42+
43+
func New(apiKey string) *GitHubV3 {
44+
client := github.NewClient(oauth2.NewClient(context.Background(), oauth2.StaticTokenSource(
45+
&oauth2.Token{AccessToken: apiKey},
46+
)))
47+
return &GitHubV3{
48+
client: client,
49+
}
50+
}

server/internal/ghv3/ghv3_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package ghv3
2+
3+
import (
4+
"context"
5+
"os"
6+
"testing"
7+
8+
"github.com/codingpot/pr12er/server/pkg/handlers/gh"
9+
"github.com/google/go-github/v36/github"
10+
"github.com/stretchr/testify/assert"
11+
"golang.org/x/oauth2"
12+
)
13+
14+
func TestGitHubV3_CreateIssue(t *testing.T) {
15+
t.Skip("this will create an issue; so skip for now")
16+
17+
githubAPIKey := os.Getenv("GITHUB_API_KEY")
18+
t.Logf("GITHUB_API_KEY=%s", githubAPIKey)
19+
20+
type fields struct {
21+
client *github.Client
22+
}
23+
type args struct {
24+
title string
25+
body string
26+
labels []string
27+
}
28+
tests := []struct {
29+
name string
30+
fields fields
31+
args args
32+
want *gh.GitHubIssue
33+
wantErr bool
34+
}{
35+
{
36+
name: "It should create a ticket",
37+
fields: fields{
38+
client: github.NewClient(
39+
oauth2.NewClient(
40+
context.Background(),
41+
oauth2.StaticTokenSource(
42+
&oauth2.Token{AccessToken: githubAPIKey}))),
43+
},
44+
args: args{
45+
title: "TEST TICKET 1",
46+
body: "TEST TICKET BODY",
47+
labels: []string{"data", "test"},
48+
},
49+
wantErr: false,
50+
},
51+
}
52+
for _, tt := range tests {
53+
t.Run(tt.name, func(t *testing.T) {
54+
g := GitHubV3{
55+
client: tt.fields.client,
56+
}
57+
got, err := g.CreateIssue(tt.args.title, tt.args.body, tt.args.labels)
58+
if tt.wantErr {
59+
assert.Error(t, err)
60+
} else {
61+
assert.NoError(t, err)
62+
assert.NotEmpty(t, got.URL)
63+
}
64+
})
65+
}
66+
}

server/internal/mock_gh/mock_gh.go

Lines changed: 50 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/pkg/handlers/gh/gh.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package gh
2+
3+
type GitHubIssue struct {
4+
URL string
5+
}
6+
7+
type GitHubService interface {
8+
CreateIssue(title, body string, labels []string) (*GitHubIssue, error)
9+
}

0 commit comments

Comments
 (0)