require 'test_helper'

module Vedeu

  module Menus

    describe DSL do

      let(:described)  { Vedeu::Menus::DSL }
      let(:instance)   { described.new(model) }
      let(:model)      { Vedeu::Menus::Menu.new(attributes) }
      let(:_name)      { 'elements' }
      let(:collection) { [:sodium, :magnesium, :aluminium, :silicon] }
      let(:attributes) {
        {
          collection: collection,
          name:       _name,
        }
      }

      describe '.menu' do
        subject {
          described.menu(_name) do
            # ...
          end
        }

        context 'when the name is not given' do
          let(:_name) {}

          it { proc { subject }.must_raise(Vedeu::Error::MissingRequired) }
        end

        context 'when the name is given' do
          context 'when the block is not given' do
            subject { described.menu(_name) }

            it { proc { subject }.must_raise(Vedeu::Error::RequiresBlock) }
          end

          context 'when the block is given' do
            it { subject.must_be_instance_of(Vedeu::Menus::Menu) }
          end
        end
      end

      describe '#item' do
        let(:_value) { :platinum }

        subject { instance.item(_value) }

        context 'when items are provided' do
          it { subject.must_equal([:sodium,
                                    :magnesium,
                                    :aluminium,
                                    :silicon,
                                    :platinum]) }
        end
      end

      describe '#item=' do
        it { instance.must_respond_to(:item=) }
      end

      describe '#items' do
        let(:_value) { [] }

        subject { instance.items(_value) }

        context 'when no items are provided' do
          it { subject.must_equal([]) }
        end

        context 'when items are provided' do
          let(:_value) { [:gold, :silver, :tin] }

          it { subject.must_equal(_value)}
        end
      end

      describe '#items=' do
        it { instance.must_respond_to(:items=) }
      end

    end # DSL

  end # Menus

end # Vedeu