1
1
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
4
4
5
5
from django_mongodb .fields import ObjectIdField
6
6
7
+ from .models import NullableObjectIdModel , ObjectIdModel , PrimaryKeyObjectIdModel
8
+
7
9
8
10
class MethodTests (SimpleTestCase ):
9
11
def test_deconstruct (self ):
@@ -33,7 +35,7 @@ def test_to_python_invalid_value(self):
33
35
for invalid_value in ["None" , {}, [], 123 ]:
34
36
with self .subTest (invalid_value = invalid_value ):
35
37
msg = f"['“{ invalid_value } ” value must be an Object Id.']"
36
- with self .assertRaisesMessage (exceptions . ValidationError , msg ):
38
+ with self .assertRaisesMessage (ValidationError , msg ):
37
39
f .to_python (invalid_value )
38
40
39
41
def test_get_prep_value_string (self ):
@@ -44,6 +46,12 @@ def test_get_prep_value_objectid(self):
44
46
value = ObjectId ("1" * 24 )
45
47
self .assertEqual (ObjectIdField ().get_prep_value (value ), value )
46
48
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
+
47
55
def test_get_prep_value_null (self ):
48
56
self .assertIsNone (ObjectIdField ().get_prep_value (None ))
49
57
@@ -55,3 +63,36 @@ def test_get_prep_value_invalid_values(self):
55
63
msg = f"Field 'test' expected an ObjectId but got { invalid_value !r} ."
56
64
with self .assertRaisesMessage (ValueError , msg ):
57
65
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