Skip to content

Commit c209952

Browse files
authored
FEATURE: retrieve user avatar (#6)
- also add specs - remove unused `name` info
1 parent 2ed2e7b commit c209952

File tree

2 files changed

+123
-4
lines changed

2 files changed

+123
-4
lines changed

lib/discourse_login_client_authenticator.rb

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@ class DiscourseLoginClientStrategy < ::OmniAuth::Strategies::OAuth2
1616
info do
1717
{
1818
username: access_token.params["info"]["username"],
19-
name: access_token.params["info"]["username"],
2019
email: access_token.params["info"]["email"],
21-
# image: for avatar?
20+
image: access_token.params["info"]["image"],
2221
}
2322
end
2423

@@ -64,7 +63,7 @@ def always_update_user_email?
6463
end
6564

6665
def enabled?
67-
SiteSetting.discourse_login_client_enabled && SiteSetting.discourse_login_client_id &&
68-
SiteSetting.discourse_login_client_secret
66+
SiteSetting.discourse_login_client_enabled && SiteSetting.discourse_login_client_id.present? &&
67+
SiteSetting.discourse_login_client_secret.present?
6968
end
7069
end
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# frozen_string_literal: true
2+
3+
require "rails_helper"
4+
5+
describe DiscourseLoginClientAuthenticator do
6+
let(:authenticator) { described_class.new }
7+
let(:user) { Fabricate(:user) }
8+
9+
context "with default settings" do
10+
before do
11+
SiteSetting.discourse_login_client_enabled = true
12+
SiteSetting.discourse_login_client_id = "client_id"
13+
SiteSetting.discourse_login_client_secret = "client_secret"
14+
end
15+
16+
it "has the right name" do
17+
expect(authenticator.name).to eq("discourse_login")
18+
end
19+
20+
it "can connect to existing user" do
21+
expect(authenticator.can_connect_existing_user?).to eq(true)
22+
end
23+
24+
it "can be revoked" do
25+
expect(authenticator.can_revoke?).to eq(true)
26+
end
27+
28+
it "verifies email by default" do
29+
expect(authenticator.primary_email_verified?({})).to eq(true)
30+
end
31+
32+
it "does not always update user email" do
33+
expect(authenticator.always_update_user_email?).to eq(false)
34+
end
35+
36+
describe "#enabled?" do
37+
it "is enabled with proper settings" do
38+
expect(authenticator.enabled?).to eq(true)
39+
end
40+
41+
it "is disabled without client id" do
42+
SiteSetting.discourse_login_client_id = ""
43+
expect(authenticator.enabled?).to eq(false)
44+
end
45+
46+
it "is disabled without client secret" do
47+
SiteSetting.discourse_login_client_secret = ""
48+
expect(authenticator.enabled?).to eq(false)
49+
end
50+
51+
it "is disabled when `discourse_login_client_enabled` is false" do
52+
SiteSetting.discourse_login_client_enabled = false
53+
expect(authenticator.enabled?).to eq(false)
54+
end
55+
end
56+
57+
describe "#base_url" do
58+
it "returns default URL when setting is blank" do
59+
SiteSetting.discourse_login_client_url = ""
60+
expect(authenticator.base_url).to eq("https://logindemo.discourse.group")
61+
end
62+
63+
it "returns configured URL when setting is present" do
64+
SiteSetting.discourse_login_client_url = "https://custom.example.com"
65+
expect(authenticator.base_url).to eq("https://custom.example.com")
66+
end
67+
end
68+
end
69+
70+
describe "DiscourseLoginClientStrategy" do
71+
let(:strategy) { DiscourseLoginClientAuthenticator::DiscourseLoginClientStrategy.new({}) }
72+
73+
it "uses 'discourse_login' name" do
74+
expect(strategy.options.name).to eq("discourse_login")
75+
end
76+
77+
it "defines client_options" do
78+
client_options = strategy.options.client_options
79+
expect(client_options.authorize_url).to eq("/oauth/authorize")
80+
expect(client_options.token_url).to eq("/oauth/token")
81+
expect(client_options.auth_scheme).to eq(:basic_auth)
82+
end
83+
84+
it "defines authorize_options" do
85+
expect(strategy.options.authorize_options).to include(:scope)
86+
end
87+
88+
it "extracts uid from access_token" do
89+
access_token =
90+
instance_double("OAuth2::AccessToken", params: { "info" => { "uuid" => "12345" } })
91+
allow(strategy).to receive(:access_token).and_return(access_token)
92+
expect(strategy.uid).to eq("12345")
93+
end
94+
95+
it "extracts user info from access_token" do
96+
access_token =
97+
instance_double(
98+
"OAuth2::AccessToken",
99+
params: {
100+
"info" => {
101+
"username" => "test_user",
102+
"email" => "test@example.com",
103+
"image" => "http://example.com/avatar.png",
104+
},
105+
},
106+
)
107+
allow(strategy).to receive(:access_token).and_return(access_token)
108+
109+
user_info = strategy.info
110+
111+
expect(user_info[:username]).to eq("test_user")
112+
expect(user_info[:email]).to eq("test@example.com")
113+
expect(user_info[:image]).to eq("http://example.com/avatar.png")
114+
end
115+
116+
it "defines callback_url" do
117+
expect(strategy.callback_url).to eq("http://test.localhost/auth/discourse_login/callback")
118+
end
119+
end
120+
end

0 commit comments

Comments
 (0)