@@ -0,0 +1,128 @@
1+package providers
2+
3+import (
4+ "github.com/bitly/go-simplejson"
5+ "github.com/bmizerany/assert"
6+ "net/http"
7+ "net/http/httptest"
8+ "net/url"
9+ "testing"
10+)
11+
12+func testLinkedInProvider(hostname string) *LinkedInProvider {
13+ p := NewLinkedInProvider(
14+ &ProviderData{
15+ ProviderName: "",
16+ LoginUrl: &url.URL{},
17+ RedeemUrl: &url.URL{},
18+ ProfileUrl: &url.URL{},
19+ Scope: ""})
20+ if hostname != "" {
21+ updateUrl(p.Data().LoginUrl, hostname)
22+ updateUrl(p.Data().RedeemUrl, hostname)
23+ updateUrl(p.Data().ProfileUrl, hostname)
24+ }
25+ return p
26+}
27+
28+func testLinkedInBackend(payload string) *httptest.Server {
29+ path := "/v1/people/~/email-address"
30+
31+ return httptest.NewServer(http.HandlerFunc(
32+ func(w http.ResponseWriter, r *http.Request) {
33+ url := r.URL
34+ if 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+ }))
43+}
44+
45+func 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, "r_emailaddress r_basicprofile", p.Data().Scope)
56+}
57+
58+func TestLinkedInProviderOverrides(t *testing.T) {
59+ p := NewLinkedInProvider(
60+ &ProviderData{
61+ LoginUrl: &url.URL{
62+ Scheme: "https",
63+ Host: "example.com",
64+ Path: "/oauth/auth"},
65+ RedeemUrl: &url.URL{
66+ Scheme: "https",
67+ Host: "example.com",
68+ Path: "/oauth/token"},
69+ ProfileUrl: &url.URL{
70+ Scheme: "https",
71+ Host: "example.com",
72+ Path: "/oauth/profile"},
73+ Scope: "profile"})
74+ assert.NotEqual(t, nil, p)
75+ assert.Equal(t, "LinkedIn", p.Data().ProviderName)
76+ assert.Equal(t, "https://example.com/oauth/auth",
77+ p.Data().LoginUrl.String())
78+ assert.Equal(t, "https://example.com/oauth/token",
79+ p.Data().RedeemUrl.String())
80+ assert.Equal(t, "https://example.com/oauth/profile",
81+ p.Data().ProfileUrl.String())
82+ assert.Equal(t, "profile", p.Data().Scope)
83+}
84+
85+func TestLinkedInProviderGetEmailAddress(t *testing.T) {
86+ b := testLinkedInBackend(`"user@linkedin.com"`)
87+ defer b.Close()
88+
89+ b_url, _ := url.Parse(b.URL)
90+ p := testLinkedInProvider(b_url.Host)
91+ unused_auth_response := simplejson.New()
92+
93+ email, err := p.GetEmailAddress(unused_auth_response,
94+ "imaginary_access_token")
95+ assert.Equal(t, nil, err)
96+ assert.Equal(t, "user@linkedin.com", email)
97+}
98+
99+func TestLinkedInProviderGetEmailAddressFailedRequest(t *testing.T) {
100+ b := testLinkedInBackend("unused payload")
101+ defer b.Close()
102+
103+ b_url, _ := url.Parse(b.URL)
104+ p := testLinkedInProvider(b_url.Host)
105+ unused_auth_response := simplejson.New()
106+
107+ // We'll trigger a request failure by using an unexpected access
108+ // token. Alternatively, we could allow the parsing of the payload as
109+ // JSON to fail.
110+ email, err := p.GetEmailAddress(unused_auth_response,
111+ "unexpected_access_token")
112+ assert.NotEqual(t, nil, err)
113+ assert.Equal(t, "", email)
114+}
115+
116+func TestLinkedInProviderGetEmailAddressEmailNotPresentInPayload(t *testing.T) {
117+ b := testLinkedInBackend("{\"foo\": \"bar\"}")
118+ defer b.Close()
119+
120+ b_url, _ := url.Parse(b.URL)
121+ p := testLinkedInProvider(b_url.Host)
122+ unused_auth_response := simplejson.New()
123+
124+ email, err := p.GetEmailAddress(unused_auth_response,
125+ "imaginary_access_token")
126+ assert.NotEqual(t, nil, err)
127+ assert.Equal(t, "", email)
128+}