require "spec_helper"
MetricFu.metrics_require { 'churn/churn' }

describe MetricFu::ChurnGenerator do

  # TODO extract yaml
  let(:churn_hash) { YAML::load("--- \n:churn: \n  :changed_files: \n  - spec/graphs/flog_grapher_spec.rb\n  - spec/base/graph_spec.rb\n  - lib/templates/awesome/layout.html.erb\n  - lib/graphs/rcov_grapher.rb\n  - lib/base/base_template.rb\n  - spec/graphs/grapher_spec.rb\n  - lib/templates/awesome/flog.html.erb\n  - lib/templates/awesome/flay.html.erb\n  - lib/graphs/roodi_grapher.rb\n  - lib/graphs/reek_grapher.rb\n  - HISTORY\n  - spec/graphs/roodi_grapher_spec.rb\n  - lib/generators/rcov.rb\n  - spec/graphs/engines/gchart_spec.rb\n  - spec/graphs/rcov_grapher_spec.rb\n  - lib/templates/javascripts/excanvas.js\n  - lib/templates/javascripts/bluff-min.js\n  - spec/graphs/reek_grapher_spec.rb\n") }

  let(:config_setup) {
    ENV['CC_BUILD_ARTIFACTS'] = nil
    MetricFu.configure.reset
  }

  describe "analyze method" do
    before :each do
      config_setup
      @changes = {"lib/generators/flog.rb" => 2, "lib/metric_fu.rb" => 3}
    end

    it "should be empty on error no output captured" do
      churn = MetricFu::ChurnGenerator.new
      churn.instance_variable_set(:@output, nil)
      result = churn.analyze
      expect(result).to eq({:churn => {}})
    end

    it "should return yaml results" do
      churn = MetricFu::ChurnGenerator.new
      churn.instance_variable_set(:@output, churn_hash)
      result = churn.analyze
      expect(result).to eq({:churn => {:changed_files => ["spec/graphs/flog_grapher_spec.rb", "spec/base/graph_spec.rb", "lib/templates/awesome/layout.html.erb", "lib/graphs/rcov_grapher.rb", "lib/base/base_template.rb", "spec/graphs/grapher_spec.rb", "lib/templates/awesome/flog.html.erb", "lib/templates/awesome/flay.html.erb", "lib/graphs/roodi_grapher.rb", "lib/graphs/reek_grapher.rb", "HISTORY", "spec/graphs/roodi_grapher_spec.rb", "lib/generators/rcov.rb", "spec/graphs/engines/gchart_spec.rb", "spec/graphs/rcov_grapher_spec.rb", "lib/templates/javascripts/excanvas.js", "lib/templates/javascripts/bluff-min.js", "spec/graphs/reek_grapher_spec.rb"]}})
    end

  end


  describe "to_h method" do
    before :each do
      config_setup
    end

    it "should put the changes into a hash" do
      churn = MetricFu::ChurnGenerator.new
      churn.instance_variable_set(:@churn, {:churn => 'results'})
      expect(churn.to_h[:churn]).to eq("results")
    end
  end


  describe "emit method" do
    before :each do
      config_setup
      @churn = MetricFu::ChurnGenerator.new
    end

    it "returns churn output" do
      allow(@churn).to receive(:run).and_return(churn_hash)
      result = @churn.emit
      expect(result).to eq(churn_hash)
    end

    it "returns nil, when churn result is not yaml" do
      allow(@churn).to receive(:run).and_return(nil)
      result = @churn.emit
      expect(result).to be nil
    end
  end
end