summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorHonza Král <honza.kral@gmail.com>2009-08-05 01:27:15 +0000
committerHonza Král <honza.kral@gmail.com>2009-08-05 01:27:15 +0000
commit97db2014f8fc7574976711bbaf833c9467486998 (patch)
treea8961a4db2884e2cfe6d62363839fb2e2547b4d7 /tests
parent37ce9a503511eb612a5d17f9908cf4f6f72f9a7b (diff)
[soc2009/model-validation] Merged to trunk at r11365
git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/model-validation@11395 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
-rw-r--r--tests/modeltests/expressions/models.py39
-rw-r--r--tests/regressiontests/admin_views/customadmin.py8
-rw-r--r--tests/regressiontests/admin_views/tests.py5
-rw-r--r--tests/regressiontests/admin_widgets/tests.py9
-rw-r--r--tests/regressiontests/admin_widgets/urls2.py7
-rw-r--r--tests/regressiontests/admin_widgets/widgetadmin.py2
-rw-r--r--tests/regressiontests/backends/tests.py15
-rw-r--r--tests/regressiontests/fixtures_regress/models.py24
-rw-r--r--tests/regressiontests/mail/tests.py7
-rw-r--r--tests/regressiontests/servers/__init__.py0
-rw-r--r--tests/regressiontests/servers/models.py0
-rw-r--r--tests/regressiontests/servers/tests.py67
-rw-r--r--tests/regressiontests/urlpatterns_reverse/included_namespace_urls.py13
-rw-r--r--tests/regressiontests/urlpatterns_reverse/namespace_urls.py38
-rw-r--r--tests/regressiontests/urlpatterns_reverse/tests.py82
15 files changed, 303 insertions, 13 deletions
diff --git a/tests/modeltests/expressions/models.py b/tests/modeltests/expressions/models.py
index f29767a9d1..d4de5ccee9 100644
--- a/tests/modeltests/expressions/models.py
+++ b/tests/modeltests/expressions/models.py
@@ -80,4 +80,43 @@ Traceback (most recent call last):
...
FieldError: Joined field references are not permitted in this query
+# F expressions can be used to update attributes on single objects
+>>> test_gmbh = Company.objects.get(name='Test GmbH')
+>>> test_gmbh.num_employees
+32
+>>> test_gmbh.num_employees = F('num_employees') + 4
+>>> test_gmbh.save()
+>>> test_gmbh = Company.objects.get(pk=test_gmbh.pk)
+>>> test_gmbh.num_employees
+36
+
+# F expressions cannot be used to update attributes which are foreign keys, or
+# attributes which involve joins.
+>>> test_gmbh.point_of_contact = None
+>>> test_gmbh.save()
+>>> test_gmbh.point_of_contact is None
+True
+>>> test_gmbh.point_of_contact = F('ceo')
+Traceback (most recent call last):
+...
+ValueError: Cannot assign "<django.db.models.expressions.F object at ...>": "Company.point_of_contact" must be a "Employee" instance.
+
+>>> test_gmbh.point_of_contact = test_gmbh.ceo
+>>> test_gmbh.save()
+>>> test_gmbh.name = F('ceo__last_name')
+>>> test_gmbh.save()
+Traceback (most recent call last):
+...
+FieldError: Joined field references are not permitted in this query
+
+# F expressions cannot be used to update attributes on objects which do not yet
+# exist in the database
+>>> acme = Company(name='The Acme Widget Co.', num_employees=12, num_chairs=5,
+... ceo=test_gmbh.ceo)
+>>> acme.num_employees = F('num_employees') + 16
+>>> acme.save()
+Traceback (most recent call last):
+...
+TypeError: int() argument must be a string or a number, not 'ExpressionNode'
+
"""}
diff --git a/tests/regressiontests/admin_views/customadmin.py b/tests/regressiontests/admin_views/customadmin.py
index 70e87ebcfe..80570ea51d 100644
--- a/tests/regressiontests/admin_views/customadmin.py
+++ b/tests/regressiontests/admin_views/customadmin.py
@@ -10,19 +10,19 @@ import models
class Admin2(admin.AdminSite):
login_template = 'custom_admin/login.html'
index_template = 'custom_admin/index.html'
-
+
# A custom index view.
def index(self, request, extra_context=None):
return super(Admin2, self).index(request, {'foo': '*bar*'})
-
+
def get_urls(self):
return patterns('',
(r'^my_view/$', self.admin_view(self.my_view)),
) + super(Admin2, self).get_urls()
-
+
def my_view(self, request):
return HttpResponse("Django is a magical pony!")
-
+
site = Admin2(name="admin2")
site.register(models.Article, models.ArticleAdmin)
diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py
index 38fe5ccc9d..aafa303cec 100644
--- a/tests/regressiontests/admin_views/tests.py
+++ b/tests/regressiontests/admin_views/tests.py
@@ -205,6 +205,11 @@ class AdminViewBasicTest(TestCase):
response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit, {'color__id__exact': 'StringNotInteger!'})
self.assertRedirects(response, '/test_admin/%s/admin_views/thing/?e=1' % self.urlbit)
+ def testLogoutAndPasswordChangeURLs(self):
+ response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit)
+ self.failIf('<a href="/test_admin/%s/logout/">' % self.urlbit not in response.content)
+ self.failIf('<a href="/test_admin/%s/password_change/">' % self.urlbit not in response.content)
+
def testNamedGroupFieldChoicesChangeList(self):
"""
Ensures the admin changelist shows correct values in the relevant column
diff --git a/tests/regressiontests/admin_widgets/tests.py b/tests/regressiontests/admin_widgets/tests.py
index 55088ca1fe..85651542bb 100644
--- a/tests/regressiontests/admin_widgets/tests.py
+++ b/tests/regressiontests/admin_widgets/tests.py
@@ -115,6 +115,7 @@ class AdminFormfieldForDBFieldWithRequestTests(DjangoTestCase):
class AdminForeignKeyWidgetChangeList(DjangoTestCase):
fixtures = ["admin-widgets-users.xml"]
+ admin_root = '/widget_admin'
def setUp(self):
self.client.login(username="super", password="secret")
@@ -123,5 +124,9 @@ class AdminForeignKeyWidgetChangeList(DjangoTestCase):
self.client.logout()
def test_changelist_foreignkey(self):
- response = self.client.get('/widget_admin/admin_widgets/car/')
- self.failUnless('/widget_admin/auth/user/add/' in response.content)
+ response = self.client.get('%s/admin_widgets/car/' % self.admin_root)
+ self.failUnless('%s/auth/user/add/' % self.admin_root in response.content)
+
+class OldAdminForeignKeyWidgetChangeList(AdminForeignKeyWidgetChangeList):
+ urls = 'regressiontests.admin_widgets.urls2'
+ admin_root = '/deep/down/admin'
diff --git a/tests/regressiontests/admin_widgets/urls2.py b/tests/regressiontests/admin_widgets/urls2.py
new file mode 100644
index 0000000000..1ad060cd09
--- /dev/null
+++ b/tests/regressiontests/admin_widgets/urls2.py
@@ -0,0 +1,7 @@
+
+from django.conf.urls.defaults import *
+import widgetadmin
+
+urlpatterns = patterns('',
+ (r'^deep/down/admin/(.*)', widgetadmin.site.root),
+)
diff --git a/tests/regressiontests/admin_widgets/widgetadmin.py b/tests/regressiontests/admin_widgets/widgetadmin.py
index bd68954a70..9257c306c9 100644
--- a/tests/regressiontests/admin_widgets/widgetadmin.py
+++ b/tests/regressiontests/admin_widgets/widgetadmin.py
@@ -19,7 +19,7 @@ class CarTireAdmin(admin.ModelAdmin):
return db_field.formfield(**kwargs)
return super(CarTireAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
-site = WidgetAdmin()
+site = WidgetAdmin(name='widget-admin')
site.register(models.User)
site.register(models.Car, CarAdmin)
diff --git a/tests/regressiontests/backends/tests.py b/tests/regressiontests/backends/tests.py
index 81dcfde30d..aff27369ad 100644
--- a/tests/regressiontests/backends/tests.py
+++ b/tests/regressiontests/backends/tests.py
@@ -17,6 +17,21 @@ class Callproc(unittest.TestCase):
return True
else:
return True
+
+class LongString(unittest.TestCase):
+
+ def test_long_string(self):
+ # If the backend is Oracle, test that we can save a text longer
+ # than 4000 chars and read it properly
+ if settings.DATABASE_ENGINE == 'oracle':
+ c = connection.cursor()
+ c.execute('CREATE TABLE ltext ("TEXT" NCLOB)')
+ long_str = ''.join([unicode(x) for x in xrange(4000)])
+ c.execute('INSERT INTO ltext VALUES (%s)',[long_str])
+ c.execute('SELECT text FROM ltext')
+ row = c.fetchone()
+ c.execute('DROP TABLE ltext')
+ self.assertEquals(long_str, row[0].read())
def connection_created_test(sender, **kwargs):
print 'connection_created signal'
diff --git a/tests/regressiontests/fixtures_regress/models.py b/tests/regressiontests/fixtures_regress/models.py
index 16a9fc4fc5..e33471646c 100644
--- a/tests/regressiontests/fixtures_regress/models.py
+++ b/tests/regressiontests/fixtures_regress/models.py
@@ -54,7 +54,7 @@ class Parent(models.Model):
class Child(Parent):
data = models.CharField(max_length=10)
-# Models to regresison check #7572
+# Models to regression test #7572
class Channel(models.Model):
name = models.CharField(max_length=255)
@@ -65,6 +65,14 @@ class Article(models.Model):
class Meta:
ordering = ('id',)
+# Models to regression test #11428
+class Widget(models.Model):
+ name = models.CharField(max_length=255)
+
+class WidgetProxy(Widget):
+ class Meta:
+ proxy = True
+
__test__ = {'API_TESTS':"""
>>> from django.core import management
@@ -170,4 +178,18 @@ Weight = 1.2 (<type 'float'>)
>>> management.call_command('dumpdata', 'fixtures_regress.animal', format='json')
[{"pk": 1, "model": "fixtures_regress.animal", "fields": {"count": 3, "weight": 1.2, "name": "Lion", "latin_name": "Panthera leo"}}, {"pk": 2, "model": "fixtures_regress.animal", "fields": {"count": 2, "weight": 2.29..., "name": "Platypus", "latin_name": "Ornithorhynchus anatinus"}}, {"pk": 10, "model": "fixtures_regress.animal", "fields": {"count": 42, "weight": 1.2, "name": "Emu", "latin_name": "Dromaius novaehollandiae"}}]
+###############################################
+# Regression for #11428 - Proxy models aren't included
+# when you run dumpdata over an entire app
+
+# Flush out the database first
+>>> management.call_command('reset', 'fixtures_regress', interactive=False, verbosity=0)
+
+# Create an instance of the concrete class
+>>> Widget(name='grommet').save()
+
+# Dump data for the entire app. The proxy class shouldn't be included
+>>> management.call_command('dumpdata', 'fixtures_regress', format='json')
+[{"pk": 1, "model": "fixtures_regress.widget", "fields": {"name": "grommet"}}]
+
"""}
diff --git a/tests/regressiontests/mail/tests.py b/tests/regressiontests/mail/tests.py
index f4c416c231..e90d77366f 100644
--- a/tests/regressiontests/mail/tests.py
+++ b/tests/regressiontests/mail/tests.py
@@ -90,8 +90,8 @@ BadHeaderError: Header values can't contain newlines (got u'Subject\nInjection T
# Make sure we can manually set the From header (#9214)
->>> email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'})
->>> message = email.message()
+>>> email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'})
+>>> message = email.message()
>>> message['From']
'from@example.com'
@@ -115,8 +115,7 @@ To: to@example.com
Date: Fri, 09 Nov 2001 01:08:47 -0000
Message-ID: foo
...
-Content-Type: multipart/alternative; boundary="..."
-MIME-Version: 1.0
+Content-Type: multipart/alternative;...
...
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
diff --git a/tests/regressiontests/servers/__init__.py b/tests/regressiontests/servers/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/servers/__init__.py
diff --git a/tests/regressiontests/servers/models.py b/tests/regressiontests/servers/models.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/servers/models.py
diff --git a/tests/regressiontests/servers/tests.py b/tests/regressiontests/servers/tests.py
new file mode 100644
index 0000000000..7621439032
--- /dev/null
+++ b/tests/regressiontests/servers/tests.py
@@ -0,0 +1,67 @@
+"""
+Tests for django.core.servers.
+"""
+
+import os
+
+import django
+from django.test import TestCase
+from django.core.handlers.wsgi import WSGIHandler
+from django.core.servers.basehttp import AdminMediaHandler
+
+
+class AdminMediaHandlerTests(TestCase):
+
+ def setUp(self):
+ self.admin_media_file_path = \
+ os.path.join(django.__path__[0], 'contrib', 'admin', 'media')
+ self.handler = AdminMediaHandler(WSGIHandler())
+
+ def test_media_urls(self):
+ """
+ Tests that URLs that look like absolute file paths after the
+ settings.ADMIN_MEDIA_PREFIX don't turn into absolute file paths.
+ """
+ # Cases that should work on all platforms.
+ data = (
+ ('/media/css/base.css', ('css', 'base.css')),
+ )
+ # Cases that should raise an exception.
+ bad_data = ()
+
+ # Add platform-specific cases.
+ if os.sep == '/':
+ data += (
+ # URL, tuple of relative path parts.
+ ('/media/\\css/base.css', ('\\css', 'base.css')),
+ )
+ bad_data += (
+ '/media//css/base.css',
+ '/media////css/base.css',
+ '/media/../css/base.css',
+ )
+ elif os.sep == '\\':
+ bad_data += (
+ '/media/C:\css/base.css',
+ '/media//\\css/base.css',
+ '/media/\\css/base.css',
+ '/media/\\\\css/base.css'
+ )
+ for url, path_tuple in data:
+ try:
+ output = self.handler.file_path(url)
+ except ValueError:
+ self.fail("Got a ValueError exception, but wasn't expecting"
+ " one. URL was: %s" % url)
+ rel_path = os.path.join(*path_tuple)
+ desired = os.path.normcase(
+ os.path.join(self.admin_media_file_path, rel_path))
+ self.assertEqual(output, desired,
+ "Got: %s, Expected: %s, URL was: %s" % (output, desired, url))
+ for url in bad_data:
+ try:
+ output = self.handler.file_path(url)
+ except ValueError:
+ continue
+ self.fail('URL: %s should have caused a ValueError exception.'
+ % url)
diff --git a/tests/regressiontests/urlpatterns_reverse/included_namespace_urls.py b/tests/regressiontests/urlpatterns_reverse/included_namespace_urls.py
new file mode 100644
index 0000000000..073190657c
--- /dev/null
+++ b/tests/regressiontests/urlpatterns_reverse/included_namespace_urls.py
@@ -0,0 +1,13 @@
+from django.conf.urls.defaults import *
+from namespace_urls import URLObject
+
+testobj3 = URLObject('testapp', 'test-ns3')
+
+urlpatterns = patterns('regressiontests.urlpatterns_reverse.views',
+ url(r'^normal/$', 'empty_view', name='inc-normal-view'),
+ url(r'^normal/(?P<arg1>\d+)/(?P<arg2>\d+)/$', 'empty_view', name='inc-normal-view'),
+
+ (r'^test3/', include(testobj3.urls)),
+ (r'^ns-included3/', include('regressiontests.urlpatterns_reverse.included_urls', namespace='inc-ns3')),
+)
+
diff --git a/tests/regressiontests/urlpatterns_reverse/namespace_urls.py b/tests/regressiontests/urlpatterns_reverse/namespace_urls.py
new file mode 100644
index 0000000000..27cc7f7a22
--- /dev/null
+++ b/tests/regressiontests/urlpatterns_reverse/namespace_urls.py
@@ -0,0 +1,38 @@
+from django.conf.urls.defaults import *
+
+class URLObject(object):
+ def __init__(self, app_name, namespace):
+ self.app_name = app_name
+ self.namespace = namespace
+
+ def urls(self):
+ return patterns('',
+ url(r'^inner/$', 'empty_view', name='urlobject-view'),
+ url(r'^inner/(?P<arg1>\d+)/(?P<arg2>\d+)/$', 'empty_view', name='urlobject-view'),
+ ), self.app_name, self.namespace
+ urls = property(urls)
+
+testobj1 = URLObject('testapp', 'test-ns1')
+testobj2 = URLObject('testapp', 'test-ns2')
+default_testobj = URLObject('testapp', 'testapp')
+
+otherobj1 = URLObject('nodefault', 'other-ns1')
+otherobj2 = URLObject('nodefault', 'other-ns2')
+
+urlpatterns = patterns('regressiontests.urlpatterns_reverse.views',
+ url(r'^normal/$', 'empty_view', name='normal-view'),
+ url(r'^normal/(?P<arg1>\d+)/(?P<arg2>\d+)/$', 'empty_view', name='normal-view'),
+
+ (r'^test1/', include(testobj1.urls)),
+ (r'^test2/', include(testobj2.urls)),
+ (r'^default/', include(default_testobj.urls)),
+
+ (r'^other1/', include(otherobj1.urls)),
+ (r'^other2/', include(otherobj2.urls)),
+
+ (r'^ns-included1/', include('regressiontests.urlpatterns_reverse.included_namespace_urls', namespace='inc-ns1')),
+ (r'^ns-included2/', include('regressiontests.urlpatterns_reverse.included_namespace_urls', namespace='inc-ns2')),
+
+ (r'^included/', include('regressiontests.urlpatterns_reverse.included_namespace_urls')),
+
+)
diff --git a/tests/regressiontests/urlpatterns_reverse/tests.py b/tests/regressiontests/urlpatterns_reverse/tests.py
index 9def6b2eb2..d4f281ba81 100644
--- a/tests/regressiontests/urlpatterns_reverse/tests.py
+++ b/tests/regressiontests/urlpatterns_reverse/tests.py
@@ -158,4 +158,84 @@ class ReverseShortcutTests(TestCase):
res = redirect('/foo/')
self.assertEqual(res['Location'], '/foo/')
res = redirect('http://example.com/')
- self.assertEqual(res['Location'], 'http://example.com/') \ No newline at end of file
+ self.assertEqual(res['Location'], 'http://example.com/')
+
+
+class NamespaceTests(TestCase):
+ urls = 'regressiontests.urlpatterns_reverse.namespace_urls'
+
+ def test_ambiguous_object(self):
+ "Names deployed via dynamic URL objects that require namespaces can't be resolved"
+ self.assertRaises(NoReverseMatch, reverse, 'urlobject-view')
+ self.assertRaises(NoReverseMatch, reverse, 'urlobject-view', args=[37,42])
+ self.assertRaises(NoReverseMatch, reverse, 'urlobject-view', kwargs={'arg1':42, 'arg2':37})
+
+ def test_ambiguous_urlpattern(self):
+ "Names deployed via dynamic URL objects that require namespaces can't be resolved"
+ self.assertRaises(NoReverseMatch, reverse, 'inner-nothing')
+ self.assertRaises(NoReverseMatch, reverse, 'inner-nothing', args=[37,42])
+ self.assertRaises(NoReverseMatch, reverse, 'inner-nothing', kwargs={'arg1':42, 'arg2':37})
+
+ def test_non_existent_namespace(self):
+ "Non-existent namespaces raise errors"
+ self.assertRaises(NoReverseMatch, reverse, 'blahblah:urlobject-view')
+ self.assertRaises(NoReverseMatch, reverse, 'test-ns1:blahblah:urlobject-view')
+
+ def test_normal_name(self):
+ "Normal lookups work as expected"
+ self.assertEquals('/normal/', reverse('normal-view'))
+ self.assertEquals('/normal/37/42/', reverse('normal-view', args=[37,42]))
+ self.assertEquals('/normal/42/37/', reverse('normal-view', kwargs={'arg1':42, 'arg2':37}))
+
+ def test_simple_included_name(self):
+ "Normal lookups work on names included from other patterns"
+ self.assertEquals('/included/normal/', reverse('inc-normal-view'))
+ self.assertEquals('/included/normal/37/42/', reverse('inc-normal-view', args=[37,42]))
+ self.assertEquals('/included/normal/42/37/', reverse('inc-normal-view', kwargs={'arg1':42, 'arg2':37}))
+
+ def test_namespace_object(self):
+ "Dynamic URL objects can be found using a namespace"
+ self.assertEquals('/test1/inner/', reverse('test-ns1:urlobject-view'))
+ self.assertEquals('/test1/inner/37/42/', reverse('test-ns1:urlobject-view', args=[37,42]))
+ self.assertEquals('/test1/inner/42/37/', reverse('test-ns1:urlobject-view', kwargs={'arg1':42, 'arg2':37}))
+
+ def test_embedded_namespace_object(self):
+ "Namespaces can be installed anywhere in the URL pattern tree"
+ self.assertEquals('/included/test3/inner/', reverse('test-ns3:urlobject-view'))
+ self.assertEquals('/included/test3/inner/37/42/', reverse('test-ns3:urlobject-view', args=[37,42]))
+ self.assertEquals('/included/test3/inner/42/37/', reverse('test-ns3:urlobject-view', kwargs={'arg1':42, 'arg2':37}))
+
+ def test_namespace_pattern(self):
+ "Namespaces can be applied to include()'d urlpatterns"
+ self.assertEquals('/ns-included1/normal/', reverse('inc-ns1:inc-normal-view'))
+ self.assertEquals('/ns-included1/normal/37/42/', reverse('inc-ns1:inc-normal-view', args=[37,42]))
+ self.assertEquals('/ns-included1/normal/42/37/', reverse('inc-ns1:inc-normal-view', kwargs={'arg1':42, 'arg2':37}))
+
+ def test_multiple_namespace_pattern(self):
+ "Namespaces can be embedded"
+ self.assertEquals('/ns-included1/test3/inner/', reverse('inc-ns1:test-ns3:urlobject-view'))
+ self.assertEquals('/ns-included1/test3/inner/37/42/', reverse('inc-ns1:test-ns3:urlobject-view', args=[37,42]))
+ self.assertEquals('/ns-included1/test3/inner/42/37/', reverse('inc-ns1:test-ns3:urlobject-view', kwargs={'arg1':42, 'arg2':37}))
+
+ def test_app_lookup_object(self):
+ "A default application namespace can be used for lookup"
+ self.assertEquals('/default/inner/', reverse('testapp:urlobject-view'))
+ self.assertEquals('/default/inner/37/42/', reverse('testapp:urlobject-view', args=[37,42]))
+ self.assertEquals('/default/inner/42/37/', reverse('testapp:urlobject-view', kwargs={'arg1':42, 'arg2':37}))
+
+ def test_app_lookup_object_with_default(self):
+ "A default application namespace is sensitive to the 'current' app can be used for lookup"
+ self.assertEquals('/included/test3/inner/', reverse('testapp:urlobject-view', current_app='test-ns3'))
+ self.assertEquals('/included/test3/inner/37/42/', reverse('testapp:urlobject-view', args=[37,42], current_app='test-ns3'))
+ self.assertEquals('/included/test3/inner/42/37/', reverse('testapp:urlobject-view', kwargs={'arg1':42, 'arg2':37}, current_app='test-ns3'))
+
+ def test_app_lookup_object_without_default(self):
+ "An application namespace without a default is sensitive to the 'current' app can be used for lookup"
+ self.assertEquals('/other2/inner/', reverse('nodefault:urlobject-view'))
+ self.assertEquals('/other2/inner/37/42/', reverse('nodefault:urlobject-view', args=[37,42]))
+ self.assertEquals('/other2/inner/42/37/', reverse('nodefault:urlobject-view', kwargs={'arg1':42, 'arg2':37}))
+
+ self.assertEquals('/other1/inner/', reverse('nodefault:urlobject-view', current_app='other-ns1'))
+ self.assertEquals('/other1/inner/37/42/', reverse('nodefault:urlobject-view', args=[37,42], current_app='other-ns1'))
+ self.assertEquals('/other1/inner/42/37/', reverse('nodefault:urlobject-view', kwargs={'arg1':42, 'arg2':37}, current_app='other-ns1'))
+