Skip to content

Commit e8a0d96

Browse files
committed
add save/load tests modeled after UUIDField tests
1 parent dd25fa8 commit e8a0d96

File tree

2 files changed

+59
-3
lines changed

2 files changed

+59
-3
lines changed

tests/model_fields_/models.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from django.db import models
2+
3+
from django_mongodb.fields import ObjectIdField
4+
5+
6+
class ObjectIdModel(models.Model):
7+
field = ObjectIdField()
8+
9+
10+
class NullableObjectIdModel(models.Model):
11+
field = ObjectIdField(blank=True, null=True)
12+
13+
14+
class PrimaryKeyObjectIdModel(models.Model):
15+
field = ObjectIdField(primary_key=True)

tests/model_fields_/test_objectidfield.py

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from bson import ObjectId
2-
from django.core import exceptions
3-
from django.test import SimpleTestCase
2+
from django.core.exceptions import ValidationError
3+
from django.test import SimpleTestCase, TestCase
44

55
from django_mongodb.fields import ObjectIdField
66

7+
from .models import NullableObjectIdModel, ObjectIdModel, PrimaryKeyObjectIdModel
8+
79

810
class MethodTests(SimpleTestCase):
911
def test_deconstruct(self):
@@ -33,7 +35,7 @@ def test_to_python_invalid_value(self):
3335
for invalid_value in ["None", {}, [], 123]:
3436
with self.subTest(invalid_value=invalid_value):
3537
msg = f"['“{invalid_value}” value must be an Object Id.']"
36-
with self.assertRaisesMessage(exceptions.ValidationError, msg):
38+
with self.assertRaisesMessage(ValidationError, msg):
3739
f.to_python(invalid_value)
3840

3941
def test_get_prep_value_string(self):
@@ -44,6 +46,12 @@ def test_get_prep_value_objectid(self):
4446
value = ObjectId("1" * 24)
4547
self.assertEqual(ObjectIdField().get_prep_value(value), value)
4648

49+
def test_get_prep_value_empty(self):
50+
# This is necessary to allow an empty ObjectIdField to be saved in
51+
# forms, unless we add an ObjectId form field to do the conversion (see
52+
# UUIDField for an example).
53+
self.assertIsNone(ObjectIdField().get_prep_value(""))
54+
4755
def test_get_prep_value_null(self):
4856
self.assertIsNone(ObjectIdField().get_prep_value(None))
4957

@@ -55,3 +63,36 @@ def test_get_prep_value_invalid_values(self):
5563
msg = f"Field 'test' expected an ObjectId but got {invalid_value!r}."
5664
with self.assertRaisesMessage(ValueError, msg):
5765
f.get_prep_value(invalid_value)
66+
67+
68+
class SaveLoadTests(TestCase):
69+
def test_objectid_instance(self):
70+
instance = ObjectIdModel.objects.create(field=ObjectId())
71+
loaded = ObjectIdModel.objects.get()
72+
self.assertEqual(loaded.field, instance.field)
73+
74+
def test_str_instance(self):
75+
ObjectIdModel.objects.create(field="6754ed8e584bc9ceaae3c072")
76+
loaded = ObjectIdModel.objects.get()
77+
self.assertEqual(loaded.field, ObjectId("6754ed8e584bc9ceaae3c072"))
78+
79+
def test_null_handling(self):
80+
NullableObjectIdModel.objects.create(field=None)
81+
loaded = NullableObjectIdModel.objects.get()
82+
self.assertIsNone(loaded.field)
83+
84+
def test_pk_validated(self):
85+
# See https://code.djangoproject.com/ticket/24859
86+
with self.assertRaisesMessage(TypeError, "must be an Object Id."):
87+
PrimaryKeyObjectIdModel.objects.get(pk={})
88+
89+
with self.assertRaisesMessage(TypeError, "must be an Object Id."):
90+
PrimaryKeyObjectIdModel.objects.get(pk=[])
91+
92+
def test_wrong_value(self):
93+
# Copied from UUID tests. Raises ValueError, might be okay.
94+
with self.assertRaisesMessage(ValidationError, "must be an Object Id."):
95+
ObjectIdModel.objects.get(field="not-a-objectid")
96+
97+
with self.assertRaisesMessage(ValidationError, "must be an Object Id."):
98+
ObjectIdModel.objects.create(field="not-a-objectid")

0 commit comments

Comments
 (0)