import unittest import unittest.mock from wif2ansible.models import Server, Flow from wif2ansible.inventory import generate_inventory class TestInventoryKeys(unittest.TestCase): @unittest.mock.patch('wif2ansible.inventory.is_valid_hostname') def test_inventory_keys_are_hostnames(self, mock_resolves): # Mock DNS to say server01 exists mock_resolves.return_value = True # Create a server with Ref, Hostname, IP s1 = Server(reference="SERVER_REF_01", hostname="server01", ip_addresses=["192.168.1.10"], platform="windows") # Create a flow matching this server f1 = Flow(flow_id="1", source_ip="192.168.1.10", destination_ip="10.0.0.1", ports=[80]) servers = {"SERVER_REF_01": s1} flows = [f1] inventory = generate_inventory(servers, flows) # Verify stricture hosts = inventory['all']['hosts'] # Key should be HOSTNAME "server01" (prioritized over Ref) self.assertIn("server01", hosts) self.assertNotIn("192.168.1.10", hosts) # Check variables host_vars = hosts["server01"] self.assertEqual(host_vars['ansible_host'], "192.168.1.10") self.assertEqual(host_vars['ansible_connection'], "winrm") @unittest.mock.patch('wif2ansible.inventory.is_valid_hostname') def test_inventory_keys_resolution(self, mock_resolves): # Setup mock: 'bad_name' -> False, 'good_name' -> True def side_effect(name): if name == "bad_name": return False if name == "good_name": return True return False mock_resolves.side_effect = side_effect # Server with a BAD hostname but a GOOD reference (simulated) # Actually logic is candidates: [hostname, cleaned_ref, rev_dns] # Let's say hostname is "bad_name" and cleaned ref is "good_name" s1 = Server(reference="SRV01 good_name", hostname="bad_name", ip_addresses=["10.10.10.10"]) f1 = Flow(flow_id="1", source_ip="10.10.10.10", destination_ip="1.1.1.1", ports=[80]) inventory = generate_inventory({"k":s1}, [f1]) hosts = inventory['all']['hosts'] # It should have skipped "bad_name" and picked "good_name" (from cleaned ref) self.assertIn("good_name", hosts) self.assertNotIn("bad_name", hosts) def test_suffix_stripping(self): from wif2ansible.parsers import clean_hostname self.assertEqual(clean_hostname("server.prod.global.gc.ca"), "server") self.assertEqual(clean_hostname("server.PROD.GLOBAL.GC.CA"), "server") self.assertEqual(clean_hostname("nosuffix"), "nosuffix") self.assertEqual(clean_hostname("other.suffix.com"), "other.suffix.com") if __name__ == '__main__': unittest.main()