ee4b53bee094bea60cb650d061be4bd72293d44c
[rhynodge.git] / src / test / kotlin / net / pterodactylus / rhynodge / webpages / weather / WeatherTriggerTest.kt
1 package net.pterodactylus.rhynodge.webpages.weather
2
3 import net.pterodactylus.rhynodge.Reaction
4 import net.pterodactylus.rhynodge.State
5 import org.hamcrest.MatcherAssert.assertThat
6 import org.hamcrest.Matchers.`is`
7 import org.hamcrest.Matchers.containsString
8 import org.hamcrest.Matchers.not
9 import org.junit.Test
10 import org.mockito.Mockito.mock
11 import java.io.File
12 import java.time.ZoneId.of
13 import java.time.ZonedDateTime
14
15 /**
16  * Unit test for [WeatherTrigger].
17
18  * @author [David ‘Bombe’ Roden](mailto:bombe@pterodactylus.net)
19  */
20 class WeatherTriggerTest {
21
22     private val now = ZonedDateTime.now(of("Europe/Berlin"))
23     private val previousState = WeatherState("Weather", now.minusDays(1))
24     private val trigger = WeatherTrigger()
25
26     @Test
27     fun currentStateIsAlwaysReturned() {
28         val currentState = WeatherState("Weather", now)
29         assertThat(trigger.mergeStates(previousState, currentState), `is`(currentState as State))
30     }
31
32     @Test
33     fun triggerDoesNotTriggerIfStateHasNotChanged() {
34         val currentState = WeatherState("Weather", now.minusDays(1))
35         trigger.mergeStates(previousState, currentState)
36         assertThat(trigger.triggers(), `is`(false))
37     }
38
39     @Test
40     fun triggerDoesTriggerIfStateHasChanged() {
41         val currentState = WeatherState("Weather", now)
42         trigger.mergeStates(previousState, currentState)
43         assertThat(trigger.triggers(), `is`(true))
44     }
45
46     @Test
47     fun outputContainsCorrectSummary() {
48         val currentState = WeatherState("Weather", ZonedDateTime.of(2016, 5, 28, 0, 0, 0, 0, of("Europe/Berlin")))
49         trigger.mergeStates(previousState, currentState)
50         val reaction = mock(Reaction::class.java)
51         val output = trigger.output(reaction)
52         assertThat(output.summary(), `is`("The Weather (according to Weather) on May 28, 2016"))
53     }
54
55     @Test
56     fun outputContainsCorrectHourData() {
57         val currentState = WeatherState("Weather", ZonedDateTime.of(2016, 5, 28, 0, 0, 0, 0, of("Europe/Berlin")))
58         currentState += HourState(0, 10, 11, 0.12, 13.0, WindDirection.SOUTHSOUTHEAST, 14, 15, 0.16, "17", "http://18")
59         currentState += HourState(1, 20, 21, 0.22, 23.0, WindDirection.NORTHNORTHWEST, 24, 25, 0.26, "27", "http://28")
60         trigger.mergeStates(previousState, currentState)
61         val reaction = mock(Reaction::class.java)
62         val output = trigger.output(reaction)
63         val htmlText = output.text("text/html", -1)
64         File("/tmp/wetter.html").writer().use { it.write(htmlText) }
65         assertThat(htmlText, containsString("00:00"))
66         assertThat(htmlText, containsString("10 °C"))
67         assertThat(htmlText, containsString("(11 °C)"))
68         assertThat(htmlText, containsString("12%"))
69         assertThat(htmlText, containsString("13 l/m²"))
70         assertThat(htmlText, containsString("↖↑"))
71         assertThat(htmlText, containsString("14 km/h"))
72         assertThat(htmlText, containsString("15 km/h"))
73         assertThat(htmlText, containsString("16%"))
74         assertThat(htmlText, containsString("17"))
75         assertThat(htmlText, containsString("http://18"))
76         assertThat(htmlText, containsString("01:00"))
77         assertThat(htmlText, containsString("20 °C"))
78         assertThat(htmlText, containsString("(21 °C)"))
79         assertThat(htmlText, containsString("22%"))
80         assertThat(htmlText, containsString("23 l/m²"))
81         assertThat(htmlText, containsString("↘↓"))
82         assertThat(htmlText, containsString("24 km/h"))
83         assertThat(htmlText, containsString("25 km/h"))
84         assertThat(htmlText, containsString("26%"))
85         assertThat(htmlText, containsString("27"))
86         assertThat(htmlText, containsString("http://28"))
87     }
88
89     @Test
90     fun outputContainsColumnHeadersForAllColumns() {
91         val currentState = WeatherState("Weather", ZonedDateTime.of(2016, 5, 28, 0, 0, 0, 0, of("Europe/Berlin")))
92         currentState += HourState(0, 10, 11, 0.12, 13.0, WindDirection.SOUTHSOUTHEAST, 14, 15, 0.16, "17", "http://18")
93         currentState += HourState(1, 20, 21, 0.22, 23.0, WindDirection.NORTHNORTHWEST, 24, 25, 0.26, "27", "http://28")
94         trigger.mergeStates(previousState, currentState)
95         val reaction = mock(Reaction::class.java)
96         val output = trigger.output(reaction)
97         val htmlText = output.text("text/html", -1)
98         assertThat(htmlText, containsString("Time"))
99         assertThat(htmlText, containsString("Temperature"))
100         assertThat(htmlText, containsString("feels like"))
101         assertThat(htmlText, containsString("Chance of Rain"))
102         assertThat(htmlText, containsString("Amount"))
103         assertThat(htmlText, containsString("Wind from"))
104         assertThat(htmlText, containsString("Speed"))
105         assertThat(htmlText, containsString("Gusts"))
106         assertThat(htmlText, containsString("Humidity"))
107         assertThat(htmlText, containsString("Description"))
108         assertThat(htmlText, containsString("Image"))
109     }
110
111     @Test
112     fun outputDoesNotContainColumnHeadersForMissingColumns() {
113         val currentState = WeatherState("Weather", ZonedDateTime.of(2016, 5, 28, 0, 0, 0, 0, of("Europe/Berlin")))
114         currentState += HourState(0, 10, null, 0.12, 13.0, WindDirection.SOUTHSOUTHEAST, 14, null, null, "17", "http://18")
115         currentState += HourState(1, 20, null, 0.22, 23.0, WindDirection.NORTHNORTHWEST, 24, null, null, "27", "http://28")
116         trigger.mergeStates(previousState, currentState)
117         val reaction = mock(Reaction::class.java)
118         val output = trigger.output(reaction)
119         val htmlText = output.text("text/html", -1)
120         assertThat(htmlText, containsString("Time"))
121         assertThat(htmlText, containsString("Temperature"))
122         assertThat(htmlText, not(containsString("feels like")))
123         assertThat(htmlText, containsString("Chance of Rain"))
124         assertThat(htmlText, containsString("Amount"))
125         assertThat(htmlText, containsString("Wind from"))
126         assertThat(htmlText, containsString("Speed"))
127         assertThat(htmlText, not(containsString("Gusts")))
128         assertThat(htmlText, not(containsString("Humidity")))
129         assertThat(htmlText, containsString("Description"))
130         assertThat(htmlText, containsString("Image"))
131     }
132
133 }