~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/tests/test_simple.py

  • Committer: John Arbash Meinel
  • Date: 2011-06-15 14:47:11 UTC
  • mfrom: (447.1.3 loggerhead)
  • Revision ID: john@arbash-meinel.com-20110615144711-wv0wgim27u1ismhi
Merge css updates for annotate from Jasper St. Pierre.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2008, 2009 Canonical Ltd.
 
1
# Copyright (C) 2007, 2008, 2009, 2011 Canonical Ltd.
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
17
17
 
18
18
import cgi
19
19
import logging
 
20
import re
20
21
 
21
22
from bzrlib.tests import TestCaseWithTransport
22
 
from bzrlib.util.configobj.configobj import ConfigObj
 
23
try:
 
24
    from bzrlib.util.configobj.configobj import ConfigObj
 
25
except ImportError:
 
26
    from configobj import ConfigObj
23
27
from bzrlib import config
24
28
 
25
29
from loggerhead.apps.branch import BranchWSGIApp
 
30
from loggerhead.apps.http_head import HeadMiddleware
26
31
from paste.fixture import TestApp
27
 
from paste.httpexceptions import HTTPExceptionHandler
28
 
 
29
 
 
30
 
 
31
 
def test_config_root():
32
 
    from loggerhead.apps.config import Root
33
 
    config = ConfigObj()
34
 
    app = TestApp(HTTPExceptionHandler(Root(config)))
35
 
    res = app.get('/')
36
 
    res.mustcontain('loggerhead branches')
 
32
from paste.httpexceptions import HTTPExceptionHandler, HTTPMovedPermanently
 
33
 
37
34
 
38
35
 
39
36
class BasicTests(TestCaseWithTransport):
59
56
 
60
57
        self.filecontents = ('some\nmultiline\ndata\n'
61
58
                             'with<htmlspecialchars\n')
 
59
        filenames = ['myfilename', 'anotherfile<']
62
60
        self.build_tree_contents(
63
 
            [('myfilename', self.filecontents)])
64
 
        self.tree.add('myfilename')
 
61
            (filename, self.filecontents) for filename in filenames)
 
62
        for filename in filenames:
 
63
            self.tree.add(filename, '%s-id' % filename)
65
64
        self.fileid = self.tree.path2id('myfilename')
66
65
        self.msg = 'a very exciting commit message <'
67
66
        self.revid = self.tree.commit(message=self.msg)
71
70
        res = app.get('/changes')
72
71
        res.mustcontain(cgi.escape(self.msg))
73
72
 
 
73
    def test_changes_for_file(self):
 
74
        app = self.setUpLoggerhead()
 
75
        res = app.get('/changes?filter_file_id=myfilename-id')
 
76
        res.mustcontain(cgi.escape(self.msg))
 
77
 
74
78
    def test_changes_branch_from(self):
75
79
        app = self.setUpLoggerhead(served_url="lp:loggerhead")
76
80
        res = app.get('/changes')
88
92
    def test_annotate(self):
89
93
        app = self.setUpLoggerhead()
90
94
        res = app.get('/annotate', params={'file_id': self.fileid})
 
95
        # If pygments is installed, it inserts <span class="pyg" content into
 
96
        # the output, to trigger highlighting. And it specifically highlights
 
97
        # the &lt; that we are interested in seeing in the output.
 
98
        # Without pygments we have a simple: 'with&lt;htmlspecialchars'
 
99
        # With it, we have
 
100
        # '<span class='pyg-n'>with</span><span class='pyg-o'>&lt;</span>'
 
101
        # '<span class='pyg-n'>htmlspecialchars</span>
 
102
        # So we pre-filter the body, to make sure remove spans of that type.
 
103
        body_no_span = re.sub(r'<span class="pyg-.">', '', res.body)
 
104
        body_no_span = body_no_span.replace('</span>', '')
91
105
        for line in self.filecontents.splitlines():
92
 
            res.mustcontain(cgi.escape(line))
 
106
            escaped = cgi.escape(line)
 
107
            self.assertTrue(escaped in body_no_span,
 
108
                            "did not find %r in %r" % (escaped, body_no_span))
93
109
 
94
110
    def test_inventory(self):
95
111
        app = self.setUpLoggerhead()
117
133
    def test_revision(self):
118
134
        app = self.setUpLoggerhead()
119
135
        res = app.get('/revision/1')
 
136
        res.mustcontain(no=['anotherfile<'])
 
137
        res.mustcontain('anotherfile&lt;')
120
138
        res.mustcontain('myfilename')
121
139
 
122
140
 
157
175
        res = app.get('/changes', status=404)
158
176
 
159
177
 
 
178
class TestControllerRedirects(BasicTests):
 
179
    """
 
180
    Test that a file under /files redirects to /view,
 
181
    and a directory under /view redirects to /files.
 
182
    """
 
183
 
 
184
    def setUp(self):
 
185
        BasicTests.setUp(self)
 
186
        self.createBranch()
 
187
        self.build_tree(('file', 'folder/', 'folder/file'))
 
188
        self.tree.smart_add([])
 
189
        self.tree.commit('')
 
190
 
 
191
    def test_view_folder(self):
 
192
        app = TestApp(BranchWSGIApp(self.tree.branch, '').app)
 
193
 
 
194
        e = self.assertRaises(HTTPMovedPermanently, app.get, '/view/head:/folder')
 
195
        self.assertEqual(e.location(), '/files/head:/folder')
 
196
 
 
197
    def test_files_file(self):
 
198
        app = TestApp(BranchWSGIApp(self.tree.branch, '').app)
 
199
 
 
200
        e = self.assertRaises(HTTPMovedPermanently, app.get, '/files/head:/folder/file')
 
201
        self.assertEqual(e.location(), '/view/head:/folder/file')
 
202
        e = self.assertRaises(HTTPMovedPermanently, app.get, '/files/head:/file')
 
203
        self.assertEqual(e.location(), '/view/head:/file')
 
204
 
 
205
 
 
206
class TestHeadMiddleware(BasicTests):
 
207
 
 
208
    def setUp(self):
 
209
        BasicTests.setUp(self)
 
210
        self.createBranch()
 
211
        self.msg = 'trivial commit message'
 
212
        self.revid = self.tree.commit(message=self.msg)
 
213
 
 
214
    def setUpLoggerhead(self, **kw):
 
215
        branch_app = BranchWSGIApp(self.tree.branch, '', **kw).app
 
216
        return TestApp(HTTPExceptionHandler(HeadMiddleware(branch_app)))
 
217
 
 
218
    def test_get(self):
 
219
        app = self.setUpLoggerhead()
 
220
        res = app.get('/changes')
 
221
        res.mustcontain(self.msg)
 
222
        self.assertEqual('text/html', res.header('Content-Type'))
 
223
 
 
224
    def test_head(self):
 
225
        app = self.setUpLoggerhead()
 
226
        res = app.get('/changes', extra_environ={'REQUEST_METHOD': 'HEAD'})
 
227
        self.assertEqual('text/html', res.header('Content-Type'))
 
228
        self.assertEqualDiff('', res.body)
 
229
 
 
230
 
160
231
#class TestGlobalConfig(BasicTests):
161
232
#    """
162
233
#    Test that global config settings are respected