This repository has been archived by the owner on Jan 24, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Save both user and email in session state: Encoding/decoding methods save both email and user field in session state, for use cases when User is not derived from email's local-parth, like for GitHub provider. For retrocompatibility, if no user is obtained by the provider, (e.g. User is an empty string) the encoding/decoding methods fall back to the previous behavior and use the email's local-part Updated also related tests and added two more tests to show behavior when session contains a non-empty user value. - Added first basic GitHub provider tests - Added GetUserName method to Provider interface The new GetUserName method is intended to return the User value when this is not the email's local-part. Added also the default implementation to provider_default.go - Added call to GetUserName in redeemCode the new GetUserName method is used in redeemCode to get SessionState User value. For backward compatibility, if GetUserName error is "not implemented", the error is ignored. - Added GetUserName method and tests to github provider.
- Loading branch information
Showing
7 changed files
with
313 additions
and
43 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
package providers | ||
|
||
import ( | ||
"net/http" | ||
"net/http/httptest" | ||
"net/url" | ||
"testing" | ||
|
||
"github.com/stretchr/testify/assert" | ||
) | ||
|
||
func testGitHubProvider(hostname string) *GitHubProvider { | ||
p := NewGitHubProvider( | ||
&ProviderData{ | ||
ProviderName: "", | ||
LoginURL: &url.URL{}, | ||
RedeemURL: &url.URL{}, | ||
ProfileURL: &url.URL{}, | ||
ValidateURL: &url.URL{}, | ||
Scope: ""}) | ||
if hostname != "" { | ||
updateURL(p.Data().LoginURL, hostname) | ||
updateURL(p.Data().RedeemURL, hostname) | ||
updateURL(p.Data().ProfileURL, hostname) | ||
updateURL(p.Data().ValidateURL, hostname) | ||
} | ||
return p | ||
} | ||
|
||
func testGitHubBackend(payload string) *httptest.Server { | ||
pathToQueryMap := map[string]string{ | ||
"/user": "", | ||
"/user/emails": "", | ||
} | ||
|
||
return httptest.NewServer(http.HandlerFunc( | ||
func(w http.ResponseWriter, r *http.Request) { | ||
url := r.URL | ||
query, ok := pathToQueryMap[url.Path] | ||
if !ok { | ||
w.WriteHeader(404) | ||
} else if url.RawQuery != query { | ||
w.WriteHeader(404) | ||
} else { | ||
w.WriteHeader(200) | ||
w.Write([]byte(payload)) | ||
} | ||
})) | ||
} | ||
|
||
func TestGitHubProviderDefaults(t *testing.T) { | ||
p := testGitHubProvider("") | ||
assert.NotEqual(t, nil, p) | ||
assert.Equal(t, "GitHub", p.Data().ProviderName) | ||
assert.Equal(t, "https://github.com/login/oauth/authorize", | ||
p.Data().LoginURL.String()) | ||
assert.Equal(t, "https://github.com/login/oauth/access_token", | ||
p.Data().RedeemURL.String()) | ||
assert.Equal(t, "https://api.github.com/", | ||
p.Data().ValidateURL.String()) | ||
assert.Equal(t, "user:email", p.Data().Scope) | ||
} | ||
|
||
func TestGitHubProviderOverrides(t *testing.T) { | ||
p := NewGitHubProvider( | ||
&ProviderData{ | ||
LoginURL: &url.URL{ | ||
Scheme: "https", | ||
Host: "example.com", | ||
Path: "/login/oauth/authorize"}, | ||
RedeemURL: &url.URL{ | ||
Scheme: "https", | ||
Host: "example.com", | ||
Path: "/login/oauth/access_token"}, | ||
ValidateURL: &url.URL{ | ||
Scheme: "https", | ||
Host: "api.example.com", | ||
Path: "/"}, | ||
Scope: "profile"}) | ||
assert.NotEqual(t, nil, p) | ||
assert.Equal(t, "GitHub", p.Data().ProviderName) | ||
assert.Equal(t, "https://example.com/login/oauth/authorize", | ||
p.Data().LoginURL.String()) | ||
assert.Equal(t, "https://example.com/login/oauth/access_token", | ||
p.Data().RedeemURL.String()) | ||
assert.Equal(t, "https://api.example.com/", | ||
p.Data().ValidateURL.String()) | ||
assert.Equal(t, "profile", p.Data().Scope) | ||
} | ||
|
||
func TestGitHubProviderGetEmailAddress(t *testing.T) { | ||
b := testGitHubBackend(`[ {"email": "[email protected]", "primary": true} ]`) | ||
defer b.Close() | ||
|
||
bURL, _ := url.Parse(b.URL) | ||
p := testGitHubProvider(bURL.Host) | ||
|
||
session := &SessionState{AccessToken: "imaginary_access_token"} | ||
email, err := p.GetEmailAddress(session) | ||
assert.Equal(t, nil, err) | ||
assert.Equal(t, "[email protected]", email) | ||
} | ||
|
||
// Note that trying to trigger the "failed building request" case is not | ||
// practical, since the only way it can fail is if the URL fails to parse. | ||
func TestGitHubProviderGetEmailAddressFailedRequest(t *testing.T) { | ||
b := testGitHubBackend("unused payload") | ||
defer b.Close() | ||
|
||
bURL, _ := url.Parse(b.URL) | ||
p := testGitHubProvider(bURL.Host) | ||
|
||
// We'll trigger a request failure by using an unexpected access | ||
// token. Alternatively, we could allow the parsing of the payload as | ||
// JSON to fail. | ||
session := &SessionState{AccessToken: "unexpected_access_token"} | ||
email, err := p.GetEmailAddress(session) | ||
assert.NotEqual(t, nil, err) | ||
assert.Equal(t, "", email) | ||
} | ||
|
||
func TestGitHubProviderGetEmailAddressEmailNotPresentInPayload(t *testing.T) { | ||
b := testGitHubBackend("{\"foo\": \"bar\"}") | ||
defer b.Close() | ||
|
||
bURL, _ := url.Parse(b.URL) | ||
p := testGitHubProvider(bURL.Host) | ||
|
||
session := &SessionState{AccessToken: "imaginary_access_token"} | ||
email, err := p.GetEmailAddress(session) | ||
assert.NotEqual(t, nil, err) | ||
assert.Equal(t, "", email) | ||
} | ||
|
||
func TestGitHubProviderGetUserName(t *testing.T) { | ||
b := testGitHubBackend(`{"email": "[email protected]", "login": "mbland"}`) | ||
defer b.Close() | ||
|
||
bURL, _ := url.Parse(b.URL) | ||
p := testGitHubProvider(bURL.Host) | ||
|
||
session := &SessionState{AccessToken: "imaginary_access_token"} | ||
email, err := p.GetUserName(session) | ||
assert.Equal(t, nil, err) | ||
assert.Equal(t, "mbland", email) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.