require 'spec_helper'

describe Gitlab::Ci::Config::Entry::Jobs do
  let(:entry) { described_class.new(config) }

  describe 'validations' do
    before do
      entry.compose!
    end

    context 'when entry config value is correct' do
      let(:config) { { rspec: { script: 'rspec' } } }

      describe '#valid?' do
        it 'is valid' do
          expect(entry).to be_valid
        end
      end
    end

    context 'when entry value is not correct' do
      describe '#errors' do
        context 'incorrect config value type' do
          let(:config) { ['incorrect'] }

          it 'returns error about incorrect type' do
            expect(entry.errors)
              .to include 'jobs config should be a hash'
          end
        end

        context 'when job is unspecified' do
          let(:config) { { rspec: nil } }

          it 'reports error' do
            expect(entry.errors).to include "rspec config can't be blank"
          end
        end

        context 'when no visible jobs present' do
          let(:config) { { '.hidden'.to_sym => { script: [] } } }

          it 'returns error about no visible jobs defined' do
            expect(entry.errors)
              .to include 'jobs config should contain at least one visible job'
          end
        end
      end
    end
  end

  context 'when valid job entries composed' do
    before do
      entry.compose!
    end

    let(:config) do
      { rspec: { script: 'rspec' },
        spinach: { script: 'spinach' },
        '.hidden'.to_sym => {} }
    end

    describe '#value' do
      it 'returns key value' do
        expect(entry.value).to eq(
          rspec: { name: :rspec,
                   script: %w[rspec],
                   ignore: false,
                   stage: 'test',
                   only: { refs: %w[branches tags] } },
          spinach: { name: :spinach,
                     script: %w[spinach],
                     ignore: false,
                     stage: 'test',
                     only: { refs: %w[branches tags] } })
      end
    end

    describe '#descendants' do
      it 'creates valid descendant nodes' do
        expect(entry.descendants.count).to eq 3
        expect(entry.descendants.first(2))
          .to all(be_an_instance_of(Gitlab::Ci::Config::Entry::Job))
        expect(entry.descendants.last)
          .to be_an_instance_of(Gitlab::Ci::Config::Entry::Hidden)
      end
    end

    describe '#value' do
      it 'returns value of visible jobs only' do
        expect(entry.value.keys).to eq [:rspec, :spinach]
      end
    end
  end
end
