From 3190a5ebc3ad7a2982b2fe610315a88a74a39afe Mon Sep 17 00:00:00 2001 From: Akihiro Motoki Date: Mon, 14 May 2018 05:46:51 +0900 Subject: [PATCH] Convert admin.networks.ports tests into mock blueprint mock-framework-in-unit-tests Change-Id: I9e01edb594ba5272b4f516a327f65b83c96e5896 --- .../dashboards/admin/networks/ports/tests.py | 567 +++++++++--------- 1 file changed, 298 insertions(+), 269 deletions(-) diff --git a/openstack_dashboard/dashboards/admin/networks/ports/tests.py b/openstack_dashboard/dashboards/admin/networks/ports/tests.py index fb774e8f10..9048e17d40 100644 --- a/openstack_dashboard/dashboards/admin/networks/ports/tests.py +++ b/openstack_dashboard/dashboards/admin/networks/ports/tests.py @@ -13,10 +13,11 @@ # License for the specific language governing permissions and limitations # under the License. -from django import http +import collections + from django.urls import reverse -from mox3.mox import IsA +import mock from horizon.workflows import views @@ -31,53 +32,64 @@ NETWORKS_DETAIL_URL = 'horizon:admin:networks:detail' class NetworkPortTests(test.BaseAdminViewTests): - use_mox = True + def _stub_is_extension_supported(self, features): + self._features = features + self._feature_call_counts = collections.defaultdict(int) + + def fake_extension_supported(request, alias): + self._feature_call_counts[alias] += 1 + return self._features[alias] + + self.mock_is_extension_supported.side_effect = fake_extension_supported + + def _check_is_extension_supported(self, expected_count): + self.assertEqual(expected_count, self._feature_call_counts) - @test.create_stubs({api.neutron: ('network_get', - 'port_get', - 'is_extension_supported',)}) def test_port_detail(self): self._test_port_detail() - @test.create_stubs({api.neutron: ('network_get', - 'port_get', - 'is_extension_supported',)}) def test_port_detail_with_mac_learning(self): self._test_port_detail(mac_learning=True) + @test.create_mocks({api.neutron: ('network_get', + 'port_get', + 'is_extension_supported',)}) def _test_port_detail(self, mac_learning=False): port = self.ports.first() network_id = self.networks.first().id - api.neutron.port_get(IsA(http.HttpRequest), port.id)\ - .AndReturn(self.ports.first()) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'mac-learning')\ - .MultipleTimes().AndReturn(mac_learning) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'allowed-address-pairs') \ - .MultipleTimes().AndReturn(False) - api.neutron.network_get(IsA(http.HttpRequest), network_id)\ - .AndReturn(self.networks.first()) - self.mox.ReplayAll() + + self.mock_port_get.return_value = self.ports.first() + self._stub_is_extension_supported( + {'mac-learning': mac_learning, + 'allowed-address-pairs': False}) + self.mock_network_get.return_value = self.networks.first() res = self.client.get(reverse(DETAIL_URL, args=[port.id])) self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertEqual(res.context['port'].id, port.id) - @test.create_stubs({api.neutron: ('port_get',)}) + self.mock_port_get.assert_called_once_with(test.IsHttpRequest(), + port.id) + self._check_is_extension_supported( + {'mac-learning': 3, + 'allowed-address-pairs': 2}) + self.mock_network_get.assert_called_once_with(test.IsHttpRequest(), + network_id) + + @test.create_mocks({api.neutron: ('port_get',)}) def test_port_detail_exception(self): port = self.ports.first() - api.neutron.port_get(IsA(http.HttpRequest), port.id)\ - .AndRaise(self.exceptions.neutron) - - self.mox.ReplayAll() + self.mock_port_get.side_effect = self.exceptions.neutron res = self.client.get(reverse(DETAIL_URL, args=[port.id])) redir_url = NETWORKS_INDEX_URL self.assertRedirectsNoFollow(res, redir_url) + self.mock_port_get.assert_called_once_with(test.IsHttpRequest(), + port.id) + def test_port_create_get(self): self._test_port_create_get() @@ -87,29 +99,19 @@ class NetworkPortTests(test.BaseAdminViewTests): def test_port_create_get_with_port_security(self): self._test_port_create_get(port_security=True) - @test.create_stubs({api.neutron: ('network_get', + @test.create_mocks({api.neutron: ('network_get', 'is_extension_supported', 'security_group_list',)}) def _test_port_create_get(self, mac_learning=False, binding=False, port_security=False): network = self.networks.first() - api.neutron.network_get(IsA(http.HttpRequest), - network.id)\ - .AndReturn(self.networks.first()) - - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'mac-learning')\ - .AndReturn(mac_learning) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'binding')\ - .AndReturn(binding) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'port-security')\ - .AndReturn(port_security) - api.neutron.security_group_list(IsA(http.HttpRequest), - tenant_id=None)\ - .AndReturn(self.security_groups.list()) - self.mox.ReplayAll() + self.mock_network_get.return_value = network + self.mock_security_group_list.return_value = \ + self.security_groups.list() + self._stub_is_extension_supported( + {'mac-learning': mac_learning, + 'binding': binding, + 'port-security': port_security}) url = reverse('horizon:admin:networks:addport', args=[network.id]) @@ -117,6 +119,16 @@ class NetworkPortTests(test.BaseAdminViewTests): self.assertTemplateUsed(res, views.WorkflowView.template_name) + self.assert_mock_multiple_calls_with_same_arguments( + self.mock_network_get, 2, + mock.call(test.IsHttpRequest(), network.id)) + self.mock_security_group_list.assert_called_once_with( + test.IsHttpRequest(), tenant_id='1') + self._check_is_extension_supported( + {'mac-learning': 1, + 'binding': 1, + 'port-security': 1}) + def test_port_create_post(self): self._test_port_create_post() @@ -126,7 +138,7 @@ class NetworkPortTests(test.BaseAdminViewTests): def test_port_create_post_with_port_security(self): self._test_port_create_post(port_security=True) - @test.create_stubs({api.neutron: ('network_get', + @test.create_mocks({api.neutron: ('network_get', 'is_extension_supported', 'security_group_list', 'port_create',)}) @@ -135,42 +147,15 @@ class NetworkPortTests(test.BaseAdminViewTests): network = self.networks.first() port = self.ports.first() security_groups = self.security_groups.list() - api.neutron.network_get(IsA(http.HttpRequest), - network.id)\ - .AndReturn(self.networks.first()) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'mac-learning')\ - .AndReturn(mac_learning) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'binding') \ - .AndReturn(binding) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'port-security')\ - .AndReturn(port_security) - api.neutron.security_group_list(IsA(http.HttpRequest), - tenant_id=None)\ - .AndReturn(self.security_groups.list()) - extension_kwargs = {} - if binding: - extension_kwargs['binding__vnic_type'] = \ - port.binding__vnic_type - if mac_learning: - extension_kwargs['mac_learning_enabled'] = True - if port_security: - extension_kwargs['port_security_enabled'] = True - extension_kwargs['wanted_groups'] = security_groups - api.neutron.port_create(IsA(http.HttpRequest), - tenant_id=network.tenant_id, - network_id=network.id, - name=port.name, - admin_state_up=port.admin_state_up, - device_id=port.device_id, - device_owner=port.device_owner, - binding__host_id=port.binding__host_id, - mac_address=port.mac_address, - **extension_kwargs)\ - .AndReturn(port) - self.mox.ReplayAll() + sg_ids = [sg.id for sg in security_groups] + + self.mock_network_get.return_value = network + self.mock_security_group_list.return_value = security_groups + self._stub_is_extension_supported( + {'mac-learning': mac_learning, + 'binding': binding, + 'port-security': port_security}) + self.mock_port_create.return_value = port form_data = {'network_id': port.network_id, 'network_name': network.name, @@ -186,7 +171,8 @@ class NetworkPortTests(test.BaseAdminViewTests): form_data['mac_state'] = True if port_security: form_data['port_security_enabled'] = True - form_data['wanted_groups'] = security_groups + form_data['default_create_security_groups_role'] = 'member' + form_data['create_security_groups_role_member'] = sg_ids url = reverse('horizon:admin:networks:addport', args=[port.network_id]) res = self.client.post(url, form_data) @@ -195,41 +181,53 @@ class NetworkPortTests(test.BaseAdminViewTests): redir_url = reverse(NETWORKS_DETAIL_URL, args=[port.network_id]) self.assertRedirectsNoFollow(res, redir_url) - @test.create_stubs({api.neutron: ('network_get', + self.assert_mock_multiple_calls_with_same_arguments( + self.mock_network_get, 2, + mock.call(test.IsHttpRequest(), network.id)) + self.mock_security_group_list.assert_called_once_with( + test.IsHttpRequest(), tenant_id='1') + extension_kwargs = {} + if binding: + extension_kwargs['binding__vnic_type'] = \ + port.binding__vnic_type + if mac_learning: + extension_kwargs['mac_learning_enabled'] = True + if port_security: + extension_kwargs['port_security_enabled'] = True + extension_kwargs['security_groups'] = sg_ids + else: + extension_kwargs['security_groups'] = [] + self.mock_port_create.assert_called_once_with( + test.IsHttpRequest(), + tenant_id=network.tenant_id, + network_id=network.id, + name=port.name, + admin_state_up=port.admin_state_up, + device_id=port.device_id, + device_owner=port.device_owner, + binding__host_id=port.binding__host_id, + mac_address=port.mac_address, + **extension_kwargs) + self._check_is_extension_supported( + {'mac-learning': 1, + 'binding': 1, + 'port-security': 1}) + + @test.create_mocks({api.neutron: ('network_get', 'is_extension_supported', 'security_group_list', 'port_create',)}) def test_port_create_post_with_fixed_ip(self): network = self.networks.first() port = self.ports.first() - api.neutron.network_get(IsA(http.HttpRequest), - network.id) \ - .MultipleTimes().AndReturn(self.networks.first()) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'mac-learning')\ - .AndReturn(True) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'port-security')\ - .AndReturn(True) - api.neutron.security_group_list(IsA(http.HttpRequest), - tenant_id=None)\ - .AndReturn(self.security_groups.list()) - extension_kwargs = {} - extension_kwargs['binding__vnic_type'] = \ - port.binding__vnic_type - api.neutron.port_create(IsA(http.HttpRequest), - tenant_id=network.tenant_id, - network_id=network.id, - name=port.name, - admin_state_up=port.admin_state_up, - device_id=port.device_id, - device_owner=port.device_owner, - binding__host_id=port.binding__host_id, - mac_address=port.mac_address, - fixed_ips=port.fixed_ips, - **extension_kwargs)\ - .AndReturn(port) - self.mox.ReplayAll() + self.mock_network_get.return_value = network + self.mock_security_group_list.return_value = \ + self.security_groups.list() + self._stub_is_extension_supported( + {'mac-learning': False, + 'binding': True, + 'port-security': True}) + self.mock_port_create.return_value = port form_data = {'network_id': port.network_id, 'network_name': network.name, @@ -243,7 +241,6 @@ class NetworkPortTests(test.BaseAdminViewTests): 'fixed_ip': port.fixed_ips[0]['ip_address'], 'subnet_id': port.fixed_ips[0]['subnet_id']} form_data['binding__vnic_type'] = port.binding__vnic_type - form_data['mac_state'] = True url = reverse('horizon:admin:networks:addport', args=[port.network_id]) res = self.client.post(url, form_data) @@ -252,6 +249,31 @@ class NetworkPortTests(test.BaseAdminViewTests): redir_url = reverse(NETWORKS_DETAIL_URL, args=[port.network_id]) self.assertRedirectsNoFollow(res, redir_url) + self.assert_mock_multiple_calls_with_same_arguments( + self.mock_network_get, 2, + mock.call(test.IsHttpRequest(), network.id)) + self._check_is_extension_supported( + {'mac-learning': 1, + 'binding': 1, + 'port-security': 1}) + self.mock_security_group_list.assert_called_once_with( + test.IsHttpRequest(), tenant_id='1') + fixed_ips = [{'ip_address': ip['ip_address']} for ip in port.fixed_ips] + self.mock_port_create.assert_called_once_with( + test.IsHttpRequest(), + tenant_id=network.tenant_id, + network_id=network.id, + name=port.name, + admin_state_up=port.admin_state_up, + device_id=port.device_id, + device_owner=port.device_owner, + binding__host_id=port.binding__host_id, + binding__vnic_type=port.binding__vnic_type, + mac_address=port.mac_address, + fixed_ips=fixed_ips, + port_security_enabled=False, + security_groups=[]) + def test_port_create_post_exception(self): self._test_port_create_post_exception() @@ -261,7 +283,7 @@ class NetworkPortTests(test.BaseAdminViewTests): def test_port_create_post_exception_with_port_security(self): self._test_port_create_post_exception(port_security=True) - @test.create_stubs({api.neutron: ('network_get', + @test.create_mocks({api.neutron: ('network_get', 'port_create', 'security_group_list', 'is_extension_supported',)}) @@ -271,41 +293,15 @@ class NetworkPortTests(test.BaseAdminViewTests): network = self.networks.first() port = self.ports.first() security_groups = self.security_groups.list() - api.neutron.network_get(IsA(http.HttpRequest), - network.id)\ - .AndReturn(self.networks.first()) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'mac-learning')\ - .AndReturn(mac_learning) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'binding') \ - .AndReturn(binding) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'port-security')\ - .AndReturn(port_security) - api.neutron.security_group_list(IsA(http.HttpRequest), - tenant_id=None)\ - .AndReturn(self.security_groups.list()) - extension_kwargs = {} - if binding: - extension_kwargs['binding__vnic_type'] = port.binding__vnic_type - if mac_learning: - extension_kwargs['mac_learning_enabled'] = True - if port_security: - extension_kwargs['port_security_enabled'] = True - extension_kwargs['wanted_groups'] = security_groups - api.neutron.port_create(IsA(http.HttpRequest), - tenant_id=network.tenant_id, - network_id=network.id, - name=port.name, - admin_state_up=port.admin_state_up, - device_id=port.device_id, - device_owner=port.device_owner, - binding__host_id=port.binding__host_id, - mac_address=port.mac_address, - **extension_kwargs)\ - .AndRaise(self.exceptions.neutron) - self.mox.ReplayAll() + sg_ids = [sg.id for sg in security_groups] + + self.mock_network_get.return_value = network + self._stub_is_extension_supported( + {'mac-learning': mac_learning, + 'binding': binding, + 'port-security': port_security}) + self.mock_security_group_list.return_value = security_groups + self.mock_port_create.side_effect = self.exceptions.neutron form_data = {'network_id': port.network_id, 'network_name': network.name, @@ -322,7 +318,8 @@ class NetworkPortTests(test.BaseAdminViewTests): form_data['mac_learning_enabled'] = True if port_security: form_data['port_security_enabled'] = True - form_data['wanted_groups'] = security_groups + form_data['default_create_security_groups_role'] = 'member' + form_data['create_security_groups_role_member'] = sg_ids url = reverse('horizon:admin:networks:addport', args=[port.network_id]) res = self.client.post(url, form_data) @@ -331,6 +328,37 @@ class NetworkPortTests(test.BaseAdminViewTests): redir_url = reverse(NETWORKS_DETAIL_URL, args=[port.network_id]) self.assertRedirectsNoFollow(res, redir_url) + self.assert_mock_multiple_calls_with_same_arguments( + self.mock_network_get, 2, + mock.call(test.IsHttpRequest(), network.id)) + self._check_is_extension_supported( + {'mac-learning': 1, + 'binding': 1, + 'port-security': 1}) + self.mock_security_group_list.assert_called_once_with( + test.IsHttpRequest(), tenant_id='1') + extension_kwargs = {} + if binding: + extension_kwargs['binding__vnic_type'] = port.binding__vnic_type + if mac_learning: + extension_kwargs['mac_learning_enabled'] = True + if port_security: + extension_kwargs['port_security_enabled'] = True + extension_kwargs['security_groups'] = sg_ids + else: + extension_kwargs['security_groups'] = [] + self.mock_port_create.assert_called_once_with( + test.IsHttpRequest(), + tenant_id=network.tenant_id, + network_id=network.id, + name=port.name, + admin_state_up=port.admin_state_up, + device_id=port.device_id, + device_owner=port.device_owner, + binding__host_id=port.binding__host_id, + mac_address=port.mac_address, + **extension_kwargs) + def test_port_update_get(self): self._test_port_update_get() @@ -340,28 +368,19 @@ class NetworkPortTests(test.BaseAdminViewTests): def test_port_update_get_with_port_security(self): self._test_port_update_get(port_security=True) - @test.create_stubs({api.neutron: ('port_get', + @test.create_mocks({api.neutron: ('port_get', 'security_group_list', 'is_extension_supported',)}) def _test_port_update_get(self, mac_learning=False, binding=False, port_security=False): port = self.ports.first() - api.neutron.port_get(IsA(http.HttpRequest), - port.id)\ - .AndReturn(port) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'binding') \ - .AndReturn(binding) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'mac-learning')\ - .AndReturn(mac_learning) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'port-security')\ - .AndReturn(port_security) - api.neutron.security_group_list(IsA(http.HttpRequest), - tenant_id=None)\ - .AndReturn(self.security_groups.list()) - self.mox.ReplayAll() + self.mock_port_get.return_value = port + self._stub_is_extension_supported( + {'binding': binding, + 'mac-learning': mac_learning, + 'port-security': port_security}) + self.mock_security_group_list.return_value = \ + self.security_groups.list() url = reverse('horizon:admin:networks:editport', args=[port.network_id, port.id]) @@ -369,6 +388,16 @@ class NetworkPortTests(test.BaseAdminViewTests): self.assertTemplateUsed(res, views.WorkflowView.template_name) + self.assert_mock_multiple_calls_with_same_arguments( + self.mock_port_get, 2, + mock.call(test.IsHttpRequest(), port.id)) + self._check_is_extension_supported( + {'binding': 1, + 'mac-learning': 1, + 'port-security': 1}) + self.mock_security_group_list.assert_called_once_with( + test.IsHttpRequest(), tenant_id='1') + def test_port_update_post(self): self._test_port_update_post() @@ -378,44 +407,21 @@ class NetworkPortTests(test.BaseAdminViewTests): def test_port_update_post_with_port_security(self): self._test_port_update_post(port_security=True) - @test.create_stubs({api.neutron: ('port_get', + @test.create_mocks({api.neutron: ('port_get', 'is_extension_supported', 'security_group_list', 'port_update')}) def _test_port_update_post(self, mac_learning=False, binding=False, port_security=False): port = self.ports.first() - api.neutron.port_get(IsA(http.HttpRequest), port.id)\ - .AndReturn(port) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'binding')\ - .MultipleTimes().AndReturn(binding) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'mac-learning')\ - .MultipleTimes().AndReturn(mac_learning) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'port-security')\ - .MultipleTimes().AndReturn(port_security) - api.neutron.security_group_list(IsA(http.HttpRequest), - tenant_id=None)\ - .AndReturn(self.security_groups.list()) - extension_kwargs = {} - if binding: - extension_kwargs['binding__vnic_type'] = port.binding__vnic_type - if mac_learning: - extension_kwargs['mac_learning_enabled'] = True - if port_security: - extension_kwargs['port_security_enabled'] = True - api.neutron.port_update(IsA(http.HttpRequest), port.id, - name=port.name, - admin_state_up=port.admin_state_up, - device_id=port.device_id, - device_owner=port.device_owner, - binding__host_id=port.binding__host_id, - mac_address=port.mac_address, - **extension_kwargs)\ - .AndReturn(port) - self.mox.ReplayAll() + self.mock_port_get.return_value = port + self._stub_is_extension_supported( + {'binding': binding, + 'mac-learning': mac_learning, + 'port-security': port_security}) + self.mock_security_group_list.return_value = \ + self.security_groups.list() + self.mock_port_update.return_value = port form_data = {'network_id': port.network_id, 'port_id': port.id, @@ -439,6 +445,33 @@ class NetworkPortTests(test.BaseAdminViewTests): redir_url = reverse(NETWORKS_DETAIL_URL, args=[port.network_id]) self.assertRedirectsNoFollow(res, redir_url) + self.assert_mock_multiple_calls_with_same_arguments( + self.mock_port_get, 2, + mock.call(test.IsHttpRequest(), port.id)) + self._check_is_extension_supported( + {'binding': 1, + 'mac-learning': 1, + 'port-security': 1}) + self.mock_security_group_list.assert_called_once_with( + test.IsHttpRequest(), tenant_id='1') + extension_kwargs = {} + if binding: + extension_kwargs['binding__vnic_type'] = port.binding__vnic_type + if mac_learning: + extension_kwargs['mac_learning_enabled'] = True + if port_security: + extension_kwargs['port_security_enabled'] = True + self.mock_port_update.assert_called_once_with( + test.IsHttpRequest(), port.id, + name=port.name, + admin_state_up=port.admin_state_up, + device_id=port.device_id, + device_owner=port.device_owner, + binding__host_id=port.binding__host_id, + mac_address=port.mac_address, + security_groups=[], + **extension_kwargs) + def test_port_update_post_exception(self): self._test_port_update_post_exception() @@ -448,7 +481,7 @@ class NetworkPortTests(test.BaseAdminViewTests): def test_port_update_post_exception_with_port_security(self): self._test_port_update_post_exception(port_security=True) - @test.create_stubs({api.neutron: ('port_get', + @test.create_mocks({api.neutron: ('port_get', 'is_extension_supported', 'security_group_list', 'port_update')}) @@ -456,37 +489,14 @@ class NetworkPortTests(test.BaseAdminViewTests): binding=False, port_security=False): port = self.ports.first() - api.neutron.port_get(IsA(http.HttpRequest), port.id)\ - .AndReturn(port) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'binding')\ - .MultipleTimes().AndReturn(binding) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'mac-learning')\ - .MultipleTimes().AndReturn(mac_learning) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'port-security')\ - .MultipleTimes().AndReturn(port_security) - api.neutron.security_group_list(IsA(http.HttpRequest), - tenant_id=None)\ - .AndReturn(self.security_groups.list()) - extension_kwargs = {} - if binding: - extension_kwargs['binding__vnic_type'] = port.binding__vnic_type - if mac_learning: - extension_kwargs['mac_learning_enabled'] = True - if port_security: - extension_kwargs['port_security_enabled'] = True - api.neutron.port_update(IsA(http.HttpRequest), port.id, - name=port.name, - admin_state_up=port.admin_state_up, - device_id=port.device_id, - device_owner=port.device_owner, - binding__host_id=port.binding__host_id, - mac_address=port.mac_address, - **extension_kwargs)\ - .AndRaise(self.exceptions.neutron) - self.mox.ReplayAll() + self.mock_port_get.return_value = port + self._stub_is_extension_supported( + {'binding': binding, + 'mac-learning': mac_learning, + 'port-security': port_security}) + self.mock_security_group_list.return_value = \ + self.security_groups.list() + self.mock_port_update.side_effect = self.exceptions.neutron form_data = {'network_id': port.network_id, 'port_id': port.id, @@ -509,36 +519,52 @@ class NetworkPortTests(test.BaseAdminViewTests): redir_url = reverse(NETWORKS_DETAIL_URL, args=[port.network_id]) self.assertRedirectsNoFollow(res, redir_url) - @test.create_stubs({api.neutron: ('port_delete', - 'subnet_list', - 'port_list', - 'show_network_ip_availability', - 'is_extension_supported', - 'list_dhcp_agent_hosting_networks',)}) + self.assert_mock_multiple_calls_with_same_arguments( + self.mock_port_get, 2, + mock.call(test.IsHttpRequest(), port.id)) + self._check_is_extension_supported( + {'binding': 1, + 'mac-learning': 1, + 'port-security': 1}) + self.mock_security_group_list.assert_called_once_with( + test.IsHttpRequest(), tenant_id='1') + extension_kwargs = {} + if binding: + extension_kwargs['binding__vnic_type'] = port.binding__vnic_type + if mac_learning: + extension_kwargs['mac_learning_enabled'] = True + if port_security: + extension_kwargs['port_security_enabled'] = True + self.mock_port_update.assert_called_once_with( + test.IsHttpRequest(), port.id, + name=port.name, + admin_state_up=port.admin_state_up, + device_id=port.device_id, + device_owner=port.device_owner, + binding__host_id=port.binding__host_id, + mac_address=port.mac_address, + security_groups=[], + **extension_kwargs) + def test_port_delete(self): self._test_port_delete() - @test.create_stubs({api.neutron: ('port_delete', + def test_port_delete_with_mac_learning(self): + self._test_port_delete(mac_learning=True) + + @test.create_mocks({api.neutron: ('port_delete', 'subnet_list', 'port_list', 'show_network_ip_availability', 'is_extension_supported', 'list_dhcp_agent_hosting_networks',)}) - def test_port_delete_with_mac_learning(self): - self._test_port_delete(mac_learning=True) - def _test_port_delete(self, mac_learning=False): port = self.ports.first() network_id = port.network_id - api.neutron.port_list(IsA(http.HttpRequest), network_id=network_id)\ - .AndReturn([self.ports.first()]) - api.neutron.is_extension_supported( - IsA(http.HttpRequest), - 'network-ip-availability').AndReturn(True) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'mac-learning')\ - .AndReturn(mac_learning) - self.mox.ReplayAll() + self.mock_port_list.return_value = self.ports.list() + self._stub_is_extension_supported( + {'network-ip-availability': True, + 'mac-learning': mac_learning}) form_data = {'action': 'ports__delete__%s' % port.id} url = reverse(NETWORKS_DETAIL_URL, args=[network_id]) @@ -546,41 +572,44 @@ class NetworkPortTests(test.BaseAdminViewTests): self.assertRedirectsNoFollow(res, url) - @test.create_stubs({api.neutron: ('port_delete', - 'subnet_list', - 'port_list', - 'show_network_ip_availability', - 'is_extension_supported', - 'list_dhcp_agent_hosting_networks',)}) + self.mock_port_list.assert_called_once_with(test.IsHttpRequest(), + network_id=network_id) + self._check_is_extension_supported( + {'network-ip-availability': 1, + 'mac-learning': 1}) + def test_port_delete_exception(self): self._test_port_delete_exception() - @test.create_stubs({api.neutron: ('port_delete', + def test_port_delete_exception_with_mac_learning(self): + self._test_port_delete_exception(mac_learning=True) + + @test.create_mocks({api.neutron: ('port_delete', 'subnet_list', 'port_list', 'show_network_ip_availability', 'is_extension_supported', 'list_dhcp_agent_hosting_networks')}) - def test_port_delete_exception_with_mac_learning(self): - self._test_port_delete_exception(mac_learning=True) - def _test_port_delete_exception(self, mac_learning=False): port = self.ports.first() network_id = port.network_id - api.neutron.port_delete(IsA(http.HttpRequest), port.id)\ - .AndRaise(self.exceptions.neutron) - api.neutron.port_list(IsA(http.HttpRequest), network_id=network_id)\ - .AndReturn([self.ports.first()]) - api.neutron.is_extension_supported( - IsA(http.HttpRequest), - 'network-ip-availability').AndReturn(True) - api.neutron.is_extension_supported(IsA(http.HttpRequest), - 'mac-learning')\ - .AndReturn(mac_learning) - self.mox.ReplayAll() + + self.mock_port_delete.side_effect = self.exceptions.neutron + self.mock_port_list.return_value = [self.ports.first()] + self._stub_is_extension_supported( + {'network-ip-availability': True, + 'mac-learning': mac_learning}) form_data = {'action': 'ports__delete__%s' % port.id} url = reverse(NETWORKS_DETAIL_URL, args=[network_id]) res = self.client.post(url, form_data) self.assertRedirectsNoFollow(res, url) + + self.mock_port_delete.assert_called_once_with(test.IsHttpRequest(), + port.id) + self.mock_port_list.assert_called_once_with(test.IsHttpRequest(), + network_id=network_id) + self._check_is_extension_supported( + {'network-ip-availability': 1, + 'mac-learning': 1})