Skip to content

Commit ded42f5

Browse files
committed
tests: Use direct values instead of raw SQL
Supersedes #11. In order to prevent (-1) from being masked by BitField.get_prep_value and converted to 15 (0xf), the test code uses a direct SQL statement. Its implementation has a few peculiarities that may be undesirable: - It uses an Django internal API, the Field.column attribute. Granted, this package already uses a lot of internal APIs, and Field.column is highly unlikely to change. However, in general using less internal APIs is better for future compatibility. - Using low-level API misses a lot of code paths that could have been tested. - Neither db_table nor db_column is escaped. In case we later incorporate tests involving pathological SQL object identifiers, we have to further use quote_name, which is not exactly public API either. Instead, we use models.Value() with an explicit output_field, which still avoids BitField.get_prep_value and inserts the value directly. Further, directly assign to __dict__ so that the BitFieldCreator descriptor's __set__ method is bypassed and the value is assigned unchanged.
1 parent ce7a1ce commit ded42f5

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

bitfield/tests/tests.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import pickle
44

5-
from django.db import connection, models
5+
from django.db import models
66
from django.db.models import F
77
from django.test import TestCase
88

@@ -155,11 +155,12 @@ def test_regression_1425(self):
155155
self.assertTrue(instance.flags.FLAG_2)
156156
self.assertTrue(instance.flags.FLAG_3)
157157

158-
cursor = connection.cursor()
159-
flags_field = BitFieldTestModel._meta.get_field('flags')
160-
flags_db_column = flags_field.db_column or flags_field.name
161-
cursor.execute("INSERT INTO %s (%s) VALUES (-1)" % (BitFieldTestModel._meta.db_table, flags_db_column))
162-
# There should only be the one row we inserted through the cursor.
158+
# Bypass BitField.to_python and insert (-1) directly.
159+
instance = BitFieldTestModel()
160+
instance.__dict__['flags'] = models.Value(-1, output_field=models.IntegerField())
161+
instance.save()
162+
163+
# There should only be the one row we inserted with a direct value.
163164
instance = BitFieldTestModel.objects.get(flags=-1)
164165
self.assertTrue(instance.flags.FLAG_0)
165166
self.assertTrue(instance.flags.FLAG_1)

0 commit comments

Comments
 (0)