|
| 1 | +# Copyright (c) Microsoft Corporation. |
| 2 | +# Licensed under the BSD license. |
| 3 | + |
| 4 | +from unittest import skipUnless |
| 5 | + |
| 6 | +from django import VERSION |
| 7 | +from django.db import OperationalError |
| 8 | +from django.db.backends.sqlite3.operations import DatabaseOperations |
| 9 | +from django.test import TestCase, skipUnlessDBFeature |
| 10 | + |
| 11 | +from ..models import BinaryData, Pizza, Topping |
| 12 | + |
| 13 | +if VERSION >= (3, 2): |
| 14 | + from ..models import TestCheckConstraintWithUnicode |
| 15 | + |
| 16 | + |
| 17 | +@skipUnless( |
| 18 | + VERSION >= (3, 1), |
| 19 | + "Django 3.0 and below doesn't support different databases in unit tests", |
| 20 | +) |
| 21 | +class TestMultpleDatabases(TestCase): |
| 22 | + databases = ['default', 'sqlite'] |
| 23 | + |
| 24 | + def test_in_split_parameter_list_as_sql(self): |
| 25 | + # Issue: https://github.com/microsoft/mssql-django/issues/92 |
| 26 | + |
| 27 | + # Mimic databases that have a limit on parameters (e.g. Oracle DB) |
| 28 | + old_max_in_list_size = DatabaseOperations.max_in_list_size |
| 29 | + DatabaseOperations.max_in_list_size = lambda self: 100 |
| 30 | + |
| 31 | + mssql_iterations = 3000 |
| 32 | + Pizza.objects.bulk_create([Pizza() for _ in range(mssql_iterations)]) |
| 33 | + Topping.objects.bulk_create([Topping() for _ in range(mssql_iterations)]) |
| 34 | + prefetch_result = Pizza.objects.prefetch_related('toppings') |
| 35 | + self.assertEqual(len(prefetch_result), mssql_iterations) |
| 36 | + |
| 37 | + # Different iterations since SQLite has max host parameters of 999 for versions prior to 3.32.0 |
| 38 | + # Info about limit: https://www.sqlite.org/limits.html |
| 39 | + sqlite_iterations = 999 |
| 40 | + Pizza.objects.using('sqlite').bulk_create([Pizza() for _ in range(sqlite_iterations)]) |
| 41 | + Topping.objects.using('sqlite').bulk_create([Topping() for _ in range(sqlite_iterations)]) |
| 42 | + prefetch_result_sqlite = Pizza.objects.using('sqlite').prefetch_related('toppings') |
| 43 | + self.assertEqual(len(prefetch_result_sqlite), sqlite_iterations) |
| 44 | + |
| 45 | + DatabaseOperations.max_in_list_size = old_max_in_list_size |
| 46 | + |
| 47 | + def test_binaryfield_init(self): |
| 48 | + binary_data = b'\x00\x46\xFE' |
| 49 | + binary = BinaryData(binary=binary_data) |
| 50 | + binary.save() |
| 51 | + binary.save(using='sqlite') |
| 52 | + |
| 53 | + try: |
| 54 | + binary.full_clean() |
| 55 | + except ValidationError: |
| 56 | + self.fail() |
| 57 | + |
| 58 | + b1 = BinaryData.objects.filter(binary=binary_data) |
| 59 | + self.assertSequenceEqual( |
| 60 | + b1, |
| 61 | + [binary], |
| 62 | + ) |
| 63 | + b2 = BinaryData.objects.using('sqlite').filter(binary=binary_data) |
| 64 | + self.assertSequenceEqual( |
| 65 | + b2, |
| 66 | + [binary], |
| 67 | + ) |
| 68 | + |
| 69 | + @skipUnlessDBFeature('supports_table_check_constraints') |
| 70 | + @skipUnless( |
| 71 | + VERSION >= (3, 2), |
| 72 | + "Django 3.1 and below has errors from running migrations for this test", |
| 73 | + ) |
| 74 | + def test_checkconstraint_get_check_sql(self): |
| 75 | + TestCheckConstraintWithUnicode.objects.create(name='abc') |
| 76 | + try: |
| 77 | + TestCheckConstraintWithUnicode.objects.using('sqlite').create(name='abc') |
| 78 | + except OperationalError: |
| 79 | + self.fail() |
| 80 | + |
| 81 | + def test_queryset_bulk_update(self): |
| 82 | + objs = [ |
| 83 | + BinaryData.objects.create(binary=b'\x00') for _ in range(5) |
| 84 | + ] |
| 85 | + for obj in objs: |
| 86 | + obj.binary = None |
| 87 | + BinaryData.objects.bulk_update(objs, ["binary"]) |
| 88 | + self.assertCountEqual(BinaryData.objects.filter(binary__isnull=True), objs) |
| 89 | + |
| 90 | + objs = [ |
| 91 | + BinaryData.objects.using('sqlite').create(binary=b'\x00') for _ in range(5) |
| 92 | + ] |
| 93 | + for obj in objs: |
| 94 | + obj.binary = None |
| 95 | + BinaryData.objects.using('sqlite').bulk_update(objs, ["binary"]) |
| 96 | + self.assertCountEqual(BinaryData.objects.using('sqlite').filter(binary__isnull=True), objs) |
0 commit comments