import static java.time.LocalDateTime.of;
import static java.util.Optional.empty;
import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.hamcrest.Matchers.*;
import static org.jsoup.Jsoup.parse;
/**
public void moviesAreLocated() throws IOException {
assertThat(movies, containsInAnyOrder(
movie("All of Us Strangers", "https://cdn.premiumkino.de/movie/2809/db0e5c3ed02ba7fe4afa3b12aabb611f.jpg",
+ allOf(startsWith("Sich neu verlieben, durch eine Zeitschleife"), endsWith("Quelle: disney-content.de")),
performance(of(2024, 2, 9, 16, 15), "2D OV", "https://savoy.premiumkino.de/vorstellung/all-of-us-strangers/20240209/1615/HkKdhlHMvtfSMy1fqYYtYuVdgGIKtnT7i7ddY5jzRfY~"),
performance(of(2024, 2, 10, 22, 15), "2D OV", "https://savoy.premiumkino.de/vorstellung/all-of-us-strangers/20240210/2215/znWqm8FQUNSbrODY_A0jw8Au2nW6uSqbFE7Co8UgQv0~"),
performance(of(2024, 2, 11, 20, 15), "2D OV", "https://savoy.premiumkino.de/vorstellung/all-of-us-strangers/20240211/2015/I642oTHBKpy7sz2RULHIQK6cykSCPi57_c0TApiKbUk~"),
performance(of(2024, 2, 14, 14, 30), "2D OV", "https://savoy.premiumkino.de/vorstellung/all-of-us-strangers/20240214/1430/VZhgxh4PZutWWlLPEAe9dfOUJkB3sLnXzWoduICJYTk~")
),
movie("Dune", "https://cdn.premiumkino.de/movie/3261/bcc70cb1cc4559731b6fd547d0f5cee1.jpg",
+ allOf(startsWith(""Dune" erzählt die packende Geschichte"), endsWith("Quelle: mediapass.warnerbros.com")),
performance(of(2024, 2, 9, 19, 0), "2D OV", "https://savoy.premiumkino.de/vorstellung/dune/20240209/1900/o9jDuan4yyxaW7-Jg3hCJpiAM4CLZei8J2IX-O5-hA0~"),
performance(of(2024, 2, 10, 15, 30), "2D OV", "https://savoy.premiumkino.de/vorstellung/dune/20240210/1530/jXbZnYD8R5djVnj3Ojjcsc9qdSJ0JBMVhn7PeP88HyY~"),
performance(of(2024, 2, 11, 13, 30), "2D OV", "https://savoy.premiumkino.de/vorstellung/dune/20240211/1330/aJmlM8wOaGl_jtuWDvWG9TF7RR1zRpNrSZeArCBhn90~"),
performance(of(2024, 2, 13, 17, 0), "2D OV", "https://savoy.premiumkino.de/vorstellung/dune/20240213/1700/QCphOtH-WrZ2tRbENwaxXPskrN2gH3I8dHR0Y5L3l0Y~")
),
movie("SAVOY Sneak-Preview", "https://cdn.premiumkino.de/movie/5617/33dc4c74b4cca5cf4585b4cadfc38ec4.png",
+ allOf(startsWith("Wir zeigen unsere OV-Sneak freitagabends"), endsWith("Logenpreis 1,- Euro Ermäßigung. ")),
performance(of(2024, 2, 9, 22, 30), "2D OV", "https://savoy.premiumkino.de/vorstellung/sneak-preview/20240209/2230/GtYBcOR_Jy7a8xDxwwPHI0wfY_v_Ep2P6rV0w4wJ7SM~"),
performance(of(2024, 2, 16, 22, 0), "2D OV", "https://savoy.premiumkino.de/vorstellung/sneak-preview/20240216/2200/ZRC7iir9Hu8nIpH1PsiA_UDvckcj7yGqgMEYXHAs9Qw~")
),
@SafeVarargs
private Matcher<Movie> movie(String name, String imageUrl, Triple<LocalDateTime, String, String>... presentationTimesTypesAndLinks) {
+ return movie(name, imageUrl, anything(), presentationTimesTypesAndLinks);
+ }
+
+ @SafeVarargs
+ private Matcher<Movie> movie(String name, String imageUrl, Matcher<? super String> descriptionMatcher, Triple<LocalDateTime, String, String>... presentationTimesTypesAndLinks) {
return new TypeSafeDiagnosingMatcher<Movie>() {
@Override
protected boolean matchesSafely(Movie movie, Description mismatchDescription) {
mismatchDescription.appendText("image URL is ").appendValue(movie.getImageUrl());
return false;
}
+ if (!descriptionMatcher.matches(movie.getDescription())) {
+ descriptionMatcher.describeMismatch(movie.getDescription(), mismatchDescription);
+ return false;
+ }
List<Performance> performances = new ArrayList<>(movie.getPerformances());
if (performances.size() != presentationTimesTypesAndLinks.length) {
mismatchDescription.appendText("has ").appendValue(performances.size()).appendText(" presentations");
@Override
public void describeTo(Description description) {
description.appendText("movie with name ").appendValue(name);
+ description.appendText(", description ").appendDescriptionOf(descriptionMatcher);
description.appendText(" and ").appendValue(presentationTimesTypesAndLinks.length).appendText(" presentations");
}
};
import org.hamcrest.Matchers.equalTo
import org.hamcrest.Matchers.not
import org.jsoup.Jsoup
+import org.jsoup.nodes.Element
import org.jsoup.nodes.TextNode
import org.junit.Test
import java.time.LocalDateTime
fun `summary contains date of earliest movie`() {
val movieState = MovieState(
setOf(
- Movie("1", "").apply { addPerformance(Performance(LocalDateTime.of(2024, 2, 12, 18, 45), "", "")) },
- Movie("2", "").apply { addPerformance(Performance(LocalDateTime.of(2024, 3, 12, 15, 30), "", "")) },
- Movie("3", "").apply { addPerformance(Performance(LocalDateTime.of(2024, 2, 11, 21, 15), "", "")) }
+ Movie("1", "", "").apply { addPerformance(Performance(LocalDateTime.of(2024, 2, 12, 18, 45), "", "")) },
+ Movie("2", "", "").apply { addPerformance(Performance(LocalDateTime.of(2024, 3, 12, 15, 30), "", "")) },
+ Movie("3", "", "").apply { addPerformance(Performance(LocalDateTime.of(2024, 2, 11, 21, 15), "", "")) }
), emptySet()
)
assertThat(movieState.output(Reaction("", null, null, null)).summary(), containsString("2024-02-11"))
@Test
fun `movie state with a new movie is triggered`() {
- assertThat(MovieState(emptySet(), setOf(Movie("1", ""))).triggered(), equalTo(true))
+ assertThat(MovieState(emptySet(), setOf(Movie("1", "", ""))).triggered(), equalTo(true))
}
@Test
@Test
fun `html output does contain a section for new movie if there are new movies`() {
- val movieState = MovieState(emptySet(), setOf(Movie("1", ""), Movie("2", "")))
+ val movieState = MovieState(emptySet(), setOf(Movie("1", "", ""), Movie("2", "", "")))
val output = movieState.output(Reaction("", null, null, null))
val document = Jsoup.parse(output.text("text/html"))
assertThat(document.select("section.new-movies"), not(empty()))
}
@Test
+ fun `new movies section contains description of movies`() {
+ val movieState = MovieState(emptySet(), setOf(Movie("1", "", "Movie 1 is cool."), Movie("2", "", "Movie 2 is bad.")))
+ val output = movieState.output(Reaction("", null, null, null))
+ val document = Jsoup.parse(output.text("text/html"))
+ assertThat(document.select("section.new-movies .description").map(Element::text), contains("Movie 1 is cool.", "Movie 2 is bad."))
+ }
+
+ @Test
fun `new movies section contains the titles of all new movies`() {
- val movieState = MovieState(emptySet(), setOf(Movie("New Movie", ""), Movie("Even Newer Movie", "")))
+ val movieState = MovieState(emptySet(), setOf(Movie("New Movie", "", ""), Movie("Even Newer Movie", "", "")))
val output = movieState.output(Reaction("", null, null, null))
val document = Jsoup.parse(output.text("text/html"))
assertThat(document.select("section.new-movies li.movie .name").textNodes().map(TextNode::text), containsInAnyOrder("New Movie", "Even Newer Movie"))
fun `html output contains a section for each day with a movie`() {
val movieState = MovieState(
setOf(
- movie("Movie 1", "", "20240212-1845", "20240213-1330", "20240214-1815"),
- movie("Movie 2", "", "20240212-2030", "20240213-1745", "20240214-1430"),
- movie("Movie 3", "", "20240213-2015", "20240214-1730"),
- movie("Movie 4", "", "20240216-1000"),
+ movie("Movie 1", "", "", "20240212-1845", "20240213-1330", "20240214-1815"),
+ movie("Movie 2", "", "", "20240212-2030", "20240213-1745", "20240214-1430"),
+ movie("Movie 3", "", "", "20240213-2015", "20240214-1730"),
+ movie("Movie 4", "", "", "20240216-1000"),
), emptySet()
)
val output = movieState.output(Reaction("", null, null, null))
fun `html output contains the correct movies within each day`() {
val movieState = MovieState(
setOf(
- movie("Movie 1", "https://cdn.premiumkino.de/movie/3047/81c49774d7828a898ae1d525ffd135af_w300.jpg", "20240212-1845", "20240213-1330", "20240214-1815"),
- movie("Movie 2", "https://cdn.premiumkino.de/movie/1066/aba09af737677ff6a15676ae588098b1_w300.jpg", "20240212-2030", "20240213-1745", "20240214-1430"),
- movie("Movie 3", "https://cdn.premiumkino.de/movie/7300/14d1b21dee51a82a7b096ca282bf01c8_w300.png", "20240213-2015", "20240214-1730"),
- movie("Movie 4", "https://cdn.premiumkino.de/movie/6080/cef2b33483d2898ddb472c955c58ea20_w300.jpg", "20240216-1000"),
+ movie("Movie 1", "https://cdn.premiumkino.de/movie/3047/81c49774d7828a898ae1d525ffd135af_w300.jpg", "", "20240212-1845", "20240213-1330", "20240214-1815"),
+ movie("Movie 2", "https://cdn.premiumkino.de/movie/1066/aba09af737677ff6a15676ae588098b1_w300.jpg", "", "20240212-2030", "20240213-1745", "20240214-1430"),
+ movie("Movie 3", "https://cdn.premiumkino.de/movie/7300/14d1b21dee51a82a7b096ca282bf01c8_w300.png", "", "20240213-2015", "20240214-1730"),
+ movie("Movie 4", "https://cdn.premiumkino.de/movie/6080/cef2b33483d2898ddb472c955c58ea20_w300.jpg", "", "20240216-1000"),
), setOf(
- movie("Movie 1", "https://cdn.premiumkino.de/movie/3047/81c49774d7828a898ae1d525ffd135af_w300.jpg", "20240212-1845", "20240213-1330", "20240214-1815"),
- movie("Movie 2", "https://cdn.premiumkino.de/movie/1066/aba09af737677ff6a15676ae588098b1_w300.jpg", "20240212-1845", "20240213-1330", "20240214-1815")
+ movie("Movie 1", "https://cdn.premiumkino.de/movie/3047/81c49774d7828a898ae1d525ffd135af_w300.jpg", "", "20240212-1845", "20240213-1330", "20240214-1815"),
+ movie("Movie 2", "https://cdn.premiumkino.de/movie/1066/aba09af737677ff6a15676ae588098b1_w300.jpg", "", "20240212-1845", "20240213-1330", "20240214-1815")
)
)
val output = movieState.output(Reaction("", null, null, null))
fun `html output contains the correct release type for movies`() {
val movieState = MovieState(
setOf(
- movie("Movie 1", "https://cdn.premiumkino.de/movie/3047/81c49774d7828a898ae1d525ffd135af_w300.jpg", "20240212-1845" to "2D OV", "20240213-1330" to "2D", "20240214-1815" to "2D OmeU"),
+ movie("Movie 1", "https://cdn.premiumkino.de/movie/3047/81c49774d7828a898ae1d525ffd135af_w300.jpg", "", "20240212-1845" to "2D OV", "20240213-1330" to "2D", "20240214-1815" to "2D OmeU"),
), setOf()
)
val output = movieState.output(Reaction("", null, null, null))
dateTimeString.substring(11..12).toInt(),
)
-private fun movie(name: String, imageUrl: String, vararg times: String) = Movie(name, imageUrl).apply {
+private fun movie(name: String, imageUrl: String, description: String = "", vararg times: String) = Movie(name, imageUrl, description).apply {
times.map(::dateTime).map { Performance(it, "", "https://link/$it") }.forEach(this::addPerformance)
}
-private fun movie(name: String, imageUrl: String, vararg timesAndTypes: Pair<String, String>) = Movie(name, imageUrl).apply {
+private fun movie(name: String, imageUrl: String, description: String = "", vararg timesAndTypes: Pair<String, String>) = Movie(name, imageUrl, description).apply {
timesAndTypes.map { Performance(it.first.let(::dateTime), it.second, "https://link/${it.first}") }.forEach(this::addPerformance)
}