From 3473875fc308b5143ec2d297e761a0ff025c3933 Mon Sep 17 00:00:00 2001 From: David Schmitt Date: Tue, 12 Sep 2017 14:42:42 +0100 Subject: [PATCH] Finish `get` method unit testing --- lib/puppet/provider/apt_key2/apt_key2.rb | 14 ++-- .../puppet/provider/apt_key2/apt_key2_spec.rb | 66 ++++++++++++++++--- 2 files changed, 64 insertions(+), 16 deletions(-) diff --git a/lib/puppet/provider/apt_key2/apt_key2.rb b/lib/puppet/provider/apt_key2/apt_key2.rb index 4f5c1ba..1ee9578 100644 --- a/lib/puppet/provider/apt_key2/apt_key2.rb +++ b/lib/puppet/provider/apt_key2/apt_key2.rb @@ -24,9 +24,9 @@ class Puppet::Provider::AptKey2::AptKey2 pub_line = nil fpr_line = nil - result = @apt_key_cmd.start_read(context, %w[adv --list-keys --with-colons --fingerprint --fixed-list-mode]) do |handle| - handle.stdout.each_line.map { |line| - line = line.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '') + result = @apt_key_cmd.start_read(context, *%w[adv --list-keys --with-colons --fingerprint --fixed-list-mode]) do |process| + process.io.stdout.each_line.map { |line| + line = line.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '').strip if line.start_with?('pub') pub_line = line elsif line.start_with?('fpr') @@ -38,7 +38,7 @@ class Puppet::Provider::AptKey2::AptKey2 # puts "debug: key_line_to_hash" - hash = key_line_to_hash(pub_line, fpr_line) + hash = self.class.key_line_to_hash(pub_line, fpr_line) # reset scanning pub_line = nil @@ -46,8 +46,6 @@ class Puppet::Provider::AptKey2::AptKey2 hash }.compact! - - result end end @@ -80,8 +78,8 @@ class Puppet::Provider::AptKey2::AptKey2 short: fingerprint[-8..-1], # last 8 characters of fingerprint size: pub_split[2].to_i, type: key_type, - created: Time.at(pub_split[5].to_i), - expiry: expiry, + created: Time.at(pub_split[5].to_i).to_s, + expiry: expiry.to_s, expired: !!(expiry && Time.now >= expiry), } end diff --git a/spec/unit/puppet/provider/apt_key2/apt_key2_spec.rb b/spec/unit/puppet/provider/apt_key2/apt_key2_spec.rb index b80c485..9400de7 100644 --- a/spec/unit/puppet/provider/apt_key2/apt_key2_spec.rb +++ b/spec/unit/puppet/provider/apt_key2/apt_key2_spec.rb @@ -6,7 +6,8 @@ require 'puppet/provider/apt_key2/apt_key2' RSpec.describe Puppet::Provider::AptKey2::AptKey2 do subject(:provider) { described_class.new } - let(:context) { instance_double('context') } + + let(:context) { instance_double('context') } describe '#canonicalize(resources)' do it('works with empty inputs') { expect(provider.canonicalize([])).to eq [] } @@ -26,11 +27,37 @@ RSpec.describe Puppet::Provider::AptKey2::AptKey2 do end end + describe '.key_line_to_hash(pub, fpr)' do + subject(:result) { described_class.key_line_to_hash(pub, fpr) } + + let(:pub) { "pub:-:4096:#{key_type}:7638D0442B90D010:1416603673:1668891673::-:::scSC:::::::" } + let(:fpr) { "fpr:::::::::#{id}:" } + + let(:key_type) { :foo } + + let(:short) { 'a' * 8 } + let(:long) { ('1' * 8) + short } + let(:id) { 'f' * (40 - 16) + long } + + it('returns the id') { expect(result[:id]).to eq id } + it('returns the long id') { expect(result[:long]).to eq long } + it('returns the short id') { expect(result[:short]).to eq short } + + [[1, :rsa], [17, :dsa], [18, :ecc], [19, :ecdsa], [:foo, :unrecognized]].each do |key_type, value| + context "with a key type of #{key_type}" do + let(:key_type) { key_type } + + it("returns #{value.inspect} as key type") { expect(result[:type]).to eq value } + end + end + end + describe '#get' do let(:apt_key_cmd) { instance_double('Puppet::ResourceApi::Command') } - let(:handle) { instance_double('handle') } + let(:process) { instance_double('ChildProcess::AbstractProcess') } + let(:io) { instance_double('ChildProcess::AbstractIO') } let(:stdout) do - StringIO.new(<: EOS - ) end - it 'processes input' do + before(:each) do allow(Puppet::ResourceApi::Command).to receive(:new).and_return(apt_key_cmd) - expect(apt_key_cmd).to receive(:start_read).with(context, any_args).and_yield(handle) - expect(handle).to receive(:stdout).and_yield(stdout) + allow(process).to receive(:io).and_return(io) + end - expect { provider.get(context) }.not_to raise_error + it 'processes input' do # rubocop:ignore RSpec/ExampleLength + expect(apt_key_cmd).to receive(:start_read).with(context, any_args).and_yield(process) + expect(io).to receive(:stdout).and_return(stdout) + expect(provider.get(context)).to eq [ + { ensure: 'present', + id: '126C0D24BD8A2942CC7DF8AC7638D0442B90D010', + fingerprint: '126C0D24BD8A2942CC7DF8AC7638D0442B90D010', + long: '7638D0442B90D010', + short: '2B90D010', + size: 4096, + type: :rsa, + created: '2014-11-21 21:01:13 +0000', + expiry: '2022-11-19 21:01:13 +0000', + expired: false }, + { ensure: 'present', + id: 'D21169141CECD440F2EB8DDA9D6D8F6BC857C906', + fingerprint: 'D21169141CECD440F2EB8DDA9D6D8F6BC857C906', + long: '9D6D8F6BC857C906', + short: 'C857C906', + size: 4096, + type: :rsa, + created: '2014-11-21 21:13:37 +0000', + expiry: '2022-11-19 21:13:37 +0000', + expired: false }, + ] end end end -- 2.45.2