|
@@ -0,0 +1,40 @@
|
|
|
+from unittest import skipUnless
|
|
|
+
|
|
|
+from django.db import connection
|
|
|
+from django.db.models import Value
|
|
|
+from django.db.models.functions import NullIf
|
|
|
+from django.test import TestCase
|
|
|
+
|
|
|
+from ..models import Author
|
|
|
+
|
|
|
+
|
|
|
+class NullIfTests(TestCase):
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def setUpTestData(cls):
|
|
|
+ Author.objects.create(name='John Smith', alias='smithj')
|
|
|
+ Author.objects.create(name='Rhonda', alias='Rhonda')
|
|
|
+
|
|
|
+ def test_basic(self):
|
|
|
+ authors = Author.objects.annotate(nullif=NullIf('alias', 'name')).values_list('nullif')
|
|
|
+ self.assertSequenceEqual(
|
|
|
+ authors, [
|
|
|
+ ('smithj',),
|
|
|
+ ('' if connection.features.interprets_empty_strings_as_nulls else None,)
|
|
|
+ ]
|
|
|
+ )
|
|
|
+
|
|
|
+ def test_null_argument(self):
|
|
|
+ authors = Author.objects.annotate(nullif=NullIf('name', Value(None))).values_list('nullif')
|
|
|
+ self.assertSequenceEqual(authors, [('John Smith',), ('Rhonda',)])
|
|
|
+
|
|
|
+ def test_too_few_args(self):
|
|
|
+ msg = "'NullIf' takes exactly 2 arguments (1 given)"
|
|
|
+ with self.assertRaisesMessage(TypeError, msg):
|
|
|
+ NullIf('name')
|
|
|
+
|
|
|
+ @skipUnless(connection.vendor == 'oracle', 'Oracle specific test for NULL-literal')
|
|
|
+ def test_null_literal(self):
|
|
|
+ msg = 'Oracle does not allow Value(None) for expression1.'
|
|
|
+ with self.assertRaisesMessage(ValueError, msg):
|
|
|
+ list(Author.objects.annotate(nullif=NullIf(Value(None), 'name')).values_list('nullif'))
|