feature/spoiler-flag (#25)
Some checks failed
CI / Check / Test (push) Has been cancelled

Reviewed-on: #25
This commit was merged in pull request #25.
This commit is contained in:
2026-10-25 18:52:11 +00:00
parent 9dd9df1f73
commit 4f3d99ec8e
66 changed files with 502 additions and 168 deletions

View File

@@ -30,6 +30,7 @@ fn review_to_ap_object_includes_two_hashtags() {
.unwrap(),
source: ReviewSource::Local,
watch_medium: None,
spoilers: false,
});
let obj = review_to_ap_object(
&review,
@@ -69,6 +70,7 @@ fn review_to_ap_object_has_public_addressing() {
.unwrap(),
source: ReviewSource::Local,
watch_medium: None,
spoilers: false,
});
let actor_url: url::Url = "https://example.com/users/abc".parse().unwrap();
let obj = review_to_ap_object(
@@ -87,6 +89,74 @@ fn review_to_ap_object_has_public_addressing() {
assert_eq!(obj.cc, vec!["https://example.com/users/abc/followers"]);
}
#[test]
fn review_to_ap_object_carries_spoiler_flag_and_summary() {
use chrono::NaiveDateTime;
use domain::{
models::{PersistedReview, Review, ReviewSource},
value_objects::{Comment, MovieId, Rating, ReviewId, UserId},
};
let ts = NaiveDateTime::parse_from_str("2024-06-01 00:00:00", "%Y-%m-%d %H:%M:%S").unwrap();
let review = Review::from_persistence(PersistedReview {
id: ReviewId::generate(),
movie_id: MovieId::from_uuid(uuid::Uuid::new_v4()),
user_id: UserId::from_uuid(uuid::Uuid::new_v4()),
rating: Rating::new(4).unwrap(),
comment: Some(Comment::new("the mentor is the villain".into()).unwrap()),
watched_at: ts,
created_at: ts,
source: ReviewSource::Local,
watch_medium: None,
spoilers: true,
});
let obj = review_to_ap_object(
&review,
ReviewApInput {
ap_id: "https://example.com/reviews/1".parse().unwrap(),
actor_url: "https://example.com/users/1".parse().unwrap(),
movie_title: "Dune".to_string(),
release_year: 2021,
external_metadata_id: None,
poster_url: None,
base_url: "https://example.com".to_string(),
},
);
assert!(obj.contains_spoilers);
assert_eq!(obj.summary.as_deref(), Some("Contains spoilers"));
let json = serde_json::to_value(&obj).unwrap();
assert_eq!(json["containsSpoilers"], serde_json::Value::Bool(true));
assert_eq!(json["summary"], "Contains spoilers");
// A flag without a comment never travels: there is nothing to veil.
let review_no_comment = Review::from_persistence(PersistedReview {
id: ReviewId::generate(),
movie_id: MovieId::from_uuid(uuid::Uuid::new_v4()),
user_id: UserId::from_uuid(uuid::Uuid::new_v4()),
rating: Rating::new(4).unwrap(),
comment: None,
watched_at: ts,
created_at: ts,
source: ReviewSource::Local,
watch_medium: None,
spoilers: true,
});
let obj2 = review_to_ap_object(
&review_no_comment,
ReviewApInput {
ap_id: "https://example.com/reviews/2".parse().unwrap(),
actor_url: "https://example.com/users/1".parse().unwrap(),
movie_title: "Dune".to_string(),
release_year: 2021,
external_metadata_id: None,
poster_url: None,
base_url: "https://example.com".to_string(),
},
);
assert!(!obj2.contains_spoilers);
assert!(obj2.summary.is_none());
}
#[test]
fn watchlist_to_ap_object_has_public_addressing() {
let actor_url: url::Url = "https://example.com/users/abc".parse().unwrap();