Skip to main content

crossref_xml/
head.rs

1use crate::serializers::*;
2use serde::Serialize;
3use validator::Validate;
4
5#[derive(Debug, Clone, Default, Serialize, Validate)]
6#[serde(rename = "head")]
7pub struct Head {
8    #[serde(serialize_with = "serialize_timestamp")]
9    pub doi_batch_id: (),
10    #[serde(serialize_with = "serialize_timestamp")]
11    pub timestamp: (),
12    #[validate(nested)]
13    pub depositor: Depositor,
14    #[validate(length(min = 1, max = 255))]
15    pub registrant: String,
16}
17
18#[derive(Debug, Clone, Default, Serialize, Validate)]
19#[serde(rename = "depositor")]
20pub struct Depositor {
21    #[validate(length(min = 1, max = 130))]
22    pub depositor_name: String,
23    #[validate(length(min = 6, max = 200))]
24    pub email_address: String,
25}
26
27#[cfg(test)]
28mod unit {
29    use super::*;
30    use pretty_assertions::assert_eq;
31
32    // Depositor tests
33    #[test]
34    fn test_depositor_serialization() {
35        let depositor = Depositor {
36            depositor_name: "John Doe".to_string(),
37            email_address: "john@example.com".to_string(),
38        };
39
40        assert!(
41            depositor.validate().is_ok(),
42            "Valid depositor should pass validation"
43        );
44    }
45
46    #[test]
47    fn test_head_serialization() {
48        let head = Head {
49            depositor: Depositor {
50                depositor_name: "Test Depositor".to_string(),
51                email_address: "test@example.com".to_string(),
52            },
53            registrant: "Test Registrant".to_string(),
54            ..Default::default()
55        };
56
57        assert!(head.validate().is_ok(), "Valid head should pass validation");
58    }
59
60    #[test]
61    fn test_head_default_invalid() {
62        let head = Head::default();
63
64        assert_eq!(head.depositor.depositor_name, "");
65        assert_eq!(head.depositor.email_address, "");
66        assert_eq!(head.registrant, "");
67
68        assert!(
69            head.validate().is_err(),
70            "Head defaults should fail validation"
71        );
72    }
73
74    #[test]
75    fn test_depositor_default_invalid() {
76        let depositor = Depositor::default();
77
78        assert_eq!(depositor.depositor_name, "");
79        assert_eq!(depositor.email_address, "");
80
81        assert!(
82            depositor.validate().is_err(),
83            "Depositor defaults should fail validation"
84        );
85    }
86}