11from 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
55from django_mongodb .fields import ObjectIdField
66
7+ from .models import NullableObjectIdModel , ObjectIdModel , PrimaryKeyObjectIdModel
8+
79
810class 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