describe Knapsack::Distributors::LeftoverDistributor do
  let(:args) { {} }
  let(:default_report) do
    {
      'a_spec.rb' => 1.0,
      'b_spec.rb' => 1.5,
      'c_spec.rb' => 2.0,
      'd_spec.rb' => 2.5,
    }
  end

  let(:distributor) { described_class.new(args) }

  before do
    allow(Knapsack).to receive(:report) {
      instance_double(Knapsack::Report, open: default_report)
    }
  end

  describe '#report_specs' do
    subject { distributor.report_specs }
    it { should eql ['a_spec.rb', 'b_spec.rb', 'c_spec.rb', 'd_spec.rb'] }
  end

  describe '#all_specs' do
    subject { distributor.all_specs }

    context 'when default spec pattern' do
      it { should_not be_empty }
      it { should include 'spec/knapsack/tracker_spec.rb' }
      it { should include 'spec/knapsack/adapters/rspec_adapter_spec.rb' }
    end

    context 'when fake spec pattern' do
      let(:args) { { spec_pattern: 'fake_pattern' } }
      it { should be_empty }
    end
  end

  describe '#leftover_specs' do
    subject { distributor.leftover_specs }

    before do
      expect(distributor).to receive(:all_specs).and_return([
        'a_spec.rb',
        'b_spec.rb',
        'c_spec.rb',
        'd_spec.rb',
        'e_spec.rb',
        'f_spec.rb',
      ])
    end

    it { should eql ['e_spec.rb', 'f_spec.rb'] }
  end

  context do
    let(:args) { { ci_node_total: 3 } }
    let(:leftover_specs) {[
      'a_spec.rb',
      'b_spec.rb',
      'c_spec.rb',
      'd_spec.rb',
      'e_spec.rb',
      'f_spec.rb',
      'g_spec.rb',
    ]}

    before do
      expect(distributor).to receive(:leftover_specs).and_return(leftover_specs)
    end

    describe '#assign_spec_files_to_node' do
      before do
        distributor.assign_spec_files_to_node
      end

      it do
        expect(distributor.node_specs[0]).to eql([
          'a_spec.rb',
          'd_spec.rb',
          'g_spec.rb',
        ])
      end

      it do
        expect(distributor.node_specs[1]).to eql([
          'b_spec.rb',
          'e_spec.rb',
        ])
      end

      it do
        expect(distributor.node_specs[2]).to eql([
          'c_spec.rb',
          'f_spec.rb',
        ])
      end
    end

    describe '#specs_for_node' do
      it do
        expect(distributor.specs_for_node(1)).to eql([
          'b_spec.rb',
          'e_spec.rb',
        ])
      end
    end
  end
end