From d51ce2c7e040e1fd1808346d4b235175f857a270 Mon Sep 17 00:00:00 2001 From: cziko Date: Wed, 20 Mar 2024 10:20:09 +0100 Subject: [PATCH 1/2] first round --- .../main/kotlin/DataUnavailableException.kt | 4 ++ app/src/main/kotlin/DayWithTemperature.kt | 3 ++ app/src/main/kotlin/HourlyData.kt | 6 +++ app/src/main/kotlin/HourlyUnits.kt | 3 ++ app/src/main/kotlin/WeatherApp.kt | 40 ++++++++++++++++++- app/src/main/kotlin/WeatherData.kt | 13 ++++++ 6 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 app/src/main/kotlin/DataUnavailableException.kt create mode 100644 app/src/main/kotlin/DayWithTemperature.kt create mode 100644 app/src/main/kotlin/HourlyData.kt create mode 100644 app/src/main/kotlin/HourlyUnits.kt create mode 100644 app/src/main/kotlin/WeatherData.kt 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..dbaaaa9 100644 --- a/app/src/main/kotlin/WeatherApp.kt +++ b/app/src/main/kotlin/WeatherApp.kt @@ -1,12 +1,50 @@ 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 fun main() { - runApplication() + val client = HttpClient.newBuilder().build(); + val request = HttpRequest.newBuilder() + .uri(URI.create("https://api.open-meteo.com/v1/forecast?latitude=47.4984&longitude=19.0404&hourly=temperature_2m&timezone=auto")) + .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 + } + } + daysWithTemperaturesMap.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 + ) From d0bf857e39fad5b4158246f9702a90da3d181194 Mon Sep 17 00:00:00 2001 From: cziko Date: Wed, 20 Mar 2024 14:59:26 +0100 Subject: [PATCH 2/2] tesztek --- app/build.gradle.kts | 1 + app/src/main/kotlin/WeatherApp.kt | 61 +++++++++++++++------------ app/src/test/kotlin/WeatherAppTest.kt | 20 ++++++++- 3 files changed, 53 insertions(+), 29 deletions(-) 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/WeatherApp.kt b/app/src/main/kotlin/WeatherApp.kt index dbaaaa9..36a28d4 100644 --- a/app/src/main/kotlin/WeatherApp.kt +++ b/app/src/main/kotlin/WeatherApp.kt @@ -12,38 +12,43 @@ 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(); -fun main() { - val client = HttpClient.newBuilder().build(); - val request = HttpRequest.newBuilder() - .uri(URI.create("https://api.open-meteo.com/v1/forecast?latitude=47.4984&longitude=19.0404&hourly=temperature_2m&timezone=auto")) - .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 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 + 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 } - daysWithTemperaturesMap.forEach { +} + +fun main() { + 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/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