blob: b7ae16a22b974f88dd5ec0d197e921fc28edefc8 [file] [log] [blame]
# coding: utf-8
# 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 json
from mock import patch, MagicMock
from nose.tools import assert_equal, assert_in, assert_not_in
from ming.odm import ThreadLocalORMSession
from pylons import tmpl_context as c
from tg import config
from bson import ObjectId
from allura import model as M
from allura.tests import TestController
from allura.lib import helpers as h
from allura.lib.decorators import task
class TestSiteAdmin(TestController):
def test_access(self):
r = self.app.get('/nf/admin/', extra_environ=dict(
username='test-user'), status=403)
r = self.app.get('/nf/admin/', extra_environ=dict(
username='*anonymous'), status=302)
r = r.follow()
assert 'Login' in r
def test_home(self):
r = self.app.get('/nf/admin/', extra_environ=dict(
username='root'))
assert 'Site Admin Home' in r
def test_stats(self):
r = self.app.get('/nf/admin/stats/', extra_environ=dict(
username='root'))
assert 'Forge Site Admin' in r.html.find(
'h2', {'class': 'dark title'}).contents[0]
stats_table = r.html.find('table')
cells = stats_table.findAll('td')
assert cells[0].contents[0] == 'Adobe', cells[0].contents[0]
def test_tickets_access(self):
self.app.get('/nf/admin/api_tickets', extra_environ=dict(
username='test-user'), status=403)
def test_new_projects_access(self):
self.app.get('/nf/admin/new_projects', extra_environ=dict(
username='test_user'), status=403)
r = self.app.get('/nf/admin/new_projects', extra_environ=dict(
username='*anonymous'), status=302).follow()
assert 'Login' in r
def test_new_projects(self):
r = self.app.get('/nf/admin/new_projects', extra_environ=dict(
username='root'))
headers = r.html.find('table').findAll('th')
assert headers[1].contents[0] == 'Created'
assert headers[2].contents[0] == 'Shortname'
assert headers[3].contents[0] == 'Name'
assert headers[4].contents[0] == 'Short description'
assert headers[5].contents[0] == 'Summary'
assert headers[6].contents[0] == 'Homepage'
assert headers[7].contents[0] == 'Admins'
def test_new_projects_deleted_projects(self):
'''Deleted projects should not be visible here'''
r = self.app.get('/nf/admin/new_projects', extra_environ=dict(
username='root'))
count = len(r.html.find('table').findAll('tr'))
p = M.Project.query.get(shortname='test')
p.deleted = True
ThreadLocalORMSession.flush_all()
r = self.app.get('/nf/admin/new_projects', extra_environ=dict(
username='root'))
assert_equal(len(r.html.find('table').findAll('tr')), count - 1)
def test_new_projects_daterange_filtering(self):
r = self.app.get('/nf/admin/new_projects', extra_environ=dict(
username='root'))
count = len(r.html.find('table').findAll('tr'))
assert_equal(count, 7)
filtr = r.forms[0]
filtr['start-dt'] = '2000/01/01 10:10:10'
filtr['end-dt'] = '2000/01/01 09:09:09'
r = filtr.submit()
count = len(r.html.find('table').findAll('tr'))
assert_equal(count, 1) # only row with headers - no results
def test_reclone_repo_access(self):
r = self.app.get('/nf/admin/reclone_repo', extra_environ=dict(
username='*anonymous'), status=302).follow()
assert 'Login' in r
def test_reclone_repo(self):
r = self.app.get('/nf/admin/reclone_repo')
assert 'Reclone repository' in r
def test_reclone_repo_default_value(self):
r = self.app.get('/nf/admin/reclone_repo')
assert 'value="p"' in r
def test_task_list(self):
r = self.app.get('/nf/admin/task_manager',
extra_environ=dict(username='*anonymous'), status=302)
import math
M.MonQTask.post(math.ceil, (12.5,))
r = self.app.get('/nf/admin/task_manager?page_num=1')
assert 'math.ceil' in r, r
def test_task_view(self):
import math
task = M.MonQTask.post(math.ceil, (12.5,))
url = '/nf/admin/task_manager/view/%s' % task._id
r = self.app.get(
url, extra_environ=dict(username='*anonymous'), status=302)
r = self.app.get(url)
assert 'math.ceil' in r, r
def test_task_new(self):
r = self.app.get('/nf/admin/task_manager/new')
assert 'New Task' in r, r
def test_task_create(self):
project = M.Project.query.get(shortname='test')
app = project.app_instance('admin')
user = M.User.by_username('root')
task_args = dict(
args=['foo'],
kwargs=dict(bar='baz'))
r = self.app.post('/nf/admin/task_manager/create', params=dict(
task='allura.tests.functional.test_site_admin.test_task',
task_args=json.dumps(task_args),
user='root',
path='/p/test/admin',
), status=302)
task = M.MonQTask.query.find({}).sort('_id', -1).next()
assert str(task._id) in r.location
assert task.context['project_id'] == project._id
assert task.context['app_config_id'] == app.config._id
assert task.context['user_id'] == user._id
assert task.args == task_args['args']
assert task.kwargs == task_args['kwargs']
def test_task_doc(self):
r = self.app.get('/nf/admin/task_manager/task_doc', params=dict(
task_name='allura.tests.functional.test_site_admin.test_task'))
assert json.loads(r.body)['doc'] == 'test_task doc string'
@patch('allura.model.auth.request')
def test_users(self, request):
request.url = 'http://host.domain/path/'
c.user = M.User.by_username('test-user-1')
h.auditlog_user('test activity user 1')
h.auditlog_user('test activity user 2', user=M.User.by_username('test-user-2'))
r = self.app.get('/nf/admin/users')
assert_not_in('test activity', r)
r = self.app.get('/nf/admin/users?username=admin1')
assert_not_in('test activity', r)
r = self.app.get('/nf/admin/users?username=test-user-1')
assert_in('test activity user 1', r)
assert_not_in('test activity user 2', r)
r = self.app.get('/nf/admin/users?username=test-user-2')
assert_not_in('test activity user 1', r)
assert_in('test activity user 2', r)
def test_add_audit_trail_entry_access(self):
self.app.get('/nf/admin/add_audit_log_entry', status=404) # GET is not allowed
r = self.app.post('/nf/admin/add_audit_log_entry',
extra_environ={'username': '*anonymous'},
status=302)
assert_equal(r.location, 'http://localhost/auth/')
def test_add_comment_on_users_trail_page(self):
r = self.app.get('/nf/admin/users')
assert_not_in('Add comment', r)
r = self.app.get('/nf/admin/users?username=fake-user')
assert_not_in('Add comment', r)
r = self.app.get('/nf/admin/users?username=test-user')
assert_in('Add comment', r)
def test_add_comment(self):
r = self.app.get('/nf/admin/users?username=test-user')
assert_not_in(u'Comment by test-admin: I was hêre!', r)
form = r.forms[1]
assert_equal(form['username'].value, 'test-user')
form['comment'] = u'I was hêre!'
r = form.submit()
assert_in(u'Comment added', self.webflash(r))
r = self.app.get('/nf/admin/users?username=test-user')
assert_in(u'Comment by test-admin: I was hêre!', r)
class TestProjectsSearch(TestController):
TEST_HIT = MagicMock(hits=1, docs=[{
'name_s': 'Test Project',
'is_nbhd_project_b': False,
'is_root_b': True,
'title': ['Project Test Project'],
'deleted_b': False,
'shortname_s': 'test',
'private_b': False,
'url_s': 'http://localhost:8080/p/test/',
'neighborhood_id_s': '53ccf6e6100d2b0741746c66',
'removal_changed_date_dt': '2014-07-21T11:18:00.087Z',
'registration_dt': '2014-07-21T11:18:00Z',
'type_s': 'Project',
'_version_': 1474236502200287232,
'neighborhood_name_s': 'Projects',
'id': 'allura/model/project/Project#53ccf6e8100d2b0741746e9f',
}])
def setUp(self):
super(TestProjectsSearch, self).setUp()
# Create project that matches TEST_HIT id
p = M.Project.query.get(_id=ObjectId('53ccf6e8100d2b0741746e9f'))
if not p:
M.Project(
_id=ObjectId('53ccf6e8100d2b0741746e9f'),
neighborhood_id=M.Neighborhood.query.get(url_prefix='/u/')._id,
shortname='test-project',
)
ThreadLocalORMSession().flush_all()
@patch('allura.controllers.site_admin.search')
def test_default_fields(self, search):
search.search_projects.return_value = self.TEST_HIT
r = self.app.get('/nf/admin/search_projects?q=fake&f=shortname')
options = [o['value'] for o in r.html.findAll('option')]
assert_equal(options, ['shortname', 'name', '__custom__'])
ths = [th.text for th in r.html.findAll('th')]
assert_equal(ths, ['Short name', 'Full name', 'Registered', 'Deleted?', 'Details'])
@patch('allura.controllers.site_admin.search')
def test_additional_fields(self, search):
search.search_projects.return_value = self.TEST_HIT
with h.push_config(config, **{'search.project.additional_fields': 'private, url'}):
r = self.app.get('/nf/admin/search_projects?q=fake&f=shortname')
options = [o['value'] for o in r.html.findAll('option')]
assert_equal(options, ['shortname', 'name', 'private', 'url', '__custom__'])
ths = [th.text for th in r.html.findAll('th')]
assert_equal(ths, ['Short name', 'Full name', 'Registered', 'Deleted?',
'private', 'url', 'Details'])
@task
def test_task(*args, **kw):
"""test_task doc string"""
pass