🚧 Add state for vacation homes
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Mon, 20 Apr 2026 14:09:40 +0000 (16:09 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Mon, 20 Apr 2026 14:09:40 +0000 (16:09 +0200)
src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/dasenbrook/VacationHomeState.kt [new file with mode: 0644]
src/test/kotlin/net/pterodactylus/rhynodge/filters/webpages/dasenbrook/VacationHomeStateTest.kt [new file with mode: 0644]

diff --git a/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/dasenbrook/VacationHomeState.kt b/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/dasenbrook/VacationHomeState.kt
new file mode 100644 (file)
index 0000000..bbe1c35
--- /dev/null
@@ -0,0 +1,46 @@
+package net.pterodactylus.rhynodge.filters.webpages.dasenbrook
+
+import java.time.LocalDate
+import java.time.format.DateTimeFormatter
+import java.time.format.FormatStyle
+import java.util.Locale
+import kotlinx.html.body
+import kotlinx.html.dom.createHTMLDocument
+import kotlinx.html.dom.serialize
+import kotlinx.html.h1
+import kotlinx.html.head
+import kotlinx.html.html
+import kotlinx.html.li
+import kotlinx.html.ol
+import kotlinx.html.title
+import net.pterodactylus.rhynodge.states.AbstractState
+
+data class VacationHomeState(val home: String, val vacancies: List<Vacancy>) : AbstractState(true) {
+
+       public override fun plainText() = """
+Vakanzen von $home:
+
+${vacancies.joinToString("\n") { (begin, end, length) -> "${begin.toGermanDate()} bis ${end.toGermanDate()} ($length Tage)" }}
+""".trimIndent()
+
+       public override fun htmlText() = createHTMLDocument().html {
+               head {
+                       title { text("Vakanzen von $home") }
+               }
+               body {
+                       h1 { text("Vakanzen von $home") }
+                       ol {
+                               vacancies.forEach {
+                                       li {
+                                               text("${it.begin.toGermanDate()} bis ${it.end.toGermanDate()} (${it.length} Tage)")
+                                       }
+                               }
+                       }
+               }
+       }.serialize()
+}
+
+data class Vacancy(val begin: LocalDate, val end: LocalDate, val length: Int = begin.datesUntil(end).count().toInt())
+
+private fun LocalDate.toGermanDate() =
+       format(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).localizedBy(Locale.GERMAN))
diff --git a/src/test/kotlin/net/pterodactylus/rhynodge/filters/webpages/dasenbrook/VacationHomeStateTest.kt b/src/test/kotlin/net/pterodactylus/rhynodge/filters/webpages/dasenbrook/VacationHomeStateTest.kt
new file mode 100644 (file)
index 0000000..db2857c
--- /dev/null
@@ -0,0 +1,34 @@
+package net.pterodactylus.rhynodge.filters.webpages.dasenbrook
+
+import java.time.LocalDate
+import java.time.Month.APRIL
+import java.time.Month.MAY
+import org.hamcrest.MatcherAssert.assertThat
+import org.hamcrest.Matchers.contains
+import org.hamcrest.Matchers.equalTo
+import org.jsoup.Jsoup
+import org.junit.jupiter.api.Test
+
+class VacationHomeStateTest {
+
+       @Test
+       fun `plain text shows list of vacancies`() {
+               assertThat(vacationHomeState.plainText(), equalTo("Vakanzen von Test Home:\n\nMontag, 20. April 2026 bis Samstag, 25. April 2026 (5 Tage)\nFreitag, 15. Mai 2026 bis Freitag, 22. Mai 2026 (7 Tage)"))
+       }
+
+       @Test
+       fun `html text shows list of vacancies`() {
+               val document = Jsoup.parse(vacationHomeState.htmlText())
+               assertThat(document.select("h1").text(), equalTo("Vakanzen von Test Home"))
+               assertThat(document.select("li").eachText(), contains(
+                       "Montag, 20. April 2026 bis Samstag, 25. April 2026 (5 Tage)",
+                       "Freitag, 15. Mai 2026 bis Freitag, 22. Mai 2026 (7 Tage)"
+               ))
+       }
+
+}
+
+private val vacationHomeState = VacationHomeState("Test Home", listOf(
+       Vacancy(LocalDate.of(2026, APRIL, 20), LocalDate.of(2026, APRIL, 25)),
+       Vacancy(LocalDate.of(2026, MAY, 15), LocalDate.of(2026, MAY, 22)),
+))