def setUp(self): super(TestThePageMoveApi, self).setUp() self.first_parent = factories.FancyPageFactory( node__name="First parent") self.second_parent = factories.FancyPageFactory( node__name="Second parent") self.third_parent = factories.FancyPageFactory( node__name="Third parent") self.a_child = self.first_parent.add_child(node__name='One child') self.first_parent.add_child(node__name='Another child') self.first_parent.add_child(node__name='Third child')
def setUp(self): super(TestTheBlockApi, self).setUp() self.prepare_template_file( "{% load fp_container_tags%}" "{% fp_object_container page-container %}" ) self.page = factories.FancyPageFactory( node__name="A new page", node__slug='a-new-page') self.text_block = TextBlock.objects.create( container=self.page.get_container_from_name('page-container'), text="some text", ) self.other_text_block = TextBlock.objects.create( container=self.page.get_container_from_name('page-container'), text="some text", ) self.third_text_block = TextBlock.objects.create( container=self.page.get_container_from_name('page-container'), text="second text", ) self.assertEquals(self.text_block.display_order, 0) self.assertEquals(self.other_text_block.display_order, 1) self.assertEquals(self.third_text_block.display_order, 2)
def test_can_be_added_in_the_dashboard(self): fancy_page = factories.FancyPageFactory(node__name='Sample Page') self.assertEquals(fancy_page.image, None) im = Image.new("RGB", (320, 240), "red") __, filename = tempfile.mkstemp(suffix='.jpg', dir=TEMP_IMAGE_DIR) im.save(filename, "JPEG") page = self.get( reverse('fp-dashboard:page-update', args=(fancy_page.id,))) settings_form = page.form settings_form['image'] = Upload(filename) list_page = settings_form.submit() self.assertRedirects(list_page, reverse('fp-dashboard:page-list')) # This bit is required because when using Oscar, the upload directory # is defined by the category's image field and differs from the one on # the PageNode. upload_url = None for field in get_node_model()._meta.fields: if field.name == 'image': upload_url = field.upload_to break pages_path = os.path.join(settings.MEDIA_ROOT, upload_url) fancy_page = FancyPage.objects.get(id=fancy_page.id) self.assertEquals( fancy_page.image.path, os.path.join(pages_path, filename.rsplit('/')[-1]))
def test_update_a_toplevel_page(self): page_name = "Test page" page_description = "The old description" now = timezone.now() current_tz = timezone.get_current_timezone() fancy_page = factories.FancyPageFactory( date_visible_start=now, node__name=page_name, node__description=page_description) page = self.get( reverse('fp-dashboard:page-update', args=(fancy_page.id,))) self.assertContains(page, 'Update page') self.assertContains(page, fancy_page.name) form = page.form self.assertEquals(form['name'].value, page_name) self.assertEquals(form['description'].value.strip(), page_description) self.assertEquals( form['date_visible_start'].value, date(now.astimezone(current_tz), 'Y-m-d H:i:s')) form['name'] = 'Another name' form['description'] = "Some description" form['date_visible_start'] = '2012-12-30' page = form.submit() fancy_page = FancyPage.objects.get(id=fancy_page.id) self.assertEquals(fancy_page.name, 'Another name') self.assertEquals(fancy_page.description, 'Some description')
def test_text_block_can_be_added_to_a_container(admin_user, browser, live_server): fancypage = factories.FancyPageFactory() title = "Sample Title" text = "This is an amazing piece of text" factories.TitleTextBlockFactory(container=fancypage.containers.all()[0], title=title, text=text) browser.visit(live_server.url + fancypage.get_absolute_url()) browser.is_text_present(title) browser.is_text_present(text) open_editor_panel(browser) find_and_click_by_css(browser, '.edit-button') wait_for_editor_reload() title_update = " Is Now New" browser.find_by_css('input[name=title]').type(title_update) browser.is_text_present(title + title_update) browser.is_text_present(text) text_update = " that I am editing on the fly." rte = browser.find_by_css('.trumbowyg-editor') rte.type(text_update) browser.is_text_present(text + text_update) browser.is_text_present(title + title_update)
def test_can_move_block_from_one_container_to_another(live_server, browser, admin_user): page = factories.FancyPageFactory(node__name='Home') main_container = page.containers.all()[0] layout = factories.TwoColumnLayoutBlockFactory(container=main_container) browser.visit(live_server.url + page.get_absolute_url()) right = layout.containers.get(name='right-container') left = layout.containers.get(name='left-container') moving_block = factories.TextBlockFactory(container=right) factories.TextBlockFactory(container=right) factories.TextBlockFactory(container=left) browser.visit(live_server.url + page.get_absolute_url()) browser.find_by_css('#editor-handle').first.click() source = browser.find_by_css('#block-{} div.move'.format( moving_block.uuid)).first chain = ActionChains(browser.driver) chain.drag_and_drop_by_offset(source._element, -600, 200).perform() time.sleep(5) assert right.blocks.count() == left.blocks.count() == 1 assert main_container.blocks.count() == 2 main_block_ids = [b.uuid for b in main_container.blocks.all()] assert main_block_ids == [layout.uuid, moving_block.uuid]
def test_can_delete_a_page(self): factories.FancyPageFactory(node__name="A new page") self.assertEquals(FancyPage.objects.count(), 1) page = self.get(reverse("fp-dashboard:page-list")) page = page.click("Delete") page.forms['page-delete-form'].submit() self.assertEquals(FancyPage.objects.count(), 0)
def test_returns_child_pagtest_returns_child_page_querysete_queryset(self): parent = factories.FancyPageFactory() children = [ parent.add_child(node__name='first child'), parent.add_child(node__name='second child')] with self.assertNumQueries(1): pages = parent.get_children() self.assertItemsEqual(pages, children)
def test_can_cancel_the_delete_of_a_page(self): fpage = factories.FancyPageFactory(node__name="A new page") self.assertEquals(FancyPage.objects.count(), 1) page = self.get(fpage.get_delete_page_url()) page = page.click('cancel') self.assertEquals(FancyPage.objects.count(), 1) self.assertContains(page, "Add New Page") self.assertContains(page, "Page Management")
def test_can_cancel_the_delete_of_a_page(self): factories.FancyPageFactory(node__name="A new page") self.assertEquals(FancyPage.objects.count(), 1) page = self.get(reverse("fp-dashboard:page-list")) page = page.click("Delete") page = page.click('cancel') self.assertEquals(FancyPage.objects.count(), 1) self.assertContains(page, "Create new top-level page") self.assertContains(page, "Page Management")
def test_can_delete_a_child_page(self): parent_page = factories.FancyPageFactory(node__name="A new page") factories.FancyPageFactory(node__name="Another page") child_page = parent_page.add_child(node__name="The child") parent = FancyPage.objects.get(id=parent_page.id) self.assertEquals(parent.node.numchild, 1) self.assertEquals(FancyPage.objects.count(), 3) page = self.get(child_page.get_delete_page_url()) delete_page = page.forms['page-delete-form'].submit() self.assertRedirects(delete_page, reverse('fp-dashboard:page-list')) self.assertEquals(FancyPage.objects.count(), 2) p = FancyPage.objects.get(id=parent_page.id) self.assertSequenceEqual(p.node.get_children(), []) factories.FancyPageFactory(node__name="3rd page") self.assertEquals(FancyPage.objects.count(), 3)
def setUp(self): super(TestImageBlock, self).setUp() self.page = factories.FancyPageFactory() im = Image.new("RGB", (320, 240), "red") __, filename = tempfile.mkstemp(suffix='.jpg', dir=TEMP_MEDIA_ROOT) im.save(filename, "JPEG") self.image_filename = os.path.basename(filename) self.image = ImageAsset.objects.create(name='test image', image=self.image_filename, creator=self.user)
def test_displays_an_error_when_slug_already_exists(self): page_title = "Home" home_page = factories.FancyPageFactory(node__name=page_title) self.assertEquals(home_page.slug, 'home') page = self.get(reverse('fp-dashboard:page-list')) page = page.click('Add New Page', index=0) new_page_form = page.form new_page_form['name'] = page_title page = new_page_form.submit() self.assertContains(page, 'A page with this title already exists')
def test_can_create_child_page(self): child_page_name = 'Test Page' parent_page = factories.FancyPageFactory(node__name="A new page") create_form = self.get(parent_page.get_add_child_url()).form create_form['name'] = child_page_name list_page = create_form.submit() self.assertRedirects(list_page, reverse('fp-dashboard:page-list')) child_node = FancyPage.objects.get(node__name=child_page_name).node self.assertTrue(child_node.path.startswith(parent_page.node.path)) self.assertTrue(child_node.depth, 2)
def _create_grouped_pages(self): self.primary_nav_group = factories.PageGroupFactory(name="Primary Nav") self.footer_group = factories.PageGroupFactory(name="Footer") page_defaults = {'status': FancyPage.PUBLISHED} self.ungrouped_page = factories.FancyPageFactory( node__name='Ungrouped Page', **page_defaults) self.first_primnav_page = factories.FancyPageFactory( node__name="First primary navigation page", **page_defaults) self.first_primnav_page.groups.add(self.primary_nav_group) self.second_primnav_page = factories.FancyPageFactory( node__name="Second primary navigation page", **page_defaults) self.second_primnav_page.groups.add(self.primary_nav_group) self.footer_page = factories.FancyPageFactory(node__name="Footer page", **page_defaults) self.footer_page.groups.add(self.footer_group) self.both_groups_page = factories.FancyPageFactory( node__name="Both groups page", **page_defaults) self.both_groups_page.groups.add(self.primary_nav_group) self.both_groups_page.groups.add(self.footer_group)
def test_text_block_can_be_added_to_container(admin_user, browser, live_server): fancypage = factories.FancyPageFactory() browser.visit(live_server.url + fancypage.get_absolute_url()) find_and_click_by_css(browser, '#editor-handle') find_and_click_by_css(browser, "div[class=block-add-control]>a") wait_for_editor_reload() find_and_click_by_css(browser, "a[href='#content']") find_and_click_by_css(browser, "button[data-block-code=text]") wait_for_editor_reload() default_text = 'Your text goes here' if not browser.is_text_present(default_text, 2): raise AssertionError("Could not find text block on page") if not browser.is_element_present_by_css('.edit-button', 2): raise AssertionError("Could not find edit button for block") find_and_click_by_css(browser, '.edit-button') wait_for_editor_reload() text_sel = 'textarea[name=text]' if not browser.is_element_present_by_css(text_sel, 2): raise AssertionError("Could not find input area for 'text' field") new_text = "The new text for this block" rte = browser.find_by_css('.trumbowyg-editor') # Jump to the end of the line and remove it using the backspace key rte.type(Keys.ARROW_RIGHT * (len(default_text) + 1)) rte.type(Keys.BACKSPACE * (len(default_text) + 1)) # Now add the new text rte.type(new_text) find_and_click_by_css(browser, 'button[type=submit]') wait_for_editor_reload() if not browser.is_text_present(new_text, 2): raise AssertionError("Could not find updated text") assert TextBlock.objects.count() == 1 # check for the text with an appended <br> because typing text into # the input box via Selenium causes a linebreak at the end. assert TextBlock.objects.all()[0].text == new_text + '<br>'
def test_form_block_can_submit_form(webtest, form_block_class): fancypage = factories.FancyPageFactory() form_block = form_block_class.objects.create( form_selection='contact-us', container=fancypage.containers.all()[0]) assert isinstance(form_block.form, import_string('contact_us.forms.ContactUsForm')) page = webtest.get(fancypage.get_absolute_url()) assert form_block.url in page page.form['name'] = 'Test User' page.form['email'] = '*****@*****.**' page.form['message'] = 'Test message' page.form['next'] = fancypage.get_absolute_url() submit_page = page.form.submit().follow() assert submit_page.request.path == fancypage.get_absolute_url()
def test_text_block_can_be_deleted_from_a_container(admin_user, browser, live_server): fancypage = factories.FancyPageFactory() title = "Sample Title" text = "This is an amazing piece of text" factories.TitleTextBlockFactory(container=fancypage.containers.all()[0], title=title, text=text) browser.visit(live_server.url + fancypage.get_absolute_url()) browser.is_text_present(title) browser.is_text_present(text) open_editor_panel(browser) find_and_click_by_css(browser, 'div.delete') wait_for_editor_reload() assert factories.TitleTextBlockFactory._meta.model.objects.count() == 0
def setUp(self): super(TestTheBlockMoveApi, self).setUp() self.prepare_template_file( "{% load fp_container_tags%}" "{% fp_object_container main-container %}" "{% fp_object_container left-container %}" ) page_type = PageType.objects.create( name="Example Template", template_name=self.template_name, ) self.page = factories.FancyPageFactory( node__name="A new page", node__slug='a-new-page', page_type=page_type) self.left_container = self.page.get_container_from_name( 'left-container') self.main_container = self.page.get_container_from_name( 'main-container') self.left_blocks = [] self.main_blocks = [] for idx in range(0, 3): main_block = TextBlock.objects.create( container=self.main_container, text="Main Column / Block #%d" % idx, ) self.main_blocks.append(main_block) self.assertEquals(main_block.display_order, idx) left_block = TextBlock.objects.create( container=self.left_container, text="Left Column / Block #{}".format(idx)) self.left_blocks.append(left_block) self.assertEquals(left_block.display_order, idx)
def tree(db): """ Fixture providing a tree of fancypages:: + root + sibling1 + child1 + sibling2 + child1 + child2 """ root = factories.FancyPageFactory(node__name='root') sibling1 = factories.FancyPageFactory(node__name="node-1", node__parent=root) sibling2 = factories.FancyPageFactory(node__name="node-2", node__parent=root) factories.FancyPageFactory(node__name="node-1-1", node__parent=sibling1) factories.FancyPageFactory(node__name="node-2-1", node__parent=sibling2) factories.FancyPageFactory(node__name="node-2-2", node__parent=sibling2) return root
def test_child_page_returns_toplevel_parent(db): root = factories.FancyPageFactory() child = factories.FancyPageFactory(node__parent=root) assert child.toplevel_parent == root
def test_can_be_added_with_new_image_and_link(admin_user, live_server, browser): fancypage = factories.FancyPageFactory() im = Image.new("RGB", (320, 240), "red") __, filename = tempfile.mkstemp(suffix='.jpg', dir=TEMP_MEDIA_ROOT) im.save(filename, "JPEG") image_filename = os.path.basename(filename) ImageAsset.objects.create(name='test image', image=image_filename, creator=admin_user) second_page = factories.FancyPageFactory(node__name='Another page', node__slug='another-page') browser.visit(live_server.url + fancypage.get_absolute_url()) find_and_click_by_css(browser, '#editor-handle') find_and_click_by_css(browser, "div[class=block-add-control]>a") find_and_click_by_css(browser, "a[href='#content']") find_and_click_by_css(browser, "button[data-block-code=image]") wait_for_editor_reload() default_image_text = 'Add An Image' if not browser.is_text_present(default_image_text, 2): raise AssertionError("Could not find image block on page") if not browser.is_element_present_by_css('.edit-button', 2): raise AssertionError("Could not find edit button for block") find_and_click_by_css(browser, '.edit-button') wait_for_editor_reload() find_and_click_by_css(browser, 'a[data-behaviours=load-asset-modal]') wait_for_editor_reload() with browser.get_iframe(0) as iframe: wait_for_editor_reload() find_and_click_by_css(iframe, 'li[data-behaviours=selectable-asset]') wait_for_editor_reload() # select 'Another page' as the link for the image find_and_click_by_css(browser, '.glyphicon-share') find_and_click_by_css(browser, 'a[href*={}]'.format(second_page.slug)) find_and_click_by_css(browser, 'button[type=submit]') wait_for_editor_reload() shows_image = browser.is_element_present_by_css( "img[src$='{}']".format(image_filename)) if not shows_image: raise AssertionError('Image not added to image block') link_exists = browser.is_element_present_by_css( "div.block-wrapper>a[href*={}]".format(second_page.slug)) if not link_exists: raise AssertionError( 'image block is not wrapped in link to other page')
def test_root_page_returns_toplevel_parent(db): root = factories.FancyPageFactory() assert root.toplevel_parent == root
def setUp(self): super(TestATextBlock, self).setUp() self.page = factories.FancyPageFactory()
def test_can_delete_a_page(self): fpage = factories.FancyPageFactory(node__name="A new page") self.assertEquals(FancyPage.objects.count(), 1) page = self.get(fpage.get_delete_page_url()) page.forms['page-delete-form'].submit() self.assertEquals(FancyPage.objects.count(), 0)