Skip to content

Commit 24f7da2

Browse files
authored
add tests on resume validation
1 parent 09e826f commit 24f7da2

File tree

8 files changed

+145
-8
lines changed

8 files changed

+145
-8
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[package]
2-
name = "json-resume"
2+
name = "json-resume-serde"
33
version = "0.1.0"
44
edition = "2024"
55

README.md

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,52 @@
11
# json-resume
22

3-
A Rust implementation of the [JSON Resume schema](https://github.com/jsonresume/resume-schema/blob/master/schema.json) with Serde support for serialization and deserialization.
3+
A Rust implementation of the [JSON Resume schema](https://github.com/jsonresume/resume-schema/blob/master/schema.json) with Serde and Validate support for serialization and deserialization.
4+
5+
## Usage
6+
7+
### From Serialized JSON
8+
```rs
9+
use serde_valid::Validate;
10+
11+
#[axum::debug_handler]
12+
async fn post(Json(resume): Json<json_resume::Resume>) -> Result<Json<Resume>, ResumeError> {
13+
14+
let result = resume.validate()
15+
16+
// do stuff
17+
18+
Ok(Json(resume))
19+
}
20+
```
21+
22+
### Build manually
23+
```rs
24+
use serde_valid::Validate;
25+
26+
let resume = json_resume::Resume {
27+
basics: Some(json_resume::Basics {
28+
//...
29+
}),
30+
work: vec![
31+
json_resume::Work {
32+
// ...
33+
}
34+
],
35+
volunteer: vec![],
36+
education: vec![],
37+
awards: vec![],
38+
certificates: vec![],
39+
publications: vec![],
40+
skills: vec![],
41+
languages: vec![],
42+
interests: vec![],
43+
references: vec![],
44+
projects: vec![],
45+
};
46+
47+
resume.validate().unwrap();
48+
```
49+
450

551
## License
652

src/resume.rs

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,103 @@ pub use work::Work;
3131

3232
#[derive(Debug, Serialize, Deserialize, Validate)]
3333
pub struct Resume {
34-
pub basics: Basics,
34+
#[validate]
35+
pub basics: Option<Basics>,
36+
#[validate]
3537
pub work: Vec<Work>,
38+
#[validate]
3639
pub volunteer: Vec<Volunteer>,
40+
#[validate]
3741
pub education: Vec<Education>,
42+
#[validate]
3843
pub awards: Vec<Award>,
44+
#[validate]
3945
pub certificates: Vec<Certificate>,
46+
#[validate]
4047
pub publications: Vec<Publication>,
48+
#[validate]
4149
pub skills: Vec<Skill>,
50+
#[validate]
4251
pub languages: Vec<Language>,
52+
#[validate]
4353
pub interests: Vec<Interest>,
54+
#[validate]
4455
pub references: Vec<Reference>,
56+
#[validate]
4557
pub projects: Vec<Project>,
4658
}
59+
60+
#[cfg(test)]
61+
mod tests {
62+
use super::*;
63+
use crate::resume::{Basics, Resume};
64+
65+
#[test]
66+
fn test_resume_validation() {
67+
let basics = Basics {
68+
name: Some("John Doe".to_string()),
69+
label: Some("Programmer".to_string()),
70+
image: Some("https://example.com/image.jpg".to_string()),
71+
email: Some("[email protected]".to_string()),
72+
phone: Some("+1234567890".to_string()),
73+
url: Some("https://johndoe.com".to_string()),
74+
summary: Some("A passionate developer.".to_string()),
75+
location: None,
76+
profiles: vec![],
77+
};
78+
79+
let resume = Resume {
80+
basics: Some(basics),
81+
work: vec![],
82+
volunteer: vec![],
83+
education: vec![],
84+
awards: vec![],
85+
certificates: vec![],
86+
publications: vec![],
87+
skills: vec![],
88+
languages: vec![],
89+
interests: vec![],
90+
references: vec![],
91+
projects: vec![],
92+
};
93+
94+
// Validate the resume. This will return Result<(), ValidationErrors>
95+
let result = resume.validate();
96+
assert!(
97+
result.is_ok(),
98+
"Resume validation failed: {:?}",
99+
result.err()
100+
);
101+
}
102+
103+
#[test]
104+
fn test_resume_validation_invalid() {
105+
let resume = Resume {
106+
basics: Some(Basics {
107+
name: Some("John Doe".to_string()),
108+
label: Some("Programmer".to_string()),
109+
image: Some("https://example.com/image.jpg".to_string()),
110+
email: Some("not-an-email".to_string()),
111+
phone: Some("+1234567890".to_string()),
112+
url: Some("https://johndoe.com".to_string()),
113+
summary: Some("A passionate developer.".to_string()),
114+
location: None,
115+
profiles: vec![],
116+
}),
117+
work: vec![],
118+
volunteer: vec![],
119+
education: vec![],
120+
awards: vec![],
121+
certificates: vec![],
122+
publications: vec![],
123+
skills: vec![],
124+
languages: vec![],
125+
interests: vec![],
126+
references: vec![],
127+
projects: vec![],
128+
};
129+
130+
let result = resume.validate();
131+
assert!(result.is_err(), "Resume validation should fail");
132+
}
133+
}

src/resume/interest.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use serde::{Deserialize, Serialize};
2+
use serde_valid::Validate;
23

3-
#[derive(Debug, Serialize, Deserialize)]
4+
#[derive(Debug, Serialize, Deserialize, Validate)]
45
pub struct Interest {
56
pub name: Option<String>,
67
pub keywords: Vec<String>,

src/resume/language.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use serde::{Deserialize, Serialize};
2+
use serde_valid::Validate;
23

3-
#[derive(Debug, Serialize, Deserialize)]
4+
#[derive(Debug, Serialize, Deserialize, Validate)]
45
pub struct Language {
56
pub language: Option<String>,
67
pub fluency: Option<String>,

src/resume/reference.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use serde::{Deserialize, Serialize};
2+
use serde_valid::Validate;
23

3-
#[derive(Debug, Serialize, Deserialize)]
4+
#[derive(Debug, Serialize, Deserialize, Validate)]
45
pub struct Reference {
56
pub name: Option<String>,
67
pub reference: Option<String>,

src/resume/skill.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use serde::{Deserialize, Serialize};
2+
use serde_valid::Validate;
23

3-
#[derive(Debug, Serialize, Deserialize)]
4+
#[derive(Debug, Serialize, Deserialize, Validate)]
45
pub struct Skill {
56
pub name: Option<String>,
67
pub level: Option<String>,

0 commit comments

Comments
 (0)