1
from configobj import ConfigObj
1
# Copyright (C) 2008, 2009 Canonical Ltd.
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
10
from turbogears import testutil
14
from loggerhead.controllers import Root
21
from bzrlib.tests import TestCaseWithTransport
22
from bzrlib.util.configobj.configobj import ConfigObj
23
from bzrlib import config
25
from loggerhead.apps.branch import BranchWSGIApp
26
from paste.fixture import TestApp
27
from paste.httpexceptions import HTTPExceptionHandler
31
def test_config_root():
32
from loggerhead.apps.config import Root
17
33
config = ConfigObj()
20
testutil.create_request('/')
21
assert 'loggerhead branches' in cherrypy.response.body[0]
24
class BasicTests(object):
26
# setup_method and teardown_method are so i can run the tests with
27
# py.test and take advantage of the error reporting.
28
def setup_method(self, meth):
31
def teardown_method(self, meth):
34
app = TestApp(HTTPExceptionHandler(Root(config)))
36
res.mustcontain('loggerhead branches')
39
class BasicTests(TestCaseWithTransport):
35
logging.basicConfig(level=logging.DEBUG)
37
self.old_bzrhome = None
42
TestCaseWithTransport.setUp(self)
43
logging.basicConfig(level=logging.ERROR)
44
logging.getLogger('bzr').setLevel(logging.CRITICAL)
39
46
def createBranch(self):
40
self.old_bzrhome = bzrlib.osutils.set_or_unset_env('BZR_HOME', '')
41
self.bzrbranch = tempfile.mkdtemp()
42
self.branch = bzrlib.bzrdir.BzrDir.create_branch_convenience(
43
self.bzrbranch, force_new_tree=True)
44
self.tree = self.branch.bzrdir.open_workingtree()
49
branch_name = 'branch'
53
def setUpLoggerhead(self):
54
ini = self.config_template%dict(branch=self.bzrbranch)
56
config = ConfigObj(ini.splitlines())
57
cherrypy.root = Root(config)
60
if self.bzrbranch is not None:
61
shutil.rmtree(self.bzrbranch)
62
bzrlib.osutils.set_or_unset_env('BZR_HOME', self.old_bzrhome)
47
self.tree = self.make_branch_and_tree('.')
49
def setUpLoggerhead(self, **kw):
50
branch_app = BranchWSGIApp(self.tree.branch, '', **kw).app
51
return TestApp(HTTPExceptionHandler(branch_app))
64
54
class TestWithSimpleTree(BasicTests):
67
57
BasicTests.setUp(self)
68
58
self.createBranch()
70
f = open(os.path.join(self.bzrbranch, 'myfilename'), 'w')
71
60
self.filecontents = ('some\nmultiline\ndata\n'
72
61
'with<htmlspecialchars\n')
74
f.write(self.filecontents)
62
self.build_tree_contents(
63
[('myfilename', self.filecontents)])
77
64
self.tree.add('myfilename')
78
65
self.fileid = self.tree.path2id('myfilename')
79
66
self.msg = 'a very exciting commit message <'
80
67
self.revid = self.tree.commit(message=self.msg)
82
self.setUpLoggerhead()
85
testutil.create_request('/')
86
link = '<a href="/project/branch">branch</a>'
87
assert link in cherrypy.response.body[0].lower()
89
69
def test_changes(self):
90
testutil.create_request('/project/branch/changes')
91
assert cgi.escape(self.msg) in cherrypy.response.body[0]
70
app = self.setUpLoggerhead()
71
res = app.get('/changes')
72
res.mustcontain(cgi.escape(self.msg))
74
def test_changes_branch_from(self):
75
app = self.setUpLoggerhead(served_url="lp:loggerhead")
76
res = app.get('/changes')
77
self.failUnless("To get this branch, use:" in res)
78
self.failUnless("lp:loggerhead" in res)
79
app = self.setUpLoggerhead(served_url=None)
80
res = app.get('/changes')
81
self.failIf("To get this branch, use:" in res)
93
83
def test_changes_search(self):
94
testutil.create_request('/project/branch/changes?q=foo')
95
assert 'Sorry, no results found for your search.' in cherrypy.response.body[0]
84
app = self.setUpLoggerhead()
85
res = app.get('/changes', params={'q': 'foo'})
86
res.mustcontain('Sorry, no results found for your search.')
97
88
def test_annotate(self):
98
testutil.create_request('/project/branch/annotate?'
99
+ 'file_id='+self.fileid)
89
app = self.setUpLoggerhead()
90
res = app.get('/annotate', params={'file_id': self.fileid})
100
91
for line in self.filecontents.splitlines():
101
assert cgi.escape(line) in cherrypy.response.body[0]
92
res.mustcontain(cgi.escape(line))
103
94
def test_inventory(self):
104
testutil.create_request('/project/branch/files')
105
assert 'myfilename' in cherrypy.response.body[0]
95
app = self.setUpLoggerhead()
96
res = app.get('/files')
97
res.mustcontain('myfilename')
98
res = app.get('/files/')
99
res.mustcontain('myfilename')
100
res = app.get('/files/1')
101
res.mustcontain('myfilename')
102
res = app.get('/files/1/')
103
res.mustcontain('myfilename')
104
res = app.get('/files/1/?file_id=' + self.tree.path2id(''))
105
res.mustcontain('myfilename')
107
def test_inventory_bad_rev_404(self):
108
app = self.setUpLoggerhead()
109
res = app.get('/files/200', status=404)
110
res = app.get('/files/invalid-revid', status=404)
112
def test_inventory_bad_path_404(self):
113
app = self.setUpLoggerhead()
114
res = app.get('/files/1/hooha', status=404)
115
res = app.get('/files/1?file_id=dssadsada', status=404)
107
117
def test_revision(self):
108
testutil.create_request('/project/branch/revision/' + self.revid)
109
assert 'myfilename' in cherrypy.response.body[0]
118
app = self.setUpLoggerhead()
119
res = app.get('/revision/1')
120
res.mustcontain('myfilename')
111
class TestWithSimpleTreeAndCache(TestWithSimpleTree):
112
config_template = """
116
branch_name = 'branch'
117
folder = '%(branch)s'
118
cachepath = '%(branch)s/cache'
121
123
class TestEmptyBranch(BasicTests):
124
"""Test that an empty branch doesn't break"""
124
127
BasicTests.setUp(self)
125
128
self.createBranch()
126
self.setUpLoggerhead()
128
def test_index(self):
129
testutil.create_request('/')
130
link = '<a href="/project/branch">branch</a>'
131
assert link in cherrypy.response.body[0].lower()
133
130
def test_changes(self):
134
testutil.create_request('/project/branch/changes')
135
assert 'No revisions!' in cherrypy.response.body[0]
137
class TestEmptyBranchWithCache(TestEmptyBranch):
138
config_template = """
142
branch_name = 'branch'
143
folder = '%(branch)s'
144
cachepath = '%(branch)s/cache'
131
app = self.setUpLoggerhead()
132
res = app.get('/changes')
133
res.mustcontain('No revisions!')
135
def test_inventory(self):
136
app = self.setUpLoggerhead()
137
res = app.get('/files')
138
res.mustcontain('No revisions!')
141
class TestHiddenBranch(BasicTests):
143
Test that hidden branches aren't shown
144
FIXME: not tested that it doesn't show up on listings
148
BasicTests.setUp(self)
150
locations = config.locations_config_filename()
151
config.ensure_config_dir_exists()
152
open(locations, 'wb').write('[%s]\nhttp_serve = False'
153
% (self.tree.branch.base,))
155
def test_no_access(self):
156
app = self.setUpLoggerhead()
157
res = app.get('/changes', status=404)
160
#class TestGlobalConfig(BasicTests):
162
# Test that global config settings are respected
166
# BasicTests.setUp(self)
167
# self.createBranch()
168
# config.GlobalConfig().set_user_option('http_version', 'True')
170
# def test_setting_respected(self):
171
#FIXME: Figure out how to test this properly
172
# app = self.setUpLoggerhead()
173
# res = app.get('/changes', status=200)