require 'spec_helper'
require 'capistrano/measure/timer'
require 'capistrano/measure/log_reporter'
require 'capistrano/measure/adapter'

describe Capistrano::Measure::Adapter do
  let(:logger) { ::StringLogger.new }
  let(:config) { {} }
  subject { Capistrano::Measure::Adapter.new(logger, config) }

  it "end-to-end test" do
    subject.before_task('root_task')
    subject.before_task('sub_task')
    subject.before_task('sub_task1')
    subject.after_task('sub_task1')
    subject.after_task('sub_task')
    subject.before_task('sub_task')
    subject.after_task('sub_task')
    subject.after_task('root_task')

    subject.print_report

    expect(logger.to_s).to include("Performance Report")
    expect(logger.to_s).to include("root_task")
    expect(logger.to_s).to include("..sub_task")
    expect(logger.to_s).to include("....sub_task1")
  end

  it "doesn't rise any errors by default" do
    subject.before_task('root_task')
    subject.after_task('sub_task')

    subject.print_report

    expect(logger.to_s).to include("Capistrano::Measure plugin encountered an error during performance evaluation")
  end

  it "raises an error in debug mode (and interrupts the deployment)" do
    config[:measure_error_handling] = :raise

    expect {
      subject.before_task('root_task')
      subject.after_task('sub_task')

      subject.print_report
    }.to raise_error(::Capistrano::Measure::Error)

  end

  describe "::capistrano_version" do
    subject { Capistrano::Measure::Adapter }

    it "should return nil if Capistrano version isn't recognizable" do
      expect(subject.capistrano_version).to be_nil
    end

    it "should detect Capistrano 2 version" do
      stub_const('Capistrano::Version::MAJOR', 2)
      expect(subject.capistrano_version).to eq 2
    end

    it "should detect Capistrano 3 version" do
      stub_const('Capistrano::VERSION', '3.0.1')
      expect(subject.capistrano_version).to eq 3
    end
  end

end