def test_library_pagination(self): """ Scenario: Ensure that adding several XBlocks to a library results in pagination. Given that I have a library in Studio with 40 XBlocks Then 10 are displayed And the first XBlock will be the 1st one And I'm on the 1st page When I add 1 Multiple Choice XBlock Then 1 XBlock will be displayed And I'm on the 5th page The first XBlock will be the newest one When I delete that XBlock Then 10 are displayed And I'm on the 4th page And the first XBlock is the 31st one And the last XBlock is the 40th one. """ self.assertEqual(len(self.lib_page.xblocks), 10) self.assertEqual(self.lib_page.get_page_number(), '1') self.assertEqual(self.lib_page.xblocks[0].name, '1') add_component(self.lib_page, "problem", "Multiple Choice") self.assertEqual(len(self.lib_page.xblocks), 1) self.assertEqual(self.lib_page.get_page_number(), '5') self.assertEqual(self.lib_page.xblocks[0].name, "Multiple Choice") self.lib_page.click_delete_button(self.lib_page.xblocks[0].locator) self.assertEqual(len(self.lib_page.xblocks), 10) self.assertEqual(self.lib_page.get_page_number(), '4') self.assertEqual(self.lib_page.xblocks[0].name, '31') self.assertEqual(self.lib_page.xblocks[-1].name, '40')
def test_library_pagination(self): """ Scenario: Ensure that adding several XBlocks to a library results in pagination. Given that I have a library in Studio with 40 XBlocks Then 10 are displayed And the first XBlock will be the 1st one And I'm on the 1st page When I add 1 Multiple Choice XBlock Then 1 XBlock will be displayed And I'm on the 5th page The first XBlock will be the newest one When I delete that XBlock Then 10 are displayed And I'm on the 4th page And the first XBlock is the 31st one And the last XBlock is the 40th one. """ self.assertEqual(len(self.lib_page.xblocks), 10) self.assertEqual(self.lib_page.get_page_number(), '1') self.assertEqual(self.lib_page.xblocks[0].name, '1') add_component(self.lib_page, "problem", "Multiple Choice") self.assertEqual(len(self.lib_page.xblocks), 1) self.assertEqual(self.lib_page.get_page_number(), '5') self.assertEqual(self.lib_page.xblocks[0].name, "Multiple Choice") self.lib_page.click_delete_button(self.lib_page.xblocks[0].locator) self.assertEqual(len(self.lib_page.xblocks), 10) self.assertEqual(self.lib_page.get_page_number(), '4') self.assertEqual(self.lib_page.xblocks[0].name, '31') self.assertEqual(self.lib_page.xblocks[-1].name, '40')
def test_add_duplicate_delete_actions(self): """ Scenario: Ensure that we can add an HTML block, duplicate it, then delete the original. Given I have a library in Studio with no XBlocks And I navigate to Library Page in Studio Then there are no XBlocks displayed When I add Text XBlock Then one XBlock is displayed When I duplicate first XBlock Then two XBlocks are displayed And those XBlocks locators' are different When I delete first XBlock Then one XBlock is displayed And displayed XBlock are second one """ self.assertEqual(len(self.lib_page.xblocks), 0) # Create a new block: add_component(self.lib_page, "html", "Text") self.assertEqual(len(self.lib_page.xblocks), 1) first_block_id = self.lib_page.xblocks[0].locator # Duplicate the block: self.lib_page.click_duplicate_button(first_block_id) self.assertEqual(len(self.lib_page.xblocks), 2) second_block_id = self.lib_page.xblocks[1].locator self.assertNotEqual(first_block_id, second_block_id) # Delete the first block: self.lib_page.click_delete_button(first_block_id, confirm=True) self.assertEqual(len(self.lib_page.xblocks), 1) self.assertEqual(self.lib_page.xblocks[0].locator, second_block_id)
def test_add_duplicate_delete_actions(self): """ Scenario: Ensure that we can add an HTML block, duplicate it, then delete the original. Given I have a library in Studio with no XBlocks And I navigate to Library Page in Studio Then there are no XBlocks displayed When I add Text XBlock Then one XBlock is displayed When I duplicate first XBlock Then two XBlocks are displayed And those XBlocks locators' are different When I delete first XBlock Then one XBlock is displayed And displayed XBlock are second one """ self.assertEqual(len(self.lib_page.xblocks), 0) # Create a new block: add_component(self.lib_page, "html", "Text") self.assertEqual(len(self.lib_page.xblocks), 1) first_block_id = self.lib_page.xblocks[0].locator # Duplicate the block: self.lib_page.click_duplicate_button(first_block_id) self.assertEqual(len(self.lib_page.xblocks), 2) second_block_id = self.lib_page.xblocks[1].locator self.assertNotEqual(first_block_id, second_block_id) # Delete the first block: self.lib_page.click_delete_button(first_block_id, confirm=True) self.assertEqual(len(self.lib_page.xblocks), 1) self.assertEqual(self.lib_page.xblocks[0].locator, second_block_id)
def test_add_latex_html_component(self): """ Scenario: I can add Latex HTML components Given I am in Studio editing a new unit Given I have enabled latex compiler When I add this type of HTML component: | Component | | E-text Written in LaTeX | Then I see HTML components in this order: | Component | | E-text Written in LaTeX | """ # Latex component component = 'E-text Written in LaTeX' # Visit advanced settings page and enable latex compiler. self.advanced_settings.visit() self.advanced_settings.set('Enable LaTeX Compiler', 'True') self.go_to_unit_page() container_page = ContainerPage(self.browser, None) # Add latex component add_component(container_page, 'html', component, is_advanced_problem=False) problem = container_page.xblocks[1] # Asset that component has been added. self.assertEqual(problem.name, component)
def _add_component(self, sub_type): """ Add sub-type of HTML component in studio Args: sub_type(str): Sub-type of HTML component """ add_component(self.container_page, 'html', sub_type) self.component = self.unit.xblocks[1] self.html_editor = HtmlXBlockEditorView(self.browser, self.component.locator) self.iframe = HTMLEditorIframe(self.browser, self.component.locator)
def test_no_edit_visibility_button(self): """ Scenario: Ensure that library xblocks do not have 'edit visibility' buttons. Given I have a library in Studio with no XBlocks And I navigate to Library Page in Studio When I add Text XBlock Then one XBlock is displayed And no 'edit visibility' button is shown """ add_component(self.lib_page, "html", "Text") self.assertFalse(self.lib_page.xblocks[0].has_edit_visibility_button)
def test_no_edit_visibility_button(self): """ Scenario: Ensure that library xblocks do not have 'edit visibility' buttons. Given I have a library in Studio with no XBlocks And I navigate to Library Page in Studio When I add Text XBlock Then one XBlock is displayed And no 'edit visibility' button is shown """ add_component(self.lib_page, "html", "Text") self.assertFalse(self.lib_page.xblocks[0].has_edit_visibility_button)
def test_nav_present_but_disabled(self, position): """ Scenario: Ensure that the navigation buttons aren't active when there aren't enough XBlocks. Given that I have a library in Studio with no XBlocks The Navigation buttons should be disabled. When I add a multiple choice problem The Navigation buttons should be disabled. """ self.assertEqual(len(self.lib_page.xblocks), 0) self.assertTrue(self.lib_page.nav_disabled(position)) add_component(self.lib_page, "problem", "Multiple Choice") self.assertTrue(self.lib_page.nav_disabled(position))
def test_nav_present_but_disabled(self, position): """ Scenario: Ensure that the navigation buttons aren't active when there aren't enough XBlocks. Given that I have a library in Studio with no XBlocks The Navigation buttons should be disabled. When I add a multiple choice problem The Navigation buttons should be disabled. """ self.assertEqual(len(self.lib_page.xblocks), 0) self.assertTrue(self.lib_page.nav_disabled(position)) add_component(self.lib_page, "problem", "Multiple Choice") self.assertTrue(self.lib_page.nav_disabled(position))
def _add_component(self, sub_type): """ Add sub-type of HTML component in studio Args: sub_type(str): Sub-type of HTML component """ add_component(self.container_page, 'html', sub_type) self.component = self.unit.xblocks[1] self.html_editor = HtmlXBlockEditorView(self.browser, self.component.locator) self.iframe = HTMLEditorIframe(self.browser, self.component.locator)
def setUp(self, is_staff=True): """ Create a course with a section, subsection, and unit to which to add the component. """ super(ProblemComponentEditor, self).setUp(is_staff=is_staff) self.component = 'Blank Common Problem' self.unit = self.go_to_unit_page() self.container_page = ContainerPage(self.browser, None) # Add a Problem add_component(self.container_page, 'problem', self.component) self.component = self.unit.xblocks[1] self.container_page.edit() self.problem_editor = ProblemXBlockEditorView(self.browser, self.component.locator)
def setUp(self, is_staff=True): """ Create a course with a section, subsection, and unit to which to add the component. """ super(DiscussionComponentTest, self).setUp(is_staff=is_staff) self.component = 'discussion' self.unit = self.go_to_unit_page() self.container_page = ContainerPage(self.browser, None) # Add Discussion component add_component(self.container_page, 'discussion', self.component) self.component = self.unit.xblocks[1] self.container_page.edit() self.discussion_editor = DiscussionComponentEditor(self.browser, self.component.locator)
def setUp(self, is_staff=True): """ Create a course with a section, subsection, and unit to which to add the component. """ super(ProblemComponentEditor, self).setUp(is_staff=is_staff) self.component = 'Blank Common Problem' self.unit = self.go_to_unit_page() self.container_page = ContainerPage(self.browser, None) # Add a Problem add_component(self.container_page, 'problem', self.component) self.component = self.unit.xblocks[1] self.container_page.edit() self.problem_editor = ProblemXBlockEditorView(self.browser, self.component.locator)
def setUp(self, is_staff=True): """ Create a course with a section, subsection, and unit to which to add the component. """ super(DiscussionComponentTest, self).setUp(is_staff=is_staff) self.component = 'discussion' self.unit = self.go_to_unit_page() self.container_page = ContainerPage(self.browser, None) # Add Discussion component add_component(self.container_page, 'discussion', self.component) self.component = self.unit.xblocks[1] self.container_page.edit() self.discussion_editor = DiscussionComponentEditor(self.browser, self.component.locator)
def setUp(self, is_staff=True): """ Create a course with a section, subsection, and unit to which to add the component. """ super(HTMLComponentEditor, self).setUp(is_staff=is_staff) self.component = 'Text' self.unit = self.go_to_unit_page() self.container_page = ContainerPage(self.browser, None) self.xblock_wrapper = XBlockWrapper(self.browser, None) # Add HTML component add_component(self.container_page, 'html', self.component) self.component = self.unit.xblocks[1] self.container_page.edit() self.html_editor = HtmlXBlockEditorView(self.browser, self.component.locator) self.iframe = HTMLEditorIframe(self.browser, self.component.locator)
def test_library_pagination(self): """ Scenario: Ensure that adding several XBlocks to a library results in pagination. Given that I have a library in Studio with no XBlocks And I create 10 Multiple Choice XBlocks Then 10 are displayed. When I add one more Multiple Choice XBlock Then 1 XBlock will be displayed When I delete that XBlock Then 10 are displayed. """ self.assertEqual(len(self.lib_page.xblocks), 0) for _ in range(10): add_component(self.lib_page, "problem", "Multiple Choice") self.assertEqual(len(self.lib_page.xblocks), 10) add_component(self.lib_page, "problem", "Multiple Choice") self.assertEqual(len(self.lib_page.xblocks), 1) self.lib_page.click_delete_button(self.lib_page.xblocks[0].locator) self.assertEqual(len(self.lib_page.xblocks), 10)
def test_library_pagination(self): """ Scenario: Ensure that adding several XBlocks to a library results in pagination. Given that I have a library in Studio with no XBlocks And I create 10 Multiple Choice XBlocks Then 10 are displayed. When I add one more Multiple Choice XBlock Then 1 XBlock will be displayed When I delete that XBlock Then 10 are displayed. """ self.assertEqual(len(self.lib_page.xblocks), 0) for _ in range(10): add_component(self.lib_page, "problem", "Multiple Choice") self.assertEqual(len(self.lib_page.xblocks), 10) add_component(self.lib_page, "problem", "Multiple Choice") self.assertEqual(len(self.lib_page.xblocks), 1) self.lib_page.click_delete_button(self.lib_page.xblocks[0].locator) self.assertEqual(len(self.lib_page.xblocks), 10)
def test_delete_deletes_only_desired_block(self): """ Scenario: Ensure that when deleting XBlock only desired XBlock is deleted Given that I have a library in Studio with no XBlocks And I create Blank Common Problem XBlock And I create Checkboxes XBlock When I delete Blank Problem XBlock Then Checkboxes XBlock is not deleted And Blank Common Problem XBlock is deleted """ self.assertEqual(len(self.lib_page.xblocks), 0) add_component(self.lib_page, "problem", "Blank Common Problem") add_component(self.lib_page, "problem", "Checkboxes") self.assertEqual(len(self.lib_page.xblocks), 2) self.assertIn("Blank Common Problem", self.lib_page.xblocks[0].name) self.assertIn("Checkboxes", self.lib_page.xblocks[1].name) self.lib_page.click_delete_button(self.lib_page.xblocks[0].locator) self.assertEqual(len(self.lib_page.xblocks), 1) problem_block = self.lib_page.xblocks[0] self.assertIn("Checkboxes", problem_block.name)
def test_delete_deletes_only_desired_block(self): """ Scenario: Ensure that when deleting XBlock only desired XBlock is deleted Given that I have a library in Studio with no XBlocks And I create Blank Common Problem XBlock And I create Checkboxes XBlock When I delete Blank Problem XBlock Then Checkboxes XBlock is not deleted And Blank Common Problem XBlock is deleted """ self.assertEqual(len(self.lib_page.xblocks), 0) add_component(self.lib_page, "problem", "Blank Common Problem") add_component(self.lib_page, "problem", "Checkboxes") self.assertEqual(len(self.lib_page.xblocks), 2) self.assertIn("Blank Common Problem", self.lib_page.xblocks[0].name) self.assertIn("Checkboxes", self.lib_page.xblocks[1].name) self.lib_page.click_delete_button(self.lib_page.xblocks[0].locator) self.assertEqual(len(self.lib_page.xblocks), 1) problem_block = self.lib_page.xblocks[0] self.assertIn("Checkboxes", problem_block.name)
def test_add_advanced_problem(self, component): """ Scenario Outline: I can add Advanced Problem components Given I am in Studio editing a new unit When I add a "<Component>" "Advanced Problem" component Then I see a "<Component>" Problem component Examples: | Component | | Blank Advanced Problem | | Circuit Schematic Builder | | Custom Python-Evaluated Input | | Drag and Drop | | Image Mapped Input | | Math Expression Input | | Problem with Adaptive Hint | """ self.go_to_unit_page() page = ContainerPage(self.browser, None) add_component(page, 'problem', component, is_advanced_problem=True) problem = page.xblocks[1] self.assertEqual(problem.name, component)
def test_add_advanced_problem(self, component): """ Scenario Outline: I can add Advanced Problem components Given I am in Studio editing a new unit When I add a "<Component>" "Advanced Problem" component Then I see a "<Component>" Problem component Examples: | Component | | Blank Advanced Problem | | Circuit Schematic Builder | | Custom Python-Evaluated Input | | Drag and Drop | | Image Mapped Input | | Math Expression Input | | Problem with Adaptive Hint | """ self.go_to_unit_page() page = ContainerPage(self.browser, None) add_component(page, 'problem', component, is_advanced_problem=True) problem = page.xblocks[1] self.assertEqual(problem.name, component)
def test_add_edit_xblock(self): """ Scenario: Ensure that we can add an XBlock, edit it, then see the resulting changes. Given I have a library in Studio with no XBlocks And I navigate to Library Page in Studio Then there are no XBlocks displayed When I add Multiple Choice XBlock Then one XBlock is displayed When I edit first XBlock And I go to basic tab And set it's text to a fairly trivial question about Battlestar Galactica And save XBlock Then one XBlock is displayed And first XBlock student content contains at least part of text I set """ self.assertEqual(len(self.lib_page.xblocks), 0) # Create a new problem block: add_component(self.lib_page, "problem", "Multiple Choice") self.assertEqual(len(self.lib_page.xblocks), 1) problem_block = self.lib_page.xblocks[0] # Edit it: problem_block.edit() problem_block.open_basic_tab() problem_block.set_codemirror_text( """ >>Who is "Starbuck"?<< (x) Kara Thrace ( ) William Adama ( ) Laura Roslin ( ) Lee Adama ( ) Gaius Baltar """ ) problem_block.save_settings() # Check that the save worked: self.assertEqual(len(self.lib_page.xblocks), 1) problem_block = self.lib_page.xblocks[0] self.assertIn("Laura Roslin", problem_block.author_content)
def test_add_edit_xblock(self): """ Scenario: Ensure that we can add an XBlock, edit it, then see the resulting changes. Given I have a library in Studio with no XBlocks And I navigate to Library Page in Studio Then there are no XBlocks displayed When I add Multiple Choice XBlock Then one XBlock is displayed When I edit first XBlock And I go to basic tab And set it's text to a fairly trivial question about Battlestar Galactica And save XBlock Then one XBlock is displayed And first XBlock student content contains at least part of text I set """ self.assertEqual(len(self.lib_page.xblocks), 0) # Create a new problem block: add_component(self.lib_page, "problem", "Multiple Choice") self.assertEqual(len(self.lib_page.xblocks), 1) problem_block = self.lib_page.xblocks[0] # Edit it: problem_block.edit() problem_block.open_basic_tab() problem_block.set_codemirror_text( """ >>Who is "Starbuck"?<< (x) Kara Thrace ( ) William Adama ( ) Laura Roslin ( ) Lee Adama ( ) Gaius Baltar """ ) problem_block.save_settings() # Check that the save worked: self.assertEqual(len(self.lib_page.xblocks), 1) problem_block = self.lib_page.xblocks[0] self.assertIn("Laura Roslin", problem_block.author_content)
def test_preview_add_xblock(self): """ Scenario: Ensure previews are shown when adding new blocks, regardless of preview setting. Given that I have a library in Studio with 40 XBlocks Then previews are visible And when I click the toggle previews button Then the previews will not be visible And when I add an XBlock Then I will be on the 5th page And the XBlock will have loaded a preview And when I revisit the library And I go to the 5th page Then the top XBlock will be the one I added And it will not have a preview And when I add an XBlock Then the XBlock I added will have a preview And the top XBlock will not have one. """ self.assertTrue(self.lib_page.are_previews_showing()) self.lib_page.toggle_previews() self.assertFalse(self.lib_page.are_previews_showing()) add_component(self.lib_page, "problem", "Checkboxes") self.assertEqual(self.lib_page.get_page_number(), '5') first_added = self.lib_page.xblocks[0] self.assertIn("Checkboxes", first_added.name) self.assertFalse(self.lib_page.xblocks[0].is_placeholder()) self.lib_page.visit() self.lib_page.wait_until_ready() self.lib_page.go_to_page(5) self.assertTrue(self.lib_page.xblocks[0].is_placeholder()) add_component(self.lib_page, "problem", "Multiple Choice") # DOM has detatched the element since last assignment first_added = self.lib_page.xblocks[0] second_added = self.lib_page.xblocks[1] self.assertIn("Multiple Choice", second_added.name) self.assertFalse(second_added.is_placeholder()) self.assertTrue(first_added.is_placeholder())
def test_preview_add_xblock(self): """ Scenario: Ensure previews are shown when adding new blocks, regardless of preview setting. Given that I have a library in Studio with 40 XBlocks Then previews are visible And when I click the toggle previews button Then the previews will not be visible And when I add an XBlock Then I will be on the 5th page And the XBlock will have loaded a preview And when I revisit the library And I go to the 5th page Then the top XBlock will be the one I added And it will not have a preview And when I add an XBlock Then the XBlock I added will have a preview And the top XBlock will not have one. """ self.assertTrue(self.lib_page.are_previews_showing()) self.lib_page.toggle_previews() self.assertFalse(self.lib_page.are_previews_showing()) add_component(self.lib_page, "problem", "Checkboxes") self.assertEqual(self.lib_page.get_page_number(), '5') first_added = self.lib_page.xblocks[0] self.assertIn("Checkboxes", first_added.name) self.assertFalse(self.lib_page.xblocks[0].is_placeholder()) self.lib_page.visit() self.lib_page.wait_until_ready() self.lib_page.go_to_page(5) self.assertTrue(self.lib_page.xblocks[0].is_placeholder()) add_component(self.lib_page, "problem", "Multiple Choice") # DOM has detatched the element since last assignment first_added = self.lib_page.xblocks[0] second_added = self.lib_page.xblocks[1] self.assertIn("Multiple Choice", second_added.name) self.assertFalse(second_added.is_placeholder()) self.assertTrue(first_added.is_placeholder())
def test_add_latex_html_component(self): """ Scenario: I can add Latex HTML components Given I am in Studio editing a new unit Given I have enabled latex compiler When I add this type of HTML component: | Component | | E-text Written in LaTeX | Then I see HTML components in this order: | Component | | E-text Written in LaTeX | """ # Latex component component = 'E-text Written in LaTeX' # Visit advanced settings page and enable latex compiler. self.advanced_settings.visit() self.advanced_settings.set('Enable LaTeX Compiler', 'True') self.go_to_unit_page() container_page = ContainerPage(self.browser, None) # Add latex component add_component(container_page, 'html', component, is_advanced_problem=False) problem = container_page.xblocks[1] # Asset that component has been added. self.assertEqual(problem.name, component)