From 432f65ce0776883d7214005a9320dcc24b45aa8b Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20=E2=80=98Bombe=E2=80=99=20Roden?= Date: Mon, 20 Apr 2026 16:09:40 +0200 Subject: [PATCH] =?utf8?q?=F0=9F=9A=A7=20Add=20state=20for=20vacation=20ho?= =?utf8?q?mes?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../webpages/dasenbrook/VacationHomeState.kt | 46 ++++++++++++++++++++++ .../webpages/dasenbrook/VacationHomeStateTest.kt | 34 ++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/dasenbrook/VacationHomeState.kt create mode 100644 src/test/kotlin/net/pterodactylus/rhynodge/filters/webpages/dasenbrook/VacationHomeStateTest.kt 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 index 0000000..bbe1c35 --- /dev/null +++ b/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/dasenbrook/VacationHomeState.kt @@ -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) : 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 index 0000000..db2857c --- /dev/null +++ b/src/test/kotlin/net/pterodactylus/rhynodge/filters/webpages/dasenbrook/VacationHomeStateTest.kt @@ -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)), +)) -- 2.7.4