[wip] unit tests for sharry module
- makeover for `json` module
This commit is contained in:
parent
d891e6d1c4
commit
ad1854dfb8
2 changed files with 75 additions and 22 deletions
|
|
@ -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]
|
||||||
|
|
|
||||||
|
|
@ -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 human‐readable 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
|
||||||
|
"Bob’s 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue