def test_delete_question(self): question_rights_model = question_models.QuestionRightsModel.get( self.question_id) self.assertFalse(question_rights_model is None) question_summary_model = question_models.QuestionSummaryModel.get( self.question_id) self.assertFalse(question_summary_model is None) question_services.delete_question(self.editor_id, self.question_id) with self.assertRaisesRegexp( Exception, ('Entity for class QuestionModel with id %s not found' % (self.question_id))): question_models.QuestionModel.get(self.question_id) with self.assertRaisesRegexp( Exception, ('Entity for class QuestionRightsModel with id %s not found' % (self.question_id))): question_models.QuestionRightsModel.get(self.question_id) with self.assertRaisesRegexp( Exception, ('Entity for class QuestionSummaryModel with id %s not found' % (self.question_id))): question_models.QuestionSummaryModel.get(self.question_id) with self.assertRaisesRegexp( Exception, 'Entity for class QuestionModel with id question_id ' 'not found'): question_services.delete_question(self.editor_id, 'question_id')
def test_migration_job_skips_deleted_question(self): """Tests that the question migration job skips deleted question and does not attempt to migrate. """ # Delete the question before migration occurs. question_services.delete_question(self.albert_id, self.QUESTION_ID) # Ensure the question is deleted. with self.assertRaisesRegexp(Exception, 'Entity .* not found'): question_services.get_question_by_id(self.QUESTION_ID) # Start migration job on sample question. with self.swap(constants, 'ENABLE_NEW_STRUCTURES', True): job_id = ( question_jobs_one_off.QuestionMigrationOneOffJob.create_new()) question_jobs_one_off.QuestionMigrationOneOffJob.enqueue(job_id) # This running without errors indicates the deleted question is # being ignored. self.process_and_flush_pending_tasks() # Ensure the question is still deleted. with self.assertRaisesRegexp(Exception, 'Entity .* not found'): question_services.get_question_by_id(self.QUESTION_ID) output = question_jobs_one_off.QuestionMigrationOneOffJob.get_output(job_id) # pylint: disable=line-too-long expected = [[ u'question_deleted', [u'Encountered 1 deleted questions.'] ]] self.assertEqual(expected, [ast.literal_eval(x) for x in output])
def test_migration_job_fails_with_invalid_question(self): question_services.delete_question(self.albert_id, self.QUESTION_ID, force_deletion=True) state = self._create_valid_question_data('ABC') question_state_data = state.to_dict() language_code = 'en' version = 1 question_model = question_models.QuestionModel.create( question_state_data, language_code, version, []) question_model.question_state_data_schema_version = ( feconf.CURRENT_STATE_SCHEMA_VERSION) question_model.commit(self.albert_id, 'invalid question created', []) question_id = question_model.id # Start migration job. job_id = ( question_jobs_one_off.QuestionMigrationOneOffJob.create_new()) question_jobs_one_off.QuestionMigrationOneOffJob.enqueue(job_id) self.assertEqual( self.count_jobs_in_taskqueue( taskqueue_services.QUEUE_NAME_ONE_OFF_JOBS), 1) self.process_and_flush_pending_tasks() output = (question_jobs_one_off.QuestionMigrationOneOffJob.get_output( job_id)) expected = [[ u'validation_error', [ u'Question %s failed validation: linked_skill_ids is ' 'either null or an empty list' % question_id ] ]] self.assertEqual(expected, [ast.literal_eval(x) for x in output])
def test_migration_job_skips_deleted_question(self): """Tests that the question migration job skips deleted questions and does not attempt to migrate. """ self.save_new_question( self.QUESTION_ID, self.albert_id, self._create_valid_question_data('ABC'), [self.skill_id]) # Delete the question before migration occurs. question_services.delete_question(self.albert_id, self.QUESTION_ID) # Ensure the question is deleted. with self.assertRaisesRegexp(Exception, 'Entity .* not found'): question_services.get_question_by_id(self.QUESTION_ID) # Start migration job on sample question. job_id = ( question_jobs_one_off.QuestionSnapshotsMigrationJob.create_new()) question_jobs_one_off.QuestionSnapshotsMigrationJob.enqueue(job_id) # This running without errors indicates the deleted question is # being ignored. self.process_and_flush_pending_mapreduce_tasks() actual_output = ( question_jobs_one_off.QuestionSnapshotsMigrationJob.get_output( job_id)) expected_output_choices = [ '[u\'INFO - Question does not exist\', [u\'%s-1\', u\'%s-2\']]' % (self.QUESTION_ID, self.QUESTION_ID), '[u\'INFO - Exploration does not exist\', [u\'%s-2\', u\'%s-1\']]' % (self.QUESTION_ID, self.QUESTION_ID) ] self.assertEqual(len(actual_output), 1) self.assertIn(actual_output[0], expected_output_choices)
def test_deleted_question_are_not_processed(self): """Tests that the job does not process deleted questions.""" # Delete the question before migration occurs. question_services.delete_question( self.albert_id, self.QUESTION_ID) # Ensure the question is deleted. with self.assertRaisesRegexp(Exception, 'Entity .* not found'): question_services.get_question_by_id(self.QUESTION_ID) # Start migration job on sample question. job_id = ( question_jobs_one_off.FixQuestionImagesStorageOneOffJob.create_new() ) question_jobs_one_off.FixQuestionImagesStorageOneOffJob.enqueue(job_id) self.process_and_flush_pending_mapreduce_tasks() # Ensure that the question is still deleted and the output is None. with self.assertRaisesRegexp(Exception, 'Entity .* not found'): question_services.get_question_by_id(self.QUESTION_ID) output = ( question_jobs_one_off.FixQuestionImagesStorageOneOffJob.get_output( job_id)) self.assertEqual( [[u'question_deleted', [u'Encountered 1 deleted questions.']]], [ast.literal_eval(x) for x in output])
def test_job_skips_deleted_question(self): """Tests that the regenerate summary job skips deleted question.""" question_services.delete_question(self.albert_id, self.QUESTION_ID) # Ensure the question is deleted. with self.assertRaisesRegexp(Exception, 'Entity .* not found'): question_services.get_question_by_id(self.QUESTION_ID) # Start migration job on sample question. job_id = (question_jobs_one_off.RegenerateQuestionSummaryOneOffJob. create_new()) question_jobs_one_off.RegenerateQuestionSummaryOneOffJob.enqueue( job_id) self.process_and_flush_pending_mapreduce_tasks() # Ensure the question is still deleted. with self.assertRaisesRegexp(Exception, 'Entity .* not found'): question_services.get_question_by_id(self.QUESTION_ID) output = (question_jobs_one_off.RegenerateQuestionSummaryOneOffJob. get_output(job_id)) expected = [[ u'question_deleted', [u'Encountered 1 deleted questions.'] ]] self.assertEqual(expected, [ast.literal_eval(x) for x in output])
def delete(self, collection_id, question_id): """Handles Delete requests.""" if not collection_id: raise self.PageNotFoundException if not question_id: raise self.PageNotFoundException question_services.delete_question(self.user_id, collection_id, question_id)
def delete(self, question_id): """Handles Delete requests.""" question = question_services.get_question_by_id(question_id, strict=False) if question is None: raise self.PageNotFoundException( 'The question with the given id doesn\'t exist.') question_services.delete_question(self.user_id, question_id) self.render_json(self.values)
def delete(self, question_id): """Handles Delete requests.""" if not feconf.ENABLE_NEW_STRUCTURES: raise self.PageNotFoundException question = question_services.get_question_by_id(question_id, strict=False) if question is None: raise self.PageNotFoundException( 'The question with the given id doesn\'t exist.') question_services.delete_question(self.user_id, question_id)
def test_delete_question(self): question_services.delete_question(self.editor_id, self.question_id) with self.assertRaisesRegexp(Exception, ( 'Entity for class QuestionModel with id %s not found' % ( self.question_id))): question_models.QuestionModel.get(self.question_id) with self.assertRaisesRegexp( Exception, 'Entity for class QuestionModel with id question_id ' 'not found'): question_services.delete_question(self.editor_id, 'question_id')
def test_delete_question(self): question = question_domain.Question( 'dummy', self._create_valid_question_data('ABC'), 1, 'en') question_id = question_services.add_question(self.owner_id, question) question_services.delete_question(self.owner_id, question_id) with self.assertRaisesRegexp( Exception, ('Entity for class QuestionModel with id %s not found' % (question_id))): question_models.QuestionModel.get(question_id)
def test_delete_question(self): question = question_domain.Question( 'dummy', 'A Question', exp_domain.State.create_default_state('ABC').to_dict(), 1, 'en') question_id = question_services.add_question(self.owner_id, question) question_services.delete_question(self.owner_id, question_id) with self.assertRaisesRegexp( Exception, ('Entity for class QuestionModel with id %s not found' % (question_id))): question_models.QuestionModel.get(question_id)
def test_delete_question_decrements_question_count(self): opportunity_services.create_skill_opportunity(self.SKILL_ID, 'description') self.save_new_question(self.QUESTION_ID, self.USER_ID, self._create_valid_question_data('ABC'), [self.SKILL_ID]) question_services.delete_question(self.USER_ID, self.QUESTION_ID) skill_opportunities, _, _ = ( opportunity_services.get_skill_opportunities(None)) opportunity = skill_opportunities[0] self.assertEqual(len(skill_opportunities), 1) self.assertEqual(opportunity.question_count, 0)
def test_job_skips_deleted_questions(self): question_data1 = self._create_valid_question_data('ABC') self.save_new_question('question_id1', self.albert_id, question_data1, ['skill_id1']) question_services.delete_question(self.albert_id, 'question_id1') with self.assertRaisesRegexp(Exception, 'Entity .* not found'): question_services.get_question_by_id('question_id1') job_id = ( question_jobs_one_off.QuestionsMathRteAuditOneOffJob.create_new()) question_jobs_one_off.QuestionsMathRteAuditOneOffJob.enqueue(job_id) self.assertEqual( self.count_jobs_in_taskqueue( taskqueue_services.QUEUE_NAME_ONE_OFF_JOBS), 1) self.process_and_flush_pending_tasks() output = (question_jobs_one_off.QuestionsMathRteAuditOneOffJob. get_output(job_id)) self.assertEqual(output, [])
def test_delete_question(self): collection_id = 'col1' exp_id = '0_exploration_id' owner_id = self.get_user_id_from_email(self.OWNER_EMAIL) # Create a new collection and exploration. self.save_new_valid_collection(collection_id, owner_id, exploration_id=exp_id) # Add a skill. collection_services.update_collection( owner_id, collection_id, [{ 'cmd': collection_domain.CMD_ADD_COLLECTION_SKILL, 'name': 'skill0' }], 'Add a new skill') question = question_domain.Question( 'dummy', 'A Question', exp_domain.State.create_default_state('ABC').to_dict(), 1, collection_id, 'en') question_id = question_services.add_question(self.owner_id, question) with self.assertRaisesRegexp( Exception, ('The question with ID %s is not present' ' in the given collection' % question_id)): question_services.delete_question(self.owner_id, 'random', question_id) question_services.delete_question(self.owner_id, collection_id, question_id) with self.assertRaisesRegexp( Exception, ('Entity for class QuestionModel with id %s not found' % (question_id))): question_models.QuestionModel.get(question_id)