blob: 8a92969b133a87954395877002f78439d75e487f [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
import os
import allura
from StringIO import StringIO
import logging
import PIL
from alluratest.controller import TestController
from allura.lib import helpers as h
from allura import model as M
from forgediscussion import model as FM
log = logging.getLogger(__name__)
class TestForumAdmin(TestController):
def setUp(self):
TestController.setUp(self)
self.app.get('/discussion/')
def test_forum_CRUD(self):
r = self.app.get('/admin/discussion/forums')
r.forms[1]['add_forum.shortname'] = 'testforum'
r.forms[1]['add_forum.name'] = 'Test Forum'
r = r.forms[1].submit().follow()
assert 'Test Forum' in r
h.set_context('test', 'Forum', neighborhood='Projects')
frm = FM.Forum.query.get(shortname='testforum')
r = self.app.post('/admin/discussion/update_forums',
params={'forum-0.delete':'',
'forum-0.id':str(frm._id),
'forum-0.name':'New Test Forum',
'forum-0.shortname':'NewTestForum',
'forum-0.description':'My desc',
'forum-0.monitoring_email':''})
r = self.app.get('/admin/discussion/forums')
assert 'New Test Forum' in r
assert 'My desc' in r
def test_forum_CRUD_hier(self):
r = self.app.get('/admin/discussion/forums')
r.forms[1]['add_forum.shortname'] = 'testforum'
r.forms[1]['add_forum.name'] = 'Test Forum'
r = r.forms[1].submit().follow()
r = self.app.get('/admin/discussion/forums')
assert 'testforum' in r
h.set_context('test', 'discussion', neighborhood='Projects')
frm = FM.Forum.query.get(shortname='testforum')
r = self.app.get('/admin/discussion/forums')
r.forms[1]['add_forum.shortname'] = 'childforum'
r.forms[1]['add_forum.name'] = 'Child Forum'
r.forms[1]['add_forum.parent'] = str(frm._id)
r.forms[1].submit()
r = self.app.get('/admin/discussion/forums')
assert 'Child Forum' in r
def test_bad_forum_names(self):
r = self.app.get('/admin/discussion/forums')
r.forms[1]['add_forum.shortname'] = 'Test.Forum'
r.forms[1]['add_forum.name'] = 'Test Forum'
r = r.forms[1].submit()
assert 'error' in r
r = self.app.get('/admin/discussion/forums')
r.forms[1]['add_forum.shortname'] = 'Test/Forum'
r.forms[1]['add_forum.name'] = 'Test Forum'
r = r.forms[1].submit()
assert 'error' in r
r = self.app.get('/admin/discussion/forums')
r.forms[1]['add_forum.shortname'] = 'Test Forum'
r.forms[1]['add_forum.name'] = 'Test Forum'
r = r.forms[1].submit()
assert 'error' in r
def test_duplicate_forum_names(self):
r = self.app.get('/admin/discussion/forums')
r.forms[1]['add_forum.shortname'] = 'a'
r.forms[1]['add_forum.name'] = 'Forum A'
r = r.forms[1].submit()
r = self.app.get('/admin/discussion/forums')
r.forms[1]['add_forum.shortname'] = 'b'
r.forms[1]['add_forum.name'] = 'Forum B'
r = r.forms[1].submit()
h.set_context('test', 'Forum', neighborhood='Projects')
forum_a = FM.Forum.query.get(shortname='a')
self.app.post('/admin/discussion/update_forums',
params={'forum-0.delete':'on',
'forum-0.id':str(forum_a._id),
'forum-0.name':'Forum A',
'forum-0.description':''
})
# Now we have two forums: 'a', and 'b'. 'a' is deleted.
# Let's try to create new forums with these names.
r = self.app.get('/admin/discussion/forums')
r.forms[1]['add_forum.shortname'] = 'a'
r.forms[1]['add_forum.name'] = 'Forum A'
r = r.forms[1].submit()
assert 'error' in r
r = self.app.get('/admin/discussion/forums')
r.forms[1]['add_forum.shortname'] = 'b'
r.forms[1]['add_forum.name'] = 'Forum B'
r = r.forms[1].submit()
assert 'error' in r
def test_forum_icon(self):
file_name = 'neo-icon-set-454545-256x350.png'
file_path = os.path.join(allura.__path__[0],'nf','allura','images',file_name)
file_data = file(file_path).read()
upload = ('add_forum.icon', file_name, file_data)
h.set_context('test', 'discussion', neighborhood='Projects')
r = self.app.get('/admin/discussion/forums')
app_id = r.forms[1]['add_forum.app_id'].value
r = self.app.post('/admin/discussion/add_forum',
params={'add_forum.shortname':'testforum',
'add_forum.app_id':app_id,
'add_forum.name':'Test Forum',
'add_forum.description':'',
'add_forum.parent':'',
},
upload_files=[upload]),
r = self.app.get('/discussion/testforum/icon')
image = PIL.Image.open(StringIO(r.body))
assert image.size == (48,48)
def test_delete_undelete(self):
r = self.app.get('/admin/discussion/forums')
r = self.app.get('/admin/discussion/forums')
r.forms[1]['add_forum.shortname'] = 'testforum'
r.forms[1]['add_forum.name'] = 'Test Forum'
r = r.forms[1].submit()
r = self.app.get('/admin/discussion/forums')
assert len(r.html.findAll('input',{'value':'Delete'})) == 2
h.set_context('test', 'Forum', neighborhood='Projects')
frm = FM.Forum.query.get(shortname='testforum')
r = self.app.post('/admin/discussion/update_forums',
params={'forum-0.delete':'on',
'forum-0.id':str(frm._id),
'forum-0.name':'New Test Forum',
'forum-0.description':'My desc'})
r = self.app.get('/admin/discussion/forums')
assert len(r.html.findAll('input',{'value':'Delete'})) == 1
r = self.app.post('/admin/discussion/update_forums',
params={'forum-0.undelete':'on',
'forum-0.id':str(frm._id),
'forum-0.name':'New Test Forum',
'forum-0.description':'My desc'})
r = self.app.get('/admin/discussion/forums')
assert len(r.html.findAll('input',{'value':'Delete'})) == 2
def test_members_only(self):
# make a forum anyone can see
r = self.app.get('/admin/discussion/forums')
r.forms[1]['add_forum.shortname'] = 'secret'
r.forms[1]['add_forum.name'] = 'Secret'
r.forms[1].submit()
# forum can be viewed by member and non-member
self.app.get('/discussion/secret')
self.app.get('/discussion/secret',extra_environ=dict(username='test-user'))
# make a post in the forum and confirm it is also viewable by member and non-member
r = self.app.get('/discussion/create_topic/')
f = r.html.find('form',{'action':'/p/test/discussion/save_new_topic'})
params = dict()
inputs = f.findAll('input')
for field in inputs:
if field.has_key('name'):
params[field['name']] = field.has_key('value') and field['value'] or ''
params[f.find('textarea')['name']] = 'secret text'
params[f.find('select')['name']] = 'secret'
params[f.find('input',{'style':'width: 90%'})['name']] = 'secret topic'
r = self.app.post('/discussion/save_new_topic', params=params).follow()
thread_url= r.request.url
self.app.get(thread_url)
self.app.get(thread_url,extra_environ=dict(username='test-user'))
# link shows up in app for member and non-member
r = self.app.get('/discussion/')
assert '/secret/' in r
r = self.app.get('/discussion/',extra_environ=dict(username='test-user'))
assert '/secret/' in r
# make the forum member only viewable
secret = FM.Forum.query.get(shortname='secret')
self.app.post('/admin/discussion/update_forums',
params={'forum-0.members_only':'on',
'forum-0.id':str(secret._id),
'forum-0.name':'Secret',
'forum-0.shortname':'secret',
'forum-0.description':'',
'forum-0.monitoring_email':''
})
# member can see the forum, but non-member gets 403
self.app.get('/discussion/secret')
self.app.get('/discussion/secret',extra_environ=dict(username='test-user'), status=403)
# member can see a thread in the forum, but non-member gets 403
self.app.get(thread_url)
self.app.get(thread_url,extra_environ=dict(username='test-user'), status=403)
# link shows up in app for member but not non-member
r = self.app.get('/discussion/')
assert '/secret/' in r
r = self.app.get('/discussion/',extra_environ=dict(username='test-user'))
assert '/secret/' not in r
def test_anon_posts(self):
# make a forum anons can't post in
r = self.app.get('/admin/discussion/forums')
r.forms[1]['add_forum.shortname'] = 'testforum'
r.forms[1]['add_forum.name'] = 'Test Forum'
r.forms[1].submit()
# try to post in the forum and get a 403
r = self.app.get('/discussion/create_topic/')
f = r.html.find('form',{'action':'/p/test/discussion/save_new_topic'})
params = dict()
inputs = f.findAll('input')
for field in inputs:
if field.has_key('name'):
params[field['name']] = field.has_key('value') and field['value'] or ''
params[f.find('textarea')['name']] = 'post text'
params[f.find('select')['name']] = 'testforum'
params[f.find('input',{'style':'width: 90%'})['name']] = 'post topic'
r = self.app.post('/discussion/save_new_topic', params=params, extra_environ=dict(username='*anonymous'))
assert r.location == 'http://localhost/auth/'
# allow anon posts in the forum
testforum = FM.Forum.query.get(shortname='testforum')
self.app.post('/admin/discussion/update_forums',
params={'forum-0.anon_posts':'on',
'forum-0.id':str(testforum._id),
'forum-0.name':'Test Forum',
'forum-0.shortname':'testforum',
'forum-0.description':'',
'forum-0.monitoring_email':''
})
# successfully post to the forum
r = self.app.get('/discussion/create_topic/')
f = r.html.find('form',{'action':'/p/test/discussion/save_new_topic'})
params = dict()
inputs = f.findAll('input')
for field in inputs:
if field.has_key('name'):
params[field['name']] = field.has_key('value') and field['value'] or ''
params[f.find('textarea')['name']] = 'post text'
params[f.find('select')['name']] = 'testforum'
params[f.find('input',{'style':'width: 90%'})['name']] = 'post topic'
r = self.app.post('/discussion/save_new_topic', params=params)
assert 'http://localhost/p/test/discussion/testforum/thread/' in r.location
def test_footer_monitoring_email(self):
r = self.app.get('/admin/discussion/forums')
r.forms[1]['add_forum.shortname'] = 'testforum'
r.forms[1]['add_forum.name'] = 'Test Forum'
r.forms[1].submit()
testforum = FM.Forum.query.get(shortname='testforum')
self.app.post('/admin/discussion/update_forums',
params={'forum-0.anon_posts':'on',
'forum-0.id':str(testforum._id),
'forum-0.name':'Test Forum',
'forum-0.shortname':'testforum',
'forum-0.description':'',
'forum-0.monitoring_email':'email@monitoring.com'
})
r = self.app.get('/discussion/create_topic/')
f = r.html.find('form',{'action':'/p/test/discussion/save_new_topic'})
params = dict()
inputs = f.findAll('input')
for field in inputs:
if field.has_key('name'):
params[field['name']] = field.has_key('value') and field['value'] or ''
params[f.find('textarea')['name']] = 'post text'
params[f.find('select')['name']] = 'testforum'
params[f.find('input',{'style':'width: 90%'})['name']] = 'post topic'
r = self.app.post('/discussion/save_new_topic', params=params)
M.MonQTask.run_ready()
email_tasks = M.MonQTask.query.find(dict(task_name='allura.tasks.mail_tasks.sendsimplemail')).all()
assert 'Sent from sourceforge.net because email@monitoring.com is subscribed to http://localhost/p/test/discussion/testforum/' in email_tasks[0].kwargs['text'],email_tasks[0].kwargs['text']
assert 'a project admin can change settings at http://localhost/p/test/admin/discussion/forums' in email_tasks[0].kwargs['text']