Skip to content

Commit 6de4f62

Browse files
committed
test that request is extracted from context correctly
1 parent 74d5674 commit 6de4f62

File tree

3 files changed

+43
-14
lines changed

3 files changed

+43
-14
lines changed

django_js_reverse/templatetags/js_reverse.py

+15-5
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,24 @@
1212
register = template.Library()
1313

1414

15+
urlconf = template.Variable('request.urlconf')
16+
17+
18+
def _get_urlconf(context):
19+
try:
20+
return context.request.urlconf
21+
except AttributeError:
22+
pass
23+
try:
24+
return urlconf.resolve(context)
25+
except template.VariableDoesNotExist:
26+
pass
27+
28+
1529
@register.simple_tag(takes_context=True)
1630
def js_reverse_inline(context):
1731
"""
1832
Outputs a string of javascript that can generate URLs via the use
1933
of the names given to those URLs.
2034
"""
21-
if 'request' in context:
22-
default_urlresolver = get_resolver(getattr(context['request'], 'urlconf', None))
23-
else:
24-
default_urlresolver = get_resolver(None)
25-
return mark_safe(generate_js(default_urlresolver))
35+
return mark_safe(generate_js(get_resolver(_get_urlconf(context))))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.views.generic import View
2+
from django.conf.urls import include, url
3+
4+
urlpatterns = [
5+
url(r'^test_changed_urlconf/$', View.as_view(), name='test_changed_urlconf'),
6+
]

django_js_reverse/tests/unit_tests.py

+22-9
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', '..') + os.sep)
2323
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
2424

25-
from django.test import TestCase # noqa: E402 isort:skip
25+
from django.test import TestCase, RequestFactory # noqa: E402 isort:skip
2626
from django.test.client import Client # noqa: E402 isort:skip
2727
from django.test.utils import override_settings # noqa: E402 isort:skip
2828

@@ -36,9 +36,8 @@ def setUpClass(cls):
3636
django.setup()
3737
super(AbstractJSReverseTestCase, cls).setUpClass()
3838

39-
def assertEqualJSUrlEval(self, url_call, expected_url):
40-
response = self.client.post('/jsreverse/')
41-
script = '{}return {};'.format(smart_str(response.content), url_call)
39+
def assertEqualJSEval(self, js, url_call, expected_url):
40+
script = '{}return {};'.format(js, url_call)
4241
module = 'console.log(new Function({})());'.format(json.dumps(script))
4342
stdout = (
4443
subprocess
@@ -48,6 +47,11 @@ def assertEqualJSUrlEval(self, url_call, expected_url):
4847
self.assertEqual(re.sub(r'\n$', '', stdout), expected_url)
4948

5049

50+
def assertEqualJSUrlEval(self, *args, **kwargs):
51+
js = smart_str(self.client.post('/jsreverse/').content)
52+
self.assertEqualJSEval(js, *args, **kwargs)
53+
54+
5155
@override_settings(ROOT_URLCONF='django_js_reverse.tests.test_urls')
5256
class JSReverseViewTestCaseMinified(AbstractJSReverseTestCase, TestCase):
5357
def test_view_no_url_args(self):
@@ -258,14 +262,23 @@ def test_script_prefix(self):
258262

259263

260264

261-
@override_settings(ROOT_URLCONF='django_js_reverse.tests.test_urls')
265+
@override_settings(
266+
ROOT_URLCONF='django_js_reverse.tests.test_urls',
267+
TEMPLATE_CONTEXT_PROCESSORS=['django.core.context_processors.request'],
268+
)
262269
class JSReverseTemplateTagTest(AbstractJSReverseTestCase, TestCase):
263270
def test_tpl_tag_with_request_in_context(self):
264-
context_instance = RequestContext(self.client.request)
271+
request = RequestFactory().post('/jsreverse/')
272+
request.urlconf = 'django_js_reverse.tests.test_urlconf_urls'
265273
tpl = Template('{% load js_reverse %}{% js_reverse_inline %}')
266-
js_from_tag = tpl.render(context_instance)
267-
js_from_view = smart_str(self.client.post('/jsreverse/').content)
268-
self.assertEqual(js_from_tag, js_from_view)
274+
js = tpl.render(RequestContext(request))
275+
self.assertEqualJSEval(js, 'Urls.test_changed_urlconf()', '/test_changed_urlconf/')
276+
277+
def test_tpl_tag_with_dict_request_in_context(self):
278+
request = {'urlconf': 'django_js_reverse.tests.test_urlconf_urls'}
279+
tpl = Template('{% load js_reverse %}{% js_reverse_inline %}')
280+
js = tpl.render(Context({'request': request}))
281+
self.assertEqualJSEval(js, 'Urls.test_changed_urlconf()', '/test_changed_urlconf/')
269282

270283
def test_tpl_tag_without_request_in_context(self):
271284
context_instance = Context()

0 commit comments

Comments
 (0)