2015-10-11 10:41:23 +01:00
require 'rails_helper'
2013-10-04 13:28:49 +10:00
require_dependency 'user'
2013-02-05 14:16:51 -05:00
describe User do
2014-12-31 11:55:03 -03:00
it { is_expected . to validate_presence_of :username }
it { is_expected . to validate_presence_of :email }
2013-02-05 14:16:51 -05:00
2014-12-30 22:06:15 +08:00
describe '#count_by_signup_date' do
before ( :each ) do
User . destroy_all
Timecop . freeze
Fabricate ( :user )
Fabricate ( :user , created_at : 1 . day . ago )
Fabricate ( :user , created_at : 1 . day . ago )
Fabricate ( :user , created_at : 2 . days . ago )
Fabricate ( :user , created_at : 4 . days . ago )
end
after ( :each ) { Timecop . return }
let ( :signups_by_day ) { { 1 . day . ago . to_date = > 2 , 2 . days . ago . to_date = > 1 , Time . now . utc . to_date = > 1 } }
it 'collect closed interval signups' do
2014-12-31 11:55:03 -03:00
expect ( User . count_by_signup_date ( 2 . days . ago , Time . now ) ) . to include ( signups_by_day )
expect ( User . count_by_signup_date ( 2 . days . ago , Time . now ) ) . not_to include ( { 4 . days . ago . to_date = > 1 } )
2014-12-30 22:06:15 +08:00
end
end
2013-02-05 14:16:51 -05:00
context '.enqueue_welcome_message' do
let ( :user ) { Fabricate ( :user ) }
it 'enqueues the system message' do
Jobs . expects ( :enqueue ) . with ( :send_system_message , user_id : user . id , message_type : 'welcome_user' )
user . enqueue_welcome_message ( 'welcome_user' )
end
it " doesn't enqueue the system message when the site settings disable it " do
SiteSetting . expects ( :send_welcome_message? ) . returns ( false )
Jobs . expects ( :enqueue ) . with ( :send_system_message , user_id : user . id , message_type : 'welcome_user' ) . never
user . enqueue_welcome_message ( 'welcome_user' )
end
end
2013-02-28 16:08:56 +03:00
describe '.approve' do
2013-02-05 14:16:51 -05:00
let ( :user ) { Fabricate ( :user ) }
let ( :admin ) { Fabricate ( :admin ) }
2015-05-04 15:30:25 -04:00
it " enqueues a 'signup after approval' email if must_approve_users is true " do
SiteSetting . stubs ( :must_approve_users ) . returns ( true )
2013-06-05 20:16:31 -07:00
Jobs . expects ( :enqueue ) . with (
:user_email , has_entries ( type : :signup_after_approval )
)
2013-02-05 14:16:51 -05:00
user . approve ( admin )
end
2015-05-04 15:30:25 -04:00
it " doesn't enqueue a 'signup after approval' email if must_approve_users is false " do
SiteSetting . stubs ( :must_approve_users ) . returns ( false )
Jobs . expects ( :enqueue ) . never
user . approve ( admin )
end
2013-02-05 14:16:51 -05:00
context 'after approval' do
before do
user . approve ( admin )
end
it 'marks the user as approved' do
2014-12-31 11:55:03 -03:00
expect ( user ) . to be_approved
2013-02-05 14:16:51 -05:00
end
it 'has the admin as the approved by' do
2014-12-31 11:55:03 -03:00
expect ( user . approved_by ) . to eq ( admin )
2013-02-05 14:16:51 -05:00
end
it 'has a value for approved_at' do
2014-12-31 11:55:03 -03:00
expect ( user . approved_at ) . to be_present
2013-02-05 14:16:51 -05:00
end
2013-02-05 19:44:49 -07:00
end
2013-02-05 14:16:51 -05:00
end
describe 'bookmark' do
before do
@post = Fabricate ( :post )
end
it " creates a bookmark with the true parameter " do
2014-12-31 11:55:03 -03:00
expect {
2013-03-01 15:07:44 +03:00
PostAction . act ( @post . user , @post , PostActionType . types [ :bookmark ] )
2014-12-31 11:55:03 -03:00
} . to change ( PostAction , :count ) . by ( 1 )
2013-02-05 14:16:51 -05:00
end
describe 'when removing a bookmark' do
before do
2013-03-01 15:07:44 +03:00
PostAction . act ( @post . user , @post , PostActionType . types [ :bookmark ] )
2013-02-05 14:16:51 -05:00
end
it 'reduces the bookmark count of the post' do
active = PostAction . where ( deleted_at : nil )
2014-12-31 11:55:03 -03:00
expect {
2013-03-01 15:07:44 +03:00
PostAction . remove_act ( @post . user , @post , PostActionType . types [ :bookmark ] )
2014-12-31 11:55:03 -03:00
} . to change ( active , :count ) . by ( - 1 )
2013-02-05 14:16:51 -05:00
end
2014-02-28 10:54:21 -08:00
end
2013-02-05 14:16:51 -05:00
end
2013-02-25 19:42:20 +03:00
describe 'delete posts' do
before do
2013-02-07 18:11:56 +11:00
@post1 = Fabricate ( :post )
@user = @post1 . user
@post2 = Fabricate ( :post , topic : @post1 . topic , user : @user )
@post3 = Fabricate ( :post , user : @user )
@posts = [ @post1 , @post2 , @post3 ]
@guardian = Guardian . new ( Fabricate ( :admin ) )
2015-04-24 16:04:44 -04:00
@queued_post = Fabricate ( :queued_post , user : @user )
2013-02-07 18:11:56 +11:00
end
2013-02-25 19:42:20 +03:00
it 'allows moderator to delete all posts' do
2013-02-07 18:11:56 +11:00
@user . delete_all_posts! ( @guardian )
2013-07-22 20:44:11 +02:00
expect ( Post . where ( id : @posts . map ( & :id ) ) ) . to be_empty
2015-04-24 16:04:44 -04:00
expect ( QueuedPost . where ( user_id : @user . id ) . count ) . to eq ( 0 )
2013-02-07 18:11:56 +11:00
@posts . each do | p |
2015-04-23 19:33:29 +02:00
if p . is_first_post?
2014-10-31 10:44:26 -07:00
expect ( Topic . find_by ( id : p . topic_id ) ) . to be_nil
2013-02-07 18:11:56 +11:00
end
end
end
2013-03-29 00:24:35 +01:00
it 'does not allow non moderators to delete all posts' do
invalid_guardian = Guardian . new ( Fabricate ( :user ) )
expect do
@user . delete_all_posts! ( invalid_guardian )
end . to raise_error Discourse :: InvalidAccess
@posts . each do | p |
p . reload
2014-12-31 11:55:03 -03:00
expect ( p ) . to be_present
expect ( p . topic ) . to be_present
2013-03-29 00:24:35 +01:00
end
end
2013-02-07 18:11:56 +11:00
end
2013-02-05 14:16:51 -05:00
describe 'new' do
subject { Fabricate . build ( :user ) }
2014-12-31 11:55:03 -03:00
it { is_expected . to be_valid }
it { is_expected . not_to be_admin }
it { is_expected . not_to be_approved }
2014-10-29 16:06:50 +01:00
it " is properly initialized " do
2014-12-31 11:55:03 -03:00
expect ( subject . approved_at ) . to be_blank
expect ( subject . approved_by_id ) . to be_blank
2014-10-29 16:06:50 +01:00
end
2013-02-05 14:16:51 -05:00
context 'after_save' do
2014-10-29 16:06:50 +01:00
before { subject . save }
2013-02-05 14:16:51 -05:00
2016-02-17 15:46:19 +11:00
it " has correct settings " do
2014-12-31 11:55:03 -03:00
expect ( subject . email_tokens ) . to be_present
2016-02-17 15:46:19 +11:00
expect ( subject . user_option . email_private_messages ) . to eq ( true )
expect ( subject . user_option . email_direct ) . to eq ( true )
2014-10-29 16:06:50 +01:00
end
2013-02-05 14:16:51 -05:00
end
2014-07-14 10:16:24 -04:00
it " downcases email addresses " do
user = Fabricate . build ( :user , email : 'Fancy.Caps.4.U@gmail.com' )
2015-01-30 01:11:41 +05:30
user . valid?
expect ( user . email ) . to eq ( 'fancy.caps.4.u@gmail.com' )
end
it " strips whitespace from email addresses " do
user = Fabricate . build ( :user , email : ' example@gmail.com ' )
user . valid?
expect ( user . email ) . to eq ( 'example@gmail.com' )
2014-07-14 10:16:24 -04:00
end
2013-02-05 14:16:51 -05:00
end
2013-10-21 14:49:51 -04:00
describe 'ip address validation' do
it 'validates ip_address for new users' do
u = Fabricate . build ( :user )
AllowedIpAddressValidator . any_instance . expects ( :validate_each ) . with ( u , :ip_address , u . ip_address )
u . valid?
end
it 'does not validate ip_address when updating an existing user' do
u = Fabricate ( :user )
u . ip_address = '87.123.23.11'
AllowedIpAddressValidator . any_instance . expects ( :validate_each ) . never
u . valid?
end
end
2013-02-05 14:16:51 -05:00
describe " trust levels " do
2013-03-19 21:05:19 -07:00
2013-05-10 16:58:23 -04:00
# NOTE be sure to use build to avoid db calls
2014-09-05 15:20:39 +10:00
let ( :user ) { Fabricate . build ( :user , trust_level : TrustLevel [ 0 ] ) }
2013-02-05 14:16:51 -05:00
it " sets to the default trust level setting " do
2014-09-05 15:20:39 +10:00
SiteSetting . default_trust_level = TrustLevel [ 4 ]
2014-12-31 11:55:03 -03:00
expect ( User . new . trust_level ) . to eq ( TrustLevel [ 4 ] )
2013-02-05 14:16:51 -05:00
end
2013-02-28 16:08:56 +03:00
describe 'has_trust_level?' do
2013-02-05 14:16:51 -05:00
it " raises an error with an invalid level " do
2014-12-31 11:55:03 -03:00
expect { user . has_trust_level? ( :wat ) } . to raise_error
2013-02-05 14:16:51 -05:00
end
it " is true for your basic level " do
2014-12-31 11:55:03 -03:00
expect ( user . has_trust_level? ( TrustLevel [ 0 ] ) ) . to eq ( true )
2013-02-05 14:16:51 -05:00
end
it " is false for a higher level " do
2014-12-31 11:55:03 -03:00
expect ( user . has_trust_level? ( TrustLevel [ 2 ] ) ) . to eq ( false )
2013-02-05 14:16:51 -05:00
end
it " is true if you exceed the level " do
2014-09-05 15:20:39 +10:00
user . trust_level = TrustLevel [ 4 ]
2014-12-31 11:55:03 -03:00
expect ( user . has_trust_level? ( TrustLevel [ 1 ] ) ) . to eq ( true )
2013-02-05 14:16:51 -05:00
end
it " is true for an admin even with a low trust level " do
2014-09-05 15:20:39 +10:00
user . trust_level = TrustLevel [ 0 ]
2013-02-05 14:16:51 -05:00
user . admin = true
2014-12-31 11:55:03 -03:00
expect ( user . has_trust_level? ( TrustLevel [ 1 ] ) ) . to eq ( true )
2013-02-05 14:16:51 -05:00
end
end
describe 'moderator' do
it " isn't a moderator by default " do
2014-12-31 11:55:03 -03:00
expect ( user . moderator? ) . to eq ( false )
2013-02-05 14:16:51 -05:00
end
it " is a moderator if the user level is moderator " do
2013-03-19 21:05:19 -07:00
user . moderator = true
2014-12-31 11:55:03 -03:00
expect ( user . has_trust_level? ( TrustLevel [ 4 ] ) ) . to eq ( true )
2013-02-05 19:44:49 -07:00
end
2013-02-05 14:16:51 -05:00
2013-05-02 17:22:27 +10:00
it " is staff if the user is an admin " do
2013-02-05 14:16:51 -05:00
user . admin = true
2014-12-31 11:55:03 -03:00
expect ( user . staff? ) . to eq ( true )
2013-02-05 19:44:49 -07:00
end
2013-02-05 14:16:51 -05:00
end
end
2013-05-18 18:07:07 +10:00
describe 'staff and regular users' do
let ( :user ) { Fabricate . build ( :user ) }
describe '#staff?' do
subject { user . staff? }
2014-12-31 11:55:03 -03:00
it { is_expected . to eq ( false ) }
2013-05-18 18:07:07 +10:00
context 'for a moderator user' do
before { user . moderator = true }
2014-12-31 11:55:03 -03:00
it { is_expected . to eq ( true ) }
2013-05-18 18:07:07 +10:00
end
context 'for an admin user' do
before { user . admin = true }
2014-12-31 11:55:03 -03:00
it { is_expected . to eq ( true ) }
2013-05-18 18:07:07 +10:00
end
end
describe '#regular?' do
subject { user . regular? }
2014-12-31 11:55:03 -03:00
it { is_expected . to eq ( true ) }
2013-05-18 18:07:07 +10:00
context 'for a moderator user' do
before { user . moderator = true }
2014-12-31 11:55:03 -03:00
it { is_expected . to eq ( false ) }
2013-05-18 18:07:07 +10:00
end
context 'for an admin user' do
before { user . admin = true }
2014-12-31 11:55:03 -03:00
it { is_expected . to eq ( false ) }
2013-05-18 18:07:07 +10:00
end
end
end
2013-02-05 19:44:49 -07:00
describe 'email_hash' do
before do
2013-02-05 14:16:51 -05:00
@user = Fabricate ( :user )
end
2013-02-05 19:44:49 -07:00
it 'should have a sane email hash' do
2014-12-31 11:55:03 -03:00
expect ( @user . email_hash ) . to match ( / ^[0-9a-f]{32}$ / )
2013-02-05 19:44:49 -07:00
end
it 'should use downcase email' do
@user . email = " example@example.com "
@user2 = Fabricate ( :user )
@user2 . email = " ExAmPlE@eXaMpLe.com "
2014-12-31 11:55:03 -03:00
expect ( @user . email_hash ) . to eq ( @user2 . email_hash )
2013-02-05 19:44:49 -07:00
end
it 'should trim whitespace before hashing' do
@user . email = " example@example.com "
@user2 = Fabricate ( :user )
@user2 . email = " example@example.com "
2014-12-31 11:55:03 -03:00
expect ( @user . email_hash ) . to eq ( @user2 . email_hash )
2013-02-05 19:44:49 -07:00
end
2013-02-05 14:16:51 -05:00
end
2014-09-25 15:50:54 +10:00
describe 'associated_accounts' do
it 'should correctly find social associations' do
user = Fabricate ( :user )
2014-12-31 11:55:03 -03:00
expect ( user . associated_accounts ) . to eq ( I18n . t ( " user.no_accounts_associated " ) )
2014-09-25 15:50:54 +10:00
TwitterUserInfo . create ( user_id : user . id , screen_name : " sam " , twitter_user_id : 1 )
FacebookUserInfo . create ( user_id : user . id , username : " sam " , facebook_user_id : 1 )
GoogleUserInfo . create ( user_id : user . id , email : " sam@sam.com " , google_user_id : 1 )
GithubUserInfo . create ( user_id : user . id , screen_name : " sam " , github_user_id : 1 )
user . reload
2014-12-31 11:55:03 -03:00
expect ( user . associated_accounts ) . to eq ( " Twitter(sam), Facebook(sam), Google(sam@sam.com), Github(sam) " )
2014-09-25 15:50:54 +10:00
end
end
2013-02-05 19:44:49 -07:00
describe 'name heuristics' do
it 'is able to guess a decent name from an email' do
2014-12-31 11:55:03 -03:00
expect ( User . suggest_name ( 'sam.saffron@gmail.com' ) ) . to eq ( 'Sam Saffron' )
2013-02-05 14:16:51 -05:00
end
end
2013-02-05 19:44:49 -07:00
describe 'username format' do
2015-09-02 12:13:44 +10:00
def assert_bad ( username )
user = Fabricate . build ( :user )
user . username = username
expect ( user . valid? ) . to eq ( false )
2013-02-05 14:16:51 -05:00
end
2015-09-02 12:13:44 +10:00
def assert_good ( username )
user = Fabricate . build ( :user )
user . username = username
expect ( user . valid? ) . to eq ( true )
2013-02-05 14:16:51 -05:00
end
2015-09-02 12:13:44 +10:00
it " should be SiteSetting.min_username_length chars or longer " do
SiteSetting . min_username_length = 5
assert_bad ( " abcd " )
assert_good ( " abcde " )
end
%w{ first.last
first first - last
_name first_last
mc . hammer_nose
UPPERCASE
sgif
} . each do | username |
it " allows #{ username } " do
assert_good ( username )
end
2013-02-05 14:16:51 -05:00
end
2015-09-02 12:13:44 +10:00
%w{
traildot .
has \ space
double__underscore
with % symbol
Exclamation !
@twitter
my @email . com
. tester
sa $sy
sam . json
sam . xml
sam . html
sam . htm
sam . js
sam . woff
sam . Png
sam . gif
} . each do | username |
it " disallows #{ username } " do
assert_bad ( username )
2013-02-05 14:16:51 -05:00
end
end
end
describe 'username uniqueness' do
before do
@user = Fabricate . build ( :user )
@user . save!
@codinghorror = Fabricate . build ( :coding_horror )
end
2013-02-05 19:44:49 -07:00
2013-02-05 14:16:51 -05:00
it " should not allow saving if username is reused " do
@codinghorror . username = @user . username
2014-12-31 11:55:03 -03:00
expect ( @codinghorror . save ) . to eq ( false )
2013-02-05 14:16:51 -05:00
end
2013-02-05 19:44:49 -07:00
it " should not allow saving if username is reused in different casing " do
2013-02-05 14:16:51 -05:00
@codinghorror . username = @user . username . upcase
2014-12-31 11:55:03 -03:00
expect ( @codinghorror . save ) . to eq ( false )
2013-02-05 14:16:51 -05:00
end
end
context '.username_available?' do
it " returns true for a username that is available " do
2014-12-31 11:55:03 -03:00
expect ( User . username_available? ( 'BruceWayne' ) ) . to eq ( true )
2013-02-05 14:16:51 -05:00
end
it 'returns false when a username is taken' do
2014-12-31 11:55:03 -03:00
expect ( User . username_available? ( Fabricate ( :user ) . username ) ) . to eq ( false )
2013-02-05 14:16:51 -05:00
end
end
2013-02-13 12:28:23 -05:00
describe 'email_validator' do
it 'should allow good emails' do
user = Fabricate . build ( :user , email : 'good@gmail.com' )
2014-12-31 11:55:03 -03:00
expect ( user ) . to be_valid
2013-02-13 12:28:23 -05:00
end
2013-02-13 22:24:32 -05:00
it 'should reject some emails based on the email_domains_blacklist site setting' do
SiteSetting . stubs ( :email_domains_blacklist ) . returns ( 'mailinator.com' )
2014-12-31 11:55:03 -03:00
expect ( Fabricate . build ( :user , email : 'notgood@mailinator.com' ) ) . not_to be_valid
expect ( Fabricate . build ( :user , email : 'mailinator@gmail.com' ) ) . to be_valid
2013-02-13 12:28:23 -05:00
end
2013-02-13 22:24:32 -05:00
it 'should reject some emails based on the email_domains_blacklist site setting' do
SiteSetting . stubs ( :email_domains_blacklist ) . returns ( 'mailinator.com|trashmail.net' )
2014-12-31 11:55:03 -03:00
expect ( Fabricate . build ( :user , email : 'notgood@mailinator.com' ) ) . not_to be_valid
expect ( Fabricate . build ( :user , email : 'notgood@trashmail.net' ) ) . not_to be_valid
expect ( Fabricate . build ( :user , email : 'mailinator.com@gmail.com' ) ) . to be_valid
2013-02-13 12:28:23 -05:00
end
2013-03-31 18:51:13 +02:00
2013-03-18 15:48:56 -04:00
it 'should not reject partial matches' do
SiteSetting . stubs ( :email_domains_blacklist ) . returns ( 'mail.com' )
2014-12-31 11:55:03 -03:00
expect ( Fabricate . build ( :user , email : 'mailinator@gmail.com' ) ) . to be_valid
2013-03-18 15:48:56 -04:00
end
2013-03-31 18:51:13 +02:00
2013-02-13 22:24:32 -05:00
it 'should reject some emails based on the email_domains_blacklist site setting ignoring case' do
SiteSetting . stubs ( :email_domains_blacklist ) . returns ( 'trashmail.net' )
2014-12-31 11:55:03 -03:00
expect ( Fabricate . build ( :user , email : 'notgood@TRASHMAIL.NET' ) ) . not_to be_valid
2013-02-13 22:24:32 -05:00
end
2015-05-13 17:38:10 +05:30
it 'should reject emails based on the email_domains_blacklist site setting matching subdomain' do
SiteSetting . stubs ( :email_domains_blacklist ) . returns ( 'domain.com' )
expect ( Fabricate . build ( :user , email : 'notgood@sub.domain.com' ) ) . not_to be_valid
end
2015-01-29 23:22:59 +05:30
it 'blacklist should not reject developer emails' do
Rails . configuration . stubs ( :developer_emails ) . returns ( 'developer@discourse.org' )
SiteSetting . stubs ( :email_domains_blacklist ) . returns ( 'discourse.org' )
expect ( Fabricate . build ( :user , email : 'developer@discourse.org' ) ) . to be_valid
end
2013-02-13 22:24:32 -05:00
it 'should not interpret a period as a wildcard' do
SiteSetting . stubs ( :email_domains_blacklist ) . returns ( 'trashmail.net' )
2014-12-31 11:55:03 -03:00
expect ( Fabricate . build ( :user , email : 'good@trashmailinet.com' ) ) . to be_valid
2013-02-13 12:28:23 -05:00
end
2013-02-20 12:16:01 -05:00
it 'should not be used to validate existing records' do
u = Fabricate ( :user , email : 'in_before_blacklisted@fakemail.com' )
SiteSetting . stubs ( :email_domains_blacklist ) . returns ( 'fakemail.com' )
2014-12-31 11:55:03 -03:00
expect ( u ) . to be_valid
2013-02-20 12:16:01 -05:00
end
2013-02-20 16:24:52 -05:00
it 'should be used when email is being changed' do
SiteSetting . stubs ( :email_domains_blacklist ) . returns ( 'mailinator.com' )
u = Fabricate ( :user , email : 'good@gmail.com' )
u . email = 'nope@mailinator.com'
2014-12-31 11:55:03 -03:00
expect ( u ) . not_to be_valid
2013-03-18 15:48:56 -04:00
end
2013-03-31 18:51:13 +02:00
2013-03-18 15:48:56 -04:00
it 'whitelist should reject some emails based on the email_domains_whitelist site setting' do
SiteSetting . stubs ( :email_domains_whitelist ) . returns ( 'vaynermedia.com' )
2014-12-31 11:55:03 -03:00
expect ( Fabricate . build ( :user , email : 'notgood@mailinator.com' ) ) . not_to be_valid
expect ( Fabricate . build ( :user , email : 'sbauch@vaynermedia.com' ) ) . to be_valid
2013-03-18 15:48:56 -04:00
end
it 'should reject some emails based on the email_domains_whitelist site setting when whitelisting multiple domains' do
SiteSetting . stubs ( :email_domains_whitelist ) . returns ( 'vaynermedia.com|gmail.com' )
2014-12-31 11:55:03 -03:00
expect ( Fabricate . build ( :user , email : 'notgood@mailinator.com' ) ) . not_to be_valid
expect ( Fabricate . build ( :user , email : 'notgood@trashmail.net' ) ) . not_to be_valid
expect ( Fabricate . build ( :user , email : 'mailinator.com@gmail.com' ) ) . to be_valid
expect ( Fabricate . build ( :user , email : 'mailinator.com@vaynermedia.com' ) ) . to be_valid
2013-03-18 15:48:56 -04:00
end
it 'should accept some emails based on the email_domains_whitelist site setting ignoring case' do
SiteSetting . stubs ( :email_domains_whitelist ) . returns ( 'vaynermedia.com' )
2014-12-31 11:55:03 -03:00
expect ( Fabricate . build ( :user , email : 'good@VAYNERMEDIA.COM' ) ) . to be_valid
2013-03-18 15:48:56 -04:00
end
2015-01-29 23:22:59 +05:30
it 'whitelist should accept developer emails' do
Rails . configuration . stubs ( :developer_emails ) . returns ( 'developer@discourse.org' )
SiteSetting . stubs ( :email_domains_whitelist ) . returns ( 'awesome.org' )
expect ( Fabricate . build ( :user , email : 'developer@discourse.org' ) ) . to be_valid
end
2013-03-18 15:48:56 -04:00
it 'email whitelist should not be used to validate existing records' do
u = Fabricate ( :user , email : 'in_before_whitelisted@fakemail.com' )
SiteSetting . stubs ( :email_domains_blacklist ) . returns ( 'vaynermedia.com' )
2014-12-31 11:55:03 -03:00
expect ( u ) . to be_valid
2013-03-18 15:48:56 -04:00
end
2013-03-31 18:51:13 +02:00
it 'email whitelist should be used when email is being changed' do
2013-03-18 15:48:56 -04:00
SiteSetting . stubs ( :email_domains_whitelist ) . returns ( 'vaynermedia.com' )
u = Fabricate ( :user , email : 'good@vaynermedia.com' )
u . email = 'nope@mailinator.com'
2014-12-31 11:55:03 -03:00
expect ( u ) . not_to be_valid
2013-02-20 16:24:52 -05:00
end
2013-02-13 12:28:23 -05:00
end
2013-02-05 19:44:49 -07:00
describe 'passwords' do
2015-06-06 03:09:02 +10:00
it " should not have an active account with a good password " do
2013-07-11 18:47:06 -04:00
@user = Fabricate . build ( :user , active : false )
2013-02-05 19:44:49 -07:00
@user . password = " ilovepasta "
2013-02-05 14:16:51 -05:00
@user . save!
2015-06-06 03:09:02 +10:00
@user . auth_token = SecureRandom . hex ( 16 )
@user . save!
2013-02-05 14:16:51 -05:00
2014-12-31 11:55:03 -03:00
expect ( @user . active ) . to eq ( false )
2015-06-06 03:09:02 +10:00
expect ( @user . confirm_password? ( " ilovepasta " ) ) . to eq ( true )
2015-06-06 03:50:06 +10:00
email_token = @user . email_tokens . create ( email : 'pasta@delicious.com' )
2015-06-06 03:09:02 +10:00
old_token = @user . auth_token
@user . password = " passwordT "
@user . save!
# must expire old token on password change
expect ( @user . auth_token ) . to_not eq ( old_token )
2015-06-06 03:50:06 +10:00
email_token . reload
expect ( email_token . expired ) . to eq ( true )
2013-02-05 14:16:51 -05:00
end
end
describe " previous_visit_at " do
2013-06-27 17:23:06 -04:00
2013-02-05 14:16:51 -05:00
let ( :user ) { Fabricate ( :user ) }
2013-06-28 15:38:47 +10:00
let! ( :first_visit_date ) { Time . zone . now }
let! ( :second_visit_date ) { 2 . hours . from_now }
let! ( :third_visit_date ) { 5 . hours . from_now }
2013-02-05 14:16:51 -05:00
before do
SiteSetting . stubs ( :active_user_rate_limit_secs ) . returns ( 0 )
2013-06-28 16:07:36 +10:00
SiteSetting . stubs ( :previous_visit_timeout_hours ) . returns ( 1 )
2013-02-05 14:16:51 -05:00
end
2013-06-28 15:38:47 +10:00
it " should act correctly " do
2014-12-31 11:55:03 -03:00
expect ( user . previous_visit_at ) . to eq ( nil )
2013-02-05 14:16:51 -05:00
2013-06-28 15:38:47 +10:00
# first visit
user . update_last_seen! ( first_visit_date )
2014-12-31 11:55:03 -03:00
expect ( user . previous_visit_at ) . to eq ( nil )
2013-02-05 14:16:51 -05:00
2013-06-28 16:07:36 +10:00
# updated same time
user . update_last_seen! ( first_visit_date )
user . reload
2014-12-31 11:55:03 -03:00
expect ( user . previous_visit_at ) . to eq ( nil )
2013-06-28 16:07:36 +10:00
2013-06-28 15:38:47 +10:00
# second visit
user . update_last_seen! ( second_visit_date )
user . reload
2014-12-31 11:55:03 -03:00
expect ( user . previous_visit_at ) . to be_within_one_second_of ( first_visit_date )
2013-02-05 14:16:51 -05:00
2013-06-28 15:38:47 +10:00
# third visit
user . update_last_seen! ( third_visit_date )
user . reload
2014-12-31 11:55:03 -03:00
expect ( user . previous_visit_at ) . to be_within_one_second_of ( second_visit_date )
2013-02-05 14:16:51 -05:00
end
end
2013-02-05 19:44:49 -07:00
describe " last_seen_at " do
2013-02-05 14:16:51 -05:00
let ( :user ) { Fabricate ( :user ) }
2013-02-05 19:44:49 -07:00
it " should have a blank last seen on creation " do
2014-12-31 11:55:03 -03:00
expect ( user . last_seen_at ) . to eq ( nil )
2013-02-05 14:16:51 -05:00
end
it " should have 0 for days_visited " do
2014-12-31 11:55:03 -03:00
expect ( user . user_stat . days_visited ) . to eq ( 0 )
2013-02-05 14:16:51 -05:00
end
describe 'with no previous values' do
2013-06-27 17:23:06 -04:00
let! ( :date ) { Time . zone . now }
2013-02-05 14:16:51 -05:00
before do
2013-06-27 17:23:06 -04:00
Timecop . freeze ( date )
2013-02-05 14:16:51 -05:00
user . update_last_seen!
end
2013-06-27 17:23:06 -04:00
after do
Timecop . return
end
2013-02-05 14:16:51 -05:00
it " updates last_seen_at " do
2014-12-31 11:55:03 -03:00
expect ( user . last_seen_at ) . to be_within_one_second_of ( date )
2013-02-05 14:16:51 -05:00
end
it " should have 0 for days_visited " do
user . reload
2014-12-31 11:55:03 -03:00
expect ( user . user_stat . days_visited ) . to eq ( 1 )
2013-02-05 19:44:49 -07:00
end
2013-02-05 14:16:51 -05:00
it " should log a user_visit with the date " do
2014-12-31 11:55:03 -03:00
expect ( user . user_visits . first . visited_at ) . to eq ( date . to_date )
2013-02-05 19:44:49 -07:00
end
2013-02-05 14:16:51 -05:00
context " called twice " do
before do
2013-06-27 17:23:06 -04:00
Timecop . freeze ( date )
2013-02-05 14:16:51 -05:00
user . update_last_seen!
user . update_last_seen!
user . reload
end
2013-06-27 17:23:06 -04:00
after do
Timecop . return
end
2013-02-05 14:16:51 -05:00
it " doesn't increase days_visited twice " do
2014-12-31 11:55:03 -03:00
expect ( user . user_stat . days_visited ) . to eq ( 1 )
2013-02-05 14:16:51 -05:00
end
end
describe " after 3 days " do
let! ( :future_date ) { 3 . days . from_now }
before do
2013-06-27 17:23:06 -04:00
Timecop . freeze ( future_date )
2013-02-05 14:16:51 -05:00
user . update_last_seen!
end
2013-06-27 17:23:06 -04:00
after do
Timecop . return
end
2013-02-05 14:16:51 -05:00
it " should log a second visited_at record when we log an update later " do
2014-12-31 11:55:03 -03:00
expect ( user . user_visits . count ) . to eq ( 2 )
2013-02-05 14:16:51 -05:00
end
end
end
end
2013-02-11 11:18:26 -05:00
describe 'email_confirmed?' do
let ( :user ) { Fabricate ( :user ) }
context 'when email has not been confirmed yet' do
it 'should return false' do
2014-12-31 11:55:03 -03:00
expect ( user . email_confirmed? ) . to eq ( false )
2013-02-11 11:18:26 -05:00
end
end
context 'when email has been confirmed' do
it 'should return true' do
2014-05-06 14:41:59 +01:00
token = user . email_tokens . find_by ( email : user . email )
2013-02-11 11:18:26 -05:00
EmailToken . confirm ( token . token )
2014-12-31 11:55:03 -03:00
expect ( user . email_confirmed? ) . to eq ( true )
2013-02-11 11:18:26 -05:00
end
end
context 'when user has no email tokens for some reason' do
it 'should return false' do
user . email_tokens . each { | t | t . destroy }
user . reload
2014-12-31 11:55:03 -03:00
expect ( user . email_confirmed? ) . to eq ( true )
2013-02-11 11:18:26 -05:00
end
end
end
2013-05-10 16:58:23 -04:00
describe " flag_linked_posts_as_spam " do
let ( :user ) { Fabricate ( :user ) }
let! ( :admin ) { Fabricate ( :admin ) }
let! ( :post ) { PostCreator . new ( user , title : " this topic contains spam " , raw : " this post has a link: http://discourse.org " ) . create }
let! ( :another_post ) { PostCreator . new ( user , title : " this topic also contains spam " , raw : " this post has a link: http://discourse.org/asdfa " ) . create }
let! ( :post_without_link ) { PostCreator . new ( user , title : " this topic shouldn't be spam " , raw : " this post has no links in it. " ) . create }
it " has flagged all the user's posts as spam " do
user . flag_linked_posts_as_spam
post . reload
2014-12-31 11:55:03 -03:00
expect ( post . spam_count ) . to eq ( 1 )
2013-05-10 16:58:23 -04:00
another_post . reload
2014-12-31 11:55:03 -03:00
expect ( another_post . spam_count ) . to eq ( 1 )
2013-05-10 16:58:23 -04:00
post_without_link . reload
2014-12-31 11:55:03 -03:00
expect ( post_without_link . spam_count ) . to eq ( 0 )
2013-05-10 16:58:23 -04:00
# It doesn't raise an exception if called again
user . flag_linked_posts_as_spam
2015-10-17 00:46:44 +05:30
end
it " does not flags post as spam if the previous flag for that post was disagreed " do
user . flag_linked_posts_as_spam
2013-05-10 16:58:23 -04:00
2015-10-17 00:46:44 +05:30
post . reload
expect ( post . spam_count ) . to eq ( 1 )
PostAction . clear_flags! ( post , admin )
user . flag_linked_posts_as_spam
post . reload
expect ( post . spam_count ) . to eq ( 0 )
2013-05-10 16:58:23 -04:00
end
end
2013-02-25 18:42:42 +11:00
2013-02-21 10:20:00 -08:00
describe '#readable_name' do
context 'when name is missing' do
it 'returns just the username' do
2014-12-31 11:55:03 -03:00
expect ( Fabricate ( :user , username : 'foo' , name : nil ) . readable_name ) . to eq ( 'foo' )
2013-02-21 10:20:00 -08:00
end
end
context 'when name and username are identical' do
it 'returns just the username' do
2014-12-31 11:55:03 -03:00
expect ( Fabricate ( :user , username : 'foo' , name : 'foo' ) . readable_name ) . to eq ( 'foo' )
2013-02-21 10:20:00 -08:00
end
end
context 'when name and username are not identical' do
it 'returns the name and username' do
2014-12-31 11:55:03 -03:00
expect ( Fabricate ( :user , username : 'foo' , name : 'Bar Baz' ) . readable_name ) . to eq ( 'Bar Baz (foo)' )
2013-02-21 10:20:00 -08:00
end
end
end
2013-08-16 11:40:30 -07:00
describe '.find_by_username_or_email' do
2013-10-28 16:29:07 +11:00
it 'finds users' do
bob = Fabricate ( :user , username : 'bob' , email : 'bob@example.com' )
found_user = User . find_by_username_or_email ( 'Bob' )
2013-08-16 11:40:30 -07:00
expect ( found_user ) . to eq bob
2013-10-28 16:29:07 +11:00
found_user = User . find_by_username_or_email ( 'bob@Example.com' )
2013-08-16 11:40:30 -07:00
expect ( found_user ) . to eq bob
2013-10-28 16:29:07 +11:00
found_user = User . find_by_username_or_email ( 'Bob@Example.com' )
2014-07-14 10:16:24 -04:00
expect ( found_user ) . to eq bob
2013-08-16 11:40:30 -07:00
2013-10-28 16:29:07 +11:00
found_user = User . find_by_username_or_email ( 'bob1' )
2014-10-31 10:44:26 -07:00
expect ( found_user ) . to be_nil
2013-06-19 10:31:19 +10:00
2013-10-28 16:29:07 +11:00
found_user = User . find_by_email ( 'bob@Example.com' )
expect ( found_user ) . to eq bob
2014-07-14 10:16:24 -04:00
found_user = User . find_by_email ( 'BOB@Example.com' )
expect ( found_user ) . to eq bob
2013-08-16 11:40:30 -07:00
2013-10-28 16:29:07 +11:00
found_user = User . find_by_email ( 'bob' )
2014-10-31 10:44:26 -07:00
expect ( found_user ) . to be_nil
2013-08-16 11:40:30 -07:00
2013-10-28 16:29:07 +11:00
found_user = User . find_by_username ( 'bOb' )
expect ( found_user ) . to eq bob
2013-08-16 11:40:30 -07:00
end
2013-06-19 10:31:19 +10:00
end
2013-10-16 14:58:18 +05:30
2015-03-26 16:48:36 +11:00
describe " # first_day_user? " do
2013-10-16 14:58:18 +05:30
2015-03-26 16:48:36 +11:00
def test_user? ( opts = { } )
Fabricate . build ( :user , { created_at : Time . now } . merge ( opts ) ) . first_day_user?
2013-10-16 14:58:18 +05:30
end
2015-03-26 16:48:36 +11:00
it " works " do
expect ( test_user? ) . to eq ( true )
expect ( test_user? ( moderator : true ) ) . to eq ( false )
expect ( test_user? ( trust_level : TrustLevel [ 2 ] ) ) . to eq ( false )
expect ( test_user? ( created_at : 2 . days . ago ) ) . to eq ( false )
2013-10-16 14:58:18 +05:30
end
2013-10-19 15:18:11 +05:30
end
2013-10-22 15:53:08 -04:00
describe 'api keys' do
let ( :admin ) { Fabricate ( :admin ) }
let ( :other_admin ) { Fabricate ( :admin ) }
let ( :user ) { Fabricate ( :user ) }
describe '.generate_api_key' do
it " generates an api key when none exists, and regenerates when it does " do
expect ( user . api_key ) . to be_blank
# Generate a key
api_key = user . generate_api_key ( admin )
expect ( api_key . user ) . to eq ( user )
expect ( api_key . key ) . to be_present
expect ( api_key . created_by ) . to eq ( admin )
user . reload
expect ( user . api_key ) . to eq ( api_key )
# Regenerate a key. Keeps the same record, updates the key
new_key = user . generate_api_key ( other_admin )
expect ( new_key . id ) . to eq ( api_key . id )
expect ( new_key . key ) . to_not eq ( api_key . key )
expect ( new_key . created_by ) . to eq ( other_admin )
end
end
describe '.revoke_api_key' do
it " revokes an api key when exists " do
expect ( user . api_key ) . to be_blank
# Revoke nothing does nothing
user . revoke_api_key
user . reload
expect ( user . api_key ) . to be_blank
# When a key is present it is removed
user . generate_api_key ( admin )
user . reload
user . revoke_api_key
user . reload
expect ( user . api_key ) . to be_blank
end
end
end
2014-01-02 12:57:40 -05:00
describe " posted too much in topic " do
2014-09-05 15:20:39 +10:00
let! ( :user ) { Fabricate ( :user , trust_level : TrustLevel [ 0 ] ) }
2014-01-02 12:57:40 -05:00
let! ( :topic ) { Fabricate ( :post ) . topic }
before do
# To make testing easier, say 1 reply is too much
SiteSetting . stubs ( :newuser_max_replies_per_topic ) . returns ( 1 )
end
context " for a user who didn't create the topic " do
let! ( :post ) { Fabricate ( :post , topic : topic , user : user ) }
it " does not return true for staff " do
user . stubs ( :staff? ) . returns ( true )
2014-12-31 11:55:03 -03:00
expect ( user . posted_too_much_in_topic? ( topic . id ) ) . to eq ( false )
2014-01-02 12:57:40 -05:00
end
it " returns true when the user has posted too much " do
2014-12-31 11:55:03 -03:00
expect ( user . posted_too_much_in_topic? ( topic . id ) ) . to eq ( true )
2014-01-02 12:57:40 -05:00
end
2014-04-29 12:59:14 -04:00
context " with a reply " do
before do
PostCreator . new ( Fabricate ( :user ) , raw : 'whatever this is a raw post' , topic_id : topic . id , reply_to_post_number : post . post_number ) . create
end
it " resets the `posted_too_much` threshold " do
2014-12-31 11:55:03 -03:00
expect ( user . posted_too_much_in_topic? ( topic . id ) ) . to eq ( false )
2014-04-29 12:59:14 -04:00
end
end
2014-01-02 12:57:40 -05:00
end
it " returns false for a user who created the topic " do
topic_user = topic . user
2014-09-05 15:20:39 +10:00
topic_user . trust_level = TrustLevel [ 0 ]
2014-12-31 11:55:03 -03:00
expect ( topic . user . posted_too_much_in_topic? ( topic . id ) ) . to eq ( false )
2014-01-02 12:57:40 -05:00
end
end
2013-11-15 20:57:43 +05:30
describe " # find_email " do
let ( :user ) { Fabricate ( :user , email : " bob@example.com " ) }
context " when email is exists in the email logs " do
before { user . stubs ( :last_sent_email_address ) . returns ( " bob@lastemail.com " ) }
it " returns email from the logs " do
expect ( user . find_email ) . to eq ( " bob@lastemail.com " )
end
end
context " when email does not exist in the email logs " do
before { user . stubs ( :last_sent_email_address ) . returns ( nil ) }
it " fetches the user's email " do
expect ( user . find_email ) . to eq ( user . email )
end
end
end
2013-11-22 19:18:45 +01:00
describe " # gravatar_template " do
it " returns a gravatar based template " do
2014-12-31 11:55:03 -03:00
expect ( User . gravatar_template ( " em@il.com " ) ) . to eq ( " //www.gravatar.com/avatar/6dc2fde946483a1d8a84b89345a1b638.png?s={size}&r=pg&d=identicon " )
2013-11-22 19:18:45 +01:00
end
end
describe " .small_avatar_url " do
2014-05-22 17:37:02 +10:00
let ( :user ) { build ( :user , username : 'Sam' ) }
2013-11-22 19:18:45 +01:00
it " returns a 45-pixel-wide avatar " do
2015-09-15 13:25:15 +10:00
SiteSetting . external_system_avatars_enabled = false
2015-04-20 13:07:12 +10:00
expect ( user . small_avatar_url ) . to eq ( " //test.localhost/letter_avatar/sam/45/ #{ LetterAvatar . version } .png " )
2015-09-15 13:25:15 +10:00
SiteSetting . external_system_avatars_enabled = true
2015-09-28 21:41:57 +10:00
expect ( user . small_avatar_url ) . to eq ( " //test.localhost/letter_avatar_proxy/v2/letter/s/5f9b8f/45.png " )
2013-11-22 19:18:45 +01:00
end
end
2014-05-22 17:37:02 +10:00
describe " .avatar_template_url " do
2013-11-22 19:18:45 +01:00
2014-05-22 17:37:02 +10:00
let ( :user ) { build ( :user , uploaded_avatar_id : 99 , username : 'Sam' ) }
2013-11-22 19:18:45 +01:00
2014-05-22 17:37:02 +10:00
it " returns a schemaless avatar template with correct id " do
2015-05-29 18:51:17 +02:00
expect ( user . avatar_template_url ) . to eq ( " //test.localhost/user_avatar/test.localhost/sam/{size}/99_ #{ OptimizedImage :: VERSION } .png " )
2013-11-22 19:18:45 +01:00
end
2014-01-07 17:45:06 +01:00
it " returns a schemaless cdn-based avatar template " do
Rails . configuration . action_controller . stubs ( :asset_host ) . returns ( " http://my.cdn.com " )
2015-05-29 18:51:17 +02:00
expect ( user . avatar_template_url ) . to eq ( " //my.cdn.com/user_avatar/test.localhost/sam/{size}/99_ #{ OptimizedImage :: VERSION } .png " )
2013-11-22 19:18:45 +01:00
end
end
2014-01-24 15:19:20 -05:00
describe " update_posts_read! " do
context " with a UserVisit record " do
let! ( :user ) { Fabricate ( :user ) }
let! ( :now ) { Time . zone . now }
before { user . update_last_seen! ( now ) }
it " with existing UserVisit record, increments the posts_read value " do
expect {
user_visit = user . update_posts_read! ( 2 )
2014-12-31 11:55:03 -03:00
expect ( user_visit . posts_read ) . to eq ( 2 )
2014-01-24 15:19:20 -05:00
} . to_not change { UserVisit . count }
end
it " with no existing UserVisit record, creates a new UserVisit record and increments the posts_read count " do
expect {
2015-07-07 12:31:07 -04:00
user_visit = user . update_posts_read! ( 3 , at : 5 . days . ago )
2014-12-31 11:55:03 -03:00
expect ( user_visit . posts_read ) . to eq ( 3 )
2014-01-24 15:19:20 -05:00
} . to change { UserVisit . count } . by ( 1 )
end
end
end
2014-02-10 16:59:36 -05:00
describe " primary_group_id " do
let! ( :user ) { Fabricate ( :user ) }
it " has no primary_group_id by default " do
2014-12-31 11:55:03 -03:00
expect ( user . primary_group_id ) . to eq ( nil )
2014-02-10 16:59:36 -05:00
end
context " when the user has a group " do
let! ( :group ) { Fabricate ( :group ) }
before do
group . usernames = user . username
group . save
user . primary_group_id = group . id
user . save
user . reload
end
it " should allow us to use it as a primary group " do
2014-12-31 11:55:03 -03:00
expect ( user . primary_group_id ) . to eq ( group . id )
2014-02-10 16:59:36 -05:00
# If we remove the user from the group
group . usernames = " "
group . save
# It should unset it from the primary_group_id
user . reload
2014-12-31 11:55:03 -03:00
expect ( user . primary_group_id ) . to eq ( nil )
2014-02-10 16:59:36 -05:00
end
end
end
2014-03-07 18:58:53 +01:00
describe " should_be_redirected_to_top " do
let! ( :user ) { Fabricate ( :user ) }
it " should be redirected to top when there is a reason to " do
2015-09-21 20:28:20 +02:00
user . expects ( :redirected_to_top ) . returns ( { reason : " 42 " } )
2014-12-31 11:55:03 -03:00
expect ( user . should_be_redirected_to_top ) . to eq ( true )
2014-03-07 18:58:53 +01:00
end
it " should not be redirected to top when there is no reason to " do
2015-09-21 20:28:20 +02:00
user . expects ( :redirected_to_top ) . returns ( nil )
2014-12-31 11:55:03 -03:00
expect ( user . should_be_redirected_to_top ) . to eq ( false )
2014-03-07 18:58:53 +01:00
end
end
2015-09-21 20:28:20 +02:00
describe " .redirected_to_top " do
2014-03-07 18:58:53 +01:00
let! ( :user ) { Fabricate ( :user ) }
2014-05-05 19:00:40 +02:00
it " should have no reason when `SiteSetting.redirect_users_to_top_page` is disabled " do
2014-03-31 21:53:38 +02:00
SiteSetting . expects ( :redirect_users_to_top_page ) . returns ( false )
2015-09-21 20:28:20 +02:00
expect ( user . redirected_to_top ) . to eq ( nil )
2014-03-07 18:58:53 +01:00
end
2014-05-05 19:00:40 +02:00
context " when `SiteSetting.redirect_users_to_top_page` is enabled " do
before { SiteSetting . expects ( :redirect_users_to_top_page ) . returns ( true ) }
2014-03-07 18:58:53 +01:00
2014-05-05 19:00:40 +02:00
it " should have no reason when top is not in the `SiteSetting.top_menu` " do
2014-03-31 21:53:38 +02:00
SiteSetting . expects ( :top_menu ) . returns ( " latest " )
2015-09-21 20:28:20 +02:00
expect ( user . redirected_to_top ) . to eq ( nil )
2014-03-07 18:58:53 +01:00
end
2014-05-05 19:00:40 +02:00
context " and when top is in the `SiteSetting.top_menu` " do
before { SiteSetting . expects ( :top_menu ) . returns ( " latest|top " ) }
2014-03-07 18:58:53 +01:00
2015-09-21 20:28:20 +02:00
it " should have no reason when there are not enough topics " do
SiteSetting . expects ( :min_redirected_to_top_period ) . returns ( nil )
expect ( user . redirected_to_top ) . to eq ( nil )
2014-03-31 21:53:38 +02:00
end
2015-09-21 20:28:20 +02:00
context " and there are enough topics " do
before { SiteSetting . expects ( :min_redirected_to_top_period ) . returns ( :monthly ) }
2014-03-31 21:53:38 +02:00
2014-05-05 19:00:40 +02:00
describe " a new user " do
before do
user . stubs ( :trust_level ) . returns ( 0 )
user . stubs ( :last_seen_at ) . returns ( 5 . minutes . ago )
end
2014-03-07 18:58:53 +01:00
2014-05-05 19:00:40 +02:00
it " should have a reason for the first visit " do
user . expects ( :last_redirected_to_top_at ) . returns ( nil )
user . expects ( :update_last_redirected_to_top! ) . once
2015-09-21 20:28:20 +02:00
expect ( user . redirected_to_top ) . to eq ( {
reason : I18n . t ( 'redirected_to_top_reasons.new_user' ) ,
period : :monthly
} )
2014-05-05 19:00:40 +02:00
end
it " should not have a reason for next visits " do
user . expects ( :last_redirected_to_top_at ) . returns ( 10 . minutes . ago )
user . expects ( :update_last_redirected_to_top! ) . never
2015-09-21 20:28:20 +02:00
expect ( user . redirected_to_top ) . to eq ( nil )
2014-05-05 19:00:40 +02:00
end
end
describe " an older user " do
before { user . stubs ( :trust_level ) . returns ( 1 ) }
it " should have a reason when the user hasn't been seen in a month " do
user . last_seen_at = 2 . months . ago
user . expects ( :update_last_redirected_to_top! ) . once
2015-09-21 20:28:20 +02:00
expect ( user . redirected_to_top ) . to eq ( {
reason : I18n . t ( 'redirected_to_top_reasons.not_seen_in_a_month' ) ,
period : :monthly
} )
2014-05-05 19:00:40 +02:00
end
2015-09-21 20:28:20 +02:00
2014-05-05 19:00:40 +02:00
end
2014-03-31 21:53:38 +02:00
end
2014-05-05 19:00:40 +02:00
2014-03-07 18:58:53 +01:00
end
2014-03-31 21:53:38 +02:00
2014-03-07 18:58:53 +01:00
end
end
2014-05-26 19:46:43 +10:00
describe " automatic avatar creation " do
it " sets a system avatar for new users " do
2015-09-15 13:25:15 +10:00
SiteSetting . external_system_avatars_enabled = false
2014-05-26 19:46:43 +10:00
u = User . create! ( username : " bob " , email : " bob@bob.com " )
u . reload
2014-12-31 11:55:03 -03:00
expect ( u . uploaded_avatar_id ) . to eq ( nil )
2015-04-20 13:07:12 +10:00
expect ( u . avatar_template ) . to eq ( " /letter_avatar/bob/{size}/ #{ LetterAvatar . version } .png " )
2014-05-26 19:46:43 +10:00
end
end
2014-04-22 13:52:13 +10:00
describe " custom fields " do
it " allows modification of custom fields " do
user = Fabricate ( :user )
2014-12-31 11:55:03 -03:00
expect ( user . custom_fields [ " a " ] ) . to eq ( nil )
2014-04-22 13:52:13 +10:00
user . custom_fields [ " bob " ] = " marley "
user . custom_fields [ " jack " ] = " black "
user . save
user = User . find ( user . id )
2014-12-31 11:55:03 -03:00
expect ( user . custom_fields [ " bob " ] ) . to eq ( " marley " )
expect ( user . custom_fields [ " jack " ] ) . to eq ( " black " )
2014-04-22 13:52:13 +10:00
user . custom_fields . delete ( " bob " )
user . custom_fields [ " jack " ] = " jill "
user . save
user = User . find ( user . id )
2014-12-31 11:55:03 -03:00
expect ( user . custom_fields ) . to eq ( { " jack " = > " jill " } )
2014-04-22 13:52:13 +10:00
end
end
2014-05-28 16:54:21 +10:00
describe " refresh_avatar " do
2014-12-15 22:10:27 +01:00
it " enqueues the update_gravatar job when automatically downloading gravatars " do
2014-05-28 16:54:21 +10:00
SiteSetting . automatically_download_gravatars = true
2014-12-15 22:10:27 +01:00
user = Fabricate ( :user )
2014-05-28 16:54:21 +10:00
2014-12-15 22:10:27 +01:00
Jobs . expects ( :enqueue ) . with ( :update_gravatar , anything )
2014-05-30 14:17:35 +10:00
user . refresh_avatar
2014-05-28 16:54:21 +10:00
end
end
2014-12-02 21:36:25 -08:00
describe " # purge_unactivated " do
2014-08-13 14:13:41 -04:00
let! ( :user ) { Fabricate ( :user ) }
let! ( :inactive ) { Fabricate ( :user , active : false ) }
let! ( :inactive_old ) { Fabricate ( :user , active : false , created_at : 1 . month . ago ) }
2014-12-02 21:36:25 -08:00
it 'should only remove old, unactivated users' do
User . purge_unactivated
2014-08-13 14:13:41 -04:00
all_users = User . all
2014-12-31 11:55:03 -03:00
expect ( all_users . include? ( user ) ) . to eq ( true )
expect ( all_users . include? ( inactive ) ) . to eq ( true )
expect ( all_users . include? ( inactive_old ) ) . to eq ( false )
2014-08-13 14:13:41 -04:00
end
end
2014-09-11 12:22:11 -07:00
describe " hash_passwords " do
let ( :too_long ) { " x " * ( User . max_password_length + 1 ) }
def hash ( password , salt )
User . new . send ( :hash_password , password , salt )
end
it " returns the same hash for the same password and salt " do
2014-12-31 11:55:03 -03:00
expect ( hash ( 'poutine' , 'gravy' ) ) . to eq ( hash ( 'poutine' , 'gravy' ) )
2014-09-11 12:22:11 -07:00
end
it " returns a different hash for the same salt and different password " do
2014-12-31 11:55:03 -03:00
expect ( hash ( 'poutine' , 'gravy' ) ) . not_to eq ( hash ( 'fries' , 'gravy' ) )
2014-09-11 12:22:11 -07:00
end
it " returns a different hash for the same password and different salt " do
2014-12-31 11:55:03 -03:00
expect ( hash ( 'poutine' , 'gravy' ) ) . not_to eq ( hash ( 'poutine' , 'cheese' ) )
2014-09-11 12:22:11 -07:00
end
it " raises an error when passwords are too long " do
2014-12-31 11:55:03 -03:00
expect { hash ( too_long , 'gravy' ) } . to raise_error
2014-09-11 12:22:11 -07:00
end
end
2015-01-23 18:25:43 +01:00
describe " automatic group membership " do
it " is automatically added to a group when the email matches " do
group = Fabricate ( :group , automatic_membership_email_domains : " bar.com|wat.com " )
user = Fabricate ( :user , email : " foo@bar.com " )
group . reload
expect ( group . users . include? ( user ) ) . to eq ( true )
end
end
2015-02-19 18:11:07 +01:00
describe " number_of_flags_given " do
let ( :user ) { Fabricate ( :user ) }
let ( :moderator ) { Fabricate ( :moderator ) }
it " doesn't count disagreed flags " do
post_agreed = Fabricate ( :post )
PostAction . act ( user , post_agreed , PostActionType . types [ :off_topic ] )
PostAction . agree_flags! ( post_agreed , moderator )
post_deferred = Fabricate ( :post )
PostAction . act ( user , post_deferred , PostActionType . types [ :inappropriate ] )
PostAction . defer_flags! ( post_deferred , moderator )
post_disagreed = Fabricate ( :post )
PostAction . act ( user , post_disagreed , PostActionType . types [ :spam ] )
PostAction . clear_flags! ( post_disagreed , moderator )
expect ( user . number_of_flags_given ) . to eq ( 2 )
end
end
2015-03-11 18:07:47 +01:00
describe " number_of_deleted_posts " do
let ( :user ) { Fabricate ( :user , id : 2 ) }
let ( :moderator ) { Fabricate ( :moderator ) }
it " counts all the posts " do
# at least 1 "unchanged" post
Fabricate ( :post , user : user )
post_deleted_by_moderator = Fabricate ( :post , user : user )
PostDestroyer . new ( moderator , post_deleted_by_moderator ) . destroy
post_deleted_by_user = Fabricate ( :post , user : user , post_number : 2 )
PostDestroyer . new ( user , post_deleted_by_user ) . destroy
# fake stub deletion
post_deleted_by_user . update_columns ( updated_at : 2 . days . ago )
PostDestroyer . destroy_stubs
expect ( user . number_of_deleted_posts ) . to eq ( 2 )
end
end
2015-03-26 16:04:32 +11:00
describe " new_user? " do
it " correctly detects new user " do
user = User . new ( created_at : Time . now , trust_level : TrustLevel [ 0 ] )
expect ( user . new_user? ) . to eq ( true )
user . trust_level = TrustLevel [ 1 ]
expect ( user . new_user? ) . to eq ( true )
user . trust_level = TrustLevel [ 2 ]
expect ( user . new_user? ) . to eq ( false )
user . trust_level = TrustLevel [ 0 ]
user . moderator = true
expect ( user . new_user? ) . to eq ( false )
end
end
2015-08-21 20:39:21 +02:00
context " when user preferences are overriden " do
before do
2016-02-17 15:46:19 +11:00
SiteSetting . default_email_digest_frequency = 1 # daily
SiteSetting . default_email_private_messages = false
SiteSetting . default_email_direct = false
SiteSetting . default_email_mailing_list_mode = true
SiteSetting . default_email_always = true
2015-08-21 20:39:21 +02:00
2016-02-17 15:46:19 +11:00
SiteSetting . default_other_new_topic_duration_minutes = - 1 # not viewed
SiteSetting . default_other_auto_track_topics_after_msecs = 0 # immediately
SiteSetting . default_other_external_links_in_new_tab = true
SiteSetting . default_other_enable_quoting = false
SiteSetting . default_other_dynamic_favicon = true
SiteSetting . default_other_disable_jump_reply = true
SiteSetting . default_other_edit_history_public = true
2015-08-21 20:39:21 +02:00
2016-02-17 15:46:19 +11:00
SiteSetting . default_topics_automatic_unpin = false
2015-11-17 18:21:40 +01:00
2016-02-17 15:46:19 +11:00
SiteSetting . default_categories_watching = " 1 "
SiteSetting . default_categories_tracking = " 2 "
SiteSetting . default_categories_muted = " 3 "
2015-08-21 20:39:21 +02:00
end
it " has overriden preferences " do
user = Fabricate ( :user )
2016-02-17 15:46:19 +11:00
options = user . user_option
expect ( options . email_always ) . to eq ( true )
expect ( options . mailing_list_mode ) . to eq ( true )
expect ( options . digest_after_days ) . to eq ( 1 )
expect ( options . email_private_messages ) . to eq ( false )
expect ( options . external_links_in_new_tab ) . to eq ( true )
expect ( options . enable_quoting ) . to eq ( false )
expect ( options . dynamic_favicon ) . to eq ( true )
expect ( options . disable_jump_reply ) . to eq ( true )
expect ( options . edit_history_public ) . to eq ( true )
expect ( options . automatically_unpin_topics ) . to eq ( false )
expect ( options . email_direct ) . to eq ( false )
2015-08-21 20:39:21 +02:00
expect ( user . new_topic_duration_minutes ) . to eq ( - 1 )
expect ( user . auto_track_topics_after_msecs ) . to eq ( 0 )
2015-11-17 18:21:40 +01:00
2015-08-21 20:39:21 +02:00
expect ( CategoryUser . lookup ( user , :watching ) . pluck ( :category_id ) ) . to eq ( [ 1 ] )
expect ( CategoryUser . lookup ( user , :tracking ) . pluck ( :category_id ) ) . to eq ( [ 2 ] )
expect ( CategoryUser . lookup ( user , :muted ) . pluck ( :category_id ) ) . to eq ( [ 3 ] )
end
2016-02-17 15:46:19 +11:00
end
context UserOption do
it " Creates a UserOption row when a user record is created and destroys once done " do
user = Fabricate ( :user )
expect ( user . user_option . email_always ) . to eq ( false )
user_id = user . id
user . destroy!
expect ( UserOption . find_by ( user_id : user_id ) ) . to eq ( nil )
end
2015-08-21 20:39:21 +02:00
end
2013-02-05 14:16:51 -05:00
end