require 'spec_helper'

class TestObject
  include Monocle

  monocle_options cache_view_counts: true

  monocle_views overall:   -> { 'overall' },
                yearly:    -> { Time.now.beginning_of_year },
                monthly:   -> { Time.now.beginning_of_month },
                weekly:    -> { Time.now.beginning_of_week },
                daily:     -> { Time.now.beginning_of_day },
                hourly:    -> { Time.now.beginning_of_hour },
                quarterly: -> { Time.now.beginning_of_quarter }

  attr_accessor :id
  attr_accessor :overall_views, :yearly_views, :monthly_views
  attr_accessor :weekly_views, :daily_views, :hourly_views
  attr_accessor :quarterly_views

  def self.find(id)
    o = new
    o.id = id.to_i
    o
  end

  def initialize
    @id = '12345'
    @overall_views = 0
  end

  def update_column(field, count)
    self.send("#{field}=", count)
  end
end

describe Monocle do
  let(:object) { TestObject.new }

  describe '#most_viewed_since' do
    before do
      10.times do |i|
        o = TestObject.new
        o.id = i
        (i + 10).times do
          o.view!
        end
      end
    end

    it 'returns top viewed objects since a given time' do
      viewed = TestObject.most_viewed_since(Time.now.beginning_of_day)
      viewed.class.should == Array
      viewed.first.id.should == TestObject.find(9).id
    end
  end

  describe '#destroy_views' do
    it 'deletes views for object' do
      object.view!
      object.destroy_views
      REDIS.hget('monocle:test_object:12345', 'overall_views').should == nil
    end
  end

  describe '#view!' do
    before do
      50.times { object.view! }
    end

    after do
      object.destroy_views
    end

    %w(overall yearly monthly weekly daily hourly quarterly).each do |view_type|
      it "sets #{view_type} views count" do
        object.send("#{view_type}_views_count").should == 50
      end

      it "updates cached #{view_type} views count" do
        object.send("#{view_type}_views").should == 50
      end
    end
  end
end