class LoginTest(WebAppTest): """ Tests for logging in and navigating to Courseware page """ DEMO_COURSE_USER = os.environ.get('USER_LOGIN_EMAIL') DEMO_COURSE_PASSWORD = os.environ.get('USER_LOGIN_PASSWORD') def setUp(self): """ Initialize the page object """ super(LoginTest, self).setUp() self.login_page = LmsLogin(self.browser) self.dashboard_ext = DashboardPageExtended(self.browser) def test_login(self): """ Verifies that user can Log in as a staff """ self.login_page.visit() self.login_page.login(self.DEMO_COURSE_USER, self.DEMO_COURSE_PASSWORD) self.assertEqual( self.login_page.q( css='.wrapper-header-courses .header-courses').text[0].lower(), 'my courses', msg='User not logged in as expected.') def test_remember_me(self): """ Verifies that user can use Remember Me functionality """ cookie_name = 'stage-edx-sessionid' if LMS_STAGE_BASE_URL != LMS_BASE_URL: cookie_name = 'sessionid' self.login_page.visit() self.login_page.provide_info( self.DEMO_COURSE_USER, self.DEMO_COURSE_PASSWORD ) self.login_page.click_remember_me() self.login_page.submit() self.dashboard_ext.wait_for_page() # When we check the 'remember me' checkbox # then edx keeps the session alive for 7 days. # In which case, cookie has 'expiry' value of # 7 days. If we don't check the 'remember me' # then the value of 'expiry' key of cookie will # be none. self.assertIsNotNone(self.browser.get_cookie(cookie_name)['expiry'])
class LoginTest(WebAppTest): """ Tests for logging in and navigating to Courseware page """ DEMO_COURSE_USER = os.environ.get('USER_LOGIN_EMAIL') DEMO_COURSE_PASSWORD = os.environ.get('USER_LOGIN_PASSWORD') def setUp(self): """ Initialize the page object """ super(LoginTest, self).setUp() self.login_page = LmsLogin(self.browser) self.dashboard_ext = DashboardPageExtended(self.browser) self.lms_home = LmsHome(self.browser) def test_login(self): """ Verifies that user can Log in as a staff """ self.login_page.visit() self.login_page.login(self.DEMO_COURSE_USER, self.DEMO_COURSE_PASSWORD) self.assertEqual(self.login_page.q( css='.wrapper-header-courses .header-courses').text[0].lower(), 'my courses', msg='User not logged in as expected.') def test_remember_me(self): """ Verifies that user can use Remember Me functionality """ cookie_name = 'stage-edx-sessionid' if LMS_STAGE_BASE_URL != LMS_BASE_URL: cookie_name = 'sessionid' self.login_page.visit() self.login_page.provide_info(self.DEMO_COURSE_USER, self.DEMO_COURSE_PASSWORD) self.login_page.click_remember_me() self.login_page.submit() self.dashboard_ext.wait_for_page() # When we check the 'remember me' checkbox # then edx keeps the session alive for 7 days. # In which case, cookie has 'expiry' value of # 7 days. If we don't check the 'remember me' # then the value of 'expiry' key of cookie will # be none. self.assertIsNotNone(self.browser.get_cookie(cookie_name)['expiry'])
class DonationsTest(WebAppTest): """ Regression tests of Donations """ def setUp(self): super(DonationsTest, self).setUp() self.register_page = RegisterPageExtended(self.browser) self.dashboard_page = DashboardPageExtended(self.browser) self.drupal_course_page = DemoCourseSelectionPage(self.browser) self.payment_page = PaymentPage(self.browser) self.payment_confirmation_page = PaymentConfirmationPage(self.browser) # Navigate to the registration page self.register_page.visit() # Create random email and register username = "******".format(uuid=self.unique_id[0:6]) email = "{user}@example.com".format(user=username) self.register_page.register(email=email, password="******", username=username, full_name="Test User", country="US", favorite_movie="Some Movie", terms_of_service=True) self.dashboard_page.wait_for_page() @skipIf(LMS_BASE_URL != LMS_STAGE_BASE_URL, "donations only work at stage") # LT-64 def test_user_donations(self): """ Verifies that user can Donate after selecting a course for audit """ self.drupal_course_page.visit() self.drupal_course_page.click_enroll_now() self.dashboard_page.wait_for_page() self.dashboard_page.visit() self.dashboard_page.click_donate_button() self.payment_page.wait_for_page() checkout_url = self.browser.current_url if checkout_url == THIRD_PARTY_PAYMENTS_BASE_URL + '/pay': pass elif checkout_url == THIRD_PARTY_PAYMENTS_BASE_URL + '/checkout': self.payment_page.wait_for_page() self.payment_page.make_test_payment() self.payment_confirmation_page.wait_for_page() else: raise Exception("User is unable to donate to edX")
class EnterpriseTestBase(WebAppTest): """ Test Enterprise Login """ def setUp(self): """ Initialize all page objects """ super(EnterpriseTestBase, self).setUp() self.browser.maximize_window() self.ent_portal_login = EnterprisePortalLogin(self.browser) self.ent_portal_home = EnterprisePortalHome(self.browser) self.ent_portal_course_start = \ EnterprisePortalCourseStart(self.browser) self.ent_portal_course_structure = \ EnterprisePortalCourseStructure(self.browser) self.ent_course_enrollment = \ EnterpriseCourseEnrollment(self.browser) self.ent_data_sharing_consent = \ EnterpriseDataSharingConsentPage(self.browser) self.ecommerce_courses_page = \ EcommerceCoursesPage(self.browser) self.lms_login = LmsLogin(self.browser) self.ent_edx_registration = EnterpriseEdxRegistration(self.browser) self.ent_edx_login = EnterpriseEdxLogin(self.browser) self.dashboard = DashboardPageExtended(self.browser) self.courses_page = CoursesPage(self.browser) self.course_about_page = CourseAboutPageExtended(self.browser) self.track_selection_page = TrackSelectionPage(self.browser) self.user_account = UserAccountSettings(self.browser) self.cyber_source_page = CyberSourcePage(self.browser) self.single_seat_basket = SingleSeatBasketPage(self.browser) self.receipt_page = ReceiptPage(self.browser) self.lms_api_client = LmsApiClient() self.login_api = LmsLoginApi() self.logout_api = LogoutApi() def unlink_account(self): """ Unlink IDP Account This serves as a fixture for unlinked user test case, it unlinks the user after running the tests to make sure that the precondition of test is true """ # Visit account setting page self.user_account.visit() self.user_account.switch_account_settings_tabs('accounts-tab') # If linked account is found, unlink it if self.user_account.is_idp_account_linked(IDP_CSS_ID): self.user_account.unlink_idp_account(IDP_CSS_ID) # Logout using api self.logout_from_lms_using_api() def login_to_ent_portal(self, ent_portal_username, ent_portal_password): """ Login to enterprise portal and find the course and click on it """ # Open portal self.ent_portal_login.visit() # Login self.ent_portal_login.login_to_portal(ent_portal_username, ent_portal_password) self.ent_portal_home.wait_for_page() def access_course(self): """ Access the course from portal """ # Open the course pop up and look for the desired course self.ent_portal_home.open_courses_popup() course_titles = self.ent_portal_home.fetch_course_titles_list() self.assert_(ENT_COURSE_TITLE in course_title for course_title in course_titles) # Go to course page and then use the link there to go to edX self.ent_portal_home.open_enterprise_course_page(ENT_COURSE_TITLE) self.ent_portal_course_start.wait_for_page() self.ent_portal_course_start.start_or_continue_course() self.ent_portal_course_structure.wait_for_page() self.ent_portal_course_structure.open_course_on_edx() # Get handle of newly opened edx window and switch control to it edx_window = self.driver.window_handles[1] self.driver.switch_to_window(edx_window) def login_ent_edx_user(self): """ Login the user using edX customized logistration page """ # edx credentials self.ent_edx_login.wait_for_page() self.assertEqual(ENTERPRISE_NAME, self.ent_edx_login.get_enterprise_name()) self.ent_edx_login.login(LOGIN_EMAIL, LOGIN_PASSWORD) def register_ent_edx_user(self): """ Register the enterprise user using edX customized logistration page """ __, email = get_random_credentials() self.ent_edx_registration.visit() self.assertEqual(ENTERPRISE_NAME, self.ent_edx_registration.get_enterprise_name()) self.ent_edx_registration.register(email=email, full_name='Enterprise Test User', country="US") def logout_from_lms_using_api(self): """ Get cookies from browser and send these cookie to python request to logout using api """ self.logout_api.logout_url = '{}://{}/{}'.format( LMS_PROTOCOL, LMS_BASE_URL, 'logout') self.logout_api.cookies = self.browser.get_cookies() self.logout_api.logout() def login_user_lms_using_api(self): """ Login user to LMS using login API """ self.login_api.authenticate(self.browser) def login_and_go_to_course_enrollment_page(self): """ Flow which covers the user login on enterprise portal, selecting the course and then login to edx course enrollment page """ # The edX site is visited just to make sure that when user jumps to # edX from portal we don't have to handle authentication popup self.lms_login.visit() # Enterprise portal flow self.login_to_ent_portal(ENT_PORTAL_USERNAME, ENT_PORTAL_PASSWORD) self.access_course() self.login_ent_edx_user() # Verify that user is on course enrollment page self.ent_course_enrollment.wait_for_page() def register_and_go_to_course_enrollment_page(self): """ Flow which covers the user login on enterprise portal, selecting the course and then register to edx course enrollment page """ # The edX site is visited just to make sure that when user jumps to # edX from portal we don't have to handle authentication popup self.lms_login.visit() # Enterprise portal flow self.login_to_ent_portal(ENT_PORTAL_USERNAME, ENT_PORTAL_PASSWORD) self.access_course() self.ent_edx_login.wait_for_page() self.register_ent_edx_user() # Verify that user is on course enrollment page self.ent_course_enrollment.wait_for_page() def payment_using_cyber_source(self): """ Make payment for course by providing Billing Info and Payment details in respected areas. """ self.cyber_source_page.set_card_holder_info(CARD_HOLDER_INFO) self.cyber_source_page.set_billing_info(BILLING_INFO) self.cyber_source_page.click_payment_button() self.receipt_page.wait_for_page() def register_edx_user(self): """ Register the user using edX registration page """ username, email = get_random_credentials() self.ent_edx_registration.visit() self.ent_edx_registration.register(email=email, full_name='Test User', username=username, password='******', country="US") self.dashboard.wait_for_page() def verify_info_is_populated_on_basket(self, discounted_price): """ After User accept data sharing consent from landing pag verify that following information is displayed correctly on basket page: i) Enterprise offer is applied ii) Discounted amount Arguments: discounted_price(float): Discounted price of the course. """ self.assertTrue(self.single_seat_basket.is_offer_applied()) self.assertEqual(self.single_seat_basket.total_price_after_discount, discounted_price) self.payment_using_cyber_source() def verify_receipt_info_for_discounted_course(self): """ Verify that info on receipt page is correct. Verify i) Course title. ii) Order date """ self.assertIn(ENT_COURSE_TITLE, self.receipt_page.order_desc) self.assertEqual(datetime.utcnow().strftime("%Y-%m-%d"), self.receipt_page.order_date)
class EnterpriseTestBase(WebAppTest): """ Test Enterprise Login """ def setUp(self): """ Initialize all page objects """ super(EnterpriseTestBase, self).setUp() self.browser.maximize_window() self.ent_portal_login = EnterprisePortalLogin(self.browser) self.ent_portal_home = EnterprisePortalHome(self.browser) self.ent_portal_course_start = \ EnterprisePortalCourseStart(self.browser) self.ent_portal_course_structure = \ EnterprisePortalCourseStructure(self.browser) self.ent_course_enrollment = \ EnterpriseCourseEnrollment(self.browser) self.ent_data_sharing_consent = \ EnterpriseDataSharingConsentPage(self.browser) self.ecommerce_courses_page = \ EcommerceCoursesPage(self.browser) self.lms_login = LmsLogin(self.browser) self.ent_edx_registration = EnterpriseEdxRegistration(self.browser) self.ent_edx_login = EnterpriseEdxLogin(self.browser) self.dashboard = DashboardPageExtended(self.browser) self.courses_page = CoursesPage(self.browser) self.course_about_page = CourseAboutPageExtended(self.browser) self.track_selection_page = TrackSelectionPage(self.browser) self.user_account = UserAccountSettings(self.browser) self.cyber_source_page = CyberSourcePage(self.browser) self.single_seat_basket = SingleSeatBasketPage(self.browser) self.receipt_page = ReceiptPage(self.browser) self.lms_api_client = LmsApiClient() self.login_api = LmsLoginApi() self.logout_api = LogoutApi() def unlink_account(self): """ Unlink IDP Account This serves as a fixture for unlinked user test case, it unlinks the user after running the tests to make sure that the precondition of test is true """ # Visit account setting page self.user_account.visit() self.user_account.switch_account_settings_tabs('accounts-tab') # If linked account is found, unlink it if self.user_account.is_idp_account_linked(IDP_CSS_ID): self.user_account.unlink_idp_account(IDP_CSS_ID) # Logout using api self.logout_from_lms_using_api() def add_recovery_email(self, email): """ Add secondary email address for enterprise learner """ self.user_account.visit() self.user_account.fill_secondary_email_field(email) def login_to_ent_portal(self, ent_portal_username, ent_portal_password): """ Login to enterprise portal and find the course and click on it """ # Open portal self.ent_portal_login.visit() # Login self.ent_portal_login.login_to_portal( ent_portal_username, ent_portal_password) self.ent_portal_home.wait_for_page() def access_course(self): """ Access the course from portal """ # Open the course pop up and look for the desired course self.ent_portal_home.open_courses_popup() course_titles = self.ent_portal_home.fetch_course_titles_list() self.assert_( ENT_COURSE_TITLE in course_title for course_title in course_titles ) # Go to course page and then use the link there to go to edX self.ent_portal_home.open_enterprise_course_page( ENT_COURSE_TITLE ) self.ent_portal_course_start.wait_for_page() self.ent_portal_course_start.start_or_continue_course() self.ent_portal_course_structure.wait_for_page() self.ent_portal_course_structure.open_course_on_edx() # Get handle of newly opened edx window and switch control to it edx_window = self.driver.window_handles[1] self.driver.switch_to_window(edx_window) def login_ent_edx_user(self): """ Login the user using edX customized logistration page """ # edx credentials self.ent_edx_login.wait_for_page() self.assertEqual( ENTERPRISE_NAME, self.ent_edx_login.get_enterprise_name() ) self.ent_edx_login.login( LOGIN_EMAIL, LOGIN_PASSWORD ) def register_ent_edx_user(self): """ Register the enterprise user using edX customized logistration page """ __, email = get_random_credentials() self.ent_edx_registration.visit() self.assertEqual( ENTERPRISE_NAME, self.ent_edx_registration.get_enterprise_name() ) self.ent_edx_registration.register( email=email, full_name='Enterprise Test User', country="US" ) def logout_from_lms_using_api(self): """ Get cookies from browser and send these cookie to python request to logout using api """ self.logout_api.logout_url = '{}://{}/{}'.format( LMS_PROTOCOL, LMS_BASE_URL, 'logout' ) self.logout_api.cookies = self.browser.get_cookies() self.logout_api.logout() def login_user_lms_using_api(self): """ Login user to LMS using login API """ self.login_api.authenticate(self.browser) def login_and_go_to_course_enrollment_page(self): """ Flow which covers the user login on enterprise portal, selecting the course and then login to edx course enrollment page """ # The edX site is visited just to make sure that when user jumps to # edX from portal we don't have to handle authentication popup self.lms_login.visit() # Enterprise portal flow self.login_to_ent_portal( ENT_PORTAL_USERNAME, ENT_PORTAL_PASSWORD) self.access_course() self.login_ent_edx_user() # Verify that user is on course enrollment page self.ent_course_enrollment.wait_for_page() def register_and_go_to_course_enrollment_page(self): """ Flow which covers the user login on enterprise portal, selecting the course and then register to edx course enrollment page """ # The edX site is visited just to make sure that when user jumps to # edX from portal we don't have to handle authentication popup self.lms_login.visit() # Enterprise portal flow self.login_to_ent_portal( ENT_PORTAL_USERNAME, ENT_PORTAL_PASSWORD) self.access_course() self.ent_edx_login.wait_for_page() self.register_ent_edx_user() # Verify that user is on course enrollment page self.ent_course_enrollment.wait_for_page() def payment_using_cyber_source(self): """ Make payment for course by providing Billing Info and Payment details in respected areas. """ self.cyber_source_page.set_card_holder_info(CARD_HOLDER_INFO) self.cyber_source_page.set_billing_info(BILLING_INFO) self.cyber_source_page.click_payment_button() self.receipt_page.wait_for_page() def register_edx_user(self): """ Register the user using edX registration page """ username, email = get_random_credentials() self.ent_edx_registration.visit() self.ent_edx_registration.register( email=email, full_name='Test User', username=username, password='******', country="US" ) self.dashboard.wait_for_page() def verify_info_is_populated_on_basket(self, discounted_price): """ After User accept data sharing consent from landing pag verify that following information is displayed correctly on basket page: i) Enterprise offer is applied ii) Discounted amount Arguments: discounted_price(float): Discounted price of the course. """ self.assertTrue(self.single_seat_basket.is_offer_applied()) self.assertEqual( self.single_seat_basket.total_price_after_discount, discounted_price ) self.payment_using_cyber_source() def verify_receipt_info_for_discounted_course(self): """ Verify that info on receipt page is correct. Verify i) Course title. ii) Order date """ self.assertIn(ENT_COURSE_TITLE, self.receipt_page.order_desc) self.assertEqual( datetime.utcnow().strftime("%Y-%m-%d"), self.receipt_page.order_date )