oparl_types/
post.rs

1// SPDX-FileCopyrightText: Politik im Blick developers
2// SPDX-FileCopyrightText: Wolfgang Silbermayr <wolfgang@silbermayr.at>
3//
4// SPDX-License-Identifier: AGPL-3.0-or-later OR EUPL-1.2
5
6#[derive(
7    Debug,
8    Clone,
9    PartialEq,
10    Eq,
11    PartialOrd,
12    Ord,
13    Hash,
14    derive_more::AsRef,
15    derive_more::Display,
16    derive_more::From,
17    derive_more::FromStr,
18    derive_more::Into,
19    serde::Serialize,
20    serde::Deserialize,
21)]
22#[cfg_attr(feature = "sea-orm", derive(sea_orm::DeriveValueType))]
23pub struct Post(String);
24
25impl From<&str> for Post {
26    fn from(value: &str) -> Self {
27        Self(value.into())
28    }
29}
30
31impl Post {
32    pub fn as_str(&self) -> &str {
33        self.0.as_str()
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::Post;
40
41    use pretty_assertions::assert_eq;
42
43    #[test]
44    fn from_str() {
45        assert_eq!(
46            Post("Vorsitzender".to_string()),
47            "Vorsitzender"
48                .parse()
49                .expect("value must be a parseable post")
50        );
51    }
52}
53
54#[cfg(test)]
55mod serde_tests {
56    use super::Post;
57    use pretty_assertions::assert_eq;
58    use serde_json::json;
59
60    #[test]
61    fn serialize() {
62        assert_eq!(
63            json!(Post("Vorsitzender".to_string())),
64            json!("Vorsitzender")
65        );
66    }
67
68    #[test]
69    fn deserialize_good() {
70        let deserialized: Post = serde_json::from_value(json!("Vorsitzender"))
71            .expect("value must be deserializable as post");
72        assert_eq!(deserialized, Post::from("Vorsitzender"));
73    }
74
75    #[test]
76    fn deserialize_bad() {
77        assert!(serde_json::from_value::<Post>(json!([])).is_err());
78        assert!(serde_json::from_value::<Post>(json!({})).is_err());
79        assert!(serde_json::from_value::<Post>(json!(true)).is_err());
80        assert!(serde_json::from_value::<Post>(json!(123)).is_err());
81    }
82}