From a8fa3e5cd77416b9e4a5b28b216fb3e19609a37d Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Fri, 10 Dec 2021 09:13:09 +0000 Subject: [PATCH] Refs #33355 -- Added missing tests for database functions and expression on null values. --- django/db/backends/oracle/features.py | 1 + tests/db_functions/math/test_atan2.py | 2 ++ tests/db_functions/math/test_log.py | 2 ++ tests/db_functions/math/test_power.py | 2 ++ tests/db_functions/text/test_pad.py | 2 ++ tests/db_functions/text/test_repeat.py | 1 + tests/expressions/tests.py | 12 ++++++++++++ 7 files changed, 22 insertions(+) diff --git a/django/db/backends/oracle/features.py b/django/db/backends/oracle/features.py index 3b1bae3501..898a82e5d5 100644 --- a/django/db/backends/oracle/features.py +++ b/django/db/backends/oracle/features.py @@ -85,6 +85,7 @@ class DatabaseFeatures(BaseDatabaseFeatures): "Oracle doesn't support bitwise XOR.": { 'expressions.tests.ExpressionOperatorTests.test_lefthand_bitwise_xor', 'expressions.tests.ExpressionOperatorTests.test_lefthand_bitwise_xor_null', + 'expressions.tests.ExpressionOperatorTests.test_lefthand_bitwise_xor_right_null', }, "Oracle requires ORDER BY in row_number, ANSI:SQL doesn't.": { 'expressions_window.tests.WindowFunctionTests.test_row_number_no_ordering', diff --git a/tests/db_functions/math/test_atan2.py b/tests/db_functions/math/test_atan2.py index ca12e64479..ce9dd53187 100644 --- a/tests/db_functions/math/test_atan2.py +++ b/tests/db_functions/math/test_atan2.py @@ -14,9 +14,11 @@ class ATan2Tests(TestCase): obj = IntegerModel.objects.annotate( null_atan2_sn=ATan2('small', 'normal'), null_atan2_nb=ATan2('normal', 'big'), + null_atan2_bn=ATan2('big', 'normal'), ).first() self.assertIsNone(obj.null_atan2_sn) self.assertIsNone(obj.null_atan2_nb) + self.assertIsNone(obj.null_atan2_bn) def test_decimal(self): DecimalModel.objects.create(n1=Decimal('-9.9'), n2=Decimal('4.6')) diff --git a/tests/db_functions/math/test_log.py b/tests/db_functions/math/test_log.py index 469bb7cd3a..293993800a 100644 --- a/tests/db_functions/math/test_log.py +++ b/tests/db_functions/math/test_log.py @@ -14,9 +14,11 @@ class LogTests(TestCase): obj = IntegerModel.objects.annotate( null_log_small=Log('small', 'normal'), null_log_normal=Log('normal', 'big'), + null_log_big=Log('big', 'normal'), ).first() self.assertIsNone(obj.null_log_small) self.assertIsNone(obj.null_log_normal) + self.assertIsNone(obj.null_log_big) def test_decimal(self): DecimalModel.objects.create(n1=Decimal('12.9'), n2=Decimal('3.6')) diff --git a/tests/db_functions/math/test_power.py b/tests/db_functions/math/test_power.py index a2d6156e3d..94929d38b7 100644 --- a/tests/db_functions/math/test_power.py +++ b/tests/db_functions/math/test_power.py @@ -13,9 +13,11 @@ class PowerTests(TestCase): obj = IntegerModel.objects.annotate( null_power_small=Power('small', 'normal'), null_power_normal=Power('normal', 'big'), + null_power_big=Power('big', 'normal'), ).first() self.assertIsNone(obj.null_power_small) self.assertIsNone(obj.null_power_normal) + self.assertIsNone(obj.null_power_big) def test_decimal(self): DecimalModel.objects.create(n1=Decimal('1.0'), n2=Decimal('-0.6')) diff --git a/tests/db_functions/text/test_pad.py b/tests/db_functions/text/test_pad.py index 17c33a30d8..fbe82c166e 100644 --- a/tests/db_functions/text/test_pad.py +++ b/tests/db_functions/text/test_pad.py @@ -25,6 +25,8 @@ class PadTests(TestCase): (RPad('name', 0), ''), (LPad('name', None), none_value), (RPad('name', None), none_value), + (LPad(Value(None), 1), none_value), + (RPad(Value(None), 1), none_value), (LPad('goes_by', 1), none_value), (RPad('goes_by', 1), none_value), ) diff --git a/tests/db_functions/text/test_repeat.py b/tests/db_functions/text/test_repeat.py index c1e136c8f0..2234c2e2da 100644 --- a/tests/db_functions/text/test_repeat.py +++ b/tests/db_functions/text/test_repeat.py @@ -16,6 +16,7 @@ class RepeatTests(TestCase): (Repeat('name', Length('alias')), 'JohnJohnJohn'), (Repeat(Value('x'), 3), 'xxx'), (Repeat('name', None), none_value), + (Repeat(Value(None), 4), none_value), (Repeat('goes_by', 1), none_value), ) for function, repeated_text in tests: diff --git a/tests/expressions/tests.py b/tests/expressions/tests.py index dab5474ef4..13c7e2b212 100644 --- a/tests/expressions/tests.py +++ b/tests/expressions/tests.py @@ -1246,6 +1246,12 @@ class ExpressionOperatorTests(TestCase): Number.objects.filter(pk=self.n.pk).update(integer=F('integer') % 20) self.assertEqual(Number.objects.get(pk=self.n.pk).integer, 2) + def test_lefthand_modulo_null(self): + # LH Modulo arithmetic on integers. + Employee.objects.create(firstname='John', lastname='Doe', salary=None) + qs = Employee.objects.annotate(modsalary=F('salary') % 20) + self.assertIsNone(qs.get().salary) + def test_lefthand_bitwise_and(self): # LH Bitwise ands on integers Number.objects.filter(pk=self.n.pk).update(integer=F('integer').bitand(56)) @@ -1294,6 +1300,12 @@ class ExpressionOperatorTests(TestCase): employee.refresh_from_db() self.assertIsNone(employee.salary) + def test_lefthand_bitwise_xor_right_null(self): + employee = Employee.objects.create(firstname='John', lastname='Doe', salary=48) + Employee.objects.update(salary=F('salary').bitxor(None)) + employee.refresh_from_db() + self.assertIsNone(employee.salary) + @unittest.skipUnless(connection.vendor == 'oracle', "Oracle doesn't support bitwise XOR.") def test_lefthand_bitwise_xor_not_supported(self): msg = 'Bitwise XOR is not supported in Oracle.'