|
| 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 |
0 commit comments