use super::*;
use domain::models::{Movie, Review};
use domain::value_objects::{Comment, MovieTitle, Rating, ReleaseYear, UserId};
fn channel<'a>(title: &'a str) -> FeedChannel<'a> {
FeedChannel {
title,
link_path: "/users/abc",
self_path: "/users/abc/feed.rss",
}
}
fn entry(spoilers: bool) -> DiaryEntry {
let movie = Movie::new(
None,
MovieTitle::new("Blade Runner".into()).unwrap(),
ReleaseYear::new(1982).unwrap(),
None,
None,
);
let review = Review::new(
movie.id().clone(),
UserId::generate(),
Rating::new(4).unwrap(),
Some(Comment::new("replicants".into()).unwrap()),
chrono::Utc::now().naive_utc(),
None,
spoilers,
)
.unwrap();
DiaryEntry::new(movie, review)
}
#[test]
fn render_feed_uses_provided_title() {
let adapter = RssAdapter::new("http://example.com".into());
let xml = adapter.render_feed(&[], &channel("Custom Title")).unwrap();
assert!(xml.contains("
Custom Title"));
}
#[test]
fn render_feed_empty_entries_produces_valid_xml() {
let adapter = RssAdapter::new("http://example.com".into());
let xml = adapter.render_feed(&[], &channel("My Feed")).unwrap();
assert!(xml.starts_with("http://example.com/users/abc"));
assert!(xml.contains(r#"xmlns:atom="http://www.w3.org/2005/Atom""#));
assert!(xml.contains(r#"href="http://example.com/users/abc/feed.rss""#));
assert!(xml.contains(r#"rel="self""#));
assert!(xml.contains("en"));
}
#[test]
fn item_links_to_absolute_movie_page() {
let adapter = RssAdapter::new("http://example.com".into());
let e = entry(false);
let xml = adapter.render_feed(&[e.clone()], &channel("Feed")).unwrap();
let expected = format!(
"http://example.com/movies/{}",
e.movie().id().value()
);
assert!(xml.contains(&expected), "{xml}");
}
#[test]
fn spoiler_comment_is_omitted() {
let adapter = RssAdapter::new("http://example.com".into());
let xml = adapter
.render_feed(&[entry(true)], &channel("Feed"))
.unwrap();
assert!(xml.contains("contains spoilers"));
assert!(!xml.contains("replicants"));
}