source: serversideredirectplugin/1.0/tracserversideredirect/tests/plugin.py

Last change on this file was 17142, checked in by Ryan J Ollos, 5 years ago

TracServerSideRedirectPlugin 1.0.1: Conform to PEP8

File size: 5.8 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# Copyright (C) 2008-2010 Martin Scharrer <martin@scharrer-online.de>
4# Copyright (C) 2015 Ryan J Ollos <ryan.j.ollos@gmail.com>
5# All rights reserved.
6#
7# This software is licensed as described in the file COPYING, which
8# you should have received as part of this distribution.
9
10import unittest
11
12from trac.test import EnvironmentStub, Mock, MockPerm, locale_en
13from trac.ticket.roadmap import MilestoneModule
14from trac.util.datefmt import utc
15from trac.web.api import _RequestArgs, RequestDone
16from trac.wiki.model import WikiPage
17from trac.wiki.tests import formatter
18from trac.wiki.web_ui import WikiModule
19
20from tracserversideredirect.plugin import ServerSideRedirectPlugin
21
22
23MACRO_TEST_CASES = u"""\
24============================== # Wiki TracLink
25[[Redirect(OtherWikiPage)]]
26------------------------------
27<p>
28</p><div class="system-message" id="notice">\
29<strong>This page redirects to: </strong>\
30<a href="/wiki/OtherWikiPage">OtherWikiPage</a>\
31</div><p>
32</p>
33============================== # Wiki TracLink with wiki prefix
34[[Redirect(wiki:OtherWikiPage)]]
35------------------------------
36<p>
37</p><div class="system-message" id="notice">\
38<strong>This page redirects to: </strong>\
39<a href="/wiki/OtherWikiPage">wiki:OtherWikiPage</a>\
40</div><p>
41</p>
42============================== # InterTrac to wiki
43[[Redirect(trac:OtherWikiPage)]]
44------------------------------
45<p>
46</p><div class="system-message" id="notice">\
47<strong>This page redirects to: </strong>\
48<a href="http://trac.edgewall.org/intertrac/OtherWikiPage">trac:OtherWikiPage</a>\
49</div><p>
50</p>
51============================== # InterTrac with wiki prefix
52[[Redirect(trac:wiki:OtherWikiPage)]]
53------------------------------
54<p>
55</p><div class="system-message" id="notice">\
56<strong>This page redirects to: </strong>\
57<a href="http://trac.edgewall.org/intertrac/wiki%3AOtherWikiPage">trac:wiki:OtherWikiPage</a>\
58</div><p>
59</p>
60============================== # Milestone TracLink
61[[Redirect(milestone:milestone1)]]
62------------------------------
63<p>
64</p><div class="system-message" id="notice">\
65<strong>This page redirects to: </strong>\
66<a href="/milestone/milestone1">milestone:milestone1</a>\
67</div><p>
68</p>
69============================== # External URL
70[[Redirect(http://www.example.com/)]]
71------------------------------
72<p>
73</p><div class="system-message" id="notice">\
74<strong>This page redirects to: </strong>\
75<a href="http://www.example.com/">http://www.example.com/</a>\
76</div><p>
77</p>
78"""
79
80
81def macro_setup(tc):
82    tc.env.enable_component(ServerSideRedirectPlugin)
83
84
85class RequestHandlerTestCase(unittest.TestCase):
86
87    def setUp(self):
88        self.env = EnvironmentStub()
89        self.redirect_target = None
90
91    def _create_page(self, text):
92        page = WikiPage(self.env, 'ThePage')
93        page.text = text
94        page.save('anonymous', 'the comment')
95        return page
96
97    def _create_request(self, **kwargs):
98        kw = {'path_info': '/wiki/ThePage', 'perm': MockPerm(),
99              'args': _RequestArgs(), 'href': self.env.href,
100              'abs_href': self.env.abs_href, 'tz': utc, 'locale': None,
101              'lc_time': locale_en, 'session': {}, 'authname': 'anonymous',
102              'chrome': {'notices': [], 'warnings': []}, 'method': 'GET',
103              'environ': {'HTTP_REFERER': ''}, 'get_header': lambda v: None,
104              'is_xhr': False, 'form_token': None}
105        if 'args' in kwargs:
106            kw['args'].update(kwargs.pop('args'))
107        kw.update(kwargs)
108
109        def redirect(url, permanent=False):
110            self.redirect_target = url
111            raise RequestDone
112
113        return Mock(add_redirect_listener=lambda x: [].append(x),
114                    redirect=redirect, **kw)
115
116    def _test_redirect(self):
117        req = self._create_request()
118
119        ssrp = ServerSideRedirectPlugin(self.env)
120        handler = ssrp.pre_process_request(req, WikiModule(self.env))
121
122        self.assertTrue(isinstance(handler, ServerSideRedirectPlugin))
123        self.assertRaises(RequestDone, ssrp.process_request, req)
124
125    def test_redirect_to_page(self):
126        self._create_page("[[Redirect(OtherWikiPage)]]")
127        self._test_redirect()
128        self.assertEqual('/trac.cgi/wiki/OtherWikiPage'
129                         '?redirectedfrom=ThePage', self.redirect_target)
130
131    def test_redirect_to_page_with_wiki_prefix(self):
132        self._create_page("[[Redirect(wiki:OtherWikiPage)]]")
133        self._test_redirect()
134        self.assertEqual('/trac.cgi/wiki/OtherWikiPage'
135                         '?redirectedfrom=ThePage', self.redirect_target)
136
137    def test_redirect_to_intertrac_page(self):
138        self._create_page("[[Redirect(trac:OtherWikiPage)]]")
139        self._test_redirect()
140        self.assertEqual('http://trac.edgewall.org/intertrac/OtherWikiPage',
141                         self.redirect_target)
142
143    def test_redirect_to_intertrac_page_with_wiki_prefix(self):
144        self._create_page("[[Redirect(trac:wiki:OtherWikiPage)]]")
145        self._test_redirect()
146        self.assertEqual('http://trac.edgewall.org/intertrac/'
147                         'wiki%3AOtherWikiPage', self.redirect_target)
148
149    def test_redirect_to_source_browser(self):
150        self._create_page("[[Redirect(milestone:milestone1)]]")
151        self._test_redirect()
152        self.assertEqual('/trac.cgi/milestone/milestone1'
153                         '?redirectedfrom=ThePage', self.redirect_target)
154
155    def test_redirect_to_external(self):
156        self._create_page("[[Redirect(http://www.example.com/)]]")
157        self._test_redirect()
158        self.assertEqual('http://www.example.com/', self.redirect_target)
159
160
161def suite():
162    suite = unittest.TestSuite()
163    suite.addTest(formatter.suite(MACRO_TEST_CASES, file=__file__,
164                                  setup=macro_setup))
165    suite.addTest(unittest.makeSuite(RequestHandlerTestCase))
166    return suite
167
168
169if __name__ == '__main__':
170    unittest.main(defaultTest='suite')
Note: See TracBrowser for help on using the repository browser.