django/tests/db_functions/comparison/test_nullif.py

41 lines
1.4 KiB
Python

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'))