[wip] unit tests for sharry module

- makeover for `json` module
This commit is contained in:
Jörn-Michael Miehe 2025-07-02 11:39:49 +00:00
parent d891e6d1c4
commit ad1854dfb8
2 changed files with 75 additions and 22 deletions

View file

@ -136,7 +136,8 @@ impl Cli {
#[must_use] #[must_use]
pub fn get_share_request(&self) -> NewShareRequest { pub fn get_share_request(&self) -> NewShareRequest {
NewShareRequest::new(&self.share_name, self.description.as_ref(), self.max_views) NewShareRequest::new(&self.share_name, self.max_views)
.description(self.description.as_ref())
} }
#[must_use] #[must_use]

View file

@ -1,31 +1,41 @@
#![allow(non_snake_case)]
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
/// Request Body sent to the Sharry API for creating a new share
///
/// - impl `Serialize` to send in a HTTP request
#[derive(Serialize, Debug)] #[derive(Serialize, Debug)]
pub struct NewShareRequest { pub struct NewShareRequest {
name: String, name: String,
validity: u32, validity: u32,
description: Option<String>, description: Option<String>,
maxViews: u32, #[serde(rename = "maxViews")]
max_views: u32,
password: Option<String>, password: Option<String>,
} }
impl NewShareRequest { impl NewShareRequest {
pub fn new( pub fn new(name: impl Into<String>, max_views: u32) -> Self {
name: impl Into<String>,
description: Option<impl Into<String>>,
max_views: u32,
) -> Self {
Self { Self {
name: name.into(), name: name.into(),
// apparently, the "validity" param doesn't make any difference
validity: 0, validity: 0,
description: description.map(Into::into), description: None,
maxViews: max_views, max_views,
// new shares are private by default, setting a password doesn't really make sense
password: None, password: None,
} }
} }
/// set a humanreadable description
pub fn description(mut self, desc: Option<impl Into<String>>) -> Self {
self.description = desc.map(Into::into);
self
}
} }
/// Request Body received from the Sharry API when creating a new share
///
/// - impl `Deserialize` to parse from a HTTP request
#[derive(Deserialize, Debug)] #[derive(Deserialize, Debug)]
pub struct NewShareResponse { pub struct NewShareResponse {
pub success: bool, pub success: bool,
@ -33,6 +43,9 @@ pub struct NewShareResponse {
pub id: String, pub id: String,
} }
/// Request Body received from the Sharry API when pinging a share's notification hook
///
/// - impl `Deserialize` to parse from a HTTP request
#[derive(Deserialize, Debug)] #[derive(Deserialize, Debug)]
#[allow(dead_code)] #[allow(dead_code)]
pub struct NotifyShareResponse { pub struct NotifyShareResponse {
@ -46,22 +59,61 @@ mod tests {
#[test] #[test]
fn nsreq_new_sets_fields_correctly() { fn nsreq_new_sets_fields_correctly() {
let name = "myname"; let cases: Vec<(&str, u32)> = vec![
let desc = "desc"; // simple ASCII name, small view count
let views = 7; ("alice", 1),
// underscores, mid-range views
("bob_smith", 10),
// unicode in the name
("漢字ユーザー", 5),
// empty name edge case
("", 3),
// zero views
("charlie", 0),
// very large view count
("delta", u32::MAX),
// name with spaces and punctuation
("user name!", 42),
// name with mixed case
("FooBar", 7),
];
let req = NewShareRequest::new(name, Some(desc), views); for (name, views) in cases {
let req = NewShareRequest::new(name, views);
assert_eq!(req.name, name); assert_eq!(req.name, name);
assert_eq!(req.validity, 0); assert_eq!(req.max_views, views);
assert_eq!(req.description.as_deref(), Some(desc));
assert_eq!(req.maxViews, views); // unset fields
assert!(req.password.is_none()); assert_eq!(req.validity, 0);
assert!(req.description.is_none());
assert!(req.password.is_none());
}
} }
#[test] #[test]
fn nsreq_new_allows_none_description() { fn nsreq_new_allows_setting_description() {
let req = NewShareRequest::new("whatever", None::<&str>, 0); let longstr = "y".repeat(256);
assert!(req.description.is_none());
let cases = vec![
// simple alphanumeric
"A simple test user",
// whitespace & punctuation
"Bobs description: loves Rust!",
// unicode
"日本語の説明",
// long string
longstr.as_str(),
// empty
"",
// only whitespace
" ",
];
for desc in cases {
let req = NewShareRequest::new("whatever", 0).description(Some(desc));
assert!(req.description.is_some());
assert_eq!(req.description.unwrap(), desc);
}
} }
} }