diff --git a/app/models/user.rb b/app/models/user.rb index e2070fde49f1197756f10f3419f59c51a1d93ad7..0df50398fc57696444dc37d2dbfae19c08492098 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -11,6 +11,11 @@ class User < ActiveRecord::Base include Querying include SocialActions + scope :logged_in_since, lambda { |time| where('last_sign_in_at > ?', time) } + scope :monthly_actives, lambda { |time = Time.now| logged_in_since(time - 1.month) } + scope :daily_actives, lambda { |time = Time.now| logged_in_since(time - 1.day) } + scope :yearly_actives, lambda { |time = Time.now| logged_in_since(time - 1.year) } + devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :timeoutable, :token_authenticatable, :lockable, @@ -82,22 +87,6 @@ class User < ActiveRecord::Base User.joins(:contacts).where(:contacts => {:person_id => person.id}) end - def self.monthly_actives(start_day = Time.now) - logged_in_since(start_day - 1.month) - end - - def self.yearly_actives(start_day = Time.now) - logged_in_since(start_day - 1.year) - end - - def self.daily_actives(start_day = Time.now) - logged_in_since(start_day - 1.day) - end - - def self.logged_in_since(time) - where('last_sign_in_at > ?', time) - end - def unread_notifications notifications.where(:unread => true) end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 5d72fdbd6357e77604118181c0e6d333c576371c..18d9945665de172918cb6445073697a4b911619d 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -22,6 +22,54 @@ describe User do end end + describe 'yearly_actives' do + it 'returns list which includes users who latest signed in within last year' do + user = FactoryGirl.build(:user) + user.last_sign_in_at = Time.now - 1.month + user.save + User.yearly_actives.should include user + end + + it 'returns list which does not include users who did not sign in within last year' do + user = FactoryGirl.build(:user) + user.last_sign_in_at = Time.now - 2.year + user.save + User.yearly_actives.should_not include user + end + end + + describe 'monthly_actives' do + it 'returns list which includes users who latest signed in within last month' do + user = FactoryGirl.build(:user) + user.last_sign_in_at = Time.now - 1.day + user.save + User.monthly_actives.should include user + end + + it 'returns list which does not include users who did not sign in within last month' do + user = FactoryGirl.build(:user) + user.last_sign_in_at = Time.now - 2.month + user.save + User.monthly_actives.should_not include user + end + end + + describe 'daily_actives' do + it 'returns list which includes users who latest signed in within last day' do + user = FactoryGirl.build(:user) + user.last_sign_in_at = Time.now - 1.hour + user.save + User.daily_actives.should include(user) + end + + it 'returns list which does not include users who did not sign in within last day' do + user = FactoryGirl.build(:user) + user.last_sign_in_at = Time.now - 2.day + user.save + User.daily_actives.should_not include(user) + end + end + context 'callbacks' do describe '#save_person!' do it 'saves the corresponding user if it has changed' do