module RequestLogAnalyzer::Spec::Mocks

  def mock_source
    source = mock('RequestLogAnalyzer::Source::Base')
    source.stub!(:file_format).and_return(testing_format)
    source.stub!(:parsed_requests).and_return(2)
    source.stub!(:skipped_requests).and_return(1)
    source.stub!(:parse_lines).and_return(10)

    source.stub!(:warning=)
    source.stub!(:progress=)
    source.stub!(:source_changes=)

    source.stub!(:prepare)
    source.stub!(:finalize)

    source.stub!(:each_request).and_return do |block|
      block.call(testing_format.request(:field => 'value1'))
      block.call(testing_format.request(:field => 'value2'))
    end

    return source
  end

  def mock_io
    mio = mock('IO')
    mio.stub!(:print)
    mio.stub!(:puts)
    mio.stub!(:write)
    return mio
  end

  def mock_output
    output = mock('RequestLogAnalyzer::Output::Base')
    output.stub!(:report_tracker)
    output.stub!(:header)
    output.stub!(:footer)
    output.stub!(:puts)
    output.stub!(:<<)
    output.stub!(:colorize).and_return("Fancy text")
    output.stub!(:link)
    output.stub!(:title)
    output.stub!(:line)
    output.stub!(:with_style)
    output.stub!(:table).and_yield([])
    output.stub!(:io).and_return(mock_io)
    output.stub!(:options).and_return({})
    output.stub!(:slice_results).and_return { |a| a } 
    return output
  end

  def mock_database(*stubs)
    database = mock('RequestLogAnalyzer::Database')
    database.stub!(:connect)
    database.stub!(:disconnect)
    database.stub!(:connection).and_return(mock_connection)
    stubs.each { |s| database.stub!(s)}
    return database
  end

  def mock_connection
    table_creator = mock('ActiveRecord table creator')
    table_creator.stub!(:column)

    connection = mock('ActiveRecord::Base.connection')
    connection.stub!(:add_index)
    connection.stub!(:remove_index)
    connection.stub!(:table_exists?).and_return(false)
    connection.stub!(:create_table).and_yield(table_creator).and_return(true)
    connection.stub!(:table_creator).and_return(table_creator)
    return connection
  end

  def request_counter
    @request_counter ||= mock('aggregator to count request')
  end
end