mock.assert_called_once() is not a valid method
mock.assert_called_once() is a no-op that tests nothing. Instead mock.assert_called_once_with() should be used (or use assertEqual(1, mock_obj.call_count) if you don't want to check parameters). Borrowed HACKING rule from Davanum Srinivas's nova patch to prevent it from appearing again. Change-Id: Idac1d3c89c07e13c9a209663f4e557fcb7547821 Closes-Bug: #1365751 Closes-Bug: #1300265
This commit is contained in:
parent
160dac816b
commit
5f53212853
@ -12,6 +12,7 @@ Neutron Specific Commandments
|
|||||||
- [N321] Validate that jsonutils module is used instead of json
|
- [N321] Validate that jsonutils module is used instead of json
|
||||||
- [N322] We do not use @authors tags in source files. We have git to track
|
- [N322] We do not use @authors tags in source files. We have git to track
|
||||||
authorship.
|
authorship.
|
||||||
|
- [N323] assert_called_once() is not a valid method
|
||||||
|
|
||||||
Creating Unit Tests
|
Creating Unit Tests
|
||||||
-------------------
|
-------------------
|
||||||
|
@ -79,7 +79,19 @@ def no_author_tags(physical_line):
|
|||||||
return pos, "N322: Don't use author tags"
|
return pos, "N322: Don't use author tags"
|
||||||
|
|
||||||
|
|
||||||
|
def check_assert_called_once(logical_line, filename):
|
||||||
|
msg = ("N323: assert_called_once is a no-op. please use "
|
||||||
|
"assert_called_once_with to test with explicit parameters or an "
|
||||||
|
"assertEqual with call_count.")
|
||||||
|
|
||||||
|
if 'neutron/tests/' in filename:
|
||||||
|
pos = logical_line.find('.assert_called_once(')
|
||||||
|
if pos != -1:
|
||||||
|
yield (pos, msg)
|
||||||
|
|
||||||
|
|
||||||
def factory(register):
|
def factory(register):
|
||||||
register(validate_log_translations)
|
register(validate_log_translations)
|
||||||
register(use_jsonutils)
|
register(use_jsonutils)
|
||||||
register(no_author_tags)
|
register(no_author_tags)
|
||||||
|
register(check_assert_called_once)
|
||||||
|
@ -68,10 +68,11 @@ class TestCiscoApicMechDriver(base.BaseTestCase,
|
|||||||
self.driver.apic_manager.apic.transaction = self.fake_transaction
|
self.driver.apic_manager.apic.transaction = self.fake_transaction
|
||||||
|
|
||||||
def test_initialize(self):
|
def test_initialize(self):
|
||||||
mgr = self.driver.apic_manager
|
|
||||||
self.driver.initialize()
|
self.driver.initialize()
|
||||||
mgr.ensure_infra_created_on_apic.assert_called_once()
|
mgr = self.driver.apic_manager
|
||||||
mgr.ensure_bgp_pod_policy_created_on_apic.assert_called_once()
|
self.assertEqual(1, mgr.ensure_infra_created_on_apic.call_count)
|
||||||
|
self.assertEqual(1,
|
||||||
|
mgr.ensure_bgp_pod_policy_created_on_apic.call_count)
|
||||||
|
|
||||||
def test_update_port_postcommit(self):
|
def test_update_port_postcommit(self):
|
||||||
net_ctx = self._get_network_context(mocked.APIC_TENANT,
|
net_ctx = self._get_network_context(mocked.APIC_TENANT,
|
||||||
@ -99,7 +100,7 @@ class TestCiscoApicMechDriver(base.BaseTestCase,
|
|||||||
self.driver.update_port_postcommit(port_ctx)
|
self.driver.update_port_postcommit(port_ctx)
|
||||||
mgr.get_router_contract.assert_called_once_with(
|
mgr.get_router_contract.assert_called_once_with(
|
||||||
port_ctx.current['device_id'])
|
port_ctx.current['device_id'])
|
||||||
mgr.ensure_context_enforced.assert_called_once()
|
self.assertEqual(1, mgr.ensure_context_enforced.call_count)
|
||||||
mgr.ensure_external_routed_network_created.assert_called_once_with(
|
mgr.ensure_external_routed_network_created.assert_called_once_with(
|
||||||
mocked.APIC_NETWORK, transaction='transaction')
|
mocked.APIC_NETWORK, transaction='transaction')
|
||||||
mgr.ensure_logical_node_profile_created.assert_called_once_with(
|
mgr.ensure_logical_node_profile_created.assert_called_once_with(
|
||||||
@ -119,17 +120,6 @@ class TestCiscoApicMechDriver(base.BaseTestCase,
|
|||||||
mocked.APIC_NETWORK, mgr.get_router_contract.return_value,
|
mocked.APIC_NETWORK, mgr.get_router_contract.return_value,
|
||||||
transaction='transaction')
|
transaction='transaction')
|
||||||
|
|
||||||
def test_update_gw_port_postcommit_fail_contract_create(self):
|
|
||||||
net_ctx = self._get_network_context(mocked.APIC_TENANT,
|
|
||||||
mocked.APIC_NETWORK,
|
|
||||||
TEST_SEGMENT1, external=True)
|
|
||||||
port_ctx = self._get_port_context(mocked.APIC_TENANT,
|
|
||||||
mocked.APIC_NETWORK,
|
|
||||||
'vm1', net_ctx, HOST_ID1, gw=True)
|
|
||||||
mgr = self.driver.apic_manager
|
|
||||||
self.driver.update_port_postcommit(port_ctx)
|
|
||||||
mgr.ensure_external_routed_network_deleted.assert_called_once()
|
|
||||||
|
|
||||||
def test_create_network_postcommit(self):
|
def test_create_network_postcommit(self):
|
||||||
ctx = self._get_network_context(mocked.APIC_TENANT,
|
ctx = self._get_network_context(mocked.APIC_TENANT,
|
||||||
mocked.APIC_NETWORK,
|
mocked.APIC_NETWORK,
|
||||||
|
@ -62,10 +62,10 @@ class TestCiscoApicSync(base.BaseTestCase):
|
|||||||
sync.core_plugin.get_ports.return_value = [{'id': 'port',
|
sync.core_plugin.get_ports.return_value = [{'id': 'port',
|
||||||
'network_id': 'net'}]
|
'network_id': 'net'}]
|
||||||
sync.sync_base()
|
sync.sync_base()
|
||||||
self.driver.create_network_postcommit.assert_called_once()
|
self.assertEqual(1, self.driver.create_network_postcommit.call_count)
|
||||||
self.driver.create_subnet_postcommit.assert_called_once()
|
self.assertEqual(1, self.driver.create_subnet_postcommit.call_count)
|
||||||
self.get_locked_port_and_binding.assert_called_once()
|
self.assertEqual(1, self.get_locked_port_and_binding.call_count)
|
||||||
self.driver.create_port_postcommit.assert_called_once()
|
self.assertEqual(1, self.driver.create_port_postcommit.call_count)
|
||||||
|
|
||||||
def test_sync_router(self):
|
def test_sync_router(self):
|
||||||
sync = apic_sync.ApicRouterSynchronizer(self.driver)
|
sync = apic_sync.ApicRouterSynchronizer(self.driver)
|
||||||
@ -74,4 +74,5 @@ class TestCiscoApicSync(base.BaseTestCase):
|
|||||||
'network_id': 'net',
|
'network_id': 'net',
|
||||||
'device_id': 'dev'}]
|
'device_id': 'dev'}]
|
||||||
sync.sync_router()
|
sync.sync_router()
|
||||||
self.driver.add_router_interface_postcommit.assert_called_once()
|
self.assertEqual(
|
||||||
|
1, self.driver.add_router_interface_postcommit.call_count)
|
||||||
|
@ -120,7 +120,8 @@ class TestCiscoApicL3Plugin(testlib_api.SqlTestCase,
|
|||||||
mgr = self.plugin.manager
|
mgr = self.plugin.manager
|
||||||
self.plugin.remove_router_interface(self.context, ROUTER,
|
self.plugin.remove_router_interface(self.context, ROUTER,
|
||||||
interface_info)
|
interface_info)
|
||||||
mgr.delete_contract_for_epg.assert_called_once()
|
mgr.remove_router_interface.assert_called_once_with(
|
||||||
|
mocked.APIC_TENANT, mocked.APIC_ROUTER, mocked.APIC_NETWORK)
|
||||||
|
|
||||||
def test_add_router_interface_subnet(self):
|
def test_add_router_interface_subnet(self):
|
||||||
self._test_add_router_interface(self.interface_info['subnet'])
|
self._test_add_router_interface(self.interface_info['subnet'])
|
||||||
|
@ -19,6 +19,7 @@ import mock
|
|||||||
from oslo.config import cfg
|
from oslo.config import cfg
|
||||||
from six.moves import queue as Queue
|
from six.moves import queue as Queue
|
||||||
|
|
||||||
|
from neutron.api.v2 import attributes
|
||||||
from neutron import context
|
from neutron import context
|
||||||
from neutron.extensions import loadbalancer
|
from neutron.extensions import loadbalancer
|
||||||
from neutron import manager
|
from neutron import manager
|
||||||
@ -155,6 +156,16 @@ class TestLoadBalancerPlugin(TestLoadBalancerPluginBase):
|
|||||||
"""Call _get_pip twice and verify that a Port is created once."""
|
"""Call _get_pip twice and verify that a Port is created once."""
|
||||||
port_dict = {'fixed_ips': [{'subnet_id': '10.10.10.10',
|
port_dict = {'fixed_ips': [{'subnet_id': '10.10.10.10',
|
||||||
'ip_address': '11.11.11.11'}]}
|
'ip_address': '11.11.11.11'}]}
|
||||||
|
port_data = {
|
||||||
|
'tenant_id': 'tenant_id',
|
||||||
|
'name': 'port_name',
|
||||||
|
'network_id': 'network_id',
|
||||||
|
'mac_address': attributes.ATTR_NOT_SPECIFIED,
|
||||||
|
'admin_state_up': False,
|
||||||
|
'device_id': '',
|
||||||
|
'device_owner': 'neutron:' + constants.LOADBALANCER,
|
||||||
|
'fixed_ips': [{'subnet_id': '10.10.10.10'}]
|
||||||
|
}
|
||||||
self.plugin_instance._core_plugin.get_ports = mock.Mock(
|
self.plugin_instance._core_plugin.get_ports = mock.Mock(
|
||||||
return_value=[])
|
return_value=[])
|
||||||
self.plugin_instance._core_plugin.create_port = mock.Mock(
|
self.plugin_instance._core_plugin.create_port = mock.Mock(
|
||||||
@ -163,15 +174,18 @@ class TestLoadBalancerPlugin(TestLoadBalancerPluginBase):
|
|||||||
radware_driver._get_pip(context.get_admin_context(),
|
radware_driver._get_pip(context.get_admin_context(),
|
||||||
'tenant_id', 'port_name',
|
'tenant_id', 'port_name',
|
||||||
'network_id', '10.10.10.10')
|
'network_id', '10.10.10.10')
|
||||||
self.plugin_instance._core_plugin.get_ports.assert_called_once()
|
self.plugin_instance._core_plugin.get_ports.assert_called_once_with(
|
||||||
self.plugin_instance._core_plugin.create_port.assert_called_once()
|
mock.ANY, filters={'name': ['port_name']})
|
||||||
|
self.plugin_instance._core_plugin.create_port.assert_called_once_with(
|
||||||
|
mock.ANY, {'port': port_data})
|
||||||
self.plugin_instance._core_plugin.create_port.reset_mock()
|
self.plugin_instance._core_plugin.create_port.reset_mock()
|
||||||
self.plugin_instance._core_plugin.get_ports.reset_mock()
|
self.plugin_instance._core_plugin.get_ports.reset_mock()
|
||||||
self.plugin_instance._core_plugin.get_ports.return_value = [port_dict]
|
self.plugin_instance._core_plugin.get_ports.return_value = [port_dict]
|
||||||
radware_driver._get_pip(context.get_admin_context(),
|
radware_driver._get_pip(context.get_admin_context(),
|
||||||
'tenant_id', 'port_name',
|
'tenant_id', 'port_name',
|
||||||
'network_id', '10.10.10.10')
|
'network_id', '10.10.10.10')
|
||||||
self.plugin_instance._core_plugin.get_ports.assert_called_once()
|
self.plugin_instance._core_plugin.get_ports.assert_called_once_with(
|
||||||
|
mock.ANY, filters={'name': ['port_name']})
|
||||||
self.assertFalse(self.plugin_instance._core_plugin.create_port.called)
|
self.assertFalse(self.plugin_instance._core_plugin.create_port.called)
|
||||||
|
|
||||||
def test_rest_client_recover_was_called(self):
|
def test_rest_client_recover_was_called(self):
|
||||||
@ -181,7 +195,9 @@ class TestLoadBalancerPlugin(TestLoadBalancerPluginBase):
|
|||||||
radware_driver.rest_client._call = self.orig__call
|
radware_driver.rest_client._call = self.orig__call
|
||||||
self.assertRaises(r_exc.RESTRequestFailure,
|
self.assertRaises(r_exc.RESTRequestFailure,
|
||||||
radware_driver._verify_workflow_templates)
|
radware_driver._verify_workflow_templates)
|
||||||
self.recover_mock.assert_called_once()
|
self.recover_mock.assert_called_once_with('GET',
|
||||||
|
'/api/workflowTemplate',
|
||||||
|
None, None, False)
|
||||||
|
|
||||||
def test_rest_client_flip_servers(self):
|
def test_rest_client_flip_servers(self):
|
||||||
radware_driver = self.plugin_instance.drivers['radware']
|
radware_driver = self.plugin_instance.drivers['radware']
|
||||||
|
@ -79,3 +79,21 @@ class HackingTestCase(base.BaseTestCase):
|
|||||||
self.assertEqual(2, checks.no_author_tags("# author: pele")[0])
|
self.assertEqual(2, checks.no_author_tags("# author: pele")[0])
|
||||||
self.assertEqual(2, checks.no_author_tags("# Author: pele")[0])
|
self.assertEqual(2, checks.no_author_tags("# Author: pele")[0])
|
||||||
self.assertEqual(3, checks.no_author_tags(".. moduleauthor:: pele")[0])
|
self.assertEqual(3, checks.no_author_tags(".. moduleauthor:: pele")[0])
|
||||||
|
|
||||||
|
def test_assert_called_once(self):
|
||||||
|
fail_code = """
|
||||||
|
mock = Mock()
|
||||||
|
mock.method(1, 2, 3, test='wow')
|
||||||
|
mock.method.assert_called_once()
|
||||||
|
"""
|
||||||
|
pass_code = """
|
||||||
|
mock = Mock()
|
||||||
|
mock.method(1, 2, 3, test='wow')
|
||||||
|
mock.method.assert_called_once_with()
|
||||||
|
"""
|
||||||
|
self.assertEqual(
|
||||||
|
1, len(list(checks.check_assert_called_once(fail_code,
|
||||||
|
"neutron/tests/test_assert.py"))))
|
||||||
|
self.assertEqual(
|
||||||
|
0, len(list(checks.check_assert_called_once(pass_code,
|
||||||
|
"neutron/tests/test_assert.py"))))
|
||||||
|
@ -1745,25 +1745,25 @@ vrrp_instance VR_1 {
|
|||||||
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
||||||
agent._queue = mock.Mock()
|
agent._queue = mock.Mock()
|
||||||
agent.router_deleted(None, FAKE_ID)
|
agent.router_deleted(None, FAKE_ID)
|
||||||
agent._queue.add.assert_called_once()
|
self.assertEqual(1, agent._queue.add.call_count)
|
||||||
|
|
||||||
def test_routers_updated(self):
|
def test_routers_updated(self):
|
||||||
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
||||||
agent._queue = mock.Mock()
|
agent._queue = mock.Mock()
|
||||||
agent.routers_updated(None, [FAKE_ID])
|
agent.routers_updated(None, [FAKE_ID])
|
||||||
agent._queue.add.assert_called_once()
|
self.assertEqual(1, agent._queue.add.call_count)
|
||||||
|
|
||||||
def test_removed_from_agent(self):
|
def test_removed_from_agent(self):
|
||||||
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
||||||
agent._queue = mock.Mock()
|
agent._queue = mock.Mock()
|
||||||
agent.router_removed_from_agent(None, {'router_id': FAKE_ID})
|
agent.router_removed_from_agent(None, {'router_id': FAKE_ID})
|
||||||
agent._queue.add.assert_called_once()
|
self.assertEqual(1, agent._queue.add.call_count)
|
||||||
|
|
||||||
def test_added_to_agent(self):
|
def test_added_to_agent(self):
|
||||||
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
||||||
agent._queue = mock.Mock()
|
agent._queue = mock.Mock()
|
||||||
agent.router_added_to_agent(None, [FAKE_ID])
|
agent.router_added_to_agent(None, [FAKE_ID])
|
||||||
agent._queue.add.assert_called_once()
|
self.assertEqual(1, agent._queue.add.call_count)
|
||||||
|
|
||||||
def test_destroy_fip_namespace(self):
|
def test_destroy_fip_namespace(self):
|
||||||
class FakeDev(object):
|
class FakeDev(object):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user