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 #[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}