require 'spec_helper'

describe CatTree::Observer do
  before do
    User.truncate
    Article.truncate

    u = User.create(:name => "cat_tree")
    u.articles.create(:title => "title1")
    u.articles.create(:title => "title2")
    u2 = User.create(:name => "cat_tree2")
    u2.articles.create(:title => "title3")
    @number_of_object = rand(10) + 1
  end

  context "#check" do
    it "count to find AR::Base object" do
      observer = CatTree::Observer.new
      observer.check do
        @number_of_object.times { User.where(:name => "cat_tree").first }
      end

      expect(observer.ar_base_count).to eq(@number_of_object)
    end

    it "count to find AR::Base object with association" do
      observer = CatTree::Observer.new
      observer.check do
        @number_of_object.times { User.includes(:articles).where(:name => "cat_tree").first }
      end

      expect(observer.ar_base_count).to eq(@number_of_object * 3)
    end

    it "count same AR:Base object" do
      @number_of_object += 1
      observer = CatTree::Observer.new
      observer.check do
        User.new
        User.create(:name => "dummy")
        @number_of_object.times do
          User.includes(:articles).where(:name => "cat_tree").first
        end
      end

      result = observer.same_ar_base_objects
      expect(result.size).to eq(3)
      result.each do |key, value|
        expect(["User(id:1)", "Article(id:1)", "Article(id:2)"]).to include(key)
        expect(value[:count]).to eq(@number_of_object)
      end
    end
  end
end