| 
12 | 12 |     ReStructuredTextRenderer,  # noqa: needed for RSTWikiTestCase to work  | 
13 | 13 | )  | 
14 | 14 | from trac.test import EnvironmentStub, MockRequest  | 
 | 15 | +from trac.ticket.web_ui import TicketModule  # Imported for side effects  | 
 | 16 | +from trac.ticket.query import QueryModule  # Imported for side effects  | 
15 | 17 | from trac.web.api import RequestDone  | 
 | 18 | +from trac.web.main import RequestDispatcher  | 
16 | 19 | 
 
  | 
17 | 20 | from tracdjangoplugin.middlewares import DjangoDBManagementMiddleware  | 
18 | 21 | from tracdjangoplugin.plugins import PlainLoginComponent, ReservedUsernamesComponent  | 
@@ -258,3 +261,65 @@ def test_wiki_can_render_rst(self):  | 
258 | 261 |             str(output),  | 
259 | 262 |             '<div class="document" id="test"><h1 class="title">TEST</h1></div>',  | 
260 | 263 |         )  | 
 | 264 | + | 
 | 265 | + | 
 | 266 | +class _TracRequestWrapper:  | 
 | 267 | +    """  | 
 | 268 | +    Wrap a Trac request object to make it look like a Django response (so it  | 
 | 269 | +    can be used with assertContains)  | 
 | 270 | +    """  | 
 | 271 | + | 
 | 272 | +    streaming = False  | 
 | 273 | +    charset = "utf8"  | 
 | 274 | + | 
 | 275 | +    def __init__(self, request):  | 
 | 276 | +        self._request = request  | 
 | 277 | + | 
 | 278 | +    @property  | 
 | 279 | +    def status_code(self):  | 
 | 280 | +        status_str, _ = self._request._status.split(" ", 1)  | 
 | 281 | +        return int(status_str)  | 
 | 282 | + | 
 | 283 | +    @property  | 
 | 284 | +    def content(self):  | 
 | 285 | +        return self._request.response_sent.getvalue()  | 
 | 286 | + | 
 | 287 | + | 
 | 288 | +class RenameQueryTitleComponentTestCase(TestCase):  | 
 | 289 | +    def setUp(self):  | 
 | 290 | +        self.env = EnvironmentStub(  | 
 | 291 | +            enable=[  | 
 | 292 | +                "trac.ticket.*",  | 
 | 293 | +                "trac.ticket.query.*",  | 
 | 294 | +                "trac.web.*",  | 
 | 295 | +                "tracdjangoplugin.plugins.renamequerytitlecomponent",  | 
 | 296 | +            ],  | 
 | 297 | +            disable=[  | 
 | 298 | +                "trac.ticket.query.querymodule",  | 
 | 299 | +            ],  | 
 | 300 | +        )  | 
 | 301 | +        self.request_factory = partial(MockRequest, self.env)  | 
 | 302 | +        self.dispatcher = RequestDispatcher(self.env)  | 
 | 303 | + | 
 | 304 | +    def get_response(self, **kwargs):  | 
 | 305 | +        """  | 
 | 306 | +        Build a request using the given kwargs and return a Django-like  | 
 | 307 | +        response object.  | 
 | 308 | +        """  | 
 | 309 | +        request = self.request_factory(**kwargs)  | 
 | 310 | +        self.assertRaises(RequestDone, self.dispatcher.dispatch, request)  | 
 | 311 | +        return _TracRequestWrapper(request)  | 
 | 312 | + | 
 | 313 | +    def test_new_title(self):  | 
 | 314 | +        response = self.get_response(path_info="/query")  | 
 | 315 | + | 
 | 316 | +        self.assertContains(  | 
 | 317 | +            response,  | 
 | 318 | +            '<h1>View Tickets <span class="numrows">(0 matches)</span></h1>',  | 
 | 319 | +            html=True,  | 
 | 320 | +        )  | 
 | 321 | +        self.assertNotContains(  | 
 | 322 | +            response,  | 
 | 323 | +            '<h1>Custom Query <span class="numrows">(0 matches)</span></h1>',  | 
 | 324 | +            html=True,  | 
 | 325 | +        )  | 
0 commit comments