from django.core.exceptions import ValidationError from django.db import models from django.test import TestCase from .models import DataModel class BinaryFieldTests(TestCase): binary_data = b'\x00\x46\xFE' def test_set_and_retrieve(self): data_set = (self.binary_data, bytearray(self.binary_data), memoryview(self.binary_data)) for bdata in data_set: dm = DataModel(data=bdata) dm.save() dm = DataModel.objects.get(pk=dm.pk) self.assertEqual(bytes(dm.data), bytes(bdata)) # Resave (=update) dm.save() dm = DataModel.objects.get(pk=dm.pk) self.assertEqual(bytes(dm.data), bytes(bdata)) # Test default value self.assertEqual(bytes(dm.short_data), b'\x08') def test_max_length(self): dm = DataModel(short_data=self.binary_data * 4) with self.assertRaises(ValidationError): dm.full_clean() def test_editable(self): field = models.BinaryField() self.assertIs(field.editable, False) field = models.BinaryField(editable=True) self.assertIs(field.editable, True) field = models.BinaryField(editable=False) self.assertIs(field.editable, False) def test_filter(self): dm = DataModel.objects.create(data=self.binary_data) DataModel.objects.create(data=b'\xef\xbb\xbf') self.assertSequenceEqual(DataModel.objects.filter(data=self.binary_data), [dm]) def test_filter_bytearray(self): dm = DataModel.objects.create(data=self.binary_data) DataModel.objects.create(data=b'\xef\xbb\xbf') self.assertSequenceEqual(DataModel.objects.filter(data=bytearray(self.binary_data)), [dm]) def test_filter_memoryview(self): dm = DataModel.objects.create(data=self.binary_data) DataModel.objects.create(data=b'\xef\xbb\xbf') self.assertSequenceEqual(DataModel.objects.filter(data=memoryview(self.binary_data)), [dm])