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 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 setUp(self): super(CourseEnrollmentTest, self).setUp() self.lms_api_client = LmsApiClient() self.enrollment_api_client = EnrollmentApiClient() # Initialize all page objects self.cyber_source_page = CyberSourcePage(self.browser) self.courses_page = CoursesPage(self.browser) self.multi_seat_basket_page = MultiSeatBasketPage(self.browser) self.single_seat_basket_page = SingleSeatBasketPage(self.browser) self.receipt_page = ReceiptPage(self.browser) # Initialize all common variables self.course_id = '' self.course_title = '' self.course_price = 0.0 self.total_price = 0.0 self.full_cleanup = True
def setUp(self): super(CourseEnrollmentTest, self).setUp() self.lms_api_client = LmsApiClient() self.enrollment_api_client = EnrollmentApiClient() # Initialize all page objects self.cyber_source_page = CyberSourcePage(self.browser) self.courses_page = CoursesPage(self.browser) self.multi_seat_basket_page = MultiSeatBasketPage(self.browser) self.single_seat_basket_page = SingleSeatBasketPage(self.browser) self.receipt_page = ReceiptPage(self.browser) # Initialize all common variables self.course_id = '' self.course_title = '' self.course_price = 0.0 self.total_price = 0.0 self.full_cleanup = True
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 CourseEnrollmentTest(WhiteLabelTestsBaseClass): """ Class for tests with enrollment capability """ def setUp(self): super(CourseEnrollmentTest, self).setUp() self.lms_api_client = LmsApiClient() self.enrollment_api_client = EnrollmentApiClient() # Initialize all page objects self.cyber_source_page = CyberSourcePage(self.browser) self.courses_page = CoursesPage(self.browser) self.multi_seat_basket_page = MultiSeatBasketPage(self.browser) self.single_seat_basket_page = SingleSeatBasketPage(self.browser) self.receipt_page = ReceiptPage(self.browser) # Initialize all common variables self.course_id = '' self.course_title = '' self.course_price = 0.0 self.total_price = 0.0 self.full_cleanup = True def go_to_basket(self, bulk_purchase=False): """ Perform all the steps from dashboard to reaching the basket page. If bulk_purchase is set to 'True' then go to multi seat basket, otherwise go to single seat basket. Arguments: bulk_purchase(bool): Indicates type of the purchase. """ course_about_page = CourseAboutPage(self.browser, self.course_id) # Check that course is not already present on dashboard and use find # course link to go to courses page self.assertFalse(self.dashboard_page.is_course_present(self.course_id)) self.dashboard_page.click_courses_button() self.courses_page.wait_for_page() # find the target course and click on it to go to about page self.courses_page.click_on_the_course(self.course_id) course_about_page.wait_for_page() # Verify that course price is correct on course about page self.assertEqual(self.course_price, course_about_page.course_price) if bulk_purchase: # go to multi seat basket page course_about_page.click_on_multi_seat_basket() self.multi_seat_basket_page.wait_for_page() else: # go to single seat basket page course_about_page.click_on_single_seat_basket() self.single_seat_basket_page.wait_for_page() # Verify course name, course price and total price on basket page # self.verify_course_name_on_basket() self.verify_price_on_basket() def verify_course_name_on_basket(self): """ Verify that course name is displayed correctly on basket page. """ self.assertIn(self.course_title, self.basket_page.course_name) def verify_price_on_basket(self): """ Verify that course price and total price are displayed correctly on basket page. """ self.assertEqual( [self.basket_page.course_price, self.basket_page.total_price], [self.course_price, self.total_price]) def assert_enrollment_and_logout_of_ecommerce(self): """ Verify that course is added to user dashboard and user can access the course. After that, logout from application. """ self.assert_course_added_to_dashboard() self.logout_user_from_ecommerce() def assert_course_added_to_dashboard(self): """ Waits for course to appear on dashboard. """ def check_course(): """ Checks if course is present on dashboard and revisits the page if it is not there. Returns: True: If course present False: Otherwise """ if self.dashboard_page.is_course_present(self.course_id): return True self.dashboard_page.visit() return False EmptyPromise(check_course, 'Course is present on dashboard').fulfill() def otto_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 unenroll_using_api(self, user_email, course_id): """ Un-enroll user from a course. Arguments: user_email(str): User's email course_id(str): The id of course in which user is enrolled. """ # Login to lms and get username self.lms_api_client.create_login_session(user_email, PASSWORD) username = self.lms_api_client.user_name # Verify that user is enrolled in the course using enrollment api. # If enrolled, then un-enroll user using api. is_enrolled = self.enrollment_api_client.is_user_enrolled( username, course_id) if is_enrolled: self.lms_api_client.change_enrollment(course_id, 'unenroll') def verify_info_is_populated_on_basket(self, discounted_price): """ After discount redeem url is used verify that following information is displayed correctly on basket page: i) Coupon is applied ii) Discounted amount Arguments: discounted_price(float): Discounted price of the course. """ self.assertTrue(self.single_seat_basket.is_voucher_applied()) self.assertEqual(self.single_seat_basket.total_price_after_discount, discounted_price) def unenroll_using_ui(self): """ Un-enroll student from the course. """ if not self.dashboard_page.is_browser_on_page(): self.dashboard_page.visit() if self.dashboard_page.is_course_present(self.course_id): self.dashboard_page.unenroll_course(self.course_id) def assert_enrollment_and_unenroll(self): """ Asserts that course is added to user dashboard and user can access the course. After that un-enroll from the course. """ self.assert_course_added_to_dashboard() self.unenroll_using_ui() def pay_with_cybersource(self): """ Make payment using cybersource. """ # Fill out all the billing and payment details and submit the form self.otto_payment_using_cyber_source() # Application should take user to the receipt page # Verify on receipt page that information like course title, # course price, total price order date and billing to is # displayed correctly self.verify_receipt_info() self.receipt_page.click_in_nav_to_go_to_dashboard() def verify_receipt_info(self): """ Verify that Course title, Course Price, total price and order date on receipt page is correct. """ self.assertIn(self.course_title, self.receipt_page.order_desc) self.assertEqual( # Slight chance that this will fail if the test execution crosses # the boundary of midnight text_type(datetime.datetime.utcnow().date()), self.receipt_page.order_date) self.assertEqual( [self.receipt_page.order_amount, self.receipt_page.total_amount], [self.course_price, self.total_price])
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 )
class CourseEnrollmentTest(WhiteLabelTestsBaseClass): """ Class for tests with enrollment capability """ def setUp(self): super(CourseEnrollmentTest, self).setUp() self.lms_api_client = LmsApiClient() self.enrollment_api_client = EnrollmentApiClient() # Initialize all page objects self.cyber_source_page = CyberSourcePage(self.browser) self.courses_page = CoursesPage(self.browser) self.multi_seat_basket_page = MultiSeatBasketPage(self.browser) self.single_seat_basket_page = SingleSeatBasketPage(self.browser) self.receipt_page = ReceiptPage(self.browser) # Initialize all common variables self.course_id = '' self.course_title = '' self.course_price = 0.0 self.total_price = 0.0 self.full_cleanup = True def go_to_basket(self, bulk_purchase=False): """ Perform all the steps from dashboard to reaching the basket page. If bulk_purchase is set to 'True' then go to multi seat basket, otherwise go to single seat basket. Arguments: bulk_purchase(bool): Indicates type of the purchase. """ course_about_page = CourseAboutPage(self.browser, self.course_id) # Check that course is not already present on dashboard and use find # course link to go to courses page self.assertFalse(self.dashboard_page.is_course_present(self.course_id)) self.dashboard_page.click_courses_button() self.courses_page.wait_for_page() # find the target course and click on it to go to about page self.courses_page.click_on_the_course(self.course_id) course_about_page.wait_for_page() # Verify that course price is correct on course about page self.assertEqual( self.course_price, course_about_page.course_price ) if bulk_purchase: # go to multi seat basket page course_about_page.click_on_multi_seat_basket() self.multi_seat_basket_page.wait_for_page() else: # go to single seat basket page course_about_page.click_on_single_seat_basket() self.single_seat_basket_page.wait_for_page() # Verify course name, course price and total price on basket page # self.verify_course_name_on_basket() self.verify_price_on_basket() def verify_course_name_on_basket(self): """ Verify that course name is displayed correctly on basket page. """ self.ecom_cookies = self.browser.get_cookies() self.assertIn(self.course_title, self.basket_page.course_name) def verify_price_on_basket(self): """ Verify that course price and total price are displayed correctly on basket page. """ self.assertEqual( [self.basket_page.course_price, self.basket_page.total_price], [self.course_price, self.total_price] ) def assert_enrollment_and_logout(self): """ Verify that course is added to user dashboard and user can access the course. After that, logout from application. """ self.assert_course_added_to_dashboard() self.logout_from_ecommerce_using_api() def assert_course_added_to_dashboard(self): """ Waits for course to appear on dashboard. """ def check_course(): """ Checks if course is present on dashboard and revisits the page if it is not there. Returns: True: If course present False: Otherwise """ if self.dashboard_page.is_course_present(self.course_id): return True self.dashboard_page.visit() return False EmptyPromise( check_course, 'Course is present on dashboard' ).fulfill() def otto_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 unenroll_using_api(self, user_email, course_id): """ Un-enroll user from a course. Arguments: user_email(str): User's email course_id(str): The id of course in which user is enrolled. """ # Login to lms and get username self.lms_api_client.create_login_session(user_email, PASSWORD) username = self.lms_api_client.user_name # Verify that user is enrolled in the course using enrollment api. # If enrolled, then un-enroll user using api. is_enrolled = self.enrollment_api_client.is_user_enrolled( username, course_id ) if is_enrolled: self.lms_api_client.change_enrollment(course_id, 'unenroll') def verify_info_is_populated_on_basket(self, discounted_price): """ After discount redeem url is used verify that following information is displayed correctly on basket page: i) Coupon is applied ii) Discounted amount Arguments: discounted_price(float): Discounted price of the course. """ self.assertTrue(self.single_seat_basket.is_voucher_applied()) self.assertEqual( self.single_seat_basket.total_price_after_discount, discounted_price ) def unenroll_using_ui(self): """ Un-enroll student from the course. """ if not self.dashboard_page.is_browser_on_page(): self.dashboard_page.visit() if self.dashboard_page.is_course_present(self.course_id): self.dashboard_page.unenroll_course(self.course_id) def assert_enrollment_and_unenroll(self): """ Asserts that course is added to user dashboard and user can access the course. After that un-enroll from the course. """ self.assert_course_added_to_dashboard() self.unenroll_using_ui() def pay_with_cybersource(self): """ Make payment using cybersource. """ # Fill out all the billing and payment details and submit the form self.otto_payment_using_cyber_source() # Application should take user to the receipt page # Verify on receipt page that information like course title, # course price, total price order date and billing to is # displayed correctly self.verify_receipt_info() self.receipt_page.click_in_nav_to_go_to_dashboard() def verify_receipt_info(self): """ Verify that Course title, Course Price, total price and order date on receipt page is correct. """ self.assertIn(self.course_title, self.receipt_page.order_desc) self.assertEqual( # Slight chance that this will fail if the test execution crosses # the boundary of midnight text_type(datetime.datetime.utcnow().date()), self.receipt_page.order_date ) self.assertEqual( [self.receipt_page.order_amount, self.receipt_page.total_amount], [self.course_price, self.total_price] )