Authors can flag a review's comment as containing spoilers; the comment is blurred behind a reveal control for every viewer except the author, omitted from RSS, and federates as containsSpoilers plus an AP summary content warning (ADR-0011) so Mastodon-class clients also collapse it. Flag follows the general-edit path (ADR-0001) across domain, both DB backends, REST, HTML templates, SPA (shadcn), TUI fixtures, and exports.
100 lines
2.8 KiB
Rust
100 lines
2.8 KiB
Rust
use chrono::NaiveDateTime;
|
|
|
|
use crate::value_objects::{Comment, MovieId, Rating, UserId, WatchMedium};
|
|
|
|
use super::*;
|
|
|
|
fn make_review(watch_medium: Option<WatchMedium>) -> Review {
|
|
Review::new(
|
|
MovieId::generate(),
|
|
UserId::generate(),
|
|
Rating::new(4).unwrap(),
|
|
Some(Comment::new("great film".into()).unwrap()),
|
|
NaiveDateTime::parse_from_str("2024-06-15 20:00:00", "%Y-%m-%d %H:%M:%S").unwrap(),
|
|
watch_medium,
|
|
false,
|
|
)
|
|
.unwrap()
|
|
}
|
|
|
|
#[test]
|
|
fn new_review_stores_watch_medium() {
|
|
let review = make_review(Some(WatchMedium::Cinema));
|
|
assert_eq!(review.watch_medium(), Some(&WatchMedium::Cinema));
|
|
}
|
|
|
|
#[test]
|
|
fn new_review_without_medium() {
|
|
let review = make_review(None);
|
|
assert_eq!(review.watch_medium(), None);
|
|
}
|
|
|
|
#[test]
|
|
fn apply_edit_updates_rating_only() {
|
|
let original = make_review(Some(WatchMedium::Streaming));
|
|
let edited = original.apply_edit(ReviewEdit {
|
|
rating: Some(Rating::new(2).unwrap()),
|
|
..Default::default()
|
|
});
|
|
assert_eq!(edited.rating().value(), 2);
|
|
assert_eq!(edited.comment().unwrap().value(), "great film");
|
|
assert_eq!(edited.watch_medium(), Some(&WatchMedium::Streaming));
|
|
}
|
|
|
|
#[test]
|
|
fn apply_edit_clears_comment() {
|
|
let original = make_review(None);
|
|
let edited = original.apply_edit(ReviewEdit {
|
|
comment: Some(None),
|
|
..Default::default()
|
|
});
|
|
assert!(edited.comment().is_none());
|
|
assert_eq!(edited.rating().value(), 4);
|
|
}
|
|
|
|
#[test]
|
|
fn apply_edit_sets_watch_medium() {
|
|
let original = make_review(None);
|
|
let edited = original.apply_edit(ReviewEdit {
|
|
watch_medium: Some(Some(WatchMedium::Cinema)),
|
|
..Default::default()
|
|
});
|
|
assert_eq!(edited.watch_medium(), Some(&WatchMedium::Cinema));
|
|
}
|
|
|
|
#[test]
|
|
fn apply_edit_clears_watch_medium() {
|
|
let original = make_review(Some(WatchMedium::Cinema));
|
|
let edited = original.apply_edit(ReviewEdit {
|
|
watch_medium: Some(None),
|
|
..Default::default()
|
|
});
|
|
assert_eq!(edited.watch_medium(), None);
|
|
}
|
|
|
|
#[test]
|
|
fn apply_edit_toggles_spoilers() {
|
|
let original = make_review(None);
|
|
let flag_on = original.apply_edit(ReviewEdit {
|
|
spoilers: Some(true),
|
|
..Default::default()
|
|
});
|
|
assert!(flag_on.spoilers());
|
|
let flag_off = flag_on.apply_edit(ReviewEdit {
|
|
spoilers: Some(false),
|
|
..Default::default()
|
|
});
|
|
assert!(!flag_off.spoilers());
|
|
let untouched = original.apply_edit(ReviewEdit::default());
|
|
assert!(!untouched.spoilers());
|
|
}
|
|
|
|
#[test]
|
|
fn apply_edit_no_changes_preserves_all() {
|
|
let original = make_review(Some(WatchMedium::TV));
|
|
let edited = original.apply_edit(ReviewEdit::default());
|
|
assert_eq!(edited.rating().value(), 4);
|
|
assert_eq!(edited.comment().unwrap().value(), "great film");
|
|
assert_eq!(edited.watch_medium(), Some(&WatchMedium::TV));
|
|
}
|