diff --git a/netbox_awx_plugin/tests/test_models.py b/netbox_awx_plugin/tests/test_models.py index a95c8ed8b514ef531e4a2c66fcccfd6b2afa3d59..0b3f20adb322d175d213312e2141244a9f84651d 100644 --- a/netbox_awx_plugin/tests/test_models.py +++ b/netbox_awx_plugin/tests/test_models.py @@ -1,8 +1,10 @@ # netbox_awx_plugin/tests/test_models.py from django.test import TestCase +from unittest.mock import patch, Mock from netbox_awx_plugin.models import AWX, AWXInventory from django.urls import reverse +from requests.compat import urljoin class AWXModelTestCase(TestCase): @@ -53,3 +55,276 @@ class AWXInventoryModelTestCase(TestCase): url = self.inventory.get_absolute_url() expected_url = reverse("plugins:netbox_awx_plugin:awxinventory", args=[self.inventory.pk]) self.assertEqual(url, expected_url) + + @patch('netbox_awx_plugin.models.requests.get') + def test_get_host(self, mock_get): + """Test the get_host method.""" + mock_response = Mock() + mock_response.json.return_value = { + "count": 1, + "results": [{"id": 1, "name": "test-host"}] + } + mock_get.return_value = mock_response + + host = self.inventory.get_host("test-host") + self.assertEqual(host["name"], "test-host") + + expected_url = urljoin(self.awx_instance.url, f"/api/v2/inventories/{self.inventory.inventory_id}/hosts/") + mock_get.assert_called_once_with( + url=expected_url, + params={"name": "test-host"}, + headers=self.awx_instance.get_headers(), + verify=False, + ) + + @patch('netbox_awx_plugin.models.requests.get') + def test_get_host_no_results(self, mock_get): + """Test get_host when no host is found.""" + mock_response = Mock() + mock_response.json.return_value = {"count": 0, "results": []} + mock_get.return_value = mock_response + + host = self.inventory.get_host("nonexistent-host") + self.assertIsNone(host) + + @patch('netbox_awx_plugin.models.requests.post') + def test_create_host(self, mock_post): + """Test the create_host method.""" + mock_response = Mock() + mock_post.return_value = mock_response + + data = {"name": "new-host"} + self.inventory.create_host(data) + + expected_url = urljoin(self.awx_instance.url, f"/api/v2/inventories/{self.inventory.inventory_id}/hosts/") + mock_post.assert_called_once_with( + url=expected_url, + headers=self.awx_instance.get_headers(), + json=data, + verify=False, + ) + + @patch('netbox_awx_plugin.models.requests.put') + def test_update_host(self, mock_put): + """Test the update_host method.""" + mock_response = Mock() + mock_put.return_value = mock_response + + data = {"name": "updated-host"} + self.inventory.update_host(1, data) + + expected_url = urljoin(self.awx_instance.url, "/api/v2/hosts/1/") + mock_put.assert_called_once_with( + url=expected_url, + headers=self.awx_instance.get_headers(), + json=data, + verify=False, + ) + + @patch('netbox_awx_plugin.models.requests.delete') + @patch('netbox_awx_plugin.models.requests.get') + def test_delete_host(self, mock_get, mock_delete): + """Test the delete_host method.""" + # Mock the get_host response + mock_get_response = Mock() + mock_get_response.json.return_value = { + "count": 1, + "results": [{"id": 1, "name": "test-host"}] + } + mock_get.return_value = mock_get_response + + # Mock the delete response + mock_delete_response = Mock() + mock_delete.return_value = mock_delete_response + + self.inventory.delete_host("test-host") + + # Check that get_host was called correctly + expected_get_url = urljoin(self.awx_instance.url, f"/api/v2/inventories/{self.inventory.inventory_id}/hosts/") + mock_get.assert_called_once_with( + url=expected_get_url, + params={"name": "test-host"}, + headers=self.awx_instance.get_headers(), + verify=False, + ) + + # Check that delete was called correctly + expected_delete_url = urljoin(self.awx_instance.url, "/api/v2/hosts/1/") + mock_delete.assert_called_once_with( + url=expected_delete_url, + headers=self.awx_instance.get_headers(), + verify=False, + ) + + @patch('netbox_awx_plugin.models.requests.get') + def test_get_group(self, mock_get): + """Test the get_group method.""" + mock_response = Mock() + mock_response.json.return_value = { + "results": [{"id": 1, "name": "test-group"}] + } + mock_get.return_value = mock_response + + group = self.inventory.get_group("test-group") + self.assertEqual(group["name"], "test-group") + + expected_url = urljoin(self.awx_instance.url, "/api/v2/groups/") + mock_get.assert_called_once_with( + url=expected_url, + params={"name": "test-group"}, + headers=self.awx_instance.get_headers(), + verify=False, + ) + + @patch('netbox_awx_plugin.models.requests.get') + def test_get_group_no_results(self, mock_get): + """Test get_group when no group is found.""" + mock_response = Mock() + mock_response.json.return_value = {"results": []} + mock_get.return_value = mock_response + + group = self.inventory.get_group("nonexistent-group") + self.assertIsNone(group) + + @patch('netbox_awx_plugin.models.requests.put') + @patch('netbox_awx_plugin.models.requests.get') + def test_update_group(self, mock_get, mock_put): + """Test the update_group method.""" + # Mock the get_group response + mock_get_response = Mock() + mock_get_response.json.return_value = { + "results": [{"id": 1, "name": "test-group"}] + } + mock_get.return_value = mock_get_response + + # Mock the put response + mock_put_response = Mock() + mock_put.return_value = mock_put_response + + data = {"name": "updated-group"} + self.inventory.update_group("test-group", data) + + # Check that get_group was called correctly + expected_get_url = urljoin(self.awx_instance.url, "/api/v2/groups/") + mock_get.assert_called_once_with( + url=expected_get_url, + params={"name": "test-group"}, + headers=self.awx_instance.get_headers(), + verify=False, + ) + + # Check that put was called correctly + expected_put_url = urljoin(self.awx_instance.url, "/api/v2/groups/1/") + mock_put.assert_called_once_with( + url=expected_put_url, + headers=self.awx_instance.get_headers(), + json=data, + verify=False, + ) + + @patch('netbox_awx_plugin.models.requests.post') + def test_create_group(self, mock_post): + """Test the create_group method.""" + mock_response = Mock() + mock_post.return_value = mock_response + + data = {"name": "new-group"} + self.inventory.create_group(data) + + expected_url = urljoin(self.awx_instance.url, f"/api/v2/inventories/{self.inventory.inventory_id}/groups/") + mock_post.assert_called_once_with( + url=expected_url, + headers=self.awx_instance.get_headers(), + json=data, + verify=False, + ) + + @patch('netbox_awx_plugin.models.requests.delete') + @patch('netbox_awx_plugin.models.requests.get') + def test_delete_group(self, mock_get, mock_delete): + """Test the delete_group method.""" + # Mock the get_group response + mock_get_response = Mock() + mock_get_response.json.return_value = { + "results": [{"id": 1, "name": "test-group"}] + } + mock_get.return_value = mock_get_response + + # Mock the delete response + mock_delete_response = Mock() + mock_delete.return_value = mock_delete_response + + self.inventory.delete_group("test-group") + + # Check that get_group was called correctly + expected_get_url = urljoin(self.awx_instance.url, "/api/v2/groups/") + mock_get.assert_called_once_with( + url=expected_get_url, + params={"name": "test-group"}, + headers=self.awx_instance.get_headers(), + verify=False, + ) + + # Check that delete was called correctly + expected_delete_url = urljoin(self.awx_instance.url, "/api/v2/groups/1/") + mock_delete.assert_called_once_with( + url=expected_delete_url, + headers=self.awx_instance.get_headers(), + verify=False, + ) + + @patch('netbox_awx_plugin.models.requests.post') + def test_associate_host_group(self, mock_post): + """Test the associate_host_group method.""" + mock_response = Mock() + mock_post.return_value = mock_response + + self.inventory.associate_host_group(1, 2) + + expected_url = urljoin(self.awx_instance.url, "/api/v2/hosts/1/groups/") + mock_post.assert_called_once_with( + url=expected_url, + headers=self.awx_instance.get_headers(), + json={"id": 2}, + verify=False, + ) + + @patch('netbox_awx_plugin.models.requests.post') + def test_disassociate_host_group(self, mock_post): + """Test the disassociate_host_group method.""" + mock_response = Mock() + mock_post.return_value = mock_response + + self.inventory.disassociate_host_group(1, 2) + + expected_url = urljoin(self.awx_instance.url, "/api/v2/hosts/1/groups/") + mock_post.assert_called_once_with( + url=expected_url, + headers=self.awx_instance.get_headers(), + json={"id": 2, "disassociate": "True"}, + verify=False, + ) + + @patch('netbox_awx_plugin.models.requests.get') + def test_get_host_groups(self, mock_get): + """Test the get_host_groups method.""" + mock_response = Mock() + mock_response.json.return_value = { + "results": [{"id": 2, "name": "group1"}, {"id": 3, "name": "group2"}] + } + mock_get.return_value = mock_response + + groups = self.inventory.get_host_groups(1) + self.assertEqual(len(groups), 2) + self.assertEqual(groups[0]["name"], "group1") + self.assertEqual(groups[1]["name"], "group2") + + expected_url = urljoin(self.awx_instance.url, "/api/v2/hosts/1/groups/") + mock_get.assert_called_once_with( + url=expected_url, + headers=self.awx_instance.get_headers(), + verify=False, + ) + + +