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