33describe 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+
62149end
0 commit comments