This repository has been archived by the owner on May 29, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathclient_test.go
128 lines (112 loc) · 4.64 KB
/
client_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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package githubproxy
import (
"fmt"
"github.com/google/go-github/github"
"github.com/sourcegraph/httpcache"
"github.com/sourcegraph/apiproxy"
"net/http"
"regexp"
)
func ExampleGitHubClient_repositories() {
cachingTransport := httpcache.NewMemoryCacheTransport()
reqModifyingTransport := &apiproxy.RequestModifyingTransport{Transport: cachingTransport}
httpClient := &http.Client{Transport: reqModifyingTransport}
client := github.NewClient(httpClient)
if exceededRateLimit(client) {
return
}
// Get a repository.
repo, resp, err := client.Repositories.Get("sourcegraph", "apiproxy")
if err != nil {
fmt.Printf("Error getting repository: %s\n", err)
return
}
fmt.Printf("1st time: got repository %s info (from cache: %v).\n", *repo.Name, resp.Header.Get("X-From-Cache") == "1")
// Get the same repository again. This request will hit the cache instead of
// GitHub's API.
repo, resp, err = client.Repositories.Get("sourcegraph", "apiproxy")
if err != nil {
fmt.Printf("Error getting repository: %s\n", err)
return
}
fmt.Printf("2nd time: got repository %s info (from cache: %v).\n", *repo.Name, resp.Header.Get("X-From-Cache") == "1")
// Once again, get the same repository, but override the request so we
// bypass the cache and hit GitHub's API.
reqModifyingTransport.Override(regexp.MustCompile(`^/repos/sourcegraph/apiproxy$`), apiproxy.NoCache, true)
repo, resp, err = client.Repositories.Get("sourcegraph", "apiproxy")
if err != nil {
fmt.Printf("Error getting repository: %s\n", err)
return
}
fmt.Printf("3nd time: got repository %s info (from cache: %v).\n", *repo.Name, resp.Header.Get("X-From-Cache") == "1")
// Subsequent requests will hit the cache.
repo, resp, err = client.Repositories.Get("sourcegraph", "apiproxy")
if err != nil {
fmt.Printf("Error getting repository: %s\n", err)
return
}
fmt.Printf("4th time: got repository %s info (from cache: %v).\n", *repo.Name, resp.Header.Get("X-From-Cache") == "1")
// Output:
// 1st time: got repository apiproxy info (from cache: false).
// 2nd time: got repository apiproxy info (from cache: true).
// 3nd time: got repository apiproxy info (from cache: false).
// 4th time: got repository apiproxy info (from cache: true).
}
func ExampleGitHubClient_events() {
cachingTransport := httpcache.NewMemoryCacheTransport()
reqModifyingTransport := &apiproxy.RequestModifyingTransport{Transport: cachingTransport}
httpClient := &http.Client{Transport: reqModifyingTransport}
client := github.NewClient(httpClient)
if exceededRateLimit(client) {
return
}
// List a user's events.
events, resp, err := client.Activity.ListEventsPerformedByUser("sqs", true, nil)
if err != nil {
fmt.Printf("Error listing events: %s\n", err)
return
}
fmt.Printf("1st time: got user %s events (from cache: %v).\n", *events[0].Actor.Login, resp.Header.Get("X-From-Cache") == "1")
// List the same user's events again. This request will hit the cache
// instead of GitHub's API.
events, resp, err = client.Activity.ListEventsPerformedByUser("sqs", true, nil)
if err != nil {
fmt.Printf("Error listing events: %s\n", err)
return
}
fmt.Printf("2nd time: got user %s events (from cache: %v).\n", *events[0].Actor.Login, resp.Header.Get("X-From-Cache") == "1")
// Once again, list the same user's events, but override the request so we
// bypass the cache and hit GitHub's API.
reqModifyingTransport.Override(regexp.MustCompile(`^/users/sqs/events/public$`), apiproxy.NoCache, true)
events, resp, err = client.Activity.ListEventsPerformedByUser("sqs", true, nil)
if err != nil {
fmt.Printf("Error listing events: %s\n", err)
return
}
fmt.Printf("3nd time: got user %s events (from cache: %v).\n", *events[0].Actor.Login, resp.Header.Get("X-From-Cache") == "1")
// Subsequent requests will hit the cache.
events, resp, err = client.Activity.ListEventsPerformedByUser("sqs", true, nil)
if err != nil {
fmt.Printf("Error listing events: %s\n", err)
return
}
fmt.Printf("4th time: got user %s events (from cache: %v).\n", *events[0].Actor.Login, resp.Header.Get("X-From-Cache") == "1")
// Output:
// 1st time: got user sqs events (from cache: false).
// 2nd time: got user sqs events (from cache: true).
// 3nd time: got user sqs events (from cache: false).
// 4th time: got user sqs events (from cache: true).
}
func exceededRateLimit(client *github.Client) bool {
rate, _, err := client.RateLimit()
if err != nil {
fmt.Printf("Error checking rate limit: %s\n", err)
return false
}
// Check for a margin sufficient to run both examples.
if rate.Remaining < 4 {
fmt.Printf("Exceeded (or almost exceeded) GitHub API rate limit: %s. Try again later.\n", rate)
return true
}
return false
}