package devicecode import ( "encoding/json" "net/http" "net/http/httptest" "testing" "time" ) func TestDeviceCodeAuthToken(t *testing.T) { server := httptest.NewUnstartedServer(nil) mux := http.NewServeMux() // register mock routes registerAccessTokenHandlerFunc(t, mux) registerDeviceCodeHandlerFunc(t, mux) server.Config.Handler = mux server.Start() defer server.Close() t.Logf("test server listening on: %v\n", server.URL) g := &Client{ BaseURL: server.URL, ClientID: "abc123", // doesnt matter for testing } token, err := g.DeviceCodeAuthToken() if err != nil { t.Error(err.Error()) } t.Logf("got token: %v", token) } func TestPollUntilTimeout(t *testing.T) { server := httptest.NewUnstartedServer(nil) mux := http.NewServeMux() // register mock routes retries := 3 h := func(rw http.ResponseWriter, _ *http.Request) { var accessTokenResp []byte if retries <= 0 { accessTokenResp, _ = json.Marshal(&accessTokenResponse{ Error: "expired_token", }) } else { accessTokenResp, _ = json.Marshal(&accessTokenResponse{ Error: "authorization_pending", }) retries-- } writeResponseOrDie(t, rw, accessTokenResp) } mux.HandleFunc(accessTokenPath, h) server.Config.Handler = mux server.Start() defer server.Close() t.Logf("test server listening on: %v\n", server.URL) g := &Client{ BaseURL: server.URL, ClientID: "abc123", // doesnt matter for testing } // use an unrealistically short interval so the test doesnt take forever _, err := g.waitForAccessToken("abcd-efgh", time.Duration(5)*time.Millisecond) if err == nil { t.Error("expected non-nil err") } } func registerDeviceCodeHandlerFunc(t *testing.T, mux *http.ServeMux) { deviceCodeResp, _ := json.Marshal(&deviceCodeResponse{ DeviceCode: "", UserCode: "", VerificationURI: "", ExpiresIn: 100, Interval: 1, }) h := func(rw http.ResponseWriter, _ *http.Request) { writeResponseOrDie(t, rw, deviceCodeResp) } mux.HandleFunc(deviceCodePath, h) } func registerAccessTokenHandlerFunc(t *testing.T, mux *http.ServeMux) { accessTokenResp, _ := json.Marshal(&accessTokenResponse{ AccessToken: "foobar", TokenType: "test_token", Scope: "test_scope", }) h := func(rw http.ResponseWriter, _ *http.Request) { writeResponseOrDie(t, rw, accessTokenResp) } mux.HandleFunc(accessTokenPath, h) } func writeResponseOrDie(t *testing.T, rw http.ResponseWriter, res []byte) { if _, err := rw.Write(res); err != nil { t.Fatalf("failed sending mock response: %v\n", err) } }