diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1182c84..0e14aef 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -17,6 +17,7 @@ dependencies { implementation("com.fasterxml.jackson.module:jackson-module-kotlin") testImplementation(kotlin("test")) testImplementation("io.mockk:mockk:1.4.1") + testImplementation("org.mockito:mockito-core:5.11.0") } tasks.test { diff --git a/app/src/main/kotlin/DataUnavailableException.kt b/app/src/main/kotlin/DataUnavailableException.kt new file mode 100644 index 0000000..8e57e6b --- /dev/null +++ b/app/src/main/kotlin/DataUnavailableException.kt @@ -0,0 +1,4 @@ +package hu.vanio.kotlin.feladat.ms + +class DataUnavailableException(message: String): Exception(message) { +} \ No newline at end of file diff --git a/app/src/main/kotlin/DayWithTemperature.kt b/app/src/main/kotlin/DayWithTemperature.kt new file mode 100644 index 0000000..46280a9 --- /dev/null +++ b/app/src/main/kotlin/DayWithTemperature.kt @@ -0,0 +1,3 @@ +package hu.vanio.kotlin.feladat.ms + +class DayWithTemperature (val day: Int, val temp: Double){ } \ No newline at end of file diff --git a/app/src/main/kotlin/HourlyData.kt b/app/src/main/kotlin/HourlyData.kt new file mode 100644 index 0000000..85a94a5 --- /dev/null +++ b/app/src/main/kotlin/HourlyData.kt @@ -0,0 +1,6 @@ +package hu.vanio.kotlin.feladat.ms + +import java.time.LocalDateTime + + +data class HourlyData(val time: Array, val temperature_2m: Array) diff --git a/app/src/main/kotlin/HourlyUnits.kt b/app/src/main/kotlin/HourlyUnits.kt new file mode 100644 index 0000000..f68ba04 --- /dev/null +++ b/app/src/main/kotlin/HourlyUnits.kt @@ -0,0 +1,3 @@ +package hu.vanio.kotlin.feladat.ms + +data class HourlyUnits(val time: String, val temperature_2m: String) diff --git a/app/src/main/kotlin/WeatherApp.kt b/app/src/main/kotlin/WeatherApp.kt index e0c098a..36a28d4 100644 --- a/app/src/main/kotlin/WeatherApp.kt +++ b/app/src/main/kotlin/WeatherApp.kt @@ -1,12 +1,55 @@ package hu.vanio.kotlin.feladat.ms +import com.fasterxml.jackson.databind.SerializationFeature +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.readValue import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication +import java.net.URI +import java.net.http.HttpClient +import java.net.http.HttpRequest +import java.net.http.HttpResponse @SpringBootApplication -class WeatherApp +class WeatherApp { + fun calculateAvgTemp(getUrl: String): MutableMap { + val client = HttpClient.newBuilder().build(); + val request = HttpRequest.newBuilder() + .uri(URI.create(getUrl)) + .build(); + + val response = client.send(request, HttpResponse.BodyHandlers.ofString()); + if (response.statusCode() != 200) { + throw DataUnavailableException("Weather datas are unavailable! Response was: " + response.body()) + } + val mapper = jacksonObjectMapper() + mapper.registerModule(JavaTimeModule()); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + val weatherData: WeatherData = mapper.readValue(response.body()) + val times = weatherData.hourly.time.toList() + val temperatures = weatherData.hourly.temperature_2m.toList() + val dayWithTemperatures = mutableListOf() + for (i in times.indices) { + dayWithTemperatures.add(DayWithTemperature(times[i].dayOfMonth, temperatures[i].toDouble())) + } + + val daysWithTemperaturesMap = mutableMapOf() + dayWithTemperatures.forEach { + if (!daysWithTemperaturesMap.containsKey(it.day)) { + daysWithTemperaturesMap[it.day] = it.temp + } else { + daysWithTemperaturesMap[it.day] = daysWithTemperaturesMap[it.day]!! + it.temp + } + } + return daysWithTemperaturesMap + } +} fun main() { - runApplication() + val weatherApp = WeatherApp() + weatherApp.calculateAvgTemp("https://api.open-meteo.com/v1/forecast?latitude=47.4984&longitude=19.0404&hourly=temperature_2m&timezone=auto").forEach { + println("${it.key}: ${it.value/24}") + } } diff --git a/app/src/main/kotlin/WeatherData.kt b/app/src/main/kotlin/WeatherData.kt new file mode 100644 index 0000000..19a9e00 --- /dev/null +++ b/app/src/main/kotlin/WeatherData.kt @@ -0,0 +1,13 @@ +package hu.vanio.kotlin.feladat.ms + +data class WeatherData( + val latitude: Double, + val longitude: Double, + val generationtime_ms: Double, + val utc_offset_seconds: Int, + val timezone: String, + val timezone_abbreviation: String, + val elevation: Int, + val hourly_units: HourlyUnits, + val hourly: HourlyData + ) diff --git a/app/src/test/kotlin/WeatherAppTest.kt b/app/src/test/kotlin/WeatherAppTest.kt index a81a55a..bf3998d 100644 --- a/app/src/test/kotlin/WeatherAppTest.kt +++ b/app/src/test/kotlin/WeatherAppTest.kt @@ -1,11 +1,29 @@ package hu.vanio.kotlin.feladat.ms +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.assertThrows +import org.mockito.Mockito +import org.mockito.Mockito.verify import kotlin.test.Test +import kotlin.test.assertEquals class WeatherAppTest { @Test fun `sikeres lekerdezes`() { - TODO() + val mockWeatherApp = Mockito.mock(WeatherApp::class.java) + val daysWithTemperaturesMap = mutableMapOf() + daysWithTemperaturesMap[11] = 3.6 + daysWithTemperaturesMap[12] = 5.1 + Mockito.`when`(mockWeatherApp.calculateAvgTemp("https://goodURL.hu")).thenReturn(daysWithTemperaturesMap) + val result = mockWeatherApp.calculateAvgTemp("https://goodURL.hu") + verify(mockWeatherApp).calculateAvgTemp("https://goodURL.hu") + assertEquals(result, daysWithTemperaturesMap) + } + + @Test fun `rossz lekerdezes`() { + val weatherApp = WeatherApp() + val exception = assertThrows { weatherApp.calculateAvgTemp("https://api.open-meteo.com/v1/forecasto?latitude=47.4984&longitude=19.0404&hourly=temperature_2m&timezone=auto") } + assertTrue(exception.message!!.startsWith("Weather datas are unavailable! Response was:")) } } \ No newline at end of file