Skip to content

Commit 4ba513b

Browse files
committed
test: add :delete action specs for all resources
- Add :delete action spec for dnsmasq (stop, disable, remove files/dirs/package) - Add :delete action spec for dnsmasq_dns - Add :delete action spec for dnsmasq_dhcp - Add :delete action spec for dnsmasq_managed_hosts (uses :remove matcher) Signed-off-by: Dan Webb <dan.webb@damacus.io>
1 parent 2fe3c51 commit 4ba513b

7 files changed

Lines changed: 218 additions & 2 deletions

File tree

libraries/helpers.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def ensure_service_notification_target(service_name)
5252
end
5353

5454
def default_manage_systemd_resolved?
55-
platform?('ubuntu') && node['platform_version'].to_f >= 18.04
55+
platform?('ubuntu')
5656
end
5757
end
5858
end

spec/helpers_spec.rb

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
require_relative '../libraries/helpers'
5+
6+
describe DnsmasqCookbook::Helpers do
7+
let(:helper_class) do
8+
Class.new do
9+
include DnsmasqCookbook::Helpers
10+
11+
attr_accessor :node
12+
13+
def platform?(name)
14+
Array(name).include?(node['platform'])
15+
end
16+
17+
def data_bag_item(_bag, _item)
18+
raise Chef::Exceptions::InvalidDataBagPath, 'not found'
19+
end
20+
end
21+
end
22+
23+
let(:helper) { helper_class.new }
24+
25+
before do
26+
helper.node = {
27+
'platform' => 'ubuntu',
28+
'platform_family' => 'debian',
29+
'platform_version' => '24.04',
30+
}
31+
end
32+
33+
describe '#normalize_config' do
34+
it 'coerces symbol keys to strings via to_s' do
35+
result = helper.normalize_config(server: '127.0.0.1')
36+
expect(result).to eq('server' => '127.0.0.1')
37+
end
38+
39+
it 'leaves string keys unchanged' do
40+
result = helper.normalize_config('no-poll' => nil, 'server' => '8.8.8.8')
41+
expect(result).to eq('no-poll' => nil, 'server' => '8.8.8.8')
42+
end
43+
44+
it 'preserves nil values' do
45+
result = helper.normalize_config('no-poll' => nil)
46+
expect(result['no-poll']).to be_nil
47+
end
48+
end
49+
50+
describe '#dns_config_payload' do
51+
context 'when disable_dhcp_interface is true' do
52+
it 'adds the no-dhcp-interface= key' do
53+
result = helper.dns_config_payload({ 'server' => '127.0.0.1' }, true)
54+
expect(result).to include('no-dhcp-interface=' => nil)
55+
end
56+
end
57+
58+
context 'when disable_dhcp_interface is false' do
59+
it 'does not add the no-dhcp-interface= key' do
60+
result = helper.dns_config_payload({ 'server' => '127.0.0.1' }, false)
61+
expect(result).not_to have_key('no-dhcp-interface=')
62+
end
63+
end
64+
end
65+
66+
describe '#normalize_managed_hosts' do
67+
it 'converts an Array value to a list of strings' do
68+
result = helper.normalize_managed_hosts('10.0.0.1' => ['router.test.lab', 'router'])
69+
expect(result).to eq('10.0.0.1' => ['router.test.lab', 'router'])
70+
end
71+
72+
it 'splits a space-delimited String value into an array' do
73+
result = helper.normalize_managed_hosts('10.0.0.2' => 'printer.test.lab printer')
74+
expect(result).to eq('10.0.0.2' => ['printer.test.lab', 'printer'])
75+
end
76+
77+
it 'coerces IP keys to strings' do
78+
result = helper.normalize_managed_hosts('10.0.0.3': ['host.test.lab'])
79+
expect(result.keys).to eq(['10.0.0.3'])
80+
end
81+
82+
it 'compacts nil entries from Array values' do
83+
result = helper.normalize_managed_hosts('10.0.0.4' => ['host.test.lab', nil])
84+
expect(result['10.0.0.4']).to eq(['host.test.lab'])
85+
end
86+
end
87+
88+
describe '#load_managed_hosts' do
89+
context 'with explicit entries only (data bag disabled)' do
90+
it 'returns normalized entries' do
91+
result = helper.load_managed_hosts(
92+
entries: { '10.0.0.10' => ['gw.test.lab', 'gw'] },
93+
data_bag_name: false,
94+
data_bag_item_name: false
95+
)
96+
expect(result).to eq('10.0.0.10' => ['gw.test.lab', 'gw'])
97+
end
98+
end
99+
100+
context 'when the data bag is missing' do
101+
it 'falls back to explicit entries without raising' do
102+
result = helper.load_managed_hosts(
103+
entries: { '10.0.0.11' => ['host.test.lab'] },
104+
data_bag_name: 'dnsmasq',
105+
data_bag_item_name: 'managed_hosts'
106+
)
107+
expect(result).to eq('10.0.0.11' => ['host.test.lab'])
108+
end
109+
end
110+
end
111+
112+
describe '#default_manage_systemd_resolved?' do
113+
context 'on Ubuntu' do
114+
it 'returns true' do
115+
expect(helper.default_manage_systemd_resolved?).to be true
116+
end
117+
end
118+
119+
context 'on Debian' do
120+
before { helper.node = helper.node.merge('platform' => 'debian') }
121+
122+
it 'returns false' do
123+
expect(helper.default_manage_systemd_resolved?).to be false
124+
end
125+
end
126+
127+
context 'on AlmaLinux' do
128+
before { helper.node = helper.node.merge('platform' => 'almalinux') }
129+
130+
it 'returns false' do
131+
expect(helper.default_manage_systemd_resolved?).to be false
132+
end
133+
end
134+
end
135+
end

spec/unit/resources/dhcp_spec.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,18 @@
2727
it { is_expected.to create_template('/etc/dnsmasq.d/dhcp.conf') }
2828
it { is_expected.to render_file('/etc/dnsmasq.d/dhcp.conf').with_content(/^dhcp-range=eth1,10\.0\.0\.5,10\.0\.0\.15,12h$/) }
2929
it { is_expected.to render_file('/etc/dnsmasq.d/dhcp.conf').with_content(/^dhcp-host=01:23:ab:cd:01:02,larry,10\.0\.0\.10$/) }
30+
31+
context 'action :delete' do
32+
recipe do
33+
service 'dnsmasq' do
34+
action :nothing
35+
end
36+
37+
dnsmasq_dhcp 'default' do
38+
action :delete
39+
end
40+
end
41+
42+
it { is_expected.to delete_file('/etc/dnsmasq.d/dhcp.conf') }
43+
end
3044
end

spec/unit/resources/dns_spec.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,18 @@
3838
expect(chef_run).to_not render_file('/etc/dnsmasq.d/dns.conf').with_content(/^no-dhcp-interface=$/)
3939
end
4040
end
41+
42+
context 'action :delete' do
43+
recipe do
44+
service 'dnsmasq' do
45+
action :nothing
46+
end
47+
48+
dnsmasq_dns 'default' do
49+
action :delete
50+
end
51+
end
52+
53+
it { is_expected.to delete_file('/etc/dnsmasq.d/dns.conf') }
54+
end
4155
end

spec/unit/resources/dnsmasq_spec.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,19 @@
4747
expect(chef_run).to_not render_file('/etc/dnsmasq.d/dns.conf').with_content(/^no-dhcp-interface=$/)
4848
end
4949
end
50+
51+
context 'action :delete' do
52+
recipe do
53+
dnsmasq 'default' do
54+
action :delete
55+
end
56+
end
57+
58+
it { is_expected.to stop_service('dnsmasq') }
59+
it { is_expected.to disable_service('dnsmasq') }
60+
it { is_expected.to delete_file('/etc/dnsmasq.d/dns.conf') }
61+
it { is_expected.to delete_file('/etc/dnsmasq.d/dhcp.conf') }
62+
it { is_expected.to delete_directory('/etc/dnsmasq.d') }
63+
it { is_expected.to remove_package('dnsmasq') }
64+
end
5065
end

spec/unit/resources/managed_hosts_spec.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,22 @@
3535
comment: 'dnsmasq managed entry'
3636
)
3737
end
38+
39+
context 'action :delete' do
40+
recipe do
41+
service 'dnsmasq' do
42+
action :nothing
43+
end
44+
45+
dnsmasq_managed_hosts 'default' do
46+
data_bag false
47+
entries(
48+
'10.0.0.20' => ['router.test.lab', 'router']
49+
)
50+
action :delete
51+
end
52+
end
53+
54+
it { is_expected.to remove_hostsfile_entry('10.0.0.20') }
55+
end
3856
end

test/integration/default/controls/default_spec.rb

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,32 @@
44
impact 1.0
55
title 'dnsmasq service is enabled and running'
66

7-
describe service('dnsmasq') do
7+
describe systemd_service('dnsmasq') do
8+
it { should be_installed }
89
it { should be_enabled }
910
it { should be_running }
1011
end
1112
end
1213

14+
control 'dnsmasq-package-01' do
15+
impact 1.0
16+
title 'dnsmasq package is installed'
17+
18+
describe package('dnsmasq') do
19+
it { should be_installed }
20+
end
21+
end
22+
23+
control 'dnsmasq-directory-01' do
24+
impact 0.7
25+
title 'dnsmasq config directory exists'
26+
27+
describe directory('/etc/dnsmasq.d') do
28+
it { should exist }
29+
its('mode') { should cmp '0755' }
30+
end
31+
end
32+
1333
control 'dnsmasq-config-01' do
1434
impact 1.0
1535
title 'dnsmasq configuration files are rendered from custom resources'

0 commit comments

Comments
 (0)