1 package net.pterodactylus.rhynodge.webpages.weather
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
10 import org.mockito.Mockito.mock
12 import java.time.ZoneId.of
13 import java.time.ZonedDateTime
16 * Unit test for [WeatherTrigger].
18 * @author [David ‘Bombe’ Roden](mailto:bombe@pterodactylus.net)
20 class WeatherTriggerTest {
22 private val now = ZonedDateTime.now(of("Europe/Berlin"))
23 private val previousState = WeatherState("Weather", now.minusDays(1))
24 private val trigger = WeatherTrigger()
27 fun currentStateIsAlwaysReturned() {
28 val currentState = WeatherState("Weather", now)
29 assertThat(trigger.mergeStates(previousState, currentState), `is`(currentState as State))
33 fun triggerDoesNotTriggerIfStateHasNotChanged() {
34 val currentState = WeatherState("Weather", now.minusDays(1))
35 trigger.mergeStates(previousState, currentState)
36 assertThat(trigger.triggers(), `is`(false))
40 fun triggerDoesTriggerIfStateHasChanged() {
41 val currentState = WeatherState("Weather", now)
42 trigger.mergeStates(previousState, currentState)
43 assertThat(trigger.triggers(), `is`(true))
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"))
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"))
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"))
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"))