Skip to content

Commit 250bf84

Browse files
committed
DEV: Improve specs for managed authenticator
1 parent a41be68 commit 250bf84

File tree

2 files changed

+95
-7
lines changed

2 files changed

+95
-7
lines changed

lib/managed_authenticator.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
class Auth::ManagedAuthenticator < Auth::Authenticator
22
def description_for_user(user)
3-
info = UserAssociatedAccount.find_by(provider_name: name, user_id: user.id).info
3+
info = UserAssociatedAccount.find_by(provider_name: name, user_id: user.id)&.info
4+
return "" if info.nil?
45
info["name"] || info["email"] || info["nickname"] || ""
56
end
67

spec/lib/managed_authenticator_spec.rb

Lines changed: 93 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@
33
describe Auth::ManagedAuthenticator do
44

55
let(:authenticator) {
6-
Class.new(described_class).new do
7-
def name
8-
"myauth"
9-
end
10-
end
6+
Class.new(described_class) do
7+
def name; "myauth" end
8+
end.new
119
}
1210

1311
let(:hash) {
@@ -30,7 +28,7 @@ def name
3028
}
3129
}
3230

33-
context 'after_authenticate' do
31+
describe 'after_authenticate' do
3432
it 'can match account from an existing association' do
3533
user = Fabricate(:user)
3634
associated = UserAssociatedAccount.create!(user: user, provider_name: 'myauth', provider_uid: "1234")
@@ -44,11 +42,61 @@ def name
4442
expect(associated.extra["raw_info"]["randominfo"]).to eq("some info")
4543
end
4644

45+
describe 'connecting to another user account' do
46+
let(:user1) { Fabricate(:user) }
47+
let(:user2) { Fabricate(:user) }
48+
before { UserAssociatedAccount.create!(user: user1, provider_name: 'myauth', provider_uid: "1234") }
49+
50+
it 'works by default' do
51+
result = authenticator.after_authenticate(hash, existing_account: user2)
52+
expect(result.user.id).to eq(user2.id)
53+
expect(UserAssociatedAccount.exists?(user_id: user1.id)).to eq(false)
54+
expect(UserAssociatedAccount.exists?(user_id: user2.id)).to eq(true)
55+
end
56+
57+
it 'does not work when disabled' do
58+
authenticator = Class.new(described_class) do
59+
def name; "myauth" end
60+
def can_connect_existing_user?; false end
61+
end.new
62+
result = authenticator.after_authenticate(hash, existing_account: user2)
63+
expect(result.user.id).to eq(user1.id)
64+
expect(UserAssociatedAccount.exists?(user_id: user1.id)).to eq(true)
65+
expect(UserAssociatedAccount.exists?(user_id: user2.id)).to eq(false)
66+
end
67+
end
68+
4769
describe 'match by email' do
4870
it 'works normally' do
4971
user = Fabricate(:user)
5072
result = authenticator.after_authenticate(hash.deep_merge(info: { email: user.email }))
5173
expect(result.user.id).to eq(user.id)
74+
expect(UserAssociatedAccount.find_by(provider_name: 'myauth', provider_uid: "1234").user_id).to eq(user.id)
75+
end
76+
77+
it 'works if there is already an association with the target account' do
78+
user = Fabricate(:user, email: "awesome@example.com")
79+
result = authenticator.after_authenticate(hash)
80+
expect(result.user.id).to eq(user.id)
81+
end
82+
83+
it 'does not match if match_by_email is false' do
84+
authenticator = Class.new(described_class) do
85+
def name; "myauth" end
86+
def match_by_email; false end
87+
end.new
88+
user = Fabricate(:user, email: "awesome@example.com")
89+
result = authenticator.after_authenticate(hash)
90+
expect(result.user).to eq(nil)
91+
end
92+
end
93+
94+
context 'when no matching user' do
95+
it 'returns the correct information' do
96+
result = authenticator.after_authenticate(hash)
97+
expect(result.user).to eq(nil)
98+
expect(result.username).to eq("IAmGroot")
99+
expect(result.email).to eq("awesome@example.com")
52100
end
53101

54102
it 'works if there is already an association with the target account' do
@@ -59,4 +107,43 @@ def name
59107
end
60108
end
61109

110+
describe 'description_for_user' do
111+
let(:user) { Fabricate(:user) }
112+
113+
it 'returns empty string if no entry for user' do
114+
expect(authenticator.description_for_user(user)).to eq("")
115+
end
116+
117+
it 'returns correct information' do
118+
association = UserAssociatedAccount.create!(user: user, provider_name: 'myauth', provider_uid: "1234", info: { nickname: "somenickname", email: "test@domain.tld", name: "bestname" })
119+
expect(authenticator.description_for_user(user)).to eq('bestname')
120+
association.update(info: { nickname: "somenickname", email: "test@domain.tld" })
121+
expect(authenticator.description_for_user(user)).to eq('test@domain.tld')
122+
association.update(info: { nickname: "somenickname" })
123+
expect(authenticator.description_for_user(user)).to eq('somenickname')
124+
end
125+
end
126+
127+
describe 'revoke' do
128+
let(:user) { Fabricate(:user) }
129+
130+
it 'raises exception if no entry for user' do
131+
expect { authenticator.revoke(user) }.to raise_error(Discourse::NotFound)
132+
end
133+
134+
context "with valid record" do
135+
before do
136+
UserAssociatedAccount.create!(user: user, provider_name: 'myauth', provider_uid: "1234", info: { name: "somename" })
137+
end
138+
139+
it 'revokes correctly' do
140+
expect(authenticator.description_for_user(user)).to eq("somename")
141+
expect(authenticator.can_revoke?).to eq(true)
142+
expect(authenticator.revoke(user)).to eq(true)
143+
144+
expect(authenticator.description_for_user(user)).to eq("")
145+
end
146+
end
147+
end
148+
62149
end

0 commit comments

Comments
 (0)