Drop bootstrap dev-dep. Extractor + api handler + app-context tests (need full AppState via build_deps) -> bootstrap/tests/http_handlers/. forms tests -> http-axum/tests/log_review_form_test.rs. Federation collection tests now go through public federation::html_routes(). Kept inline (private fns): api/social social_actor_to_dto (4), federation/blocklist_api social_actor_to_blocked_dto (1), html/social social_actor_to_template (1), router slow_down/api_governor (2).
121 lines
3.5 KiB
Rust
121 lines
3.5 KiB
Rust
use api_types::{DiaryQueryParams, LogReviewRequest};
|
|
use http_axum::html::forms::{LogReviewData, LogReviewForm, to_diary_query};
|
|
|
|
fn make_form(watched_at: &str) -> LogReviewForm {
|
|
LogReviewForm {
|
|
external_metadata_id: None,
|
|
manual_title: None,
|
|
manual_release_year: None,
|
|
manual_director: None,
|
|
rating: 4,
|
|
comment: None,
|
|
watched_at: watched_at.to_string(),
|
|
watch_medium: None,
|
|
spoilers: false,
|
|
csrf_token: String::new(),
|
|
}
|
|
}
|
|
|
|
fn make_request(watched_at: &str) -> LogReviewRequest {
|
|
LogReviewRequest {
|
|
external_metadata_id: None,
|
|
manual_title: None,
|
|
manual_release_year: None,
|
|
manual_director: None,
|
|
rating: 4,
|
|
comment: None,
|
|
watched_at: watched_at.to_string(),
|
|
watch_medium: None,
|
|
spoilers: false,
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn form_accepts_datetime_with_seconds() {
|
|
let data = LogReviewData::try_from(make_form("2024-03-15T20:30:00")).unwrap();
|
|
assert_eq!(data.watched_at.format("%H:%M:%S").to_string(), "20:30:00");
|
|
}
|
|
|
|
#[test]
|
|
fn form_accepts_datetime_without_seconds() {
|
|
let data = LogReviewData::try_from(make_form("2024-03-15T20:30")).unwrap();
|
|
assert_eq!(data.watched_at.format("%H:%M").to_string(), "20:30");
|
|
}
|
|
|
|
#[test]
|
|
fn form_rejects_invalid_datetime() {
|
|
assert!(LogReviewData::try_from(make_form("not-a-date")).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn api_accepts_datetime_with_seconds() {
|
|
let data = LogReviewData::try_from(make_request("2024-03-15T20:30:00")).unwrap();
|
|
assert_eq!(data.watched_at.format("%H:%M:%S").to_string(), "20:30:00");
|
|
}
|
|
|
|
#[test]
|
|
fn api_accepts_datetime_without_seconds() {
|
|
let data = LogReviewData::try_from(make_request("2024-03-15T20:30")).unwrap();
|
|
assert_eq!(data.watched_at.format("%H:%M").to_string(), "20:30");
|
|
}
|
|
|
|
#[test]
|
|
fn api_rejects_invalid_datetime() {
|
|
assert!(LogReviewData::try_from(make_request("garbage")).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn whitespace_external_id_becomes_none_in_form() {
|
|
let mut form = make_form("2024-03-15T20:30:00");
|
|
form.external_metadata_id = Some(" ".to_string());
|
|
let data = LogReviewData::try_from(form).unwrap();
|
|
assert!(data.external_metadata_id.is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn whitespace_external_id_becomes_none_in_request() {
|
|
let mut req = make_request("2024-03-15T20:30:00");
|
|
req.external_metadata_id = Some(" ".to_string());
|
|
let data = LogReviewData::try_from(req).unwrap();
|
|
assert!(data.external_metadata_id.is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn sort_by_asc_string_becomes_ascending() {
|
|
let params = DiaryQueryParams {
|
|
sort_by: Some("asc".to_string()),
|
|
limit: None,
|
|
offset: None,
|
|
movie_id: None,
|
|
user_id: None,
|
|
};
|
|
let query = to_diary_query(params);
|
|
assert!(matches!(
|
|
query.sort_by,
|
|
Some(domain::models::ReviewSortBy::Ascending)
|
|
));
|
|
}
|
|
|
|
#[test]
|
|
fn sort_by_other_string_becomes_descending() {
|
|
let params = DiaryQueryParams {
|
|
sort_by: Some("desc".to_string()),
|
|
limit: None,
|
|
offset: None,
|
|
movie_id: None,
|
|
user_id: None,
|
|
};
|
|
let query = to_diary_query(params);
|
|
assert!(matches!(
|
|
query.sort_by,
|
|
Some(domain::models::ReviewSortBy::Descending)
|
|
));
|
|
}
|
|
|
|
#[test]
|
|
fn form_accepts_date_only() {
|
|
let data = LogReviewData::try_from(make_form("2024-03-15")).unwrap();
|
|
assert_eq!(data.watched_at.format("%H:%M:%S").to_string(), "00:00:00");
|
|
assert_eq!(data.watched_at.format("%Y-%m-%d").to_string(), "2024-03-15");
|
|
}
|