transport_test.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package oauth2
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "testing"
  6. "time"
  7. )
  8. type tokenSource struct{ token *Token }
  9. func (t *tokenSource) Token() (*Token, error) {
  10. return t.token, nil
  11. }
  12. func TestTransportNilTokenSource(t *testing.T) {
  13. tr := &Transport{}
  14. server := newMockServer(func(w http.ResponseWriter, r *http.Request) {})
  15. defer server.Close()
  16. client := &http.Client{Transport: tr}
  17. res, err := client.Get(server.URL)
  18. if err == nil {
  19. t.Errorf("a nil Source was passed into the transport expected an error")
  20. }
  21. if res != nil {
  22. t.Errorf("expected a nil response, got %v", res)
  23. }
  24. }
  25. func TestTransportTokenSource(t *testing.T) {
  26. ts := &tokenSource{
  27. token: &Token{
  28. AccessToken: "abc",
  29. },
  30. }
  31. tr := &Transport{
  32. Source: ts,
  33. }
  34. server := newMockServer(func(w http.ResponseWriter, r *http.Request) {
  35. if r.Header.Get("Authorization") != "Bearer abc" {
  36. t.Errorf("Transport doesn't set the Authorization header from the fetched token")
  37. }
  38. })
  39. defer server.Close()
  40. client := &http.Client{Transport: tr}
  41. res, err := client.Get(server.URL)
  42. if err != nil {
  43. t.Fatal(err)
  44. }
  45. res.Body.Close()
  46. }
  47. // Test for case-sensitive token types, per https://github.com/golang/oauth2/issues/113
  48. func TestTransportTokenSourceTypes(t *testing.T) {
  49. const val = "abc"
  50. tests := []struct {
  51. key string
  52. val string
  53. want string
  54. }{
  55. {key: "bearer", val: val, want: "Bearer abc"},
  56. {key: "mac", val: val, want: "MAC abc"},
  57. {key: "basic", val: val, want: "Basic abc"},
  58. }
  59. for _, tc := range tests {
  60. ts := &tokenSource{
  61. token: &Token{
  62. AccessToken: tc.val,
  63. TokenType: tc.key,
  64. },
  65. }
  66. tr := &Transport{
  67. Source: ts,
  68. }
  69. server := newMockServer(func(w http.ResponseWriter, r *http.Request) {
  70. if got, want := r.Header.Get("Authorization"), tc.want; got != want {
  71. t.Errorf("Authorization header (%q) = %q; want %q", val, got, want)
  72. }
  73. })
  74. defer server.Close()
  75. client := &http.Client{Transport: tr}
  76. res, err := client.Get(server.URL)
  77. if err != nil {
  78. t.Fatal(err)
  79. }
  80. res.Body.Close()
  81. }
  82. }
  83. func TestTokenValidNoAccessToken(t *testing.T) {
  84. token := &Token{}
  85. if token.Valid() {
  86. t.Errorf("Token should not be valid with no access token")
  87. }
  88. }
  89. func TestExpiredWithExpiry(t *testing.T) {
  90. token := &Token{
  91. Expiry: time.Now().Add(-5 * time.Hour),
  92. }
  93. if token.Valid() {
  94. t.Errorf("Token should not be valid if it expired in the past")
  95. }
  96. }
  97. func newMockServer(handler func(w http.ResponseWriter, r *http.Request)) *httptest.Server {
  98. return httptest.NewServer(http.HandlerFunc(handler))
  99. }