diff --git a/common/djangoapps/student/helpers.py b/common/djangoapps/student/helpers.py index 06abbe770639..d6bab8624d4b 100644 --- a/common/djangoapps/student/helpers.py +++ b/common/djangoapps/student/helpers.py @@ -204,7 +204,7 @@ def auth_pipeline_urls(auth_entry, redirect_url=None): # Query string parameters that can be passed to the "finish_auth" view to manage # things like auto-enrollment. -POST_AUTH_PARAMS = ('course_id', 'enrollment_action', 'course_mode', 'email_opt_in') +POST_AUTH_PARAMS = ('course_id', 'enrollment_action', 'course_mode', 'email_opt_in', 'advanced_course') def get_next_url_for_login_page(request): diff --git a/common/test/acceptance/pages/lms/ga_advanced_course.py b/common/test/acceptance/pages/lms/ga_advanced_course.py index b3c3f0567b54..ba218c27dce4 100644 --- a/common/test/acceptance/pages/lms/ga_advanced_course.py +++ b/common/test/acceptance/pages/lms/ga_advanced_course.py @@ -7,6 +7,7 @@ from . import BASE_URL from .course_about import CourseAboutPage as EdXCourseAboutPage +from .login_and_register import CombinedLoginAndRegisterPage from .pay_and_verify import FakePaymentPage as EdXFakePaymentPage from .ga_dashboard import DashboardPage as GaDashboradPage @@ -276,12 +277,17 @@ def submit_payment(self, payment_method='card'): class CourseAboutPage(EdXCourseAboutPage): - def enroll(self): + def enroll(self, login=True): self.q(css='a.register').first.click() - advanced_course_choose_page = AdvancedCourseChoosePage(self.browser, self.course_id) - advanced_course_choose_page.wait_for_page() - return advanced_course_choose_page + if login: + advanced_course_choose_page = AdvancedCourseChoosePage(self.browser, self.course_id) + advanced_course_choose_page.wait_for_page() + return advanced_course_choose_page + else: + register_page = CombinedLoginAndRegisterPage(self.browser) + register_page.wait_for_page() + return register_page class DashboardPage(GaDashboradPage): diff --git a/common/test/acceptance/tests/lms/test_ga_advanced_course.py b/common/test/acceptance/tests/lms/test_ga_advanced_course.py index 97f7299a547b..250ba608b45a 100644 --- a/common/test/acceptance/tests/lms/test_ga_advanced_course.py +++ b/common/test/acceptance/tests/lms/test_ga_advanced_course.py @@ -10,7 +10,7 @@ from ..ga_helpers import GaccoTestMixin from ...pages.lms.ga_advanced_course import ( - AdvancedF2FCoursesPage, CourseAboutPage, DashboardPage, + AdvancedCourseChoosePage, AdvancedF2FCoursesPage, CourseAboutPage, DashboardPage, ) @@ -231,7 +231,7 @@ def test_purchase_flow_when_enroll(self): def test_purchase_flow_from_dashboard(self): """ Scenario: - Course has only onw advanced course. + Course has only one advanced course. 1. Visit dashboard and go to list page 2. Show advanced course list page and go to ticket option page @@ -304,3 +304,101 @@ def test_purchase_flow_from_dashboard(self): u"If you unenroll, ticket, such as face-to-face classroom you have purchased will not be canceled. Please contact us through the Help If you would like to cancel the ticket.", dashboard_page.get_refund_info_message() ) + + def test_not_logged_in_and_register(self): + """ + Scenario: + To enroll in not logged-in state. + + 1. Visit course about page and enroll + 2. Show register page and register + 3. Show advanced course choose page + """ + course_about_page = CourseAboutPage(self.browser, self.course_id).visit() + register_page = course_about_page.enroll(login=False) + + username = self.unique_id[0:6] + register_page.register( + email='{}@example.com'.format(username), password='abcdefG1', username=username, + full_name=username, terms_of_service=True + ) + + # Verify course choose page is shown + AdvancedCourseChoosePage(self.browser, self.course_id).wait_for_page() + + def test_not_logged_in_and_register_with_not_advanced_course(self): + """ + Scenario: + Course has not advanced course. + To enroll in not logged-in state. + + 1. Visit course about page and enroll + 2. Show register page and register + 3. Show dashboard page + """ + _course_id = CourseFixture( + self.COURSE_ORG, '{}_2'.format(self._testMethodName), self.COURSE_RUN, self.COURSE_DISPLAY + ).install()._course_key + + course_about_page = CourseAboutPage(self.browser, _course_id).visit() + register_page = course_about_page.enroll(login=False) + + username = self.unique_id[0:6] + register_page.register( + email='{}@example.com'.format(username), password='abcdefG1', username=username, + full_name=username, terms_of_service=True + ) + + # Verify dashboard page is shown + DashboardPage(self.browser).wait_for_page() + + def test_not_logged_in_and_login(self): + """ + Scenario: + To enroll in not logged-in state. + + 1. Visit course about page and enroll + 2. Show register page + 3. Toggle form and login + 4. Show advanced course choose page + """ + # Create user and logout + user = self._auto_auth() + self._logout() + + course_about_page = CourseAboutPage(self.browser, self.course_id).visit() + register_page = course_about_page.enroll(login=False) + + register_page.toggle_form() + register_page.login(email=user['email'], password=user['username']) + + # Verify course choose page is shown + AdvancedCourseChoosePage(self.browser, self.course_id).wait_for_page() + + def test_not_logged_in_and_login_with_not_advanced_course(self): + """ + Scenario: + Course has not advanced course. + To enroll in not logged-in state. + + 1. Visit course about page and enroll + 2. Show register page + 3. Toggle form and login + 4. Show dashboard page + """ + # Create user and logout + user = self._auto_auth() + self._logout() + + _course_id = CourseFixture( + self.COURSE_ORG, '{}_2'.format(self._testMethodName), self.COURSE_RUN, self.COURSE_DISPLAY + ).install()._course_key + + course_about_page = CourseAboutPage(self.browser, _course_id).visit() + register_page = course_about_page.enroll(login=False) + + register_page.toggle_form() + register_page.login(email=user['email'], password=user['username']) + + # Verify dashboard page is shown + DashboardPage(self.browser).wait_for_page() diff --git a/lms/static/js/student_account/views/FinishAuthView.js b/lms/static/js/student_account/views/FinishAuthView.js index 49cb7055a425..7874ac0f2653 100644 --- a/lms/static/js/student_account/views/FinishAuthView.js +++ b/lms/static/js/student_account/views/FinishAuthView.js @@ -46,7 +46,8 @@ finishAuth: '/account/finish_auth', defaultNextUrl: '/dashboard', payment: '/verify_student/start-flow/', - trackSelection: '/course_modes/choose/' + trackSelection: '/course_modes/choose/', + advancedCourse: '/advanced_course/choose/' }, initialize: function( obj ) { @@ -55,7 +56,8 @@ enrollmentAction: $.url( '?enrollment_action' ), courseId: $.url( '?course_id' ), courseMode: $.url( '?course_mode' ), - emailOptIn: $.url( '?email_opt_in') + emailOptIn: $.url( '?email_opt_in'), + advancedCourse: $.url( '?advanced_course' ) }; for (var key in queryParams) { if (queryParams[key]) { @@ -66,6 +68,7 @@ this.enrollmentAction = queryParams.enrollmentAction; this.courseMode = queryParams.courseMode; this.emailOptIn = queryParams.emailOptIn; + this.advancedCourse = queryParams.advancedCourse; this.nextUrl = this.urls.defaultNextUrl; if (queryParams.next) { // Ensure that the next URL is internal for security reasons @@ -120,7 +123,10 @@ var courseId = decodeURIComponent( this.courseId ); // Determine where to redirect the user after auto-enrollment. - if ( !this.courseMode ) { + if ( this.advancedCourse ) { + /* If the course has advanced course, send user to the course choose flow */ + redirectUrl = this.urls.advancedCourse + courseId + '/'; + } else if ( !this.courseMode ) { /* Backwards compatibility with the original course details page. The old implementation did not specify the course mode for enrollment, so we'd always send the user to the "track selection" page.