# pylint: disable=C0111 # pylint: disable=W0621 from lettuce import world, step from nose.tools import assert_true, assert_equal # pylint: disable=E0611 from terrain.steps import reload_the_page from selenium.common.exceptions import StaleElementReferenceException ############### ACTIONS #################### @step('I select Checklists from the Tools menu$') def i_select_checklists(step): world.click_tools() link_css = 'li.nav-course-tools-checklists a' world.css_click(link_css) world.wait_for_ajax_complete() @step('I have opened Checklists$') def i_have_opened_checklists(step): step.given('I have opened a new course in Studio') step.given('I select Checklists from the Tools menu') @step('I see the four default edX checklists$') def i_see_default_checklists(step): checklists = world.css_find('.checklist-title') assert_equal(4, len(checklists)) assert_true(checklists[0].text.endswith('Getting Started With Studio')) assert_true(checklists[1].text.endswith('Draft a Rough Course Outline')) assert_true(checklists[2].text.endswith("Explore edX\'s Support Tools")) assert_true(checklists[3].text.endswith('Draft Your Course About Page')) @step('I can check and uncheck tasks in a checklist$') def i_can_check_and_uncheck_tasks(step): # Use the 2nd checklist as a reference verifyChecklist2Status(0, 7, 0) toggleTask(1, 0) verifyChecklist2Status(1, 7, 14) toggleTask(1, 3) verifyChecklist2Status(2, 7, 29) toggleTask(1, 6) verifyChecklist2Status(3, 7, 43) toggleTask(1, 3) verifyChecklist2Status(2, 7, 29) @step('the tasks are correctly selected$') def tasks_correctly_selected(step): verifyChecklist2Status(2, 7, 29) # verify that task 7 is still selected by toggling its checkbox state and making sure that it deselects world.browser.execute_script("window.scrollBy(0,1000)") toggleTask(1, 6) verifyChecklist2Status(1, 7, 14) @step('I select a link to the course outline$') def i_select_a_link_to_the_course_outline(step): clickActionLink(1, 0, 'Edit Course Outline') @step('I am brought to the course outline page$') def i_am_brought_to_course_outline(step): assert world.is_css_present('body.view-outline') assert_equal(1, len(world.browser.windows)) @step('I am brought back to the course outline in the correct state$') def i_am_brought_back_to_course_outline(step): step.given('I see the four default edX checklists') # In a previous step, we selected (1, 0) in order to click the 'Edit Course Outline' link. # Make sure the task is still showing as selected (there was a caching bug with the collection). verifyChecklist2Status(1, 7, 14) @step('I select a link to help page$') def i_select_a_link_to_the_help_page(step): clickActionLink(2, 0, 'Visit Studio Help') @step('I am brought to the help page in a new window$') def i_am_brought_to_help_page_in_new_window(step): step.given('I see the four default edX checklists') windows = world.browser.windows assert_equal(2, len(windows)) world.browser.switch_to_window(windows[1]) assert_equal('http://help.edge.edx.org/', world.browser.url) ############### HELPER METHODS #################### def verifyChecklist2Status(completed, total, percentage): def verify_count(driver): try: statusCount = world.css_find('#course-checklist1 .status-count').first return statusCount.text == str(completed) except StaleElementReferenceException: return False world.wait_for(verify_count) assert_equal(str(total), world.css_find('#course-checklist1 .status-amount').first.text) # Would like to check the CSS width, but not sure how to do that. assert_equal(str(percentage), world.css_find('#course-checklist1 .viz-checklist-status-value .int').first.text) def toggleTask(checklist, task): world.css_click('#course-checklist' + str(checklist) + '-task' + str(task)) world.wait_for_ajax_complete() # TODO: figure out a way to do this in phantom and firefox # For now we will mark the scenerios that use this method as skipped def clickActionLink(checklist, task, actionText): # text will be empty initially, wait for it to populate def verify_action_link_text(driver): actualText = world.css_text('#course-checklist' + str(checklist) + ' a', index=task) if actualText == actionText: return True else: # toggle checklist item to make sure that the link button is showing toggleTask(checklist, task) return False world.wait_for(verify_action_link_text) world.css_click('#course-checklist' + str(checklist) + ' a', index=task) world.wait_for_ajax_complete()