def test_small_cohort(self): cohort_upload = CohortUpload() cohort_upload.name.data = 'small_cohort' cohort_upload.project.data = mediawiki_project cohort_upload.records = [ # two existing users {'raw_id_or_name': 'Editor test-specific-0', 'project': mediawiki_project}, {'raw_id_or_name': 'Editor test-specific-1', 'project': mediawiki_project}, # one invalid username {'raw_id_or_name': 'Nonexisting', 'project': mediawiki_project}, # one user with invalid project {'raw_id_or_name': 'Nonexisting2', 'project': 'Nonexisting'}, ] v = ValidateCohort.from_upload(cohort_upload, self.owner_user_id) v.task.delay(v).get() self.session.commit() assert_equal(self.session.query(WikiUserStore).filter( WikiUserStore.raw_id_or_name == 'Editor test-specific-0').one().valid, True ) assert_equal(self.session.query(WikiUserStore).filter( WikiUserStore.raw_id_or_name == 'Editor test-specific-1').one().valid, True ) assert_equal(self.session.query(WikiUserStore).filter( WikiUserStore.raw_id_or_name == 'Nonexisting').one().valid, False) assert_equal(self.session.query(WikiUserStore).filter( WikiUserStore.raw_id_or_name == 'Nonexisting2').one().valid, False)
def program_metrics_reports_request(): """ Renders a page that facilitates kicking off a new ProgramMetrics report """ form = ProgramMetricsForm() if request.method == 'POST': form = ProgramMetricsForm.from_request(request) try: if not form.validate(): flash('Please fix validation problems.', 'warning') else: form.parse_records() vc = ValidateCohort.from_upload(form, current_user.id) gm = RunProgramMetricsReport(vc.cohort_id, form.start_date.data, form.end_date.data, current_user.id) # Validate the cohort, and on success, call the # RunProgramMetricsReport task. No parameters are passed # from ValidateCohort to the report, so we are using # an immutable task signature in the link param. vc.task.apply_async([vc], link=gm.task.si(gm)) return redirect(url_for('reports_index')) except Exception, e: app.logger.exception(str(e)) flash('Server error while processing your request', 'error')
def test_from_upload_exception(self): cohort_upload = CohortUpload() cohort_upload.name.data = 'small_cohort' cohort_upload.project.data = 'wiki' cohort_upload.records = [{'fake': 'dict'}] v = ValidateCohort.from_upload(cohort_upload, self.owner_user_id) assert_equal(v, None)
def test_small_cohort(self): cohort_upload = CohortUpload() cohort_upload.name.data = 'small_cohort' cohort_upload.project.data = mediawiki_project cohort_upload.records = [ # two existing users { 'raw_id_or_name': 'Editor test-specific-0', 'project': mediawiki_project }, { 'raw_id_or_name': 'Editor test-specific-1', 'project': mediawiki_project }, # one invalid username { 'raw_id_or_name': 'Nonexisting', 'project': mediawiki_project }, # one user with invalid project { 'raw_id_or_name': 'Nonexisting2', 'project': 'Nonexisting' }, ] v = ValidateCohort.from_upload(cohort_upload, self.owner_user_id) v.task.delay(v).get() self.session.commit() assert_equal( self.session.query(WikiUserStore).filter( WikiUserStore.raw_id_or_name == 'Editor test-specific-0').one().valid, True) assert_equal( self.session.query(WikiUserStore).filter( WikiUserStore.raw_id_or_name == 'Editor test-specific-1').one().valid, True) assert_equal( self.session.query(WikiUserStore).filter( WikiUserStore.raw_id_or_name == 'Nonexisting').one().valid, False) assert_equal( self.session.query(WikiUserStore).filter( WikiUserStore.raw_id_or_name == 'Nonexisting2').one().valid, False)
def cohort_upload(): """ View for uploading and validating a new cohort via CSV """ form = CohortUpload() if request.method == 'POST': form = CohortUpload.from_request(request) try: if not form.validate(): flash('Please fix validation problems.', 'warning') else: form.parse_records() vc = ValidateCohort.from_upload(form, current_user.id) vc.task.delay(vc) return redirect('{0}#{1}'.format( url_for('cohorts_index'), vc.cohort_id )) except Exception, e: app.logger.exception(str(e)) flash('Server error while processing your upload', 'error')
def validate_cohort(self, filename): ''' Given a cohort file with usernames all users but one should validate. It will mingle the name of the 1st user. Parameters: filename : Name of a file that contains a cohort with user names test will search for file in tests/static/public folder ''' names = self.create_users_from_file(filename) # establish ownership for this cohort otherwise things do not work owner_user = UserStore(username='******', email='*****@*****.**') self.session.add(owner_user) self.session.commit() # creating here kind of like a cohortupload mock # flask forms do not lend themselves to easy mocking cohort_upload = MockCohort() cohort_upload.name = MockCohort() cohort_upload.name.data = 'testing-cohort' cohort_upload.description = MockCohort() cohort_upload.description.data = 'testing-cohort' cohort_upload.project = MockCohort() cohort_upload.project.data = mediawiki_project cohort_upload.validate_as_user_ids = MockCohort() cohort_upload.validate_as_user_ids.data = False cohort_upload.records = [] # mingle the name of the first user user not_valid_editor_name = 'Mr Not Valid' names[0] = not_valid_editor_name for name in names: cohort_upload.records.append({ 'raw_id_or_name' : name, 'project' : mediawiki_project, }) # TODO clear session situation? # all operations need to happen on the scope of the same session # but this session passed in is going to be closed vc = ValidateCohort.from_upload(cohort_upload, owner_user.id, self.session) cohort = self.session.query(CohortStore).first() self.session.commit() vc.validate_records(self.session, cohort) # now we need to assert that all users but the first one validate assert_equal(len( self.session.query(WikiUserStore) .filter(WikiUserStore.validating_cohort == cohort.id) .filter(WikiUserStore.valid) .all() ), len(names) - 1) # retrieve the user that should not be valid, make sure it is not indeed wiki_user = self.session.query(WikiUserStore)\ .filter(WikiUserStore.validating_cohort == cohort.id)\ .filter(WikiUserStore.raw_id_or_name == not_valid_editor_name).one() assert_false(wiki_user.valid)
def validate_cohort(self, filename): ''' Given a cohort file with usernames all users but one should validate. It will mingle the name of the 1st user. Parameters: filename : Name of a file that contains a cohort with user names test will search for file in tests/static/public folder ''' names = self.create_users_from_file(filename) # establish ownership for this cohort otherwise things do not work owner_user = UserStore(username='******', email='*****@*****.**') self.session.add(owner_user) self.session.commit() # creating here kind of like a cohortupload mock # flask forms do not lend themselves to easy mocking cohort_upload = MockCohort() cohort_upload.name = MockCohort() cohort_upload.name.data = 'testing-cohort' cohort_upload.description = MockCohort() cohort_upload.description.data = 'testing-cohort' cohort_upload.project = MockCohort() cohort_upload.project.data = mediawiki_project cohort_upload.validate_as_user_ids = MockCohort() cohort_upload.validate_as_user_ids.data = False cohort_upload.records = [] # mingle the name of the first user user not_valid_editor_name = 'Mr Not Valid' names[0] = not_valid_editor_name for name in names: cohort_upload.records.append({ 'raw_id_or_name': name, 'project': mediawiki_project, }) # TODO clear session situation? # all operations need to happen on the scope of the same session # but this session passed in is going to be closed vc = ValidateCohort.from_upload(cohort_upload, owner_user.id, self.session) cohort = self.session.query(CohortStore).first() self.session.commit() vc.validate_records(self.session, cohort) # now we need to assert that all users but the first one validate assert_equal( len( self.session.query(WikiUserStore).filter( WikiUserStore.validating_cohort == cohort.id).filter( WikiUserStore.valid).all()), len(names) - 1) # retrieve the user that should not be valid, make sure it is not indeed wiki_user = self.session.query(WikiUserStore)\ .filter(WikiUserStore.validating_cohort == cohort.id)\ .filter(WikiUserStore.raw_id_or_name == not_valid_editor_name).one() assert_false(wiki_user.valid)