55 "fmt"
66 "net/http"
77 "net/http/httptest"
8- "strings "
8+ "net/url "
99 "sync"
1010 "testing"
1111 "time"
@@ -29,37 +29,35 @@ func TestHappyPath(t *testing.T) {
2929 defer wg .Done ()
3030 defer close (openBrowserCh )
3131 // Start a local server and get a token.
32- s := httptest .NewServer (& authserver.Handler {
33- T : t ,
34- NewAuthorizationResponse : func (r authserver.AuthorizationRequest ) string {
35- if w := "email profile" ; r .Scope != w {
36- t .Errorf ("scope wants %s but %s" , w , r .Scope )
37- return fmt .Sprintf ("%s?error=invalid_scope" , r .RedirectURI )
32+ testServer := httptest .NewServer (& authserver.Handler {
33+ TestingT : t ,
34+ NewAuthorizationResponse : func (req authserver.AuthorizationRequest ) string {
35+ if want := "email profile" ; req .Scope != want {
36+ t .Errorf ("scope wants %s but %s" , want , req .Scope )
37+ return fmt .Sprintf ("%s?error=invalid_scope" , req .RedirectURI )
3838 }
39- redirectURIPrefix := "http://localhost:"
40- if ! strings .HasPrefix (r .RedirectURI , redirectURIPrefix ) {
41- t .Errorf ("redirect_uri wants prefix %s but was %s" , redirectURIPrefix , r .RedirectURI )
42- return fmt .Sprintf ("%s?error=invalid_redirect_uri" , r .RedirectURI )
39+ if ! assertRedirectURI (t , req .RedirectURI , "http" , "localhost" ) {
40+ return fmt .Sprintf ("%s?error=invalid_redirect_uri" , req .RedirectURI )
4341 }
44- return fmt .Sprintf ("%s?state=%s&code=%s" , r .RedirectURI , r .State , "AUTH_CODE" )
42+ return fmt .Sprintf ("%s?state=%s&code=%s" , req .RedirectURI , req .State , "AUTH_CODE" )
4543 },
46- NewTokenResponse : func (r authserver.TokenRequest ) (int , string ) {
47- if w := "AUTH_CODE" ; r .Code != w {
48- t .Errorf ("code wants %s but %s" , w , r .Code )
44+ NewTokenResponse : func (req authserver.TokenRequest ) (int , string ) {
45+ if want := "AUTH_CODE" ; req .Code != want {
46+ t .Errorf ("code wants %s but %s" , want , req .Code )
4947 return 400 , invalidGrantResponse
5048 }
5149 return 200 , validTokenResponse
5250 },
5351 })
54- defer s .Close ()
52+ defer testServer .Close ()
5553 cfg := oauth2cli.Config {
5654 OAuth2Config : oauth2.Config {
5755 ClientID : "YOUR_CLIENT_ID" ,
5856 ClientSecret : "YOUR_CLIENT_SECRET" ,
5957 Scopes : []string {"email" , "profile" },
6058 Endpoint : oauth2.Endpoint {
61- AuthURL : s .URL + "/auth" ,
62- TokenURL : s .URL + "/token" ,
59+ AuthURL : testServer .URL + "/auth" ,
60+ TokenURL : testServer .URL + "/token" ,
6361 },
6462 },
6563 LocalServerReadyChan : openBrowserCh ,
@@ -71,11 +69,11 @@ func TestHappyPath(t *testing.T) {
7169 t .Errorf ("could not get a token: %s" , err )
7270 return
7371 }
74- if "ACCESS_TOKEN" != token . AccessToken {
72+ if token . AccessToken != "ACCESS_TOKEN" {
7573 t .Errorf ("AccessToken wants %s but %s" , "ACCESS_TOKEN" , token .AccessToken )
7674 }
77- if "REFRESH_TOKEN" != token . RefreshToken {
78- t .Errorf ("RefreshToken wants %s but %s" , "REFRESH_TOKEN" , token .AccessToken )
75+ if token . RefreshToken != "REFRESH_TOKEN" {
76+ t .Errorf ("RefreshToken wants %s but %s" , "REFRESH_TOKEN" , token .RefreshToken )
7977 }
8078 }()
8179 wg .Add (1 )
@@ -101,37 +99,35 @@ func TestRedirectURLHostname(t *testing.T) {
10199 defer wg .Done ()
102100 defer close (openBrowserCh )
103101 // Start a local server and get a token.
104- s := httptest .NewServer (& authserver.Handler {
105- T : t ,
106- NewAuthorizationResponse : func (r authserver.AuthorizationRequest ) string {
107- if w := "email profile" ; r .Scope != w {
108- t .Errorf ("scope wants %s but %s" , w , r .Scope )
109- return fmt .Sprintf ("%s?error=invalid_scope" , r .RedirectURI )
102+ testServer := httptest .NewServer (& authserver.Handler {
103+ TestingT : t ,
104+ NewAuthorizationResponse : func (req authserver.AuthorizationRequest ) string {
105+ if want := "email profile" ; req .Scope != want {
106+ t .Errorf ("scope wants %s but %s" , want , req .Scope )
107+ return fmt .Sprintf ("%s?error=invalid_scope" , req .RedirectURI )
110108 }
111- redirectURIPrefix := "http://127.0.0.1:"
112- if ! strings .HasPrefix (r .RedirectURI , redirectURIPrefix ) {
113- t .Errorf ("redirect_uri wants prefix %s but was %s" , redirectURIPrefix , r .RedirectURI )
114- return fmt .Sprintf ("%s?error=invalid_redirect_uri" , r .RedirectURI )
109+ if ! assertRedirectURI (t , req .RedirectURI , "http" , "127.0.0.1" ) {
110+ return fmt .Sprintf ("%s?error=invalid_redirect_uri" , req .RedirectURI )
115111 }
116- return fmt .Sprintf ("%s?state=%s&code=%s" , r .RedirectURI , r .State , "AUTH_CODE" )
112+ return fmt .Sprintf ("%s?state=%s&code=%s" , req .RedirectURI , req .State , "AUTH_CODE" )
117113 },
118- NewTokenResponse : func (r authserver.TokenRequest ) (int , string ) {
119- if w := "AUTH_CODE" ; r .Code != w {
120- t .Errorf ("code wants %s but %s" , w , r .Code )
114+ NewTokenResponse : func (req authserver.TokenRequest ) (int , string ) {
115+ if want := "AUTH_CODE" ; req .Code != want {
116+ t .Errorf ("code wants %s but %s" , want , req .Code )
121117 return 400 , invalidGrantResponse
122118 }
123119 return 200 , validTokenResponse
124120 },
125121 })
126- defer s .Close ()
122+ defer testServer .Close ()
127123 cfg := oauth2cli.Config {
128124 OAuth2Config : oauth2.Config {
129125 ClientID : "YOUR_CLIENT_ID" ,
130126 ClientSecret : "YOUR_CLIENT_SECRET" ,
131127 Scopes : []string {"email" , "profile" },
132128 Endpoint : oauth2.Endpoint {
133- AuthURL : s .URL + "/auth" ,
134- TokenURL : s .URL + "/token" ,
129+ AuthURL : testServer .URL + "/auth" ,
130+ TokenURL : testServer .URL + "/token" ,
135131 },
136132 },
137133 RedirectURLHostname : "127.0.0.1" ,
@@ -144,11 +140,11 @@ func TestRedirectURLHostname(t *testing.T) {
144140 t .Errorf ("could not get a token: %s" , err )
145141 return
146142 }
147- if "ACCESS_TOKEN" != token . AccessToken {
143+ if token . AccessToken != "ACCESS_TOKEN" {
148144 t .Errorf ("AccessToken wants %s but %s" , "ACCESS_TOKEN" , token .AccessToken )
149145 }
150- if "REFRESH_TOKEN" != token . RefreshToken {
151- t .Errorf ("RefreshToken wants %s but %s" , "REFRESH_TOKEN" , token .AccessToken )
146+ if token . RefreshToken != "REFRESH_TOKEN" {
147+ t .Errorf ("RefreshToken wants %s but %s" , "REFRESH_TOKEN" , token .RefreshToken )
152148 }
153149 }()
154150 wg .Add (1 )
@@ -174,29 +170,27 @@ func TestSuccessRedirect(t *testing.T) {
174170 defer wg .Done ()
175171 defer close (openBrowserCh )
176172 // start a local server of oauth2 endpoint
177- s := httptest .NewServer (& authserver.Handler {
178- T : t ,
179- NewAuthorizationResponse : func (r authserver.AuthorizationRequest ) string {
180- if w := "email profile" ; r .Scope != w {
181- t .Errorf ("scope wants %s but %s" , w , r .Scope )
182- return fmt .Sprintf ("%s?error=invalid_scope" , r .RedirectURI )
173+ testServer := httptest .NewServer (& authserver.Handler {
174+ TestingT : t ,
175+ NewAuthorizationResponse : func (req authserver.AuthorizationRequest ) string {
176+ if want := "email profile" ; req .Scope != want {
177+ t .Errorf ("scope wants %s but %s" , want , req .Scope )
178+ return fmt .Sprintf ("%s?error=invalid_scope" , req .RedirectURI )
183179 }
184- redirectURIPrefix := "http://localhost:"
185- if ! strings .HasPrefix (r .RedirectURI , redirectURIPrefix ) {
186- t .Errorf ("redirect_uri wants prefix %s but was %s" , redirectURIPrefix , r .RedirectURI )
187- return fmt .Sprintf ("%s?error=invalid_redirect_uri" , r .RedirectURI )
180+ if ! assertRedirectURI (t , req .RedirectURI , "http" , "localhost" ) {
181+ return fmt .Sprintf ("%s?error=invalid_redirect_uri" , req .RedirectURI )
188182 }
189- return fmt .Sprintf ("%s?state=%s&code=%s" , r .RedirectURI , r .State , "AUTH_CODE" )
183+ return fmt .Sprintf ("%s?state=%s&code=%s" , req .RedirectURI , req .State , "AUTH_CODE" )
190184 },
191- NewTokenResponse : func (r authserver.TokenRequest ) (int , string ) {
192- if w := "AUTH_CODE" ; r .Code != w {
193- t .Errorf ("code wants %s but %s" , w , r .Code )
185+ NewTokenResponse : func (req authserver.TokenRequest ) (int , string ) {
186+ if want := "AUTH_CODE" ; req .Code != want {
187+ t .Errorf ("code wants %s but %s" , want , req .Code )
194188 return 400 , invalidGrantResponse
195189 }
196190 return 200 , validTokenResponse
197191 },
198192 })
199- defer s .Close ()
193+ defer testServer .Close ()
200194 // start a local server to be redirected
201195 sr := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
202196 if r .URL .Path == "/success" && r .Method == "GET" {
@@ -213,8 +207,8 @@ func TestSuccessRedirect(t *testing.T) {
213207 ClientSecret : "YOUR_CLIENT_SECRET" ,
214208 Scopes : []string {"email" , "profile" },
215209 Endpoint : oauth2.Endpoint {
216- AuthURL : s .URL + "/auth" ,
217- TokenURL : s .URL + "/token" ,
210+ AuthURL : testServer .URL + "/auth" ,
211+ TokenURL : testServer .URL + "/token" ,
218212 },
219213 },
220214 LocalServerReadyChan : openBrowserCh ,
@@ -228,11 +222,11 @@ func TestSuccessRedirect(t *testing.T) {
228222 t .Errorf ("could not get a token: %s" , err )
229223 return
230224 }
231- if "ACCESS_TOKEN" != token . AccessToken {
225+ if token . AccessToken != "ACCESS_TOKEN" {
232226 t .Errorf ("AccessToken wants %s but %s" , "ACCESS_TOKEN" , token .AccessToken )
233227 }
234- if "REFRESH_TOKEN" != token . RefreshToken {
235- t .Errorf ("RefreshToken wants %s but %s" , "REFRESH_TOKEN" , token .AccessToken )
228+ if token . RefreshToken != "REFRESH_TOKEN" {
229+ t .Errorf ("RefreshToken wants %s but %s" , "REFRESH_TOKEN" , token .RefreshToken )
236230 }
237231 }()
238232 wg .Add (1 )
@@ -248,6 +242,27 @@ func TestSuccessRedirect(t *testing.T) {
248242 wg .Wait ()
249243}
250244
245+ func assertRedirectURI (t * testing.T , actualURI , scheme , hostname string ) bool {
246+ redirect , err := url .Parse (actualURI )
247+ if err != nil {
248+ t .Errorf ("could not parse redirect_uri: %s" , err )
249+ return false
250+ }
251+ if redirect .Scheme != scheme {
252+ t .Errorf ("redirect_uri wants scheme %s but was %s" , scheme , redirect .Scheme )
253+ return false
254+ }
255+ if actualHostname := redirect .Hostname (); actualHostname != hostname {
256+ t .Errorf ("redirect_uri wants hostname %s but was %s" , hostname , actualHostname )
257+ return false
258+ }
259+ if redirect .Path != "" {
260+ t .Errorf ("redirect_uri wants path `` but was %s" , redirect .Path )
261+ return false
262+ }
263+ return true
264+ }
265+
251266func loggingMiddleware (t * testing.T ) func (h http.Handler ) http.Handler {
252267 return func (h http.Handler ) http.Handler {
253268 return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
0 commit comments