...

Source file src/edge-infra.dev/pkg/f8n/devinfra/github/oauth/devicecode/devicecode_test.go

Documentation: edge-infra.dev/pkg/f8n/devinfra/github/oauth/devicecode

     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  	// register mock routes
    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", // doesnt matter for testing
    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  	// register mock routes
    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", // doesnt matter for testing
    65  	}
    66  	// use an unrealistically short interval so the test doesnt take forever
    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