def test_update_with_keystone_can_edit_user_false(self): user = self.users.get(id="1") domain_id = user.domain_id domain = self.domains.get(id=domain_id) api.keystone.user_get(IsA(http.HttpRequest), '1', admin=True).AndReturn(user) api.keystone.domain_get(IsA(http.HttpRequest), domain_id) \ .AndReturn(domain) api.keystone.tenant_list(IgnoreArg(), domain=domain_id, user=user.id) \ .AndReturn([self.tenants.list(), False]) api.keystone.keystone_can_edit_user().AndReturn(False) api.keystone.keystone_can_edit_user().AndReturn(False) self.mox.ReplayAll() formData = {'method': 'UpdateUserForm', 'id': user.id, 'name': user.name, 'project': self.tenant.id, } res = self.client.post(USER_UPDATE_URL, formData) self.assertNoFormErrors(res) self.assertMessageCount(error=1)
def test_get_update_form_init_values(self): user = self.users.get(id="1") domain_id = user.domain_id domain = self.domains.get(id=domain_id) api.keystone.user_get(IsA(http.HttpRequest), '1', admin=True).AndReturn(user) api.keystone.domain_get(IsA(http.HttpRequest), domain_id).AndReturn(domain) api.keystone.tenant_list(IgnoreArg(), domain=domain_id, user=user.id) \ .AndReturn([self.tenants.list(), False]) self.mox.ReplayAll() res = self.client.get(USER_UPDATE_URL) # Check that the form contains the default values as initialized by # the UpdateView self.assertEqual(res.context['form']['name'].value(), user.name) self.assertEqual(res.context['form']['email'].value(), user.email) self.assertEqual(res.context['form']['description'].value(), user.description) self.assertEqual(res.context['form']['project'].value(), user.project_id) self.assertEqual(res.context['form']['domain_id'].value(), user.domain_id) self.assertEqual(res.context['form']['domain_name'].value(), domain.name)
def test_router_delete(self): router = self.routers.first() tenants = self.tenants.list() api.neutron.router_list(IsA(http.HttpRequest)).AndReturn( self.routers.list()) api.keystone.tenant_list(IsA(http.HttpRequest))\ .AndReturn([tenants, False]) self._mock_external_network_list() api.neutron.router_list(IsA(http.HttpRequest)).AndReturn( self.routers.list()) api.keystone.tenant_list(IsA(http.HttpRequest))\ .AndReturn([tenants, False]) self._mock_external_network_list() api.neutron.port_list(IsA(http.HttpRequest), device_id=router.id, device_owner=IgnoreArg())\ .AndReturn([]) api.neutron.router_delete(IsA(http.HttpRequest), router.id) api.neutron.router_list(IsA(http.HttpRequest)).AndReturn( self.routers.list()) api.keystone.tenant_list(IsA(http.HttpRequest))\ .AndReturn([tenants, False]) self._mock_external_network_list() self.mox.ReplayAll() res = self.client.get(self.INDEX_URL) formData = {'action': 'routers__delete__' + router.id} res = self.client.post(self.INDEX_URL, formData, follow=True) self.assertNoFormErrors(res) self.assertMessageCount(response=res, success=1) self.assertIn('Deleted Router: ' + router.name, res.content.decode('utf-8'))
def test_update_different_description(self): user = self.users.get(id="1") domain_id = user.domain_id domain = self.domains.get(id=domain_id) api.keystone.user_get(IsA(http.HttpRequest), '1', admin=True).AndReturn(user) api.keystone.domain_get(IsA(http.HttpRequest), domain_id).AndReturn(domain) api.keystone.tenant_list(IgnoreArg(), domain=domain_id, user=user.id) \ .AndReturn([self.tenants.list(), False]) api.keystone.user_update(IsA(http.HttpRequest), user.id, email=user.email, name=user.name, project=self.tenant.id, description='changed').AndReturn(None) self.mox.ReplayAll() formData = {'method': 'UpdateUserForm', 'id': user.id, 'name': user.name, 'description': 'changed', 'email': user.email, 'project': self.tenant.id} res = self.client.post(USER_UPDATE_URL, formData) self.assertNoFormErrors(res)
def test_delete_group(self): domain_id = self._get_domain_id() group = self.groups.get(id="2") domain = self.domains.get(id="1") api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.group_list(IgnoreArg(), domain=domain_id) \ .AndReturn(self.groups.list()) api.keystone.group_delete(IgnoreArg(), group.id) self.mox.ReplayAll() formData = {'action': 'groups__delete__%s' % group.id} res = self.client.post(GROUPS_INDEX_URL, formData) self.assertRedirectsNoFollow(res, GROUPS_INDEX_URL)
def test_index_with_domain(self): domain = self.domains.get(id="1") self.setSessionValues(domain_context=domain.id, domain_context_name=domain.name) groups = self._get_groups(domain.id) api.keystone.get_effective_domain_id(IgnoreArg()).AndReturn(domain.id) api.keystone.group_list(IsA(http.HttpRequest), domain=domain.id).AndReturn(groups) self.mox.ReplayAll() res = self.client.get(GROUPS_INDEX_URL) self.assertTemplateUsed(res, constants.GROUPS_INDEX_VIEW_TEMPLATE) self.assertItemsEqual(res.context['table'].data, groups) if domain.id: for group in res.context['table'].data: self.assertItemsEqual(group.domain_id, domain.id) self.assertContains(res, 'Create Group') self.assertContains(res, 'Edit') self.assertContains(res, 'Delete Group')
def test_router_delete(self): router = self.routers.first() quota_data = self.neutron_quota_usages.first() api.neutron.router_list(IsA(http.HttpRequest), tenant_id=self.tenant.id).AndReturn( self.routers.list()) quotas.tenant_quota_usages( IsA(http.HttpRequest), targets=('routers', )) \ .MultipleTimes().AndReturn(quota_data) api.neutron.is_extension_supported(IsA(http.HttpRequest), "router_availability_zone")\ .MultipleTimes().AndReturn(True) self._mock_external_network_list() api.neutron.router_list(IsA(http.HttpRequest), tenant_id=self.tenant.id).AndReturn( self.routers.list()) self._mock_external_network_list() api.neutron.router_list(IsA(http.HttpRequest), tenant_id=self.tenant.id).AndReturn( self.routers.list()) self._mock_external_network_list() api.neutron.port_list(IsA(http.HttpRequest), device_id=router.id, device_owner=IgnoreArg())\ .AndReturn([]) api.neutron.router_delete(IsA(http.HttpRequest), router.id) self.mox.ReplayAll() res = self.client.get(self.INDEX_URL) formData = {'action': 'routers__delete__' + router.id} res = self.client.post(self.INDEX_URL, formData, follow=True) self.assertNoFormErrors(res) self.assertMessageCount(response=res, success=1) self.assertIn('Deleted Router: ' + router.name, res.content.decode('utf-8'))
def test_router_delete(self): router = self.routers.first() quota_data = self.quota_usages.first() quota_data['routers']['available'] = 5 api.neutron.router_list(IsA(http.HttpRequest), tenant_id=self.tenant.id, search_opts=None).AndReturn( self.routers.list()) quotas.tenant_quota_usages( IsA(http.HttpRequest)) \ .MultipleTimes().AndReturn(quota_data) self._mock_external_network_list() api.neutron.router_list(IsA(http.HttpRequest), tenant_id=self.tenant.id, search_opts=None).AndReturn( self.routers.list()) self._mock_external_network_list() api.neutron.router_list(IsA(http.HttpRequest), tenant_id=self.tenant.id, search_opts=None).AndReturn( self.routers.list()) self._mock_external_network_list() api.neutron.port_list(IsA(http.HttpRequest), device_id=router.id, device_owner=IgnoreArg())\ .AndReturn([]) api.neutron.router_delete(IsA(http.HttpRequest), router.id) self.mox.ReplayAll() res = self.client.get(self.INDEX_URL) formData = {'action': 'Routers__delete__' + router.id} res = self.client.post(self.INDEX_URL, formData, follow=True) self.assertNoFormErrors(res) self.assertMessageCount(response=res, success=1) self.assertIn('Deleted Router: ' + router.name, res.content)
def test_index_with_domain_context(self): domain = self.domains.get(id="1") filters = {} self.setSessionValues(domain_context=domain.id, domain_context_name=domain.name) domain_tenants = [ tenant for tenant in self.tenants.list() if tenant.domain_id == domain.id ] api.keystone.tenant_list(IsA(http.HttpRequest), domain=domain.id, paginate=True, marker=None, filters=filters) \ .AndReturn([domain_tenants, False]) api.keystone.domain_lookup(IgnoreArg()).AndReturn( {domain.id: domain.name}) quotas.enabled_quotas(IsA(http.HttpRequest)).AndReturn(('instances', )) self.mox.ReplayAll() res = self.client.get(INDEX_URL) self.assertTemplateUsed(res, 'identity/projects/index.html') self.assertItemsEqual(res.context['table'].data, domain_tenants) self.assertContains(res, "<em>test_domain:</em>")
def _test_base_index(self): api.base.is_service_enabled(IsA(http.HttpRequest), IgnoreArg()) \ .MultipleTimes().AndReturn(True) services = self.services.list() api.nova.service_list(IsA(http.HttpRequest)).AndReturn(services) api.neutron.is_extension_supported(IsA(http.HttpRequest), 'agent').AndReturn(True) agents = self.agents.list() api.neutron.agent_list(IsA(http.HttpRequest)).AndReturn(agents) cinder_services = self.cinder_services.list() api.cinder.service_list(IsA(http.HttpRequest)).\ AndReturn(cinder_services) heat_services = self.heat_services.list() api.heat.service_list(IsA(http.HttpRequest)).\ AndReturn(heat_services) self.mox.ReplayAll() res = self.client.get(INDEX_URL) self.assertTemplateUsed(res, 'admin/info/index.html') return res
def test_ajax_loading_instances(self): server = self.servers.first() flavor = self.flavors.list()[0] tenant = self.tenants.list()[0] api.nova.server_get(IsA(http.HttpRequest), server.id) \ .AndReturn(objectify.objectify(server)) api.nova.extension_supported('AdminActions', IsA(http.HttpRequest)) \ .MultipleTimes().AndReturn(True) api.nova.extension_supported('Shelve', IsA(http.HttpRequest)) \ .MultipleTimes().AndReturn(True) api.nova.flavor_get(IsA(http.HttpRequest), server.flavor['id']).AndReturn(flavor) api.network.servers_update_addresses(IsA(http.HttpRequest), IgnoreArg()) api.keystone.tenant_get(IsA(http.HttpRequest), server.tenant_id, admin=True).AndReturn(tenant) self.mox.ReplayAll() url = (INDEX_URL + "?action=row_update&table=instances&obj_id=" + server.id) res = self.client.get(url, {}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertTemplateUsed(res, "horizon/common/_data_table_row.html") self.assertContains(res, "test_tenant", 1, 200) self.assertContains(res, "instance-host", 1, 200) # two instances of name, other name comes from row data-display self.assertContains(res, "server_1", 2, 200) self.assertContains(res, "10.0.0.1", 1, 200) self.assertContains(res, "RAM</th><td>512MB", 1, 200) self.assertContains(res, "VCPUs</th><td>1", 1, 200) self.assertContains(res, "Size</th><td>0 GB", 1, 200) self.assertContains(res, "Active", 1, 200) self.assertContains(res, "Running", 1, 200)
def test_delete_group(self): domain_id = self._get_domain_id() filters = {} group = self.groups.get(id="2") api.keystone.group_list(IgnoreArg(), domain=domain_id, filters=filters) \ .AndReturn(self.groups.list()) api.keystone.group_delete(IgnoreArg(), group.id) self.mox.ReplayAll() formData = {'action': 'groups__delete__%s' % group.id} res = self.client.post(GROUPS_INDEX_URL, formData) self.assertRedirectsNoFollow(res, GROUPS_INDEX_URL)
def test_create(self): user = self.users.get(id="1") domain = self._get_default_domain() domain_id = domain.id role = self.roles.first() api.keystone.get_default_domain(IgnoreArg()) \ .AndReturn(domain) api.keystone.get_default_domain(IgnoreArg(), False) \ .AndReturn(domain) if api.keystone.VERSIONS.active >= 3: api.keystone.tenant_list(IgnoreArg(), domain=domain.id).AndReturn( [self.tenants.list(), False]) else: api.keystone.tenant_list(IgnoreArg(), user=None).AndReturn( [self.tenants.list(), False]) api.keystone.user_create(IgnoreArg(), name=user.name, description=user.description, email=user.email, password=user.password, project=self.tenant.id, enabled=True, domain=domain_id).AndReturn(user) api.keystone.role_list(IgnoreArg()).AndReturn(self.roles.list()) api.keystone.get_default_role(IgnoreArg()).AndReturn(role) api.keystone.roles_for_user(IgnoreArg(), user.id, self.tenant.id) api.keystone.add_tenant_user_role(IgnoreArg(), self.tenant.id, user.id, role.id) self.mox.ReplayAll() formData = { 'method': 'CreateUserForm', 'domain_id': domain_id, 'name': user.name, 'description': user.description, 'email': user.email, 'password': user.password, 'project': self.tenant.id, 'role_id': self.roles.first().id, 'enabled': True, 'confirm_password': user.password } res = self.client.post(USER_CREATE_URL, formData) self.assertNoFormErrors(res) self.assertMessageCount(success=1)
def test_remove_user(self): group = self.groups.get(id="1") user = self.users.get(id="2") api.keystone.user_list(IgnoreArg(), group=group.id).\ AndReturn(self.users.list()) api.keystone.remove_group_user(IgnoreArg(), group_id=group.id, user_id=user.id) self.mox.ReplayAll() formData = {'action': 'group_members__removeGroupMember__%s' % user.id} res = self.client.post(GROUP_MANAGE_URL, formData) self.assertRedirectsNoFollow(res, GROUP_MANAGE_URL) self.assertMessageCount(success=1)
def test_create_validation_for_password_too_long(self): user = self.users.get(id="1") domain = self._get_default_domain() domain_id = domain.id api.keystone.get_default_domain(IgnoreArg()) \ .MultipleTimes().AndReturn(domain) if api.keystone.VERSIONS.active >= 3: api.keystone.tenant_list( IgnoreArg(), domain=domain_id).AndReturn( [self.tenants.list(), False]) else: api.keystone.tenant_list( IgnoreArg(), user=None).AndReturn( [self.tenants.list(), False]) api.keystone.role_list(IgnoreArg()).AndReturn(self.roles.list()) api.keystone.get_default_role(IgnoreArg()) \ .AndReturn(self.roles.first()) if django.VERSION >= (1, 9): if api.keystone.VERSIONS.active >= 3: api.keystone.tenant_list( IgnoreArg(), domain=domain_id).AndReturn( [self.tenants.list(), False]) else: api.keystone.tenant_list( IgnoreArg(), user=None).AndReturn( [self.tenants.list(), False]) api.keystone.role_list(IgnoreArg()).AndReturn(self.roles.list()) api.keystone.get_default_role(IgnoreArg()) \ .AndReturn(self.roles.first()) self.mox.ReplayAll() # check password min-len verification formData = {'method': 'CreateUserForm', 'domain_id': domain_id, 'name': user.name, 'email': user.email, 'password': '******', 'project': self.tenant.id, 'role_id': self.roles.first().id, 'confirm_password': '******'} res = self.client.post(USER_CREATE_URL, formData) self.assertFormError( res, "form", 'password', ['Password must be between 8 and 18 characters.'])
def test_enable_disable_user_exception(self): domain = self._get_default_domain() domain_id = domain.id user = self.users.get(id="2") users = self._get_users(domain_id) user.enabled = False api.keystone.user_list(IgnoreArg(), domain=domain_id) \ .AndReturn(users) api.keystone.user_update_enabled(IgnoreArg(), user.id, True) \ .AndRaise(self.exceptions.keystone) self.mox.ReplayAll() formData = {'action': 'users__toggle__%s' % user.id} res = self.client.post(USERS_INDEX_URL, formData) self.assertRedirectsNoFollow(res, USERS_INDEX_URL)
def test_delete_vip(self): pool = self.pools.first() vip = self.vips.first() api.lbaas.pool_list( IsA(http.HttpRequest), tenant_id=self.tenant.id) \ .AndReturn(self.pools.list()) api.lbaas.pool_get(IsA(http.HttpRequest), pool.id).AndReturn(pool) api.network.floating_ip_supported(IgnoreArg()).MultipleTimes() \ .AndReturn(True) api.network.floating_ip_simple_associate_supported(IgnoreArg()) \ .MultipleTimes().AndReturn(True) api.lbaas.vip_delete(IsA(http.HttpRequest), vip.id) self.mox.ReplayAll() form_data = {"action": "poolstable__deletevip__%s" % pool.id} res = self.client.post(self.INDEX_URL, form_data) self.assertNoFormErrors(res)
def test_index(self): domain = self._get_default_domain() domain_id = domain.id users = self._get_users(domain_id) api.keystone.get_effective_domain_id(IgnoreArg()).AndReturn(domain_id) api.keystone.user_list(IgnoreArg(), domain=domain_id).AndReturn(users) api.keystone.domain_lookup(IgnoreArg()).AndReturn( {domain.id: domain.name}) self.mox.ReplayAll() res = self.client.get(USERS_INDEX_URL) self.assertTemplateUsed(res, 'identity/users/index.html') self.assertItemsEqual(res.context['table'].data, users) if domain_id: for user in res.context['table'].data: self.assertItemsEqual(user.domain_id, domain_id)
def test_create_with_password_mismatch(self): user = self.users.get(id="1") domain = self._get_default_domain() domain_id = domain.id api.keystone.get_default_domain(IgnoreArg()) \ .MultipleTimes().AndReturn(domain) if api.keystone.VERSIONS.active >= 3: api.keystone.tenant_list( IgnoreArg(), domain=domain_id).AndReturn( [self.tenants.list(), False]) else: api.keystone.tenant_list( IgnoreArg(), user=None).AndReturn( [self.tenants.list(), False]) api.keystone.role_list(IgnoreArg()).AndReturn(self.roles.list()) api.keystone.get_default_role(IgnoreArg()) \ .AndReturn(self.roles.first()) if django.VERSION >= (1, 9): if api.keystone.VERSIONS.active >= 3: api.keystone.tenant_list( IgnoreArg(), domain=domain_id).AndReturn( [self.tenants.list(), False]) else: api.keystone.tenant_list( IgnoreArg(), user=None).AndReturn( [self.tenants.list(), False]) api.keystone.role_list(IgnoreArg()).AndReturn(self.roles.list()) api.keystone.get_default_role(IgnoreArg()) \ .AndReturn(self.roles.first()) self.mox.ReplayAll() formData = {'method': 'CreateUserForm', 'domain_id': domain_id, 'name': user.name, 'email': user.email, 'password': user.password, 'project': self.tenant.id, 'role_id': self.roles.first().id, 'confirm_password': "******"} res = self.client.post(USER_CREATE_URL, formData) self.assertFormError(res, "form", None, ['Passwords do not match.'])
def test_disabling_current_user(self): domain = self._get_default_domain() domain_id = domain.id users = self._get_users(domain_id) for i in range(0, 2): api.keystone.user_list(IgnoreArg(), domain=domain_id) \ .AndReturn(users) api.keystone.domain_lookup(IgnoreArg()).AndReturn( {domain.id: domain.name}) self.mox.ReplayAll() formData = {'action': 'users__toggle__%s' % self.request.user.id} res = self.client.post(USERS_INDEX_URL, formData, follow=True) self.assertEqual( list(res.context['messages'])[0].message, u'You cannot disable the user you are currently ' u'logged in as.')
def test_delete_user_with_improper_permissions(self): domain = self._get_default_domain() domain_id = domain.id users = self._get_users(domain_id) for i in range(0, 2): api.keystone.user_list(IgnoreArg(), domain=domain_id) \ .AndReturn(users) api.keystone.domain_lookup(IgnoreArg()).AndReturn( {domain.id: domain.name}) self.mox.ReplayAll() formData = {'action': 'users__delete__%s' % self.request.user.id} res = self.client.post(USERS_INDEX_URL, formData, follow=True) self.assertEqual( list(res.context['messages'])[0].message, u'You are not allowed to delete user: %s' % self.request.user.username)
def test_enable_user(self): domain = self._get_default_domain() domain_id = domain.id user = self.users.get(id="2") users = self._get_users(domain_id) user.enabled = False api.keystone.domain_get(IsA(http.HttpRequest), '1').AndReturn(domain) api.keystone.user_list(IgnoreArg(), domain=domain_id).AndReturn(users) api.keystone.user_update_enabled(IgnoreArg(), user.id, True).AndReturn(user) api.keystone.domain_lookup(IgnoreArg()).AndReturn( {domain.id: domain.name}) self.mox.ReplayAll() formData = {'action': 'users__toggle__%s' % user.id} res = self.client.post(USERS_INDEX_URL, formData) self.assertRedirectsNoFollow(res, USERS_INDEX_URL)
def test_index(self): api.keystone.mapping_list(IgnoreArg()). \ AndReturn(self.idp_mappings.list()) self.mox.ReplayAll() res = self.client.get(MAPPINGS_INDEX_URL) self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html') self.assertItemsEqual(res.context['table'].data, self.idp_mappings.list())
def test_index(self): api.keystone.identity_provider_list(IgnoreArg()). \ AndReturn(self.identity_providers.list()) self.mox.ReplayAll() res = self.client.get(IDPS_INDEX_URL) self.assertTemplateUsed(res, 'identity/identity_providers/index.html') self.assertItemsEqual(res.context['table'].data, self.identity_providers.list())
def test_delete_with_enabled_domain(self): domain = self.domains.get(id="1") api.keystone.domain_list(IgnoreArg()).AndReturn(self.domains.list()) self.mox.ReplayAll() formData = {'action': 'domains__delete__%s' % domain.id} res = self.client.post(DOMAINS_INDEX_URL, formData) self.assertRedirectsNoFollow(res, DOMAINS_INDEX_URL) self.assertMessageCount(error=2)
def test_index(self): api.keystone.domain_list(IgnoreArg()).AndReturn(self.domains.list()) self.mox.ReplayAll() res = self.client.get(DOMAINS_INDEX_URL) self.assertTemplateUsed(res, constants.DOMAINS_INDEX_VIEW_TEMPLATE) self.assertItemsEqual(res.context['table'].data, self.domains.list()) self.assertContains(res, 'Create Domain') self.assertContains(res, 'Edit') self.assertContains(res, 'Delete Domain')
def test_create(self): role = self.roles.first() api.keystone.role_create(IgnoreArg(), role.name).AndReturn(role) self.mox.ReplayAll() formData = {'method': 'CreateRoleForm', 'name': role.name} res = self.client.post(ROLES_CREATE_URL, formData) self.assertNoFormErrors(res) self.assertMessageCount(success=1)
def test_index(self): api.keystone.role_list(IgnoreArg()).AndReturn(self.roles.list()) self.mox.ReplayAll() res = self.client.get(ROLES_INDEX_URL) self.assertContains(res, 'Create Role') self.assertContains(res, 'Edit') self.assertContains(res, 'Delete Role') self.assertTemplateUsed(res, 'identity/roles/index.html') self.assertItemsEqual(res.context['table'].data, self.roles.list())
def set_up_expect(self): # retrieve pools api.lbaas.pool_list( IsA(http.HttpRequest), tenant_id=self.tenant.id) \ .AndReturn(self.pools.list()) # retrieves members api.lbaas.member_list( IsA(http.HttpRequest), tenant_id=self.tenant.id) \ .AndReturn(self.members.list()) # retrieves monitors api.lbaas.pool_health_monitor_list( IsA(http.HttpRequest), tenant_id=self.tenant.id).MultipleTimes() \ .AndReturn(self.monitors.list()) api.network.floating_ip_supported(IgnoreArg()).MultipleTimes() \ .AndReturn(True) api.network.floating_ip_simple_associate_supported(IgnoreArg()).MultipleTimes() \ .AndReturn(True)
def test_update(self): user = self.users.get(id="1") domain_id = user.domain_id domain = self.domains.get(id=domain_id) phone_number = "+81-3-1234-5678" api.keystone.user_get(IsA(http.HttpRequest), '1', admin=True).AndReturn(user) api.keystone.domain_get(IsA(http.HttpRequest), domain_id).AndReturn(domain) if api.keystone.VERSIONS.active >= 3: api.keystone.tenant_list(IgnoreArg(), domain=domain.id).AndReturn( [self.tenants.list(), False]) else: api.keystone.tenant_list(IgnoreArg(), user=user.id).AndReturn( [self.tenants.list(), False]) kwargs = {'phone_num': phone_number} api.keystone.user_update(IsA(http.HttpRequest), user.id, email=user.email, name=user.name, **kwargs).AndReturn(None) self.mox.ReplayAll() formData = { 'method': 'UpdateUserForm', 'id': user.id, 'name': user.name, 'description': user.description, 'email': user.email, 'project': self.tenant.id, 'phone_num': phone_number } res = self.client.post(USER_UPDATE_URL, formData) self.assertNoFormErrors(res)