-
-
Notifications
You must be signed in to change notification settings - Fork 31.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Migrated null_queries doctests. Thanks to Stephan Jaekel.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@13932 bcc190cf-cafb-0310-a4f2-bffc1f526a37
- Loading branch information
1 parent
1c09aca
commit 974e807
Showing
2 changed files
with
69 additions
and
57 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
from django.test import TestCase | ||
from django.core.exceptions import FieldError | ||
|
||
from regressiontests.null_queries.models import * | ||
|
||
|
||
class NullQueriesTests(TestCase): | ||
|
||
def test_none_as_null(self): | ||
""" | ||
Regression test for the use of None as a query value. | ||
None is interpreted as an SQL NULL, but only in __exact queries. | ||
Set up some initial polls and choices | ||
""" | ||
p1 = Poll(question='Why?') | ||
p1.save() | ||
c1 = Choice(poll=p1, choice='Because.') | ||
c1.save() | ||
c2 = Choice(poll=p1, choice='Why Not?') | ||
c2.save() | ||
|
||
# Exact query with value None returns nothing ("is NULL" in sql, | ||
# but every 'id' field has a value). | ||
self.assertQuerysetEqual(Choice.objects.filter(choice__exact=None), []) | ||
|
||
# Excluding the previous result returns everything. | ||
self.assertQuerysetEqual( | ||
Choice.objects.exclude(choice=None).order_by('id'), | ||
[ | ||
'<Choice: Choice: Because. in poll Q: Why? >', | ||
'<Choice: Choice: Why Not? in poll Q: Why? >' | ||
] | ||
) | ||
|
||
# Valid query, but fails because foo isn't a keyword | ||
self.assertRaises(FieldError, Choice.objects.filter, foo__exact=None) | ||
|
||
# Can't use None on anything other than __exact | ||
self.assertRaises(ValueError, Choice.objects.filter, id__gt=None) | ||
|
||
# Can't use None on anything other than __exact | ||
self.assertRaises(ValueError, Choice.objects.filter, foo__gt=None) | ||
|
||
# Related managers use __exact=None implicitly if the object hasn't been saved. | ||
p2 = Poll(question="How?") | ||
self.assertEquals(repr(p2.choice_set.all()), '[]') | ||
|
||
def test_reverse_relations(self): | ||
""" | ||
Querying across reverse relations and then another relation should | ||
insert outer joins correctly so as not to exclude results. | ||
""" | ||
obj = OuterA.objects.create() | ||
self.assertQuerysetEqual( | ||
OuterA.objects.filter(inner__second=None), | ||
['<OuterA: OuterA object>'] | ||
) | ||
self.assertQuerysetEqual( | ||
OuterA.objects.filter(inner__second__data=None), | ||
['<OuterA: OuterA object>'] | ||
) | ||
|
||
inner_obj = Inner.objects.create(first=obj) | ||
self.assertQuerysetEqual( | ||
Inner.objects.filter(first__inner__second=None), | ||
['<Inner: Inner object>'] | ||
) | ||
|