def test_instances_tab_exception(self): try: config = self.database_configurations.first() # setup the configuration parameter manager config_param_mgr = config_param_manager.ConfigParamManager( config.id) config_param_mgr.configuration = config config_param_mgr.original_configuration_values = \ dict.copy(config.values) self.mock_get.return_value = config_param_mgr self.mock_configuration_instances.side_effect = ( self.exceptions.trove) details_url = self._get_url_with_arg(DETAIL_URL, config.id) url = details_url + '?tab=configuration_details__instance' res = self.client.get(url) self.assert_mock_multiple_calls_with_same_arguments( self.mock_get, 2, mock.call(test.IsHttpRequest(), config.id)) self.mock_configuration_instances.assert_called_once_with( test.IsHttpRequest(), config.id) table_data = res.context['instances_table'].data self.assertNotEqual(len(self.configuration_instances.list()), len(table_data)) self.assertTemplateUsed( res, 'project/database_configurations/details.html') finally: config_param_manager.delete(config.id)
def test_add_parameter_invalid_value(self): try: config = self.database_configurations.first() # setup the configuration parameter manager config_param_mgr = config_param_manager.ConfigParamManager( config.id) config_param_mgr.configuration = config config_param_mgr.original_configuration_values = \ dict.copy(config.values) self.mock_get.return_value = config_param_mgr self.mock_configuration_parameters_list.return_value = ( self.configuration_parameters.list()) name = self.configuration_parameters.first().name value = "non-numeric" post = { 'method': 'AddParameterForm', 'name': name, 'value': value} res = self.client.post(self._get_url_with_arg(ADD_URL, config.id), post) self.assert_mock_multiple_calls_with_same_arguments( self.mock_get, 2, mock.call(test.IsHttpRequest(), test.IsA(str))) self.assert_mock_multiple_calls_with_same_arguments( self.mock_configuration_parameters_list, 2, mock.call(test.IsHttpRequest(), test.IsA(str), test.IsA(str))) self.assertFormError(res, "form", 'value', ['Value must be a number.']) finally: config_param_manager.delete(config.id)
def test_create_test_configuration_exception(self): self.mock_datastore_list.return_value = self.datastores.list() self.mock_datastore_version_list.return_value = ( self.datastore_versions.list()) self.mock_configuration_create.side_effect = self.exceptions.trove name = u'config1' values = "{}" config_description = u'description of config1' ds = self._get_test_datastore('mysql') dsv = self._get_test_datastore_version(ds.id, '5.5') config_datastore = ds.name config_datastore_version = dsv.name post = {'method': 'CreateConfigurationForm', 'name': name, 'description': config_description, 'datastore': config_datastore + ',' + config_datastore_version} res = self.client.post(CREATE_URL, post) self.mock_datastore_list.assert_called_once_with(test.IsHttpRequest()) self.assert_mock_multiple_calls_with_same_arguments( self.mock_datastore_version_list, 4, mock.call(test.IsHttpRequest(), test.IsA(str))) self.mock_configuration_create.assert_called_once_with( test.IsHttpRequest(), name, values, description=config_description, datastore=config_datastore, datastore_version=config_datastore_version) self.assertRedirectsNoFollow(res, INDEX_URL)
def test_detail_backup(self): self.mock_backup_get.return_value = self.database_backups.first() self.mock_instance_get.return_value = self.databases.first() res = self.client.get(DETAILS_URL) self.mock_backup_get.assert_called_once_with(test.IsHttpRequest(), test.IsA(str)) self.mock_instance_get.assert_called_once_with(test.IsHttpRequest(), test.IsA(str)) self.assertTemplateUsed(res, 'project/database_backups/details.html')
def test_index(self): clusters = common.Paginated(self.trove_clusters.list()) self.mock_cluster_list.return_value = clusters self.mock_flavor_list.return_value = self.flavors.list() res = self.client.get(INDEX_URL) self.mock_cluster_list.assert_called_once_with(test.IsHttpRequest(), marker=None) self.mock_flavor_list.assert_called_once_with(test.IsHttpRequest()) self.assertTemplateUsed(res, 'project/database_clusters/index.html')
def test_create_configuration(self): self.mock_datastore_list.return_value = self.datastores.list() self.mock_datastore_version_list.return_value = ( self.datastore_versions.list()) res = self.client.get(CREATE_URL) self.mock_datastore_list.assert_called_once_with(test.IsHttpRequest()) self.assert_mock_multiple_calls_with_same_arguments( self.mock_datastore_version_list, 4, mock.call(test.IsHttpRequest(), test.IsA(str))) self.assertTemplateUsed(res, 'project/database_configurations/create.html')
def test_index(self): self.mock_backup_list.return_value = self.database_backups.list() self.mock_instance_get.return_value = self.databases.first() res = self.client.get(INDEX_URL) self.mock_backup_list.assert_called_once_with(test.IsHttpRequest()) self.assert_mock_multiple_calls_with_same_arguments( self.mock_instance_get, 3, mock.call(test.IsHttpRequest(), test.IsA(str))) self.assertTemplateUsed(res, 'project/database_backups/index.html')
def test_index_flavor_exception(self): clusters = common.Paginated(self.trove_clusters.list()) self.mock_cluster_list.return_value = clusters self.mock_flavor_list.side_effect = self.exceptions.trove res = self.client.get(INDEX_URL) self.mock_cluster_list.assert_called_once_with(test.IsHttpRequest(), marker=None) self.mock_flavor_list.assert_called_once_with(test.IsHttpRequest()) self.assertTemplateUsed(res, 'project/database_clusters/index.html') self.assertMessageCount(res, error=1)
def test_grow_cluster(self): cluster = self.trove_clusters.first() self.mock_cluster_get.return_value = cluster cluster_volume = 1 flavor = self.flavors.first() cluster_flavor = flavor.id cluster_flavor_name = flavor.name instances = [ cluster_manager.ClusterInstance("id1", "name1", cluster_flavor, cluster_flavor_name, cluster_volume, "master", None, None), cluster_manager.ClusterInstance("id2", "name2", cluster_flavor, cluster_flavor_name, cluster_volume, "slave", "master", None), cluster_manager.ClusterInstance("id3", None, cluster_flavor, cluster_flavor_name, cluster_volume, None, None, None), ] manager = cluster_manager.ClusterInstanceManager(cluster.id) manager.instances = instances self.mock_get.return_value = manager url = reverse('horizon:project:database_clusters:cluster_grow_details', args=[cluster.id]) res = self.client.get(url) self.assertTemplateUsed( res, 'project/database_clusters/cluster_grow_details.html') table = res.context_data["".join( [tables.ClusterGrowInstancesTable.Meta.name, '_table'])] self.assertEqual(len(cluster.instances), len(table.data)) action = "".join([ tables.ClusterGrowInstancesTable.Meta.name, '__', tables.ClusterGrowRemoveInstance.name, '__', 'id1' ]) self.client.post(url, {'action': action}) self.assertEqual(len(cluster.instances) - 1, len(table.data)) action = "".join([ tables.ClusterGrowInstancesTable.Meta.name, '__', tables.ClusterGrowAction.name, '__', cluster.id ]) res = self.client.post(url, {'action': action}) self.mock_cluster_get.assert_called_once_with(test.IsHttpRequest(), cluster.id) self.assert_mock_multiple_calls_with_same_arguments( self.mock_get, 5, mock.call(cluster.id)) self.mock_cluster_grow.assert_called_once_with(test.IsHttpRequest(), cluster.id, instances) self.assertMessageCount(success=1) self.assertRedirectsNoFollow(res, INDEX_URL)
def test_launch_backup_exception(self): self.mock_check.return_value = True self.mock_instance_list.side_effect = self.exceptions.trove self.mock_backup_list.return_value = self.database_backups.list() res = self.client.get(BACKUP_URL) self.mock_check.assert_called_once_with((), test.IsHttpRequest()) self.mock_instance_list.assert_called_once_with(test.IsHttpRequest()) self.mock_backup_list.assert_called_once_with(test.IsHttpRequest()) self.assertMessageCount(res, error=1) self.assertTemplateUsed(res, 'project/database_backups/backup.html')
def test_index_pagination(self): clusters = self.trove_clusters.list() last_record = clusters[1] clusters = common.Paginated(clusters, next_marker="foo") self.mock_cluster_list.return_value = clusters self.mock_flavor_list.return_value = self.flavors.list() res = self.client.get(INDEX_URL) self.mock_cluster_list.assert_called_once_with(test.IsHttpRequest(), marker=None) self.mock_flavor_list.assert_called_once_with(test.IsHttpRequest()) self.assertTemplateUsed(res, 'project/database_clusters/index.html') self.assertContains(res, 'marker=' + last_record.id)
def test_create_simple_cluster_exception(self): self.mock_network_list_for_tenant.return_value = self.networks.list() self.mock_datastore_flavors.return_value = self.flavors.list() filtered_datastores = self._get_filtered_datastores('mongodb') self.mock_datastore_list.return_value = filtered_datastores self.mock_datastore_version_list.return_value = ( self._get_filtered_datastore_versions(filtered_datastores)) self.mock_cluster_create.side_effect = self.exceptions.trove cluster_name = u'MyCluster' cluster_volume = 1 cluster_flavor = u'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' cluster_instances = 3 cluster_datastore = u'mongodb' cluster_datastore_version = u'2.6' cluster_network = u'' field_name = self._build_flavor_widget_name(cluster_datastore, cluster_datastore_version) post = { 'name': cluster_name, 'volume': cluster_volume, 'num_instances': cluster_instances, 'num_shards': 1, 'datastore': field_name, field_name: 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', } res = self.client.post(LAUNCH_URL, post) self.mock_network_list_for_tenant.assert_called_once_with( test.IsHttpRequest(), '1') self.mock_datastore_flavors.assert_called_once_with( test.IsHttpRequest(), 'mongodb', '2.6') self.mock_datastore_list.assert_called_once_with(test.IsHttpRequest()) self.mock_datastore_version_list.assert_called_once_with( test.IsHttpRequest(), test.IsA(str)) self.mock_cluster_create.assert_called_once_with( test.IsHttpRequest(), cluster_name, cluster_volume, cluster_flavor, cluster_instances, datastore=cluster_datastore, datastore_version=cluster_datastore_version, nics=cluster_network, root_password=None, locality=None) self.assertRedirectsNoFollow(res, INDEX_URL) self.assertMessageCount(error=1)
def test_create_simple_cluster(self): self.mock_is_service_enabled.return_value = False self.mock_datastore_flavors.return_value = self.flavors.list() filtered_datastores = self._get_filtered_datastores('mongodb') self.mock_datastore_list.return_value = filtered_datastores self.mock_datastore_version_list.return_value = ( self._get_filtered_datastore_versions(filtered_datastores)) self.mock_cluster_create.return_value = self.trove_clusters.first() cluster_name = u'MyCluster' cluster_volume = 1 cluster_flavor = u'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' cluster_instances = 3 cluster_datastore = u'mongodb' cluster_datastore_version = u'2.6' cluster_network = u'' field_name = self._build_flavor_widget_name(cluster_datastore, cluster_datastore_version) post = { 'name': cluster_name, 'volume': cluster_volume, 'num_instances': cluster_instances, 'num_shards': 1, 'datastore': field_name, field_name: 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', } res = self.client.post(LAUNCH_URL, post) self.mock_is_service_enabled.assert_called_once_with( test.IsHttpRequest(), 'network') self.mock_datastore_flavors.assert_called_once_with( test.IsHttpRequest(), 'mongodb', '2.6') self.mock_datastore_list.assert_called_once_with(test.IsHttpRequest()) self.mock_datastore_version_list.assert_called_once_with( test.IsHttpRequest(), test.IsA(str)) self.mock_cluster_create.assert_called_once_with( test.IsHttpRequest(), cluster_name, cluster_volume, cluster_flavor, cluster_instances, datastore=cluster_datastore, datastore_version=cluster_datastore_version, nics=cluster_network, root_password=None, locality=None) self.assertNoFormErrors(res) self.assertMessageCount(success=1)
def test_view_log(self): CONSOLE_OUTPUT = 'superspecialuniquetext' self.mock_log_tail.return_value = lambda: [CONSOLE_OUTPUT] url = reverse('horizon:project:databases:logs:log_contents', args=('id', 'guest.log')) res = self.client.get(url) self.mock_Connection.assert_called_once_with( None, mock.ANY, None, preauthtoken=mock.ANY, preauthurl=mock.ANY, cacert=None, insecure=False, auth_version="2.0") self.mock_log_tail.assert_called_once_with( test.IsHttpRequest(), test.IsA(six.string_types), 'guest.log', False, LINES, self.mock_Connection()) self.assertNoMessages() self.assertIsInstance(res, http.HttpResponse) self.assertContains(res, CONSOLE_OUTPUT)
def test_values_tab_discard_action(self): config = self.database_configurations.first() self.mock_configuration_get.return_value = config details_url = self._get_url_with_arg(DETAIL_URL, config.id) url = details_url + '?tab=configuration_details__value' self._test_create_altered_config_params(config, url) # get the state of the configuration before discard action changed_configuration_values = \ dict.copy(config_param_manager.get(self.request, config.id) .get_configuration().values) res = self.client.post(url, {'action': u"values__discard_changes"}) self.mock_configuration_get.assert_called_once_with( test.IsHttpRequest(), config.id) if django.VERSION >= (1, 9): url = settings.TESTSERVER + url self.assertRedirectsNoFollow(res, url) # get the state of the configuration after discard action restored_configuration_values = \ dict.copy(config_param_manager.get(self.request, config.id) .get_configuration().values) self.assertTrue( config_param_manager.dict_has_changes( changed_configuration_values, restored_configuration_values))
def test_detail_backup_notfound(self): self.mock_backup_get.side_effect = self.exceptions.trove res = self.client.get(DETAILS_URL) self.mock_backup_get.assert_called_once_with(test.IsHttpRequest(), test.IsA(str)) self.assertRedirectsNoFollow(res, INDEX_URL)
def test_detail_backup_incr(self): incr_backup = self.database_backups.list()[2] parent_backup = self.database_backups.list()[1] self.mock_backup_get.side_effect = [incr_backup, parent_backup] self.mock_instance_get.return_value = self.databases.list()[1] url = reverse('horizon:project:database_backups:detail', args=[incr_backup.id]) res = self.client.get(url) self.assertEqual([ mock.call(test.IsHttpRequest(), test.IsA(str)), mock.call(test.IsHttpRequest(), incr_backup.parent_id) ], self.mock_backup_get.call_args_list) self.mock_instance_get.assert_called_once_with(test.IsHttpRequest(), test.IsA(str)) self.assertTemplateUsed(res, 'project/database_backups/details.html')
def test_values_tab_apply_action(self): # NOTE(zhaochao): we cannot use copy.deepcopy() under Python 3, # because of the lazy-loading feature of the troveclient Resource # objects. copy.deepcopy will use hasattr to search for the # '__setstate__' attribute of the resource object. As the resource # object is lazy loading, searching attributes relys on the 'is_load' # property, unfortunately this property is also not loaded at the # moment, then we're getting in an infinite loop there. Python will # raise RuntimeError saying "maximum recursion depth exceeded", this is # ignored under Python 2.x, but reraised under Python 3 by hasattr(). # # Temporarily importing troveclient and reconstructing a configuration # object from the original config object's dict info will make this # case (and the next) working under Python 3. original_config = self.database_configurations.first() from troveclient.v1 import configurations config = configurations.Configuration( configurations.Configurations(None), original_config.to_dict()) # Making sure the newly constructed config object is the same as # the original one. self.assertEqual(config, original_config) # setup the configuration parameter manager config_param_mgr = config_param_manager.ConfigParamManager(config.id) config_param_mgr.configuration = config config_param_mgr.original_configuration_values = \ dict.copy(config.values) self.mock_get.return_value = config_param_mgr self.mock_configuration_update.return_value = None details_url = self._get_url_with_arg(DETAIL_URL, config.id) url = details_url + '?tab=configuration_details__value' self._test_create_altered_config_params(config, url) # apply changes res = self.client.post(url, {'action': u"values__apply_changes"}) self.assert_mock_multiple_calls_with_same_arguments( self.mock_get, 11, mock.call(test.IsHttpRequest(), config.id)) self.mock_configuration_update.assert_called_once_with( test.IsHttpRequest(), config.id, config_param_mgr.to_json()) if django.VERSION >= (1, 9): url = settings.TESTSERVER + url self.assertRedirectsNoFollow(res, url)
def test_index(self): self.mock_configuration_list.return_value = ( self.database_configurations.list()) res = self.client.get(INDEX_URL) self.mock_configuration_list.assert_called_once_with( test.IsHttpRequest()) self.assertTemplateUsed(res, 'project/database_configurations/index.html')
def test_add_parameter(self): config = self.database_configurations.first() self.mock_get_configuration.return_value = config self.mock_configuration_get.return_value = config ds = self._get_test_datastore('mysql') dsv = self._get_test_datastore_version(ds.id, '5.5') self.mock_configuration_parameters_list.return_value = ( self.configuration_parameters.list()) res = self.client.get(self._get_url_with_arg(ADD_URL, 'id')) self.mock_get_configuration.assert_called_once() self.mock_configuration_get.assert_called_once_with( test.IsHttpRequest()) self.mock_configuration_parameters_list.assert_called_once_with( test.IsHttpRequest(), ds.name, dsv.name) self.assertTemplateUsed( res, 'project/database_configurations/add_parameter.html')
def test_index_exception(self): self.mock_configuration_list.side_effect = self.exceptions.trove res = self.client.get(INDEX_URL) self.mock_configuration_list.assert_called_once_with( test.IsHttpRequest()) self.assertTemplateUsed(res, 'project/database_configurations/index.html') self.assertEqual(res.status_code, 200) self.assertMessageCount(res, error=1)
def launch_cluster_fields_setup(self, datastore, datastore_version): self.mock_is_service_enabled.return_value = False self.mock_datastore_flavors.return_value = self.flavors.list() filtered_datastores = self._get_filtered_datastores(datastore) self.mock_datastore_list.return_value = filtered_datastores self.mock_datastore_version_list.return_value = ( self._get_filtered_datastore_versions(filtered_datastores)) res = self.client.get(LAUNCH_URL) self.mock_is_service_enabled.assert_called_once_with( test.IsHttpRequest(), 'network') self.mock_datastore_flavors.assert_called_once_with( test.IsHttpRequest(), datastore, datastore_version) self.mock_datastore_list.assert_called_once_with(test.IsHttpRequest()) self.mock_datastore_version_list.assert_called_once_with( test.IsHttpRequest(), test.IsA(str)) return res.context_data['form'].fields
def test_overview_tab_exception(self): config = self.database_configurations.first() self.mock_configuration_get.side_effect = self.exceptions.trove details_url = self._get_url_with_arg(DETAIL_URL, config.id) url = details_url + '?tab=configuration_details__overview' res = self.client.get(url) self.mock_configuration_get.assert_called_once_with( test.IsHttpRequest(), config.id) self.assertRedirectsNoFollow(res, INDEX_URL)
def test_launch_cluster(self): self.mock_is_service_enabled.return_value = False self.mock_datastore_flavors.return_value = self.flavors.list() filtered_datastores = self._get_filtered_datastores('mongodb') self.mock_datastore_list.return_value = filtered_datastores self.mock_datastore_version_list.return_value = ( self._get_filtered_datastore_versions(filtered_datastores)) res = self.client.get(LAUNCH_URL) self.mock_is_service_enabled.assert_called_once_with( test.IsHttpRequest(), 'network') self.mock_datastore_flavors.assert_called_once_with( test.IsHttpRequest(), 'mongodb', '2.6') self.mock_datastore_list.assert_called_once_with(test.IsHttpRequest()) self.mock_datastore_version_list.assert_called_once_with( test.IsHttpRequest(), test.IsA(str)) self.assertTemplateUsed(res, 'project/database_clusters/launch.html')
def test_details_tab(self): config = self.database_configurations.first() self.mock_configuration_get.return_value = config details_url = self._get_url_with_arg(DETAIL_URL, config.id) url = details_url + '?tab=configuration_details__details' res = self.client.get(url) self.mock_configuration_get.assert_called_once_with( test.IsHttpRequest(), config.id) self.assertTemplateUsed( res, 'project/database_configurations/details.html')
def test_details_without_locality(self): cluster = self.trove_clusters.list()[1] self.mock_cluster_get.return_value = cluster self.mock_instance_get.return_value = self.databases.first() self.mock_flavor_get.return_value = self.flavors.first() details_url = reverse('horizon:project:database_clusters:detail', args=[cluster.id]) res = self.client.get(details_url) self.assert_mock_multiple_calls_with_same_arguments( self.mock_cluster_get, 2, mock.call(test.IsHttpRequest(), cluster.id)) self.assert_mock_multiple_calls_with_same_arguments( self.mock_instance_get, 3, mock.call(test.IsHttpRequest(), test.IsA(str))) self.assert_mock_multiple_calls_with_same_arguments( self.mock_flavor_get, 4, mock.call(test.IsHttpRequest(), test.IsA(str))) self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertNotContains(res, "Locality")
def test_add_parameter_exception_on_parameters(self): try: config = self.database_configurations.first() self.mock_get_configuration.return_value = config self.mock_configuration_get.return_value = config ds = self._get_test_datastore('mysql') dsv = self._get_test_datastore_version(ds.id, '5.5') self.mock_configuration_parameters_list.side_effect = ( self.exceptions.trove) toSuppress = ["trove_dashboard.content." "database_configurations.forms", ] # Suppress expected log messages in the test output loggers = [] for cls in toSuppress: logger = logging.getLogger(cls) loggers.append((logger, logger.getEffectiveLevel())) logger.setLevel(logging.CRITICAL) try: res = self.client.get( self._get_url_with_arg(ADD_URL, config.id)) self.mock_get_configuration.assert_called_once() self.mock_configuration_get.assert_called_once_with( test.IsHttpRequest()) self.mock_configuration_parameters_list. \ assert_called_once_with( test.IsHttpRequest(), ds.name, dsv.name ) self.assertEqual(res.status_code, 302) finally: # Restore the previous log levels for (log, level) in loggers: log.setLevel(level) finally: config_param_manager.delete(config.id)
def test_log_tab_exception(self): database = self.databases.first() database_id = database.id self.mock_instance_get.return_value = database self.mock_log_list.side_effect = self.exceptions.trove self.mock_flavor_get.return_value = self.flavors.first() self.mock_root_show.return_value = self.database_user_roots.first() detail_url = reverse('horizon:project:databases:detail', args=[database_id]) url = detail_url + '?tab=instance_details__logs_tab' toSuppress = ["trove_dashboard.content.databases.tabs"] loggers = [] for cls in toSuppress: logger = logging.getLogger(cls) loggers.append((logger, logger.getEffectiveLevel())) logger.setLevel(logging.CRITICAL) try: res = self.client.get(url) self.mock_instance_get.assert_called_once_with( test.IsHttpRequest(), test.IsA(six.text_type)) self.mock_log_list.assert_called_once_with( test.IsHttpRequest(), database_id) self.mock_flavor_get.assert_called_once_with( test.IsHttpRequest(), database.flavor["id"]) self.mock_root_show.assert_called_once_with( test.IsHttpRequest(), database.id) table_data = res.context['logs_table'].data self.assertNotEqual(len(self.logs.list()), len(table_data)) self.assertTemplateUsed( res, 'horizon/common/_detail_table.html') finally: # Restore the previous log levels for (log, level) in loggers: log.setLevel(level)
def test_add_new_parameter(self): config = self.database_configurations.first() try: self.mock_configuration_get.return_value = config ds = self._get_test_datastore('mysql') dsv = self._get_test_datastore_version(ds.id, '5.5') self.mock_configuration_parameters_list.return_value = ( self.configuration_parameters.list()) name = self.configuration_parameters.first().name value = 1 config.values.update({name: value}) self.mock_add_param.return_value = value post = { 'method': 'AddParameterForm', 'name': name, 'value': value} res = self.client.post(self._get_url_with_arg(ADD_URL, config.id), post) self.assertEqual(2, self.mock_configuration_get.call_count) self.mock_configuration_parameters_list.assert_called_once_with( test.IsHttpRequest(), ds.name, dsv.name) self.mock_add_param.assert_called_once_with(name, value) self.mock_configuration_update.assert_called_once_with( test.IsHttpRequest(), config.id, jsonutils.dumps(config.values) ) self.assertNoFormErrors(res) self.assertMessageCount(success=1) finally: config_param_manager.delete(config.id)
def test_values_tab_apply_action_exception(self): # NOTE(zhaochao) Please refer to the comment at the beginning of the # 'test_values_tab_apply_action' about not using copy.deepcopy() for # details. original_config = self.database_configurations.first() from troveclient.v1 import configurations config = configurations.Configuration( configurations.Configurations(None), original_config.to_dict()) # Making sure the newly constructed config object is the same as # the original one. self.assertEqual(config, original_config) # setup the configuration parameter manager config_param_mgr = config_param_manager.ConfigParamManager(config.id) config_param_mgr.configuration = config config_param_mgr.original_configuration_values = \ dict.copy(config.values) self.mock_get.return_value = config_param_mgr self.mock_configuration_update.side_effect = self.exceptions.trove details_url = self._get_url_with_arg(DETAIL_URL, config.id) url = details_url + '?tab=configuration_details__value' self._test_create_altered_config_params(config, url) # apply changes res = self.client.post(url, {'action': u"values__apply_changes"}) self.assert_mock_multiple_calls_with_same_arguments( self.mock_get, 11, mock.call(test.IsHttpRequest(), config.id)) self.mock_configuration_update.assert_called_once_with( test.IsHttpRequest(), config.id, config_param_mgr.to_json()) if django.VERSION >= (1, 9): url = settings.TESTSERVER + url self.assertRedirectsNoFollow(res, url) self.assertEqual(res.status_code, 302)