...
1 package devicecode
2
3 import (
4 "encoding/json"
5 "net/http"
6 "net/http/httptest"
7 "testing"
8 "time"
9 )
10
11 func TestDeviceCodeAuthToken(t *testing.T) {
12 server := httptest.NewUnstartedServer(nil)
13 mux := http.NewServeMux()
14
15
16 registerAccessTokenHandlerFunc(t, mux)
17 registerDeviceCodeHandlerFunc(t, mux)
18
19 server.Config.Handler = mux
20 server.Start()
21 defer server.Close()
22
23 t.Logf("test server listening on: %v\n", server.URL)
24 g := &Client{
25 BaseURL: server.URL,
26 ClientID: "abc123",
27 }
28 token, err := g.DeviceCodeAuthToken()
29 if err != nil {
30 t.Error(err.Error())
31 }
32 t.Logf("got token: %v", token)
33 }
34
35 func TestPollUntilTimeout(t *testing.T) {
36 server := httptest.NewUnstartedServer(nil)
37 mux := http.NewServeMux()
38
39
40 retries := 3
41 h := func(rw http.ResponseWriter, _ *http.Request) {
42 var accessTokenResp []byte
43 if retries <= 0 {
44 accessTokenResp, _ = json.Marshal(&accessTokenResponse{
45 Error: "expired_token",
46 })
47 } else {
48 accessTokenResp, _ = json.Marshal(&accessTokenResponse{
49 Error: "authorization_pending",
50 })
51 retries--
52 }
53 writeResponseOrDie(t, rw, accessTokenResp)
54 }
55 mux.HandleFunc(accessTokenPath, h)
56
57 server.Config.Handler = mux
58 server.Start()
59 defer server.Close()
60
61 t.Logf("test server listening on: %v\n", server.URL)
62 g := &Client{
63 BaseURL: server.URL,
64 ClientID: "abc123",
65 }
66
67 _, err := g.waitForAccessToken("abcd-efgh", time.Duration(5)*time.Millisecond)
68 if err == nil {
69 t.Error("expected non-nil err")
70 }
71 }
72
73 func registerDeviceCodeHandlerFunc(t *testing.T, mux *http.ServeMux) {
74 deviceCodeResp, _ := json.Marshal(&deviceCodeResponse{
75 DeviceCode: "",
76 UserCode: "",
77 VerificationURI: "",
78 ExpiresIn: 100,
79 Interval: 1,
80 })
81 h := func(rw http.ResponseWriter, _ *http.Request) {
82 writeResponseOrDie(t, rw, deviceCodeResp)
83 }
84 mux.HandleFunc(deviceCodePath, h)
85 }
86
87 func registerAccessTokenHandlerFunc(t *testing.T, mux *http.ServeMux) {
88 accessTokenResp, _ := json.Marshal(&accessTokenResponse{
89 AccessToken: "foobar",
90 TokenType: "test_token",
91 Scope: "test_scope",
92 })
93 h := func(rw http.ResponseWriter, _ *http.Request) {
94 writeResponseOrDie(t, rw, accessTokenResp)
95 }
96 mux.HandleFunc(accessTokenPath, h)
97 }
98
99 func writeResponseOrDie(t *testing.T, rw http.ResponseWriter, res []byte) {
100 if _, err := rw.Write(res); err != nil {
101 t.Fatalf("failed sending mock response: %v\n", err)
102 }
103 }
104
View as plain text