Skip to main content

rjango_contrib_postgres/
fields.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
4pub struct ArrayField {
5    pub base_field: String,
6    pub size: Option<usize>,
7}
8
9impl ArrayField {
10    #[must_use]
11    pub fn new(base_field: impl Into<String>, size: Option<usize>) -> Self {
12        Self {
13            base_field: base_field.into(),
14            size,
15        }
16    }
17}
18
19impl Default for ArrayField {
20    fn default() -> Self {
21        Self::new(String::new(), None)
22    }
23}
24
25#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
26pub struct HStoreField;
27
28#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
29pub struct JSONField {
30    pub default: Option<serde_json::Value>,
31}
32
33#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
34pub struct CITextField {
35    pub max_length: Option<usize>,
36}
37
38impl CITextField {
39    #[must_use]
40    pub fn new(max_length: Option<usize>) -> Self {
41        Self { max_length }
42    }
43}
44
45#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
46pub struct IntegerRangeField;
47
48#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
49pub struct BigIntegerRangeField;
50
51#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
52pub struct DecimalRangeField;
53
54#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
55pub struct DateRangeField;
56
57#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
58pub struct DateTimeRangeField;
59
60#[cfg(test)]
61mod tests {
62    use serde_json::json;
63
64    use super::{
65        ArrayField, BigIntegerRangeField, CITextField, DateRangeField, DateTimeRangeField,
66        DecimalRangeField, HStoreField, IntegerRangeField, JSONField,
67    };
68
69    #[test]
70    fn array_field_construction_preserves_configuration() {
71        let field = ArrayField::new("text", Some(4));
72
73        assert_eq!(field.base_field, "text");
74        assert_eq!(field.size, Some(4));
75    }
76
77    #[test]
78    fn array_field_default_is_unbounded_and_empty() {
79        let field = ArrayField::default();
80
81        assert!(field.base_field.is_empty());
82        assert_eq!(field.size, None);
83    }
84
85    #[test]
86    fn hstore_field_default_constructs() {
87        let field = HStoreField;
88        let defaulted = HStoreField;
89
90        assert_eq!(format!("{field:?}"), format!("{defaulted:?}"));
91    }
92
93    #[test]
94    fn json_field_supports_default_values() {
95        let field = JSONField {
96            default: Some(json!({ "enabled": true })),
97        };
98
99        assert_eq!(field.default, Some(json!({ "enabled": true })));
100    }
101
102    #[test]
103    fn json_field_default_is_empty() {
104        let field = JSONField::default();
105
106        assert_eq!(field.default, None);
107    }
108
109    #[test]
110    fn citext_field_construction_preserves_max_length() {
111        let field = CITextField::new(Some(255));
112
113        assert_eq!(field.max_length, Some(255));
114    }
115
116    #[test]
117    fn citext_field_default_has_no_length_limit() {
118        let field = CITextField::default();
119
120        assert_eq!(field.max_length, None);
121    }
122
123    #[test]
124    fn integer_range_field_default_constructs() {
125        let field = IntegerRangeField;
126
127        assert_eq!(format!("{field:?}"), "IntegerRangeField");
128    }
129
130    #[test]
131    fn big_integer_range_field_default_constructs() {
132        let field = BigIntegerRangeField;
133
134        assert_eq!(format!("{field:?}"), "BigIntegerRangeField");
135    }
136
137    #[test]
138    fn decimal_range_field_default_constructs() {
139        let field = DecimalRangeField;
140
141        assert_eq!(format!("{field:?}"), "DecimalRangeField");
142    }
143
144    #[test]
145    fn date_range_field_default_constructs() {
146        let field = DateRangeField;
147
148        assert_eq!(format!("{field:?}"), "DateRangeField");
149    }
150
151    #[test]
152    fn date_time_range_field_default_constructs() {
153        let field = DateTimeRangeField;
154
155        assert_eq!(format!("{field:?}"), "DateTimeRangeField");
156    }
157}