Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(#1532) Replace ParserError with Puppet::Error #1540

Merged
merged 1 commit into from
Apr 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/puppet/provider/postgresql_conf/ruby.rb
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def write_config(file, lines)
# check, if resource exists in postgresql.conf file
def exists?
select = parse_config.select { |hash| hash[:key] == resource[:key] }
raise ParserError, "found multiple config items of #{resource[:key]} found, please fix this" if select.length > 1
raise Puppet::Error, "found multiple config items of #{resource[:key]}, please fix this" if select.length > 1
Copy link

@joshcooper joshcooper Apr 8, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FWIW, providers can call the fail method which will raise Puppet::Error, for example see the base exec provider: https://github.com/puppetlabs/puppet/blob/fce49baa3767fffb000f1b26d3a7b4edbec58999/lib/puppet/provider/exec.rb#L105 There should really be a specification about what methods are available for providers...

Copy link
Collaborator Author

@bastelfreak bastelfreak Apr 10, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just wanted to fix a simple typo. I don't know how to properly write tests for the fail() method. I cannot justify to the customer that I spent several days within a 6 month period on this fix. If someone wants to pick it up: feel free.

return false if select.empty?

@result = select.first
Expand Down
26 changes: 23 additions & 3 deletions spec/unit/provider/postgresql_conf/ruby_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@
provider_class = Puppet::Type.type(:postgresql_conf).provider(:ruby)

describe provider_class do
let(:resource) { Puppet::Type.type(:postgresql_conf).new(name: 'foo', value: 'bar') }
let(:resource) { Puppet::Type.type(:postgresql_conf).new(name: 'foo', key: 'foo', value: 'bar') }
let(:provider) { resource.provider }

before(:each) do
allow(provider).to receive(:file_path).and_return('/tmp/foo')
allow(provider).to receive(:read_file).and_return('foo = bar')
allow(provider).to receive(:write_file).and_return(true)
allow(provider).to receive(:resource).and_return(key: 'your_key', line_number: 1, value: 'foo')
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I meant to change line 7 to:

let(:resource) { Puppet::Type.type(:postgresql_conf).new(name: 'foo', key: 'foo', value: 'bar') }

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah okay. will update

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mhm this line is still requires to get the tests passing

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This confuses me and now I wonder what's wrong. Perhaps tomorrow I'll have some idea.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So I think I know what is going on. Line 7 instantiates a new Puppet type with the desired state. The provider has the actual state. You're mocking that here. So by mocking this, you know it is already in place.

So at the very least I'd expect you to only mock it when you want it to exist, not before each test.

It also makes me wonder about something else. key is a parameter, not a property. So I'm not sure it should be loaded from the provider.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line is now redundant, right?

Suggested change
allow(provider).to receive(:resource).and_return(key: 'your_key', line_number: 1, value: 'foo')

end
# rubocop:enable RSpec/ReceiveMessages

Expand All @@ -26,8 +27,27 @@
expect(provider).to respond_to(:add_header)
end

it 'has a method exists?' do
expect(provider).to respond_to(:exists?)
describe '#exists?' do
it 'returns true when a matching config item is found' do
config_data = [{ key: 'your_key', value: 'your_value' }]
expect(provider).to receive(:parse_config).and_return(config_data)

expect(provider.exists?).to be true
end

it 'returns false when no matching config item is found' do
config_data = [{ key: 'other_key', value: 'other_value' }]
expect(provider).to receive(:parse_config).and_return(config_data)

expect(provider.exists?).to be false
end

it 'raises an error when multiple matching config items are found' do
config_data = [{ key: 'your_key', value: 'value1' }, { key: 'your_key', value: 'value2' }]
expect(provider).to receive(:parse_config).and_return(config_data)

expect { provider.exists? }.to raise_error(Puppet::Error, 'found multiple config items of your_key, please fix this')
end
end

it 'has a method create' do
Expand Down
Loading