def login_user(self, learner, email): """ Logs in an already existing user. Args: learner (str): the username of the user. email (str): email address of the user. """ auto_auth_page = AutoAuthPage( self.browser, email=email, password=self.TEST_PASSWORD, username=learner, course_id=self.TEST_COURSE_ID, staff=True ) auto_auth_page.visit()
def login_user(self, learner, email=LEARNER_EMAIL, password=LEARNER_PASSWORD): """ Logs in an already existing user. Args: learner (str): the username of the user. email (str): email (if not specified, LEARNER_EMAIL is used). password (str): password (if not specified, LEARNER_PASSWORD is used). """ auto_auth_page = AutoAuthPage( self.browser, email=email, password=password, username=learner, course_id=self.TEST_COURSE_ID, staff=True ) auto_auth_page.visit()
def do_submission(self): """ Creates a user and submission. Returns: (str, str): the username and email of the newly created user """ auto_auth_page = AutoAuthPage( self.browser, password=self.TEST_PASSWORD, course_id=self.TEST_COURSE_ID, staff=True ) auto_auth_page.visit() username_email = auto_auth_page.get_username_and_email() self.submission_page.visit().submit_response(self.SUBMISSION) return username_email
def setUp(self, problem_type, staff=False): """ Configure page objects to test Open Assessment. Args: problem_type (str): The type of problem being tested, used to choose which part of the course to load. staff (bool): If True, runs the test with a staff user (defaults to False). """ super(OpenAssessmentTest, self).setUp() self.problem_loc = self.PROBLEM_LOCATIONS[problem_type] self.auto_auth_page = AutoAuthPage(self.browser, course_id=self.TEST_COURSE_ID, staff=staff) self.submission_page = SubmissionPage(self.browser, self.problem_loc) self.self_asmnt_page = AssessmentPage('self-assessment', self.browser, self.problem_loc) self.peer_asmnt_page = AssessmentPage('peer-assessment', self.browser, self.problem_loc) self.student_training_page = AssessmentPage('student-training', self.browser, self.problem_loc) self.grade_page = GradePage(self.browser, self.problem_loc)
def do_submission(self, email, password): """ Creates a user and submission. Args: email (str): email for the new user password (str): password for the new user Returns: str: the username of the newly created user """ auto_auth_page = AutoAuthPage( self.browser, email=email, password=password, course_id=self.TEST_COURSE_ID, staff=True ) auto_auth_page.visit() username = auto_auth_page.get_username() self.submission_page.visit().submit_response(self.SUBMISSION) return username
def setUp(self, problem_type, staff=False): """ Configure page objects to test Open Assessment. Args: problem_type (str): The type of problem being tested, used to choose which part of the course to load. staff (bool): If True, runs the test with a staff user (defaults to False). """ super(OpenAssessmentTest, self).setUp() self.problem_loc = self.PROBLEM_LOCATIONS[problem_type] self.auto_auth_page = AutoAuthPage(self.browser, course_id=self.TEST_COURSE_ID, staff=staff) self.submission_page = SubmissionPage(self.browser, self.problem_loc) self.self_asmnt_page = AssessmentPage("self-assessment", self.browser, self.problem_loc) self.peer_asmnt_page = AssessmentPage("peer-assessment", self.browser, self.problem_loc) self.student_training_page = AssessmentPage("student-training", self.browser, self.problem_loc) self.staff_asmnt_page = AssessmentPage("staff-assessment", self.browser, self.problem_loc) self.grade_page = GradePage(self.browser, self.problem_loc)
class OpenAssessmentTest(WebAppTest): """ UI-level acceptance tests for Open Assessment. """ TEST_COURSE_ID = "course-v1:edx+ORA203+course" PROBLEM_LOCATIONS = { 'staff_only': u'courses/{test_course_id}/courseware/' u'61944efb38a349edb140c762c7419b50/415c3ee1b7d04b58a1887a6fe82b31d6/'.format(test_course_id=TEST_COURSE_ID), 'self_only': u'courses/{test_course_id}/courseware/' u'a4dfec19cf9b4a6fb5b18be6ccd9cecc/338a4affb58a45459629e0566291381e/'.format(test_course_id=TEST_COURSE_ID), 'peer_only': u'courses/{test_course_id}/courseware/' u'a4dfec19cf9b4a6fb5b18be6ccd9cecc/417e47b2663a4f79b62dba20b21628c8/'.format(test_course_id=TEST_COURSE_ID), 'student_training': u'courses/{test_course_id}/courseware/' u'676026889c884ac1827688750871c825/5663e9b038434636977a4226d668fe02/'.format(test_course_id=TEST_COURSE_ID), 'file_upload': u'courses/{test_course_id}/courseware/' u'57a3f9d51d424f6cb922f0d69cba868d/bb563abc989340d8806920902f267ca3/'.format(test_course_id=TEST_COURSE_ID), 'full_workflow_staff_override': u'courses/{test_course_id}/courseware/' u'676026889c884ac1827688750871c825/181ea9ff144c4766be44eb8cb360e34f/'.format(test_course_id=TEST_COURSE_ID), 'full_workflow_staff_required': u'courses/{test_course_id}/courseware/' u'8d9584d242b44343bc270ea5ef04ab03/0b0dcc728abe45138c650732af178afb/'.format(test_course_id=TEST_COURSE_ID), } SUBMISSION = u"This is a test submission." LATEX_SUBMISSION = u"[mathjaxinline]( \int_{0}^{1}xdx )[/mathjaxinline]" OPTIONS_SELECTED = [1, 2] STAFF_OVERRIDE_OPTIONS_SELECTED = [0, 1] STAFF_OVERRIDE_SCORE = 1 STAFF_GRADE_EXISTS = "COMPLETE" STAFF_OVERRIDE_LEARNER_STEPS_NOT_COMPLETE = "YOU MUST COMPLETE THE STEPS ABOVE TO VIEW YOUR GRADE" STAFF_AREA_SCORE = "Final grade: {} out of 8" STAFF_OVERRIDE_STAFF_AREA_NOT_COMPLETE = "The problem has not been completed." EXPECTED_SCORE = 6 STUDENT_TRAINING_OPTIONS = [ [1, 2], [0, 2] ] TEST_PASSWORD = "******" def setUp(self, problem_type, staff=False): """ Configure page objects to test Open Assessment. Args: problem_type (str): The type of problem being tested, used to choose which part of the course to load. staff (bool): If True, runs the test with a staff user (defaults to False). """ super(OpenAssessmentTest, self).setUp() if PROFILING_ENABLED: self.profiler = Profiler(use_signal=False) self.profiler.start() self.problem_loc = self.PROBLEM_LOCATIONS[problem_type] self.auto_auth_page = AutoAuthPage(self.browser, course_id=self.TEST_COURSE_ID, staff=staff) self.submission_page = SubmissionPage(self.browser, self.problem_loc) self.self_asmnt_page = AssessmentPage('self-assessment', self.browser, self.problem_loc) self.peer_asmnt_page = AssessmentPage('peer-assessment', self.browser, self.problem_loc) self.student_training_page = AssessmentPage('student-training', self.browser, self.problem_loc) self.staff_asmnt_page = AssessmentPage('staff-assessment', self.browser, self.problem_loc) self.grade_page = GradePage(self.browser, self.problem_loc) def log_to_file(self): with open('{}-profile.log'.format(self.id()), 'w') as f: f.write(self.profiler.output_text()) def tearDown(self): if PROFILING_ENABLED: self.profiler.stop() self.log_to_file() def login_user(self, learner, email): """ Logs in an already existing user. Args: learner (str): the username of the user. email (str): email address of the user. """ auto_auth_page = AutoAuthPage( self.browser, email=email, password=self.TEST_PASSWORD, username=learner, course_id=self.TEST_COURSE_ID, staff=True ) auto_auth_page.visit() def do_self_assessment(self): """ Creates a user, submits a self assessment, verifies the grade, and returns the username of the learner for which the self assessment was submitted. """ self.auto_auth_page.visit() username, _ = self.auto_auth_page.get_username_and_email() self.submission_page.visit().submit_response(self.SUBMISSION) self.assertTrue(self.submission_page.has_submitted) # Submit a self-assessment self.submit_self_assessment(self.OPTIONS_SELECTED) # Verify the grade self.assertEqual(self.EXPECTED_SCORE, self.grade_page.wait_for_page().score) return username def submit_self_assessment(self, options=OPTIONS_SELECTED): """ Submit a self assessment for the currently logged in student. Do not verify grade. Args: options: the options to select for the self assessment (will use OPTIONS_SELECTED if not specified) """ self.self_asmnt_page.wait_for_page().wait_for_response() self.assertIn(self.SUBMISSION, self.self_asmnt_page.response_text) self.self_asmnt_page.assess("self", options).wait_for_complete() self.assertTrue(self.self_asmnt_page.is_complete) def _verify_staff_grade_section(self, expected_status, expected_message_title): """ Verifies the expected status and message text in the Staff Grade section (as shown to the learner). """ self.staff_asmnt_page.wait_for_page() self.assertEqual("Staff Grade", self.staff_asmnt_page.label) self.staff_asmnt_page.verify_status_value(expected_status) self.assertEqual(expected_message_title, self.staff_asmnt_page.message_title) def do_training(self): """ Complete two training examples, satisfying the requirements. """ for example_num, options_selected in enumerate(self.STUDENT_TRAINING_OPTIONS): if example_num > 0: try: self.student_training_page.wait_for_num_completed(example_num) except BrokenPromise: msg = "Did not complete at least {num} student training example(s).".format(num=example_num) self.fail(msg) self.student_training_page.wait_for_page().wait_for_response().assess("training", options_selected) # Check that we've completed student training try: self.student_training_page.wait_for_complete() except BrokenPromise: self.fail("Student training was not marked complete.") def do_peer_assessment(self, count=1, options=OPTIONS_SELECTED): """ Does the specified number of peer assessments. Args: count: the number of assessments that must be completed (defaults to 1) options: the options to use (defaults to OPTIONS_SELECTED) """ self.peer_asmnt_page.visit() for count_assessed in range(1, count + 1): self.peer_asmnt_page.wait_for_page().wait_for_response().assess("peer", options) self.peer_asmnt_page.wait_for_num_completed(count_assessed) def do_staff_override(self, username, final_score=STAFF_AREA_SCORE.format(STAFF_OVERRIDE_SCORE)): """ Complete a staff assessment (grade override). Args: username: the learner to grade final_score: the expected final score as shown in the staff area (defaults to the staff override score value) """ self.staff_area_page.visit() self.staff_area_page.show_learner(username) self.staff_area_page.expand_learner_report_sections() self.staff_area_page.staff_assess(self.STAFF_OVERRIDE_OPTIONS_SELECTED, "override") self.staff_area_page.verify_learner_final_score(final_score) def do_staff_assessment(self, number_to_assess=0, options_selected=OPTIONS_SELECTED): """ Use staff tools to assess available responses. Args: number_to_assess: the number of submissions to assess. If not provided (or 0), will grade all available submissions. """ self.staff_area_page.visit() self.staff_area_page.click_staff_toolbar_button("staff-grading") # Get the counts before checking out a submission for assessment. start_numbers = self.staff_area_page.available_checked_out_numbers # Check out a submission. self.staff_area_page.expand_staff_grading_section() # Checked out number should increase, ungraded decrease. ungraded = start_numbers[0]-1 checked_out = start_numbers[1]+1 self.staff_area_page.verify_available_checked_out_numbers((ungraded, checked_out)) assessed = 0 while number_to_assess == 0 or assessed < number_to_assess: continue_after = False if number_to_assess-1 == assessed else ungraded > 0 self.staff_area_page.staff_assess(options_selected, "full-grade", continue_after) assessed += 1 if not continue_after: self.staff_area_page.verify_available_checked_out_numbers((ungraded, checked_out-1)) break else: ungraded -=1 self.staff_area_page.verify_available_checked_out_numbers((ungraded, checked_out)) def refresh_page(self): """ Helper method that waits for "unsaved changes" warnings to clear before refreshing the page. """ EmptyPromise( lambda: self.browser.execute_script("return window.onbeforeunload === null"), "Unsubmitted changes exist on page." ).fulfill() self.browser.refresh()