require File.dirname(__FILE__) + '/../../spec_helper'

describe RequestLogAnalyzer::Tracker::Frequency, 'static category' do
  
  before(:each) do
    @tracker = RequestLogAnalyzer::Tracker::Frequency.new(:category => :category)
    @tracker.prepare
  end
  
  
  it "should register a request in the right category" do
    @tracker.update(request(:category => 'a', :blah => 0.2))
    @tracker.frequencies.keys.should include('a')
  end
  
  it "should register a request in the right category" do
    @tracker.update(request(:category => 'a', :blah => 0.2))
    @tracker.update(request(:category => 'b', :blah => 0.2))
    @tracker.update(request(:category => 'b', :blah => 0.2))
    
    @tracker.frequency('a').should == 1
    @tracker.frequency('b').should == 2
    @tracker.overall_frequency.should == 3
  end

  it "should sort correctly by frequency" do
    @tracker.update(request(:category => 'a', :blah => 0.2))
    @tracker.update(request(:category => 'b', :blah => 0.2))
    @tracker.update(request(:category => 'b', :blah => 0.2))

    @tracker.sorted_by_frequency.should == [['b', 2], ['a', 1]]
  end
end

describe RequestLogAnalyzer::Tracker::Frequency, 'dynamic category' do
  
  before(:each) do
    @categorizer = Proc.new { |request| request[:duration] > 0.2 ? 'slow' : 'fast' }
    @tracker = RequestLogAnalyzer::Tracker::Frequency.new(:category => @categorizer)
    @tracker.prepare
  end
  
  it "should use the categorizer to determine the right category" do
    @tracker.update(request(:category => 'a', :duration => 0.2))
    @tracker.update(request(:category => 'b', :duration => 0.3))
    @tracker.update(request(:category => 'b', :duration => 0.4)) 
    
    @tracker.frequency('fast').should == 1
    @tracker.frequency('slow').should == 2
    @tracker.frequency('moderate').should == 0
  end
  
end


describe RequestLogAnalyzer::Tracker::Frequency, 'reporting' do
 
  before(:each) do
    @tracker = RequestLogAnalyzer::Tracker::Frequency.new(:category => :category)
    @tracker.prepare
  end
  
  it "should generate a report without errors when one category is present" do
    @tracker.update(request(:category => 'a', :blah => 0.2))
    lambda { @tracker.report(mock_output) }.should_not raise_error
  end

  it "should generate a report without errors when no category is present" do
    lambda { @tracker.report(mock_output) }.should_not raise_error
  end

  it "should generate a report without errors when multiple categories are present" do
    @tracker.update(request(:category => 'a', :blah => 0.2))
    @tracker.update(request(:category => 'b', :blah => 0.2))    
    lambda { @tracker.report(mock_output) }.should_not raise_error
  end
end