def test_dict(self): become_trusted() somedict = {u"One": u"1", u"Two": u"2"} update_item(u'TestDict', {SOMEDICT: somedict}, "This is a dict item.") return u"TestDict"
def test_rename_acts_only_in_active_name_in_case_there_are_several_names(self): content = "This is page content" update_item('Page', {NAME: ['First', 'Second', 'Third', ], CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, content) item = Item.create('Second') item.rename('New name', comment='renamed') item1 = Item.create('First') assert item1.name == 'First' assert item1.meta[CONTENTTYPE] == 'text/x.moin.wiki;charset=utf-8' assert item1.content.data == content.encode() item2 = Item.create('New name') assert item2.name == 'New name' assert item2.meta[CONTENTTYPE] == 'text/x.moin.wiki;charset=utf-8' assert item2.content.data == content.encode() item3 = Item.create('Third') assert item3.name == 'Third' assert item3.meta[CONTENTTYPE] == 'text/x.moin.wiki;charset=utf-8' assert item3.content.data == content.encode() assert item1.rev.revid == item2.rev.revid == item3.rev.revid item4 = Item.create('Second') assert item4.meta[CONTENTTYPE] == CONTENTTYPE_NONEXISTENT
def custom_setup(self): become_trusted(username='******') for item_name, item_acl, item_content in self.items: if item_acl is not None: update_item(item_name, {ACL: item_acl}, item_content) else: update_item(item_name, {}, item_content)
def custom_setup(self): become_trusted(username='******') for item_names, item_acl, item_content in self.items: meta = {NAME: item_names} if item_acl is not None: meta.update({ACL: item_acl}) update_item(item_names[0], meta, item_content)
def test_Include_Read_Permission_Denied(self): # attempt to include an item that user cannot read update_item(u'page1', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8', ACL: u'All:write,create,admin,destroy'}, u'no one can read') update_item(u'page2', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'some text{{page1}}more text') page2 = Item.create(u'page2') rendered = page2.content._render_data() # an error message will follow p tag, similar to: Access Denied, transcluded content suppressed. assert '<div class="warning"><p>' in rendered
def test_InlineIncludeCreole(self): # transclude single paragraph as inline using creole parser update_item('creole', {CONTENTTYPE: 'text/x.moin.creole;charset=utf-8'}, 'creole item') update_item('page1', {CONTENTTYPE: 'text/x.moin.creole;charset=utf-8'}, 'before {{creole}} after') rendered = Item.create('page1').content._render_data() assert '<p>before <span class="moin-transclusion" data-href="/creole">creole item</span> after</p>' in rendered
def custom_setup(self): become_trusted() somedict = {"First": "first item", "text with spaces": "second item", 'Empty string': '', "Last": "last item"} update_item('SomeTestDict', {SOMEDICT: somedict}, DATA) somedict = {"One": "1", "Two": "2"} update_item('SomeOtherTestDict', {SOMEDICT: somedict}, DATA)
def custom_setup(self): become_trusted() somedict = { u"First": u"first item", u"text with spaces": u"second item", u'Empty string': u'', u"Last": u"last item" } update_item(u'SomeTestDict', {SOMEDICT: somedict}, DATA) somedict = {u"One": u"1", u"Two": u"2"} update_item(u'SomeOtherTestDict', {SOMEDICT: somedict}, DATA)
def test_appending_group_item(self): """ Test scalability by appending a name to a large list of group members. """ become_trusted() # long list of users members = create_random_string_list(length=15, count=1234) test_user = create_random_string_list(length=15, count=1)[0] update_item(u'UserGroup', {USERGROUP: members}, DATA) update_item(u'UserGroup', {USERGROUP: members + [test_user]}, '') result = test_user in flaskg.groups['UserGroup'] assert result
def test_IncludeHandlesCircularRecursion(self): # detect circular recursion and create error message update_item(u'page1', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'{{page2}}') update_item(u'page2', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'{{page3}}') update_item(u'page3', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'{{page4}}') update_item(u'page4', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'{{page2}}') page1 = Item.create(u'page1') rendered = page1.content._render_data() # an error message will follow strong tag assert '<strong class="moin-error">' in rendered
def test_rename_group_item(self): """ Tests renaming of a group item. """ become_trusted() update_item(u'SomeGroup', {USERGROUP: ["ExampleUser"]}, DATA) assert u'ExampleUser' in flaskg.groups[u'SomeGroup'] pytest.raises(GroupDoesNotExistError, lambda: flaskg.groups[u'AnotherGroup']) update_item(u'SomeGroup', { NAME: [ u'AnotherGroup', ], USERGROUP: ["ExampleUser"] }, DATA) assert u'ExampleUser' in flaskg.groups[u'AnotherGroup'] pytest.raises(GroupDoesNotExistError, lambda: flaskg.groups[u'SomeGroup'])
def test_global_atom_with_an_item(self, app): basename = u'Foo' update_item(basename, {COMMENT: u"foo data for feed item"}, '') with app.test_client() as c: rv = c.get(url_for('feed.atom')) assert rv.status == '200 OK' assert rv.headers['Content-Type'] == 'application/atom+xml' assert rv.data.startswith('<?xml') assert "foo data for feed item" in rv.data # tests the cache invalidation update_item(basename, {COMMENT: u"checking if the cache invalidation works"}, '') with app.test_client() as c: rv = c.get(url_for('feed.atom')) assert rv.status == '200 OK' assert rv.headers['Content-Type'] == 'application/atom+xml' assert rv.data.startswith('<?xml') assert "checking if the cache invalidation works" in rv.data
def test_item_can_have_several_names(self): content = b"This is page content" update_item('Page', {NAME: ['Page', 'Another name', ], CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, content) item1 = Item.create('Page') assert item1.name == 'Page' assert item1.meta[CONTENTTYPE] == 'text/x.moin.wiki;charset=utf-8' assert item1.content.data == content item2 = Item.create('Another name') assert item2.name == 'Another name' assert item2.meta[CONTENTTYPE] == 'text/x.moin.wiki;charset=utf-8' assert item2.content.data == content assert item1.rev.revid == item2.rev.revid
def test_wiki_backend_item_acl_usergroupmember_item(self): """ Test if the wiki group backend works with acl code. First check acl rights of a user that is not a member of group then add user member to an item group and check acl rights """ become_trusted() update_item(u'NewGroup', {USERGROUP: ["ExampleUser"]}, DATA) acl_rights = ["NewGroup:read,write"] acl = AccessControlList(acl_rights, valid=app.cfg.acl_rights_contents) has_rights_before = acl.may(u"AnotherUser", "read") # update item - add AnotherUser to a item group NewGroup update_item(u'NewGroup', {USERGROUP: ["AnotherUser"]}, '') has_rights_after = acl.may(u"AnotherUser", "read") assert not has_rights_before, 'AnotherUser has no read rights because in the beginning he is not a member of a group item NewGroup' assert has_rights_after, 'AnotherUser must have read rights because after appenditem he is member of NewGroup'
def test__render_data_diff(self): item_name = 'Html_Item' fqname = split_fqname(item_name) empty_html = '<span></span>' html = '<span>\ud55c</span>' meta = {CONTENTTYPE: 'text/html;charset=utf-8'} item = Item.create(item_name) item._save(meta, empty_html) item = Item.create(item_name) # Unicode test, html escaping rev1 = update_item(item_name, meta, html) rev2 = update_item(item_name, {}, ' ') result = Text._render_data_diff(item.content, rev1, rev2, fqname=fqname) assert escape(html) in result # Unicode test, whitespace rev1 = update_item(item_name, {}, '\n\n') rev2 = update_item(item_name, {}, '\n \n') result = Text._render_data_diff(item.content, rev1, rev2, fqname=fqname) assert '<span> </span>' in result # If fairly similar diffs are correctly spanned or not, also check indent rev1 = update_item(item_name, {}, 'One Two Three Four\nSix\n\ud55c') rev2 = update_item(item_name, {}, 'Two Three Seven Four\nSix\n\ud55c') result = Text._render_data_diff(item.content, rev1, rev2, fqname=fqname) assert '<span>One </span>Two Three Four' in result assert 'Two Three <span>Seven </span>Four' in result # Check for diff_html.diff return types assert reduce(lambda x, y: x and y, [isinstance(i[1], str) and isinstance(i[3], str) for i in diff_html.diff('One Two Three Four\nSix\n', 'Two Three Seven Four\nSix Seven\n')], True)
def test_ExternalInclude(self): # external include update_item(u'page1', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'{{http://moinmo.in}}') rendered = Item.create(u'page1').content._render_data() assert '<object class="moin-transclusion" data="http://moinmo.in" data-href="http://moinmo.in">http://moinmo.in</object>' in rendered # external include embedded within text (object is an inline tag) update_item(u'page1', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'before {{http://moinmo.in}} after') rendered = Item.create(u'page1').content._render_data() assert '<p>before <object class="moin-transclusion" data="http://moinmo.in" data-href="http://moinmo.in">http://moinmo.in</object> after</p>' in rendered # external include embedded within text italic and bold markup (object is an inline tag) update_item(u'page1', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u"before ''italic '''bold {{http://moinmo.in}} bold''' italic'' normal") rendered = Item.create(u'page1').content._render_data() assert '<p>before <em>italic <strong>bold <object class="moin-transclusion" data="http://moinmo.in" data-href="http://moinmo.in">http://moinmo.in</object> bold</strong> italic</em> normal</p>' in rendered
def test_rename_works_with_multiple_names(self): content = "This is page content" meta = { NAME: [ 'First', 'Second', 'Third', ], CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8' } r = update_item('Page', meta, content) item = Item.create('Second') rev = item.rename(['New name', 'First', 'Third'], comment='renamed') item1 = Item.create('First') assert item1.name == 'First' assert 'First' in item1.meta[NAME] assert 'Third' in item1.meta[NAME] assert 'New name' in item1.meta[NAME] assert item1.meta[CONTENTTYPE] == 'text/x.moin.wiki;charset=utf-8' assert item1.content.data == content.encode() item2 = Item.create('New name') assert item2.name == 'New name' assert 'First' in item2.meta[NAME] assert 'Third' in item2.meta[NAME] assert 'New name' in item2.meta[NAME] assert item2.meta[CONTENTTYPE] == 'text/x.moin.wiki;charset=utf-8' assert item2.content.data == content.encode() item3 = Item.create('Third') assert item3.name == 'Third' assert 'First' in item3.meta[NAME] assert 'Third' in item3.meta[NAME] assert 'New name' in item3.meta[NAME] assert item3.meta[CONTENTTYPE] == 'text/x.moin.wiki;charset=utf-8' assert item3.content.data == content.encode() assert item1.rev.revid == item2.rev.revid == item3.rev.revid item4 = Item.create('Second') assert item4.meta[CONTENTTYPE] == CONTENTTYPE_NONEXISTENT
def test_rename_recursion(self): update_item(u'Page', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'Page 1') update_item(u'Page/Child', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'this is child') update_item(u'Page/Child/Another', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'another child') item = Item.create(u'Page') item.rename(u'Renamed_Page', comment=u'renamed') # items at original name and its contents after renaming item = Item.create(u'Page') assert item.name == u'Page' assert item.meta[CONTENTTYPE] == CONTENTTYPE_NONEXISTENT item = Item.create(u'Page/Child') assert item.name == u'Page/Child' assert item.meta[CONTENTTYPE] == CONTENTTYPE_NONEXISTENT item = Item.create(u'Page/Child/Another') assert item.name == u'Page/Child/Another' assert item.meta[CONTENTTYPE] == CONTENTTYPE_NONEXISTENT # item at new name and its contents after renaming item = Item.create(u'Renamed_Page') assert item.name == u'Renamed_Page' assert item.meta[NAME_OLD] == [u'Page'] assert item.meta[COMMENT] == u'renamed' assert item.content.data == u'Page 1' item = Item.create(u'Renamed_Page/Child') assert item.name == u'Renamed_Page/Child' assert item.meta[NAME_OLD] == [u'Page/Child'] assert item.meta[COMMENT] == u'renamed' assert item.content.data == u'this is child' item = Item.create(u'Renamed_Page/Child/Another') assert item.name == u'Renamed_Page/Child/Another' assert item.meta[NAME_OLD] == [u'Page/Child/Another'] assert item.meta[COMMENT] == u'renamed' assert item.content.data == u'another child'
def test_member_removed_from_group_item(self): """ Tests appending a member to a large list of group members and recreating the item without the member. """ become_trusted() # long list of users members = create_random_string_list() update_item(u'UserGroup', {USERGROUP: members}, DATA) # updates the text with the text_user test_user = create_random_string_list(length=15, count=1)[0] update_item(u'UserGroup', {USERGROUP: [test_user]}, DATA) result = test_user in flaskg.groups[u'UserGroup'] assert result # updates the text without test_user update_item(u'UserGroup', {}, DATA) result = test_user in flaskg.groups[u'UserGroup'] assert not result
def test_rename_recursion_with_multiple_names_and_children(self): update_item( u'Foo', { CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8', NAME: [u'Other', u'Page', u'Foo'], }, u'Parent') update_item(u'Page/Child', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'Child of Page') update_item(u'Other/Child2', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'Child of Other') update_item( u'Another', { CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8', NAME: [u'Another', u'Page/Second'], }, u'Both') update_item(u'Page/Second/Child', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'Child of Second') update_item(u'Another/Child', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'Child of Another') item = Item.create(u'Page') item.rename(u'Renamed', comment=u'renamed') assert Item.create( u'Page/Child').meta[CONTENTTYPE] == CONTENTTYPE_NONEXISTENT assert Item.create(u'Renamed/Child').content.data == u'Child of Page' assert Item.create( u'Page/Second').meta[CONTENTTYPE] == CONTENTTYPE_NONEXISTENT assert Item.create(u'Renamed/Second').content.data == u'Both' assert Item.create(u'Another').content.data == u'Both' assert Item.create( u'Page/Second/Child').meta[CONTENTTYPE] == CONTENTTYPE_NONEXISTENT assert Item.create( u'Renamed/Second/Child').content.data == u'Child of Second' assert Item.create(u'Other/Child2').content.data == u'Child of Other' assert Item.create( u'Another/Child').content.data == u'Child of Another'
def test_IncludeAsLinkAlternate(self): # the 3rd parameter, u'', should be a binary string defining a png image, but it is not needed for this simple test update_item('logo.png', {CONTENTTYPE: 'image/png'}, '') update_item('page2', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "Single Line") # image as link alternate update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "text [[page2|{{logo.png}}]] text") rendered = Item.create('page1').content._render_data() assert '<p>text <a href="/page2"><span class="moin-transclusion" data-href="/logo.png"><img alt="logo.png" src="' in rendered assert '/logo.png" /></span></a> text</p>' in rendered # link alternate with image embedded in markup update_item( 'page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "text [[page2|plain '''bold {{logo.png}} bold''' plain]] text") rendered = Item.create('page1').content._render_data() assert '<p>text <a href="/page2">plain <strong>bold <span class="moin-transclusion" data-href="/logo.png"><img alt="logo.png" src="' in rendered assert '/logo.png" /></span> bold</strong> plain</a> text</p>' in rendered # nonexistent image used in link alternate # XXX html validation errora: A inside A - the image alternate turns into an A-tag to create the non-existant image. Error is easily seen. # IE9, Firefox, Chrome, Safari, and Opera display this OK; the only usable hyperlink is to create the missing image. update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "text [[page2|{{logoxxx.png}}]] text") rendered = Item.create('page1').content._render_data() assert '<p>text <a href="/page2"><span class="moin-transclusion" data-href="/logoxxx.png"><a href="/+modify/logoxxx.png">' in rendered assert '</a></span></a> text</p>' in rendered # image used as alternate to nonexistent page update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "text [[page2xxx|{{logo.png}}]] text") rendered = Item.create('page1').content._render_data() assert '<p>text <a class="moin-nonexistent" href="/page2xxx"><span class="moin-transclusion" data-href="/logo.png"><img alt="logo.png" src="' in rendered assert '/logo.png" /></span></a> text</p>' in rendered # transclude block elem as link alternate to nonexistent page # XXX html validation errors, block element inside A. # IE9, Firefox, Chrome, Safari, and Opera display this OK; the hyperlink is the entire div enclosing the block elem update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, 'text [[MyPage|{{page2}}]] text') update_item('page2', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "Double\n\nLine") rendered = Item.create('page1').content._render_data() assert '<p>text <a class="moin-nonexistent" href="/MyPage"><div class="moin-transclusion" data-href="/page2"><p>Double</p><p>Line</p></div></a> text</p>' in rendered # transclude empty item as link alternate to nonexistent page # hyperlink will be empty span and invisible update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, 'text [[MyPage|{{page2}}]] text') update_item('page2', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "") rendered = Item.create('page1').content._render_data() assert '<p>text <a class="moin-nonexistent" href="/MyPage"><span class="moin-transclusion" data-href="/page2"></span></a> text</p>' in rendered # transclude external page as link alternate to nonexistent page update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, 'text [[MyPage|{{http://moinmo.in}}]] text') rendered = Item.create('page1').content._render_data() assert '<p>text <a class="moin-nonexistent" href="/MyPage"><object class="moin-transclusion" data="http://moinmo.in" data-href="http://moinmo.in">http://moinmo.in</object></a> text</p>' in rendered
def test_InlineIncludeImage(self): # the 3rd parameter, u'', should be a binary string defining a png image, but it is not needed for this simple test update_item('logo.png', {CONTENTTYPE: 'image/png'}, '') # simple transclusion update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, '{{logo.png}}') rendered = Item.create('page1').content._render_data() assert '<p><span class="moin-transclusion" data-href="/logo.png"><img alt="logo.png" src=' in rendered assert '/logo.png" /></span></p>' in rendered # simple transclusion with alt text and width update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, '{{logo.png|my alt text|width="100"}}') rendered = Item.create('page1').content._render_data() assert '<p><span class="moin-transclusion" data-href="/logo.png"><img alt="my alt text" src=' in rendered assert 'logo.png" width="100" /></span></p>' in rendered # within paragraph update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, 'text {{logo.png}} text') rendered = Item.create('page1').content._render_data() assert '<p>text <span class="moin-transclusion" data-href="/logo.png"><img alt="logo.png" src=' in rendered assert '/logo.png" /></span> text</p>' in rendered # within markup update_item( 'page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "Normal ''italic '''bold {{logo.png}} bold''' italic'' normal") rendered = Item.create('page1').content._render_data() assert '<p>Normal <em>italic <strong>bold <span class="moin-transclusion" data-href="/logo.png"><img alt="logo.png" src=' in rendered assert '/logo.png" /></span> bold</strong> italic</em> normal</p>' in rendered # multiple transclusions update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, '{{logo.png}}{{logo.png}}') rendered = Item.create('page1').content._render_data() assert '<p><span class="moin-transclusion" data-href="/logo.png"><img alt="logo.png" src=' in rendered assert '/logo.png" /></span><span class="moin-transclusion" data-href="/logo.png"><img alt="logo.png" src=' in rendered # check for old bug assert '<p />' not in rendered assert '<p></p>' not in rendered
def test_InlineIncludeWithinMarkup(self): # transclude single line item within italic and bold markup update_item( 'page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "Normal ''italic '''bold {{page2}} bold''' italic'' normal") update_item('page2', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "Single Line") rendered = Item.create('page1').content._render_data() assert '<p>Normal <em>italic <strong>bold <span class="moin-transclusion" data-href="/page2">Single Line</span> bold</strong> italic</em> normal</p>' in rendered # transclude double line item within italic and bold markup update_item( 'page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "Normal ''italic '''bold {{page2}} bold''' italic'' normal") update_item('page2', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "Double\n\nLine") rendered = Item.create('page1').content._render_data() assert '<p>Normal <em>italic <strong>bold </strong></em></p><div class="moin-transclusion" data-href="/page2"><p>Double</p><p>Line</p></div><p><em><strong> bold</strong> italic</em> normal</p>' in rendered # transclude single line item within comment update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "comment /* before {{page2}} after */") update_item('page2', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "Single Line") rendered = Item.create('page1').content._render_data() assert '<p>comment <span class="comment">before <span class="moin-transclusion" data-href="/page2">Single Line</span> after</span></p>' in rendered # transclude double line item within comment update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "comment /* before {{page2}} after */") update_item('page2', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "Double\n\nLine") rendered = Item.create('page1').content._render_data() assert '<p>comment <span class="comment">before </span></p><div class="comment moin-transclusion" data-href="/page2"><p>Double</p><p>Line</p></div><p><span class="comment"> after</span></p>' in rendered
def _publish_entry(self, entry, ptime, acl=None): meta = self.entry_meta.copy() meta[PTIME] = ptime if acl is not None: meta[ACL] = acl update_item(entry['name'], meta, entry['data'])
def test_InlineInclude(self): update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, 'before {{page2}} after') # transclude single paragraph as inline update_item('page2', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, 'Single line') rendered = Item.create('page1').content._render_data() assert '<p>before <span class="moin-transclusion" data-href="/page2">Single line</span> after</p>' in rendered # transclude multiple paragraphs as block update_item('page2', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, 'Two\n\nParagraphs') rendered = Item.create('page1').content._render_data() assert '<p>before </p><div class="moin-transclusion" data-href="/page2"><p>Two</p><p>Paragraphs</p></div><p> after</p></div>' in rendered # transclude single paragraph with internal markup as inline update_item('page2', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "this text contains ''italic'' string") rendered = Item.create('page1').content._render_data() assert 'before <span class="moin-transclusion" data-href="/page2">this text contains <em>italic</em>' in rendered # transclude single paragraph as only content within a paragraph update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, 'Content of page2 is\n\n{{page2}}') update_item('page2', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "Single Line") rendered = Item.create('page1').content._render_data() assert '<p>Content of page2 is</p><p><span class="moin-transclusion" data-href="/page2">Single Line</span></p>' in rendered # transclude single row table within a paragraph, block element forces paragraph to be split into 2 parts update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, 'before {{page2}} after') update_item('page2', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "|| table || cell ||") rendered = Item.create('page1').content._render_data() assert '<p>before </p><div class="moin-transclusion" data-href="/page2"><table' in rendered assert '</table></div><p> after</p>' in rendered assert rendered.count('<table') == 1 # transclude two row table within a paragraph, block element forces paragraph to be split into 2 parts update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, 'before {{page2}} after') update_item('page2', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "|| this || has ||\n|| two || rows ||") rendered = Item.create('page1').content._render_data() # inclusion of block item within a paragraph results in a before and after p assert '<p>before </p><div class="moin-transclusion" data-href="/page2"><table' in rendered assert '</table></div><p> after</p>' in rendered assert rendered.count('<table') == 1 # transclude nonexistent item update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, 'before {{nonexistent}} after') rendered = Item.create('page1').content._render_data() assert '<p>before <span class="moin-transclusion" data-href="/nonexistent"><a href="/+modify/nonexistent">' in rendered assert '</a></span> after</p>' in rendered # transclude empty item update_item('page1', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, 'text {{page2}} text') update_item('page2', {CONTENTTYPE: 'text/x.moin.wiki;charset=utf-8'}, "") rendered = Item.create('page1').content._render_data() assert '<p>text <span class="moin-transclusion" data-href="/page2"></span> text</p>' in rendered
def custom_setup(self): become_trusted() for group, members in self.test_groups.iteritems(): update_item(group, {USERGROUP: members}, DATA)