git.iko.soy/typeable/oauth2-proxy
on v3.2.0 help sign in
133 lines 3.9 kB history raw
1package providers
3import (
4 "net/http"
5 "net/http/httptest"
6 "net/url"
7 "testing"
9 "github.com/stretchr/testify/assert"
12func testLinkedInProvider(hostname string) *LinkedInProvider {
13 p := NewLinkedInProvider(
14 &ProviderData{
15 ProviderName: "",
16 LoginURL: &url.URL{},
17 RedeemURL: &url.URL{},
18 ProfileURL: &url.URL{},
19 ValidateURL: &url.URL{},
20 Scope: ""})
21 if hostname != "" {
22 updateURL(p.Data().LoginURL, hostname)
23 updateURL(p.Data().RedeemURL, hostname)
24 updateURL(p.Data().ProfileURL, hostname)
25 }
26 return p
29func testLinkedInBackend(payload string) *httptest.Server {
30 path := "/v1/people/~/email-address"
32 return httptest.NewServer(http.HandlerFunc(
33 func(w http.ResponseWriter, r *http.Request) {
34 if r.URL.Path != path {
35 w.WriteHeader(404)
36 } else if r.Header.Get("Authorization") != "Bearer imaginary_access_token" {
37 w.WriteHeader(403)
38 } else {
39 w.WriteHeader(200)
40 w.Write([]byte(payload))
41 }
42 }))
45func TestLinkedInProviderDefaults(t *testing.T) {
46 p := testLinkedInProvider("")
47 assert.NotEqual(t, nil, p)
48 assert.Equal(t, "LinkedIn", p.Data().ProviderName)
49 assert.Equal(t, "https://www.linkedin.com/uas/oauth2/authorization",
50 p.Data().LoginURL.String())
51 assert.Equal(t, "https://www.linkedin.com/uas/oauth2/accessToken",
52 p.Data().RedeemURL.String())
53 assert.Equal(t, "https://www.linkedin.com/v1/people/~/email-address",
54 p.Data().ProfileURL.String())
55 assert.Equal(t, "https://www.linkedin.com/v1/people/~/email-address",
56 p.Data().ValidateURL.String())
57 assert.Equal(t, "r_emailaddress r_basicprofile", p.Data().Scope)
60func TestLinkedInProviderOverrides(t *testing.T) {
61 p := NewLinkedInProvider(
62 &ProviderData{
63 LoginURL: &url.URL{
64 Scheme: "https",
65 Host: "example.com",
66 Path: "/oauth/auth"},
67 RedeemURL: &url.URL{
68 Scheme: "https",
69 Host: "example.com",
70 Path: "/oauth/token"},
71 ProfileURL: &url.URL{
72 Scheme: "https",
73 Host: "example.com",
74 Path: "/oauth/profile"},
75 ValidateURL: &url.URL{
76 Scheme: "https",
77 Host: "example.com",
78 Path: "/oauth/tokeninfo"},
79 Scope: "profile"})
80 assert.NotEqual(t, nil, p)
81 assert.Equal(t, "LinkedIn", p.Data().ProviderName)
82 assert.Equal(t, "https://example.com/oauth/auth",
83 p.Data().LoginURL.String())
84 assert.Equal(t, "https://example.com/oauth/token",
85 p.Data().RedeemURL.String())
86 assert.Equal(t, "https://example.com/oauth/profile",
87 p.Data().ProfileURL.String())
88 assert.Equal(t, "https://example.com/oauth/tokeninfo",
89 p.Data().ValidateURL.String())
90 assert.Equal(t, "profile", p.Data().Scope)
93func TestLinkedInProviderGetEmailAddress(t *testing.T) {
94 b := testLinkedInBackend(`"user@linkedin.com"`)
95 defer b.Close()
97 bURL, _ := url.Parse(b.URL)
98 p := testLinkedInProvider(bURL.Host)
100 session := &SessionState{AccessToken: "imaginary_access_token"}
101 email, err := p.GetEmailAddress(session)
102 assert.Equal(t, nil, err)
103 assert.Equal(t, "user@linkedin.com", email)
106func TestLinkedInProviderGetEmailAddressFailedRequest(t *testing.T) {
107 b := testLinkedInBackend("unused payload")
108 defer b.Close()
110 bURL, _ := url.Parse(b.URL)
111 p := testLinkedInProvider(bURL.Host)
113 // We'll trigger a request failure by using an unexpected access
114 // token. Alternatively, we could allow the parsing of the payload as
115 // JSON to fail.
116 session := &SessionState{AccessToken: "unexpected_access_token"}
117 email, err := p.GetEmailAddress(session)
118 assert.NotEqual(t, nil, err)
119 assert.Equal(t, "", email)
122func TestLinkedInProviderGetEmailAddressEmailNotPresentInPayload(t *testing.T) {
123 b := testLinkedInBackend("{\"foo\": \"bar\"}")
124 defer b.Close()
126 bURL, _ := url.Parse(b.URL)
127 p := testLinkedInProvider(bURL.Host)
129 session := &SessionState{AccessToken: "imaginary_access_token"}
130 email, err := p.GetEmailAddress(session)
131 assert.NotEqual(t, nil, err)
132 assert.Equal(t, "", email)