# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Banzai::Pipeline do
  describe '.[]' do
    subject { described_class[name] }

    shared_examples 'error' do |exception, message|
      it do
        expect { subject }.to raise_error(exception, message)
      end
    end

    context 'for nil' do
      let(:name) { nil }

      it { is_expected.to eq(Banzai::Pipeline::FullPipeline) }
    end

    context 'for symbols' do
      context 'when known' do
        let(:name) { :full }

        it { is_expected.to eq(Banzai::Pipeline::FullPipeline) }
      end

      context 'when unknown' do
        let(:name) { :unknown }

        it_behaves_like 'error', NameError,
          'uninitialized constant Banzai::Pipeline::UnknownPipeline'
      end
    end

    context 'for classes' do
      let(:name) { klass }

      context 'subclassing Banzai::Pipeline::BasePipeline' do
        let(:klass) { Class.new(Banzai::Pipeline::BasePipeline) }

        it { is_expected.to eq(klass) }
      end

      context 'subclassing other types' do
        let(:klass) { Class.new(Banzai::RenderContext) }

        before do
          stub_const('Foo', klass)
        end

        it_behaves_like 'error', ArgumentError,
          'unsupported pipeline name Foo (Class)'
      end
    end

    context 'for other types' do
      let(:name) { 'label' }

      it_behaves_like 'error', ArgumentError,
        'unsupported pipeline name "label" (String)'
    end
  end
end