require 'spec_helper'

describe PuppetStrings::Markdown::Base do
  context 'basic class' do
    before :each do
      YARD::Parser::SourceParser.parse_string(<<-SOURCE, :puppet)
# An overview
# @api private
# @summary A simple class.
# @param param1 First param.
# @param param2 Second param.
# @param param3 Third param.
class klass(Integer $param1, $param2, String $param3 = hi) inherits foo::bar {
}
SOURCE
    end

    let(:reg) { YARD::Registry.all(:puppet_class).sort_by!(&:name).map!(&:to_hash)[0] }
    let(:component) { PuppetStrings::Markdown::Base.new(reg, 'class') }

    describe '#name' do
      it 'returns the expected name' do
        expect(component.name).to eq 'klass'
      end
    end

    [ 'examples',
      'see',
      'since',
      'return_val',
      'return_type',].each do |method|
      describe "##{method}" do
        it 'returns nil' do
          expect(component.method(method.to_sym).call).to be_nil
        end
      end

    end

    describe '#private?' do
      it do
        expect(component.private?).to be true
      end
    end

    describe '#params' do
      it 'returns the expected params' do
        expect(component.params.size).to eq 3
      end
    end

    describe '#summary' do
      it 'returns the expected summary' do
        expect(component.summary).to eq 'A simple class.'
      end
    end

    describe '#toc_info' do
      let(:toc) { component.toc_info }
      it 'returns a hash' do
        expect(toc).to be_instance_of Hash
      end
      it 'prefers the summary for :desc' do
        expect(toc[:desc]).to eq 'A simple class.'
      end
    end
  end
  context 'less basic class' do
    before :each do
      YARD::Parser::SourceParser.parse_string(<<-SOURCE, :puppet)
# An overview
# It's a longer overview
# Ya know?
# @example A simple example.
#  class { 'klass::yeah':
#    param1 => 1,
#  }
# @param param1 First param.
# @param param2 Second param.
# @param param3 Third param.
class klass::yeah(
  Integer $param1,
  $param2,
  String $param3 = hi
) inherits foo::bar {

}
SOURCE
    end

    let(:reg) { YARD::Registry.all(:puppet_class).sort_by!(&:name).map!(&:to_hash)[0] }
    let(:component) { PuppetStrings::Markdown::Base.new(reg, 'class') }

    describe '#name' do
      it 'returns the expected name' do
        expect(component.name).to eq 'klass::yeah'
      end
    end

    ['summary',
      'see',
      'since',
      'return_val',
      'return_type'].each do |method|
      describe "##{method}" do
        it 'returns nil' do
          expect(component.method(method.to_sym).call).to be_nil
        end
      end
    end

    describe '#examples' do
      it 'should return one example' do
        expect(component.examples.size).to eq 1
      end
    end

    describe '#params' do
      it 'returns the expected params' do
        expect(component.params.size).to eq 3
      end
    end

    describe '#private?' do
      it do
        expect(component.private?).to be false
      end
    end

    describe '#toc_info' do
      let(:toc) { component.toc_info }
      it 'returns a hash' do
        expect(toc).to be_instance_of Hash
      end
      it 'uses overview for :desc in absence of summary' do
        expect(toc[:desc]).to eq 'An overview It\'s a longer overview Ya know?'
      end
    end

    describe '#link' do
      it 'returns a valid link' do
        expect(component.link).to eq 'klassyeah'
      end
    end
  end
end
