def test_context_setters(): h.set_context('test', 'wiki', neighborhood='Projects') assert c.project is not None assert c.app is not None cfg_id = c.app.config._id h.set_context('test', app_config_id=cfg_id, neighborhood='Projects') assert c.project is not None assert c.app is not None h.set_context('test', app_config_id=str(cfg_id), neighborhood='Projects') assert c.project is not None assert c.app is not None c.project = c.app = None with h.push_context('test', 'wiki', neighborhood='Projects'): assert c.project is not None assert c.app is not None assert c.project == c.app == None with h.push_context('test', app_config_id=cfg_id, neighborhood='Projects'): assert c.project is not None assert c.app is not None assert c.project == c.app == None with h.push_context('test', app_config_id=str(cfg_id), neighborhood='Projects'): assert c.project is not None assert c.app is not None assert c.project == c.app == None del c.project del c.app with h.push_context('test', app_config_id=str(cfg_id), neighborhood='Projects'): assert c.project is not None assert c.app is not None assert not hasattr(c, 'project') assert not hasattr(c, 'app')
def test_context_setters(): h.set_context("test", "wiki", neighborhood="Projects") assert c.project is not None assert c.app is not None cfg_id = c.app.config._id h.set_context("test", app_config_id=cfg_id, neighborhood="Projects") assert c.project is not None assert c.app is not None h.set_context("test", app_config_id=str(cfg_id), neighborhood="Projects") assert c.project is not None assert c.app is not None c.project = c.app = None with h.push_context("test", "wiki", neighborhood="Projects"): assert c.project is not None assert c.app is not None assert c.project == c.app == None with h.push_context("test", app_config_id=cfg_id, neighborhood="Projects"): assert c.project is not None assert c.app is not None assert c.project == c.app == None with h.push_context("test", app_config_id=str(cfg_id), neighborhood="Projects"): assert c.project is not None assert c.app is not None assert c.project == c.app == None del c.project del c.app with h.push_context("test", app_config_id=str(cfg_id), neighborhood="Projects"): assert c.project is not None assert c.app is not None assert not hasattr(c, "project") assert not hasattr(c, "app")
def test_macro_include_permissions(): p_nbhd = M.Neighborhood.query.get(name='Projects') p_test = M.Project.query.get(shortname='test', neighborhood_id=p_nbhd._id) wiki = p_test.app_instance('wiki') wiki2 = p_test.app_instance('wiki2') with h.push_context(p_test._id, app_config_id=wiki.config._id): p = WM.Page.upsert(title='CanRead') p.text = 'Can see this!' p.commit() ThreadLocalORMSession.flush_all() with h.push_context(p_test._id, app_config_id=wiki2.config._id): role = M.ProjectRole.by_name('*anonymous')._id read_perm = M.ACE.allow(role, 'read') acl = c.app.config.acl if read_perm in acl: acl.remove(read_perm) p = WM.Page.upsert(title='CanNotRead') p.text = 'Can not see this!' p.commit() ThreadLocalORMSession.flush_all() with h.push_context(p_test._id, app_config_id=wiki.config._id): c.user = M.User.anonymous() md = '[[include ref=CanRead]]\n[[include ref=wiki2:CanNotRead]]' html = g.markdown_wiki.convert(md) assert_in('Can see this!', html) assert_not_in('Can not see this!', html) assert_in("[[include: you don't have a read permission for wiki2:CanNotRead]]", html)
def test_hideawards_macro(): p_nbhd = M.Neighborhood.query.get(name='Projects') app_config_id = ObjectId() award = M.Award(app_config_id=app_config_id) award.short = u'Award short' award.full = u'Award full' award.created_by_neighborhood_id = p_nbhd._id project = M.Project.query.get( neighborhood_id=p_nbhd._id, shortname=u'test') M.AwardGrant( award=award, award_url='http://award.org', comment='Winner!', granted_by_neighborhood=p_nbhd, granted_to_project=project) ThreadLocalORMSession.flush_all() with h.push_context(p_nbhd.neighborhood_project._id): r = g.markdown_wiki.convert('[[projects]]') assert_in('<div class="feature"> <a href="http://award.org" rel="nofollow" title="Winner!">' 'Award short</a> </div>', squish_spaces(r)) r = g.markdown_wiki.convert('[[projects show_awards_banner=False]]') assert_not_in('Award short', r)
def test_app_globals(): with h.push_context('test', 'wiki', neighborhood='Projects'): assert g.app_static( 'css/wiki.css') == '/nf/_static_/wiki/css/wiki.css', g.app_static('css/wiki.css') assert g.url( '/foo', a='foo bar') == 'http://localhost/foo?a=foo+bar', g.url('/foo', a='foo bar') assert g.url('/foo') == 'http://localhost/foo', g.url('/foo')
def test_merge_request(self): to_project = M.Project.query.get(shortname='test2', neighborhood_id=c.project.neighborhood_id) r = self.app.post('/src-hg/fork', params=dict( project_id=str(to_project._id), mount_point='code')) assert "{status: 'error'}" not in str(r.follow()) cloned_from = c.app.repo with h.push_context('test2', 'code', neighborhood='Projects'): c.app.repo.init_as_clone( cloned_from.full_fs_path, cloned_from.app.config.script_name(), cloned_from.full_fs_path) r = self.app.get('/p/test2/code/').follow().follow() assert 'Request Merge' in r # Request Merge button only visible to repo admins kw = dict(extra_environ=dict(username='******')) r = self.app.get('/p/test2/code/', **kw).follow(**kw).follow(**kw) assert 'Request Merge' not in r, r # Request merge controller action only permitted for repo admins r = self.app.get('/p/test2/code/request_merge', status=403, **kw) r = self.app.get('/p/test2/code/request_merge') assert 'Request merge' in r # Merge request detail view r = r.forms[0].submit().follow() assert 'would like you to merge' in r mr_num = r.request.url.split('/')[-2] # Merge request list view r = self.app.get('/p/test/src-hg/merge-requests/') assert 'href="%s/"' % mr_num in r # Merge request status update r = self.app.post('/p/test/src-hg/merge-requests/%s/save' % mr_num, params=dict(status='rejected')).follow() assert 'Merge Request #%s: (rejected)' % mr_num in r, r
def test_ticket_move(self): app1 = c.project.app_instance('bugs') app2 = c.project.app_instance('bugs2') with h.push_context(c.project._id, app_config_id=app1.config._id): ticket = Ticket.new() ticket.summary = 'test ticket' ticket.description = 'test description' ticket.assigned_to_id = User.by_username('test-user')._id ticket.discussion_thread.add_post(text='test comment') assert_equal(Ticket.query.find({'app_config_id': app1.config._id}).count(), 1) assert_equal(Ticket.query.find({'app_config_id': app2.config._id}).count(), 0) assert_equal(Post.query.find(dict(thread_id=ticket.discussion_thread._id)).count(), 1) t = ticket.move(app2.config) assert_equal(Ticket.query.find({'app_config_id': app1.config._id}).count(), 0) assert_equal(Ticket.query.find({'app_config_id': app2.config._id}).count(), 1) assert_equal(t.summary, 'test ticket') assert_equal(t.description, 'test description') assert_equal(t.assigned_to.username, 'test-user') assert_equal(t.url(), '/p/test/bugs2/1/') post = Post.query.find(dict(thread_id=ticket.discussion_thread._id, text={'$ne': 'test comment'})).first() assert post is not None, 'No comment about ticket moving' message = 'Ticket moved from /p/test/bugs/1/' assert_equal(post.text, message) post = Post.query.find(dict(text='test comment')).first() assert_equal(post.thread.discussion_id, app2.config.discussion_id) assert_equal(post.thread.app_config_id, app2.config._id) assert_equal(post.app_config_id, app2.config._id)
def test_ticket_move_with_different_custom_fields(self): app1 = c.project.app_instance('bugs') app2 = c.project.app_instance('bugs2') app1.globals.custom_fields.extend([ {'name': '_test', 'type': 'string', 'label': 'Test field'}, {'name': '_test2', 'type': 'string', 'label': 'Test field 2'}]) app2.globals.custom_fields.append( {'name': '_test', 'type': 'string', 'label': 'Test field'}) ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all() with h.push_context(c.project._id, app_config_id=app1.config._id): ticket = Ticket.new() ticket.summary = 'test ticket' ticket.description = 'test description' ticket.custom_fields['_test'] = 'test val' ticket.custom_fields['_test2'] = 'test val 2' t = ticket.move(app2.config) assert_equal(t.summary, 'test ticket') assert_equal(t.description, 'test description') assert_equal(t.custom_fields['_test'], 'test val') post = Post.query.find(dict(thread_id=ticket.discussion_thread._id)).first() assert post is not None, 'No comment about ticket moving' message = 'Ticket moved from /p/test/bugs/1/' message += '\n\nCan\'t be converted:\n' message += '\n- **_test2**: test val 2' assert_equal(post.text, message)
def test_ticket_move_with_users_not_in_project(self): app1 = c.project.app_instance('bugs') app2 = c.project.app_instance('bugs2') app1.globals.custom_fields.extend([ {'name': '_user_field', 'type': 'user', 'label': 'User field'}, {'name': '_user_field_2', 'type': 'user', 'label': 'User field 2'}]) app2.globals.custom_fields.extend([ {'name': '_user_field', 'type': 'user', 'label': 'User field'}, {'name': '_user_field_2', 'type': 'user', 'label': 'User field 2'}]) ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all() from allura.websetup import bootstrap bootstrap.create_user('test-user-0') with h.push_context(c.project._id, app_config_id=app1.config._id): ticket = Ticket.new() ticket.summary = 'test ticket' ticket.description = 'test description' ticket.custom_fields['_user_field'] = 'test-user' # in project ticket.custom_fields['_user_field_2'] = 'test-user-0' # not in project ticket.assigned_to_id = User.by_username('test-user-0')._id # not in project t = ticket.move(app2.config) assert_equal(t.assigned_to_id, None) assert_equal(t.custom_fields['_user_field'], 'test-user') assert_equal(t.custom_fields['_user_field_2'], '') post = Post.query.find(dict(thread_id=ticket.discussion_thread._id)).first() assert post is not None, 'No comment about ticket moving' message = 'Ticket moved from /p/test/bugs/1/' message += '\n\nCan\'t be converted:\n' message += '\n- **_user_field_2**: test-user-0 (user not in project)' message += '\n- **assigned_to**: test-user-0 (user not in project)' assert_equal(post.text, message)
def main(): args = arguments() c.user = M.User.query.get(username='******') with h.push_context(args.shortname, args.mountpt, neighborhood='Projects'): tool = c.project.app_config_by_tool_type(args.mountpt) # create tons of topics discussion = Forum.query.get( app_config_id=tool._id, shortname=args.forumname) for i in range(5000): subject = 'fake topic {}'.format(str(i)) thd = discussion.thread_class()(discussion_id=discussion._id, subject=subject) # subj = str(uuid.uuid4())[:8] p = thd.post(subject, 'a new topic 2') for j in range(randint(1, 5)): new_post = {'text':'comment text'} # post = thd.add_post(**new_post) post = thd.add_post(text='comment text for real', subject="test subject") if i % 1000: session(p).flush()
def test_milestone_status(self): """When importing, if all tickets in a milestone are closed, the milestone itself should also be closed. """ here_dir = os.path.dirname(__file__) api_ticket = M.ApiTicket(user_id=c.user._id, capabilities={'import': ['Projects','test']}, expires=datetime.utcnow() + timedelta(days=1)) ming.orm.session(api_ticket).flush() self.set_api_token(api_ticket) doc_text = open(here_dir + '/data/milestone-tickets.json').read() r = self.api_post('/rest/p/test/bugs/perform_import', doc=doc_text, options='{"user_map": {"hinojosa4": "test-admin", "ma_boehm": "test-user"}}') assert r.json['status'], r.json ming.orm.ThreadLocalORMSession.flush_all() M.MonQTask.run_ready() ming.orm.ThreadLocalORMSession.flush_all() with h.push_context('test', mount_point='bugs', neighborhood='Projects'): for milestone_fld in c.app.globals.milestone_fields: milestone_names = [ms['name'] for ms in milestone_fld['milestones']] assert 'open_milestone' in milestone_names, milestone_names assert 'closed_milestone' in milestone_names, milestone_names for milestone in milestone_fld['milestones']: if milestone['name'] == 'open_milestone': assert milestone['complete'] == False if milestone['name'] == 'closed_milestone': assert milestone['complete'] == True
def test_macro_project_admins(): user = M.User.by_username('test-admin') user.display_name = u'Test Ådmin <script>' with h.push_context('test', neighborhood='Projects'): r = g.markdown_wiki.convert('[[project_admins]]') assert_equal( r, u'<div class="markdown_content"><h6>Project Admins:</h6>\n<ul class="md-users-list">\n<li><a href="/u/test-admin/">Test \xc5dmin <script></a></li>\n</ul>\n</div>')
def test_macro_neighborhood_feeds(): p_nbhd = M.Neighborhood.query.get(name='Projects') p_test = M.Project.query.get(shortname='test', neighborhood_id=p_nbhd._id) with h.push_context('--init--', 'wiki', neighborhood='Projects'): r = g.markdown_wiki.convert('[[neighborhood_feeds tool_name=wiki]]') assert 'Home modified by' in r, r orig_len = len(r) # Make project private & verify we don't see its new feed items anon = M.User.anonymous() p_test.acl.insert(0, M.ACE.deny( M.ProjectRole.anonymous(p_test)._id, 'read')) ThreadLocalORMSession.flush_all() pg = WM.Page.query.get(title='Home', app_config_id=c.app.config._id) pg.text = 'Change' with h.push_config(c, user=M.User.by_username('test-admin')): pg.commit() r = g.markdown_wiki.convert('[[neighborhood_feeds tool_name=wiki]]') new_len = len(r) assert new_len == orig_len p = BM.BlogPost(title='test me', neighborhood_id=p_test.neighborhood_id) p.text = 'test content' p.state = 'published' p.make_slug() with h.push_config(c, user=M.User.by_username('test-admin')): p.commit() ThreadLocalORMSession.flush_all() with h.push_config(c, user=anon): r = g.markdown_wiki.convert('[[neighborhood_blog_posts]]') assert 'test content' in r
def test_export_with_attachments(self): project = M.Project.query.get(shortname='test') blog = project.app_instance('blog') with h.push_context('test', 'blog', neighborhood='Projects'): post = BM.BlogPost.new( title='Test title', text='test post', labels=['the firstlabel', 'the second label'], delete=None ) ThreadLocalORMSession.flush_all() test_file1 = FieldStorage() test_file1.name = 'file_info' test_file1.filename = 'test_file' test_file1.file = StringIO('test file1\n') p = post.discussion_thread.add_post(text='test comment') p.add_multiple_attachments(test_file1) ThreadLocalORMSession.flush_all() f = tempfile.TemporaryFile() temp_dir = tempfile.mkdtemp() blog.bulk_export(f, temp_dir, True) f.seek(0) blog = json.loads(f.read()) blog['posts'] = sorted( blog['posts'], key=lambda x: x['title'], reverse=True) file_path = 'blog/{}/{}/{}/test_file'.format( post._id, post.discussion_thread._id, list(post.discussion_thread.post_class().query.find())[0].slug ) assert_equal(blog['posts'][0]['discussion_thread']['posts'][0] ['attachments'][0]['path'], file_path) assert os.path.exists(os.path.join(temp_dir, file_path))
def setUp(self): super(TestFork, self).setUp() to_project = M.Project.query.get( shortname='test2', neighborhood_id=c.project.neighborhood_id) r = self.app.post('/src-git/fork', params=dict( project_id=str(to_project._id), mount_point='code', mount_label='Test forked repository')) assert "{status: 'error'}" not in str(r.follow()) cloned_from = c.app.repo with h.push_context('test2', 'code', neighborhood='Projects'): c.app.repo.init_as_clone( cloned_from.full_fs_path, cloned_from.app.config.script_name(), cloned_from.full_fs_path) # Add commit to a forked repo, thus merge requests will not be empty # clone repo to tmp location first (can't add commit to bare repos # directly) clone_path = tempfile.mkdtemp() cloned = c.app.repo._impl._git.clone(clone_path) with open(clone_path + '/README', 'w+') as f: f.write('Very useful README') cloned.index.add(['README']) cloned.index.commit('Improve documentation') cloned.remotes[0].push() c.app.repo.refresh() self.forked_repo = c.app.repo shutil.rmtree(clone_path, ignore_errors=True)
def test_app_globals(): g.oid_session() g.oid_session() with h.push_context("test", "wiki", neighborhood="Projects"): assert g.app_static("css/wiki.css") == "/nf/_static_/wiki/css/wiki.css", g.app_static("css/wiki.css") assert g.url("/foo", a="foo bar") == "http://localhost:80/foo?a=foo+bar", g.url("/foo", a="foo bar") assert g.url("/foo") == "http://localhost:80/foo", g.url("/foo")
def test_bulk_export(self): # Clear out some context vars, to properly simulate how this is run from the export task # Besides, it's better not to need c context vars c.app = c.project = None project = M.Project.query.get(shortname='test') blog = project.app_instance('blog') with h.push_context('test', 'blog', neighborhood='Projects'): post = BM.BlogPost() post.title = 'Test title' post.text = 'test post' post.labels = ['the firstlabel', 'the second label'] post.make_slug() post.commit() post.discussion_thread.add_post(text='test comment') post2 = BM.BlogPost() post2.title = 'Test2 title' post2.text = 'test2 post' post2.make_slug() post2.commit() f = tempfile.TemporaryFile() blog.bulk_export(f) f.seek(0) blog = json.loads(f.read()) blog['posts'] = sorted( blog['posts'], key=lambda x: x['title'], reverse=True) assert_equal(blog['posts'][0]['title'], 'Test2 title') assert_equal(blog['posts'][0]['text'], 'test2 post') assert_equal(blog['posts'][1]['title'], 'Test title') assert_equal(blog['posts'][1]['text'], 'test post') assert_equal(blog['posts'][1]['labels'], ['the firstlabel', 'the second label']) assert_equal(blog['posts'][1]['discussion_thread'] ['posts'][0]['text'], 'test comment')
def test_sort_alpha(): p_nbhd = M.Neighborhood.query.get(name='Projects') with h.push_context(p_nbhd.neighborhood_project._id): r = g.markdown_wiki.convert('[[projects sort=alpha]]') project_list = get_project_names(r) assert project_list == sorted(project_list)
def test_macro_include_extra_br(): p_nbhd = M.Neighborhood.query.get(name="Projects") p_test = M.Project.query.get(shortname="test", neighborhood_id=p_nbhd._id) wiki = p_test.app_instance("wiki") with h.push_context(p_test._id, app_config_id=wiki.config._id): p = WM.Page.upsert(title="Include_1") p.text = "included page 1" p.commit() p = WM.Page.upsert(title="Include_2") p.text = "included page 2" p.commit() p = WM.Page.upsert(title="Include_3") p.text = "included page 3" p.commit() ThreadLocalORMSession.flush_all() md = "[[include ref=Include_1]]\n[[include ref=Include_2]]\n[[include ref=Include_3]]" html = g.markdown_wiki.convert(md) expected_html = """ <div class="markdown_content"> <p> <div><div class="markdown_content"><p>included page 1</p></div></div> <div><div class="markdown_content"><p>included page 2</p></div></div> <div><div class="markdown_content"><p>included page 3</p></div></div> </p> </div> """.strip().replace( "\n", "" ) assert html.strip().replace("\n", "") == expected_html, html
def test_markdown_basics(): with h.push_context("test", "wiki", neighborhood="Projects"): text = g.markdown.convert("# Foo!\n[Home]") assert '<a class="alink" href=' in text, text text = g.markdown.convert("# Foo!\n[Rooted]") assert "<a href=" not in text, text assert "<br" in g.markdown.convert("Multi\nLine"), g.markdown.convert("Multi\nLine") assert "<br" not in g.markdown.convert("Multi\n\nLine") g.markdown.convert("<class 'foo'>") # should not raise an exception assert "<br>" not in g.markdown.convert( """# Header Some text in a regular paragraph :::python for i in range(10): print i """ ) assert "http://localhost/" in g.forge_markdown(email=True).convert("[Home]") assert 'class="codehilite"' in g.markdown.convert( """ ~~~~ def foo(): pass ~~~~""" )
def test_markdown_basics(): with h.push_context('test', 'wiki', neighborhood='Projects'): text = g.markdown.convert('# Foo!\n[Home]') assert '<a class="alink" href=' in text, text text = g.markdown.convert('# Foo!\n[Rooted]') assert '<a href=' not in text, text assert '<br' in g.markdown.convert( 'Multi\nLine'), g.markdown.convert('Multi\nLine') assert '<br' not in g.markdown.convert('Multi\n\nLine') g.markdown.convert("<class 'foo'>") # should not raise an exception assert '<br>' not in g.markdown.convert('''# Header Some text in a regular paragraph :::python for i in range(10): print i ''') assert 'http://localhost/' in g.forge_markdown(email=True).convert('[Home]') assert 'class="codehilite"' in g.markdown.convert(''' ~~~~ def foo(): pass ~~~~''')
def test_markdown_within_html(): with h.push_context('test', neighborhood='Projects'): r = g.markdown_wiki.convert( '<div style="float:left" markdown>**blah**</div>') assert '''<div style="float: left;"> <p><strong>blah</strong></p> </div>''' in r, r
def test_macro_include_no_extra_br(): p_nbhd = M.Neighborhood.query.get(name='Projects') p_test = M.Project.query.get(shortname='test', neighborhood_id=p_nbhd._id) wiki = p_test.app_instance('wiki') with h.push_context(p_test._id, app_config_id=wiki.config._id): p = WM.Page.upsert(title='Include_1') p.text = 'included page 1' p.commit() p = WM.Page.upsert(title='Include_2') p.text = 'included page 2' p.commit() p = WM.Page.upsert(title='Include_3') p.text = 'included page 3' p.commit() ThreadLocalORMSession.flush_all() md = '[[include ref=Include_1]]\n[[include ref=Include_2]]\n[[include ref=Include_3]]' html = g.markdown_wiki.convert(md) expected_html = '''<div class="markdown_content"><p></p><div> <div class="markdown_content"><p>included page 1</p></div> </div> <div> <div class="markdown_content"><p>included page 2</p></div> </div> <div> <div class="markdown_content"><p>included page 3</p></div> </div> <p></p></div>''' assert_equal(squish_spaces(html), squish_spaces(expected_html))
def move(self, app_config, notify=True): """Move ticket from current tickets app to tickets app with given app_config""" app = app_config.project.app_instance(app_config) prior_url = self.url() prior_app = self.app prior_ticket_num = self.ticket_num attachments = self.attachments attach_metadata = BaseAttachment.metadata_for(self) prior_cfs = [(cf["name"], cf["type"], cf["label"]) for cf in prior_app.globals.custom_fields or []] new_cfs = [(cf["name"], cf["type"], cf["label"]) for cf in app.globals.custom_fields or []] skipped_fields = [] user_fields = [] for cf in prior_cfs: if cf not in new_cfs: # can't convert skipped_fields.append(cf) elif cf[1] == "user": # can convert and field type == user user_fields.append(cf) messages = [] for cf in skipped_fields: name = cf[0] messages.append("- **%s**: %s" % (name, self.custom_fields.get(name, ""))) for cf in user_fields: name = cf[0] username = self.custom_fields.get(name, None) user = app_config.project.user_in_project(username) if not user or user == User.anonymous(): messages.append("- **%s**: %s (user not in project)" % (name, username)) self.custom_fields[name] = "" # special case: not custom user field (assigned_to_id) user = self.assigned_to if user and not app_config.project.user_in_project(user.username): messages.append("- **assigned_to**: %s (user not in project)" % user.username) self.assigned_to_id = None custom_fields = {} for cf in new_cfs: fn, ft, fl = cf old_val = self.custom_fields.get(fn, None) if old_val is None: custom_fields[fn] = None if ft == "user" else "" custom_fields[fn] = old_val self.custom_fields = custom_fields # move ticket. ensure unique ticket_num while True: with h.push_context(app_config.project_id, app_config_id=app_config._id): ticket_num = app.globals.next_ticket_num() self.ticket_num = ticket_num self.app_config_id = app_config._id new_url = app_config.url() + str(self.ticket_num) + "/" try: session(self).flush(self) h.log_action(log, "moved").info("Ticket %s moved to %s" % (prior_url, new_url)) break except OperationFailure, err: if "duplicate" in err.args[0]: log.warning("Try to create duplicate ticket %s when moving from %s" % (new_url, prior_url)) session(self).expunge(self) continue
def test_sort_updated(): p_nbhd = M.Neighborhood.query.get(name="Projects") with h.push_context(p_nbhd.neighborhood_project._id): r = g.markdown_wiki.convert("[[projects sort=last_updated]]") project_names = get_project_names(r) updated_at = get_projects_property_in_the_same_order(project_names, "last_updated") assert updated_at == sorted(updated_at, reverse=True)
def test_sort_registered(): p_nbhd = M.Neighborhood.query.get(name='Projects') with h.push_context(p_nbhd.neighborhood_project._id): r = g.markdown_wiki.convert('[[projects sort=last_registered]]') project_names = get_project_names(r) ids = get_projects_property_in_the_same_order(project_names, '_id') assert ids == sorted(ids, reverse=True)
def test_limit_tools_macro(): p_nbhd = M.Neighborhood.query.get(name='Adobe') with h.push_context(p_nbhd.neighborhood_project._id, 'wiki'): r = g.markdown_wiki.convert('[[projects]]') assert '<span>Admin</span>' in r r = g.markdown_wiki.convert('[[projects grid_view_tools=wiki]]') assert '<span>Admin</span>' not in r r = g.markdown_wiki.convert('[[projects grid_view_tools=wiki,admin]]') assert '<span>Admin</span>' in r
def test_limit_tools_macro(): p_nbhd = M.Neighborhood.query.get(name="Adobe") with h.push_context(p_nbhd.neighborhood_project._id, "wiki"): r = g.markdown_wiki.convert("[[projects]]") assert "<span>Admin</span>" in r r = g.markdown_wiki.convert("[[projects grid_view_tools=wiki]]") assert "<span>Admin</span>" not in r r = g.markdown_wiki.convert("[[projects grid_view_tools=wiki,admin]]") assert "<span>Admin</span>" in r
def test_wiki_artifact_links(): text = g.markdown.convert('See [18:13:49]') assert 'See <span>[18:13:49]</span>' in text, text with h.push_context('test', 'wiki', neighborhood='Projects'): text = g.markdown.convert('Read [here](Home) about our project') assert '<a class="" href="/p/test/wiki/Home/">here</a>' in text, text text = g.markdown.convert('[Go home](test:wiki:Home)') assert '<a class="" href="/p/test/wiki/Home/">Go home</a>' in text, text text = g.markdown.convert('See [test:wiki:Home]') assert '<a class="alink" href="/p/test/wiki/Home/">[test:wiki:Home]</a>' in text, text
def _check_security(self): require_authenticated() enable_editing = config.get('trovecategories.enableediting', 'false') if enable_editing == 'admin': with h.push_context(config.get('site_admin_project', 'allura'), neighborhood=config.get('site_admin_project_nbhd', 'Projects')): require_access(c.project, 'admin') elif enable_editing != 'true': raise HTTPForbidden()
def test_macros(): file_name = 'neo-icon-set-454545-256x350.png' file_path = os.path.join(allura.__path__[0], 'nf', 'allura', 'images', file_name) curr_project = c.project p_nbhd = M.Neighborhood.query.get(name='Projects') p_test = M.Project.query.get(shortname='test', neighborhood_id=p_nbhd._id) c.project = p_test icon_file = open(file_path) M.ProjectFile.save_image(file_name, icon_file, content_type='image/png', square=True, thumbnail_size=(48, 48), thumbnail_meta=dict(project_id=c.project._id, category='icon')) icon_file.close() p_test2 = M.Project.query.get(shortname='test2', neighborhood_id=p_nbhd._id) c.project = p_test2 icon_file = open(file_path) M.ProjectFile.save_image(file_name, icon_file, content_type='image/png', square=True, thumbnail_size=(48, 48), thumbnail_meta=dict(project_id=c.project._id, category='icon')) icon_file.close() p_sub1 = M.Project.query.get(shortname='test/sub1', neighborhood_id=p_nbhd._id) c.project = p_sub1 icon_file = open(file_path) M.ProjectFile.save_image(file_name, icon_file, content_type='image/png', square=True, thumbnail_size=(48, 48), thumbnail_meta=dict(project_id=c.project._id, category='icon')) icon_file.close() p_test.labels = ['test', 'root'] p_sub1.labels = ['test', 'sub1'] # Make one project private p_test.private = False p_sub1.private = False p_test2.private = True ThreadLocalORMSession.flush_all() with h.push_context(p_nbhd.neighborhood_project._id): r = g.markdown_wiki.convert('[[projects]]') assert '<img alt="test Logo"' in r, r assert '<img alt="sub1 Logo"' in r, r r = g.markdown_wiki.convert('[[projects labels=root]]') assert '<img alt="test Logo"' in r, r assert '<img alt="sub1 Logo"' not in r, r r = g.markdown_wiki.convert('[[projects labels=sub1]]') assert '<img alt="test Logo"' not in r, r assert '<img alt="sub1 Logo"' in r, r r = g.markdown_wiki.convert('[[projects labels=test]]') assert '<img alt="test Logo"' in r, r assert '<img alt="sub1 Logo"' in r, r r = g.markdown_wiki.convert('[[projects labels=test,root]]') assert '<img alt="test Logo"' in r, r assert '<img alt="sub1 Logo"' not in r, r r = g.markdown_wiki.convert('[[projects labels=test,sub1]]') assert '<img alt="test Logo"' not in r, r assert '<img alt="sub1 Logo"' in r, r r = g.markdown_wiki.convert('[[projects labels=root|sub1]]') assert '<img alt="test Logo"' in r, r assert '<img alt="sub1 Logo"' in r, r r = g.markdown_wiki.convert('[[projects labels=test,root|root,sub1]]') assert '<img alt="test Logo"' in r, r assert '<img alt="sub1 Logo"' not in r, r r = g.markdown_wiki.convert('[[projects labels=test,root|test,sub1]]') assert '<img alt="test Logo"' in r, r assert '<img alt="sub1 Logo"' in r, r r = g.markdown_wiki.convert('[[projects show_total=True sort=random]]') assert '<p class="macro_projects_total">3 Projects</p>' in r, r r = g.markdown_wiki.convert( '[[projects show_total=True private=True sort=random]]') assert '<p class="macro_projects_total">1 Projects</p>' in r, r assert '<img alt="test2 Logo"' in r, r assert '<img alt="test Logo"' not in r, r assert '<img alt="sub1 Logo"' not in r, r r = g.markdown_wiki.convert("""[TOC] # Header 1 ## Header 2""") assert '<a class="" href="#header-1">Header 1</a>' in r, r r = g.markdown_wiki.convert(""" <?xml version="1.0" encoding="UTF-8"?> <project xmlns="0"></project>""") assert 'The markdown supplied could not be parsed correctly.' in r, r r = g.markdown_wiki.convert('[[projects show_proj_icon=True]]') assert '<img alt="test Logo"' in r r = g.markdown_wiki.convert('[[projects show_proj_icon=False]]') assert '<img alt="test Logo"' not in r c.project = curr_project r = g.markdown_wiki.convert('[[project_admins]]') assert r == '<div class="markdown_content"><p><a href="/u/test-admin/">Test Admin</a><br /></p></div>' r = g.markdown_wiki.convert('[[download_button]]') assert_equal( r, '<div class="markdown_content"><p><span class="download-button-%s" style="margin-bottom: 1em; display: block;"></span></p></div>' % p_test._id) h.set_context('--init--', 'wiki', neighborhood='Projects') r = g.markdown_wiki.convert('[[neighborhood_feeds tool_name=Wiki]]') assert 'WikiPage Home modified by' in r, r orig_len = len(r) # Make project private & verify we don't see its new feed items proj = M.Project.query.get(shortname='test', neighborhood_id=p_nbhd._id) c.user = M.User.anonymous() proj.acl.insert(0, M.ACE.deny(c.user.project_role(proj)._id, 'read')) ThreadLocalORMSession.flush_all() pg = WM.Page.query.get(title='Home', app_config_id=c.app.config._id) pg.text = 'Change' pg.commit() r = g.markdown_wiki.convert('[[neighborhood_feeds tool_name=Wiki]]') new_len = len(r) assert new_len == orig_len p = BM.BlogPost(title='test me', neighborhood_id=p_test.neighborhood_id) p.text = 'test content' p.state = 'published' p.make_slug() p.commit() ThreadLocalORMSession.flush_all() r = g.markdown_wiki.convert('[[neighborhood_blog_posts]]') assert 'test content' in r
def push_upstream_context(self): project, rest = h.find_project(self.upstream_repo.name) with h.push_context(project._id): app = project.app_instance(rest[0]) return h.push_context(project._id, app_config_id=app.config._id)
def push_downstream_context(self): return h.push_context(self.downstream.project_id, self.downstream.mount_point)
def test_ticket_numbers_are_independent(self): with h.push_context('test', 'doc-bugs', neighborhood='Projects'): assert_equal(c.app.globals.next_ticket_num(), 1) with h.push_context('test', 'bugs', neighborhood='Projects'): assert_equal(c.app.globals.next_ticket_num(), 1)
def revoke(self): require_access(self.neighborhood, 'admin') self.grant.delete() with h.push_context(self.project._id): g.post_event('project_updated') redirect(request.referer)
def test_markdown_and_html(): with h.push_context('test', neighborhood='Projects'): r = g.markdown_wiki.convert('<div style="float:left">blah</div>') assert '<div style="float: left;">blah</div>' in r, r
def test_markdown_within_html(): with h.push_context('test', neighborhood='Projects'): r = g.markdown_wiki.convert( '<div style="float:left" markdown>**blah**</div>') assert_in('<div style="float: left;"><p><strong>blah</strong></p></div>', r.replace('\n', ''))
def test_macro_nbhd_feeds(): with h.push_context('--init--', 'wiki', neighborhood='Projects'): r = g.markdown_wiki.convert('[[neighborhood_feeds tool_name=wiki]]') assert 'Home modified by ' in r, r assert '<div class="markdown_content">' not in r
def _check_security(self): with h.push_context(config.get('site_admin_project', 'allura'), neighborhood=config.get('site_admin_project_nbhd', 'Projects')): require_access(c.project, 'admin')
def test_app_globals(): with h.push_context('test', 'wiki', neighborhood='Projects'): assert g.app_static( 'css/wiki.css') == '/nf/_static_/wiki/css/wiki.css', g.app_static('css/wiki.css')