050f68c314234bd388998e005d8c86b6ff92f5e6
[rhynodge.git] / src / test / java / net / pterodactylus / rhynodge / filters / ComicSiteFilterTest.java
1 package net.pterodactylus.rhynodge.filters;
2
3 import static com.google.common.base.Optional.fromNullable;
4 import static java.util.Arrays.asList;
5 import static org.hamcrest.MatcherAssert.assertThat;
6 import static org.hamcrest.Matchers.contains;
7 import static org.hamcrest.Matchers.hasSize;
8 import static org.hamcrest.Matchers.is;
9
10 import java.util.Collections;
11 import java.util.List;
12
13 import net.pterodactylus.rhynodge.State;
14 import net.pterodactylus.rhynodge.states.ComicState;
15 import net.pterodactylus.rhynodge.states.ComicState.Comic;
16 import net.pterodactylus.rhynodge.states.ComicState.Strip;
17 import net.pterodactylus.rhynodge.states.FailedState;
18 import net.pterodactylus.rhynodge.states.HtmlState;
19
20 import com.google.common.base.Optional;
21 import org.jsoup.nodes.Document;
22 import org.junit.Test;
23
24 /**
25  * Unit test for {@link ComicSiteFilter}.
26  *
27  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
28  */
29 public class ComicSiteFilterTest {
30
31         @Test(expected = IllegalArgumentException.class)
32         public void comicSiteFilterRequiresHtmlState() {
33                 State state = new FailedState();
34                 ComicSiteFilter comicSiteFilter = new TestComicSiteFilter(null, null, null);
35                 comicSiteFilter.filter(state);
36         }
37
38         @Test
39         public void htmlWithoutTitleIsNotRecognizedAsComic() {
40                 State state = new HtmlState("http://foo/", null);
41                 ComicSiteFilter comicSiteFilter = new TestComicSiteFilter(null, null, null);
42                 State newState = comicSiteFilter.filter(state);
43                 assertThat(newState.success(), is(false));
44         }
45
46         @Test
47         public void htmlWithTitleButWithoutImagesIsNotRecognizedAsComic() {
48                 State state = new HtmlState("http://foo/", null);
49                 ComicSiteFilter comicSiteFilter = new TestComicSiteFilter("Title", Collections.<String>emptyList(), null);
50                 State newState = comicSiteFilter.filter(state);
51                 assertThat(newState.success(), is(false));
52         }
53
54         @Test
55         public void everyUrlGetAStrip() {
56                 State state = new HtmlState("http://foo/", null);
57                 ComicSiteFilter comicSiteFilter = new TestComicSiteFilter("Title", asList("url1.gif", "url2.gif", "url3.gif"), asList("Comment 1", "Comment 2"));
58                 State newState = comicSiteFilter.filter(state);
59                 assertThat(newState instanceof ComicState, is(true));
60                 ComicState comicState = (ComicState) newState;
61                 assertThat(comicState.comics(), hasSize(1));
62                 Comic comic = comicState.comics().get(0);
63                 assertThat(comic.strips(), contains(new Strip("http://foo/url1.gif", "Comment 1"), new Strip("http://foo/url2.gif", "Comment 2"), new Strip("http://foo/url3.gif", "")));
64         }
65
66         @Test(expected = IllegalStateException.class)
67         public void illegalUrlThrowsException() {
68                 State state = new HtmlState("http://foo/^", null);
69                 ComicSiteFilter comicSiteFilter = new TestComicSiteFilter("Title", asList("url1.gif"), Collections.<String>emptyList());
70                 comicSiteFilter.filter(state);
71         }
72
73         private static class TestComicSiteFilter extends ComicSiteFilter {
74
75                 private final String title;
76                 private final List<String> urls;
77                 private final List<String> comments;
78
79                 public TestComicSiteFilter(String title, List<String> urls, List<String> comments) {
80                         this.title = title;
81                         this.urls = urls;
82                         this.comments = comments;
83                 }
84
85                 @Override
86                 protected Optional<String> extractTitle(Document document) {
87                         return fromNullable(title);
88                 }
89
90                 @Override
91                 protected List<String> extractImageUrls(Document document) {
92                         return urls;
93                 }
94
95                 @Override
96                 protected List<String> extractImageComments(Document document) {
97                         return comments;
98                 }
99
100         }
101
102 }