diff --git a/spec/unit/puppet-strings/yard/handlers/ruby/provider_handler_spec.rb b/spec/unit/puppet-strings/yard/handlers/ruby/provider_handler_spec.rb index 9ae6b8e..26c0e76 100644 --- a/spec/unit/puppet-strings/yard/handlers/ruby/provider_handler_spec.rb +++ b/spec/unit/puppet-strings/yard/handlers/ruby/provider_handler_spec.rb @@ -27,6 +27,34 @@ SOURCE end end + describe 'parsing a provider with an invalid docstring assignment' do + let(:source) { <<-SOURCE +Puppet::Type.type(:custom).provide :linux do + @doc = 123 +end +SOURCE + } + + it 'should log an error' do + expect { subject }.to output(/Failed to parse docstring/).to_stdout_from_any_process + end + end + + describe 'parsing a provider with a valid docstring assignment' do + let(:source) { <<-SOURCE +Puppet::Type.type(:custom).provide :linux do + @doc = 'An example provider on Linux.' +end +SOURCE + } + + it 'should correctly detect the docstring' do + expect(subject.size).to eq(1) + object = subject.first + expect(object.docstring).to eq('An example provider on Linux.') + end + end + describe 'parsing a provider definition' do let(:source) { <<-SOURCE Puppet::Type.type(:custom).provide :linux do diff --git a/spec/unit/puppet-strings/yard/handlers/ruby/type_handler_spec.rb b/spec/unit/puppet-strings/yard/handlers/ruby/type_handler_spec.rb index ec0894b..945f136 100644 --- a/spec/unit/puppet-strings/yard/handlers/ruby/type_handler_spec.rb +++ b/spec/unit/puppet-strings/yard/handlers/ruby/type_handler_spec.rb @@ -27,8 +27,38 @@ SOURCE end end + describe 'parsing a type with an invalid docstring assignment' do + let(:source) { <<-SOURCE +Puppet::Type.newtype(:database) do + @doc = 123 +end +SOURCE + } + + it 'should log an error' do + expect { subject }.to output(/Failed to parse docstring/).to_stdout_from_any_process + end + end + + describe 'parsing a type with a valid docstring assignment' do + let(:source) { <<-SOURCE +Puppet::Type.newtype(:database) do + @doc = 'An example database server resource type.' +end +SOURCE + } + + it 'should correctly detect the docstring' do + expect(subject.size).to eq(1) + object = subject.first + expect(object.docstring).to eq('An example database server resource type.') + end + end + describe 'parsing a type definition' do let(:source) { <<-SOURCE +# @!puppet.type.param [value1, value2] dynamic_param Documentation for a dynamic parameter. +# @!puppet.type.property [foo, bar] dynamic_prop Documentation for a dynamic property. Puppet::Type.newtype(:database) do desc 'An example database server resource type.' feature :encryption, 'The provider supports encryption.', methods: [:encrypt] @@ -54,6 +84,12 @@ Puppet::Type.newtype(:database) do defaultto false end + newparam(:backup) do + desc 'How often to backup the database.' + defaultto :never + newvalues(:daily, :monthly, :never) + end + newproperty(:file) do desc 'The database file to use.' end @@ -80,47 +116,99 @@ SOURCE tags = object.docstring.tags(:api) expect(tags.size).to eq(1) expect(tags[0].text).to eq('public') - expect(object.properties.size).to eq(3) - expect(object.properties[0].name).to eq('ensure') - expect(object.properties[0].docstring).to eq('What state the database should be in.') + expect(object.properties.size).to eq(4) + expect(object.properties[0].name).to eq('dynamic_prop') + expect(object.properties[0].docstring).to eq('Documentation for a dynamic property.') expect(object.properties[0].isnamevar).to eq(false) - expect(object.properties[0].default).to eq('up') - expect(object.properties[0].values).to eq(%w(present absent up down)) - expect(object.properties[0].aliases).to eq({ 'down' => 'absent', 'up' => 'present' }) - expect(object.properties[1].name).to eq('file') - expect(object.properties[1].docstring).to eq('The database file to use.') + expect(object.properties[0].values).to eq(%w(foo bar)) + expect(object.properties[1].name).to eq('ensure') + expect(object.properties[1].docstring).to eq('What state the database should be in.') expect(object.properties[1].isnamevar).to eq(false) - expect(object.properties[1].default).to be_nil - expect(object.properties[1].values).to eq([]) - expect(object.properties[1].aliases).to eq({}) - expect(object.properties[2].name).to eq('log_level') - expect(object.properties[2].docstring).to eq('The log level to use.') + expect(object.properties[1].default).to eq('up') + expect(object.properties[1].values).to eq(%w(present absent up down)) + expect(object.properties[1].aliases).to eq({ 'down' => 'absent', 'up' => 'present' }) + expect(object.properties[2].name).to eq('file') + expect(object.properties[2].docstring).to eq('The database file to use.') expect(object.properties[2].isnamevar).to eq(false) - expect(object.properties[2].default).to eq('warn') - expect(object.properties[2].values).to eq(%w(debug warn error)) + expect(object.properties[2].default).to be_nil + expect(object.properties[2].values).to eq([]) expect(object.properties[2].aliases).to eq({}) - expect(object.parameters.size).to eq(3) - expect(object.parameters[0].name).to eq('address') - expect(object.parameters[0].docstring).to eq('The database server name.') - expect(object.parameters[0].isnamevar).to eq(true) - expect(object.parameters[0].default).to be_nil - expect(object.parameters[0].values).to eq([]) - expect(object.parameters[0].aliases).to eq({}) - expect(object.parameters[1].name).to eq('encryption_key') - expect(object.parameters[1].docstring).to eq('The encryption key to use.') - expect(object.parameters[1].isnamevar).to eq(false) + expect(object.properties[3].name).to eq('log_level') + expect(object.properties[3].docstring).to eq('The log level to use.') + expect(object.properties[3].isnamevar).to eq(false) + expect(object.properties[3].default).to eq('warn') + expect(object.properties[3].values).to eq(%w(debug warn error)) + expect(object.properties[3].aliases).to eq({}) + expect(object.parameters.size).to eq(5) + expect(object.parameters[0].name).to eq('dynamic_param') + expect(object.parameters[0].docstring).to eq('Documentation for a dynamic parameter.') + expect(object.parameters[0].isnamevar).to eq(false) + expect(object.parameters[0].values).to eq(%w(value1 value2)) + expect(object.parameters[1].name).to eq('address') + expect(object.parameters[1].docstring).to eq('The database server name.') + expect(object.parameters[1].isnamevar).to eq(true) expect(object.parameters[1].default).to be_nil expect(object.parameters[1].values).to eq([]) expect(object.parameters[1].aliases).to eq({}) - expect(object.parameters[2].name).to eq('encrypt') - expect(object.parameters[2].docstring).to eq('Whether or not to encrypt the database.') + expect(object.parameters[2].name).to eq('encryption_key') + expect(object.parameters[2].docstring).to eq('The encryption key to use.') expect(object.parameters[2].isnamevar).to eq(false) - expect(object.parameters[2].default).to eq('false') - expect(object.parameters[2].values).to eq(%w(true false yes no)) + expect(object.parameters[2].default).to be_nil + expect(object.parameters[2].values).to eq([]) expect(object.parameters[2].aliases).to eq({}) + expect(object.parameters[3].name).to eq('encrypt') + expect(object.parameters[3].docstring).to eq('Whether or not to encrypt the database.') + expect(object.parameters[3].isnamevar).to eq(false) + expect(object.parameters[3].default).to eq('false') + expect(object.parameters[3].values).to eq(%w(true false yes no)) + expect(object.parameters[3].aliases).to eq({}) + expect(object.parameters[4].name).to eq('backup') + expect(object.parameters[4].docstring).to eq('How often to backup the database.') + expect(object.parameters[4].isnamevar).to eq(false) + expect(object.parameters[4].default).to eq('never') + expect(object.parameters[4].values).to eq(%w(daily monthly never)) expect(object.features.size).to eq(1) expect(object.features[0].name).to eq('encryption') expect(object.features[0].docstring).to eq('The provider supports encryption.') end end + + describe 'parsing an ensurable type with default ensure values' do + let(:source) { <<-SOURCE +Puppet::Type.newtype(:database) do + desc 'An example database server resource type.' + ensurable +end +SOURCE + } + + it 'should register a type object with default ensure values' do + expect(subject.size).to eq(1) + object = subject.first + expect(object.properties[0].name).to eq('ensure') + expect(object.properties[0].docstring).to eq('The basic property that the resource should be in.') + expect(object.properties[0].default).to eq('present') + expect(object.properties[0].values).to eq(%w(present absent)) + end + end + + describe 'parsing a type with a parameter with the name of "name"' do + let(:source) { <<-SOURCE +Puppet::Type.newtype(:database) do + desc 'An example database server resource type.' + newparam(:name) do + desc 'The database server name.' + end +end +SOURCE + } + + it 'should register a type object with the "name" parameter as the namevar' do + expect(subject.size).to eq(1) + object = subject.first + expect(object.parameters.size).to eq(1) + expect(object.parameters[0].name).to eq('name') + expect(object.parameters[0].isnamevar).to eq(true) + end + end end