feat: openMeteo tests
This commit is contained in:
parent
68abfe66fa
commit
eb56bbfe73
@ -9,6 +9,7 @@ import eirb.pg203.utils.JSONFetcher;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.time.Clock;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
@ -23,7 +24,8 @@ import eirb.pg203.WeatherData.Condition;
|
|||||||
public class OpenMeteo implements WeatherDataAPI {
|
public class OpenMeteo implements WeatherDataAPI {
|
||||||
private static final String forecastBaseURL = "https://api.open-meteo.com/v1/forecast";
|
private static final String forecastBaseURL = "https://api.open-meteo.com/v1/forecast";
|
||||||
private static final String dailyQuery = "weather_code,temperature_2m_max,temperature_2m_min,wind_speed_10m_max,wind_direction_10m_dominant";
|
private static final String dailyQuery = "weather_code,temperature_2m_max,temperature_2m_min,wind_speed_10m_max,wind_direction_10m_dominant";
|
||||||
private static final JSONFetcherInterface JSONFetcher = new JSONFetcher();
|
JSONFetcherInterface JSONFetcher = new JSONFetcher();
|
||||||
|
Clock clock = Clock.systemUTC();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor
|
* Default constructor
|
||||||
@ -45,6 +47,9 @@ public class OpenMeteo implements WeatherDataAPI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static Condition getConditionFromCode(int WMOCode) {
|
private static Condition getConditionFromCode(int WMOCode) {
|
||||||
|
// TODO Wesh Nemo c'est quoi cette merde ?
|
||||||
|
if (WMOCode == 2 )
|
||||||
|
return Condition.PARTIAL;
|
||||||
if (WMOCode < 20)
|
if (WMOCode < 20)
|
||||||
return Condition.SUNNY;
|
return Condition.SUNNY;
|
||||||
else if (WMOCode < 30)
|
else if (WMOCode < 30)
|
||||||
@ -56,7 +61,7 @@ public class OpenMeteo implements WeatherDataAPI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static WeatherData getWeatherDataFromForecast(JSONObject response, int day, String city) {
|
private WeatherData getWeatherDataFromForecast(JSONObject response, int day, String city) {
|
||||||
JSONObject daily = response.getJSONObject("daily");
|
JSONObject daily = response.getJSONObject("daily");
|
||||||
float max_temp = daily.getJSONArray("temperature_2m_max").getFloat(day);
|
float max_temp = daily.getJSONArray("temperature_2m_max").getFloat(day);
|
||||||
float min_temp = daily.getJSONArray("temperature_2m_min").getFloat(day);
|
float min_temp = daily.getJSONArray("temperature_2m_min").getFloat(day);
|
||||||
@ -68,7 +73,7 @@ public class OpenMeteo implements WeatherDataAPI {
|
|||||||
|
|
||||||
return new WeatherData(
|
return new WeatherData(
|
||||||
new City(city),
|
new City(city),
|
||||||
Instant.now(),
|
Instant.now(clock),
|
||||||
temp_c,
|
temp_c,
|
||||||
windSpeed,
|
windSpeed,
|
||||||
windDirection,
|
windDirection,
|
||||||
@ -109,4 +114,9 @@ public class OpenMeteo implements WeatherDataAPI {
|
|||||||
public String getAPIName() {
|
public String getAPIName() {
|
||||||
return "OpenMeteo";
|
return "OpenMeteo";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return this.getAPIName();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package eirb.pg203;
|
package eirb.pg203;
|
||||||
|
|
||||||
|
import eirb.pg203.fakeJSONFetcher.FakeJSONFetcherOpenMeteo;
|
||||||
import eirb.pg203.fakeJSONFetcher.FakeJSONFetcherOpenWeatherMap;
|
import eirb.pg203.fakeJSONFetcher.FakeJSONFetcherOpenWeatherMap;
|
||||||
import eirb.pg203.fakeJSONFetcher.FakeJSONFetcherWeatherAPI;
|
import eirb.pg203.fakeJSONFetcher.FakeJSONFetcherWeatherAPI;
|
||||||
import org.junit.jupiter.api.Assertions;
|
import org.junit.jupiter.api.Assertions;
|
||||||
@ -37,6 +38,17 @@ public class WeatherDataAPITest {
|
|||||||
return openWeatherMap;
|
return openWeatherMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static OpenMeteo openMeteo() {
|
||||||
|
// Fix clock for testing
|
||||||
|
String instantExpected = "2024-11-24T00:00:00.00Z";
|
||||||
|
Clock clock = Clock.fixed(Instant.parse(instantExpected), ZoneId.systemDefault());
|
||||||
|
|
||||||
|
OpenMeteo openMeteo = new OpenMeteo();
|
||||||
|
openMeteo.clock = clock;
|
||||||
|
openMeteo.JSONFetcher = new FakeJSONFetcherOpenMeteo();
|
||||||
|
return openMeteo;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of args for Temperature testing
|
* List of args for Temperature testing
|
||||||
@ -45,14 +57,21 @@ public class WeatherDataAPITest {
|
|||||||
private static Stream<Arguments> testGetTemperature(){
|
private static Stream<Arguments> testGetTemperature(){
|
||||||
|
|
||||||
return Stream.of(
|
return Stream.of(
|
||||||
|
/* WeatherAPI */
|
||||||
Arguments.arguments(weatherAPI(), 0, 8.1F,WeatherData.Condition.PARTIAL, 17.45F, 142.08F),
|
Arguments.arguments(weatherAPI(), 0, 8.1F,WeatherData.Condition.PARTIAL, 17.45F, 142.08F),
|
||||||
Arguments.arguments(weatherAPI(), 1, 13F, WeatherData.Condition.SUNNY, 23.03F, 142.58F),
|
Arguments.arguments(weatherAPI(), 1, 13F, WeatherData.Condition.SUNNY, 23.03F, 142.58F),
|
||||||
Arguments.arguments(weatherAPI(), 2, 12.7F, WeatherData.Condition.RAINY, 13.19F, 222.92F),
|
Arguments.arguments(weatherAPI(), 2, 12.7F, WeatherData.Condition.RAINY, 13.19F, 222.92F),
|
||||||
Arguments.arguments(weatherAPI(), 3, 8.1F,WeatherData.Condition.CLOUDY, 17.45F, 142.08F),
|
Arguments.arguments(weatherAPI(), 3, 8.1F,WeatherData.Condition.CLOUDY, 17.45F, 142.08F),
|
||||||
|
/* Open Weather Map */
|
||||||
Arguments.arguments(openWeatherMap(), 0, 13.41F,WeatherData.Condition.PARTIAL, 5.74F, 142.13F),
|
Arguments.arguments(openWeatherMap(), 0, 13.41F,WeatherData.Condition.PARTIAL, 5.74F, 142.13F),
|
||||||
Arguments.arguments(openWeatherMap(), 1, 13.29F,WeatherData.Condition.CLOUDY, 3.62F, 225.25F),
|
Arguments.arguments(openWeatherMap(), 1, 13.29F,WeatherData.Condition.CLOUDY, 3.62F, 225.25F),
|
||||||
Arguments.arguments(openWeatherMap(), 2, 10.06F,WeatherData.Condition.RAINY, 2.22F, 191.75F),
|
Arguments.arguments(openWeatherMap(), 2, 10.06F,WeatherData.Condition.RAINY, 2.22F, 191.75F),
|
||||||
Arguments.arguments(openWeatherMap(), 3, 9.88F,WeatherData.Condition.SUNNY, 2.00F, 160.00F)
|
Arguments.arguments(openWeatherMap(), 3, 9.88F,WeatherData.Condition.SUNNY, 2.00F, 160.00F),
|
||||||
|
/* Open Meteo */
|
||||||
|
Arguments.arguments(openMeteo(), 0, 7.6F,WeatherData.Condition.PARTIAL, 17.6F, 151F),
|
||||||
|
Arguments.arguments(openMeteo(), 1, 13.20F,WeatherData.Condition.CLOUDY, 20.6F, 149F),
|
||||||
|
Arguments.arguments(openMeteo(), 2, 12.3F,WeatherData.Condition.RAINY, 21.70F, 187F),
|
||||||
|
Arguments.arguments(openMeteo(), 3, 10.80F,WeatherData.Condition.SUNNY, 9.4F, 177F)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,9 +102,15 @@ public class WeatherDataAPITest {
|
|||||||
float[] openWeatherMapExpectedWindSpeed = {5.74F, 3.62F, 2.22F, 2.00F};
|
float[] openWeatherMapExpectedWindSpeed = {5.74F, 3.62F, 2.22F, 2.00F};
|
||||||
float[] openWeatherMapExpectedWindDirection = {142.13F, 225.25F, 191.75F, 160F};
|
float[] openWeatherMapExpectedWindDirection = {142.13F, 225.25F, 191.75F, 160F};
|
||||||
|
|
||||||
|
float[] openMeteoExpectedTemperatures = {7.6F, 13.2F, 12.3F, 10.80F};
|
||||||
|
WeatherData.Condition[] openMeteoExpectedConditions = {WeatherData.Condition.PARTIAL, WeatherData.Condition.CLOUDY, WeatherData.Condition.RAINY, WeatherData.Condition.SUNNY};
|
||||||
|
float[] openMeteoExpectedWindSpeed = {17.6F, 20.6F, 21.7F, 9.40F};
|
||||||
|
float[] openMeteoExpectedWindDirection = {157.00F, 149F, 187F, 177F};
|
||||||
|
|
||||||
return Stream.of(
|
return Stream.of(
|
||||||
Arguments.arguments(weatherAPI(), 4, weatherAPIExpectedTemperatures, weatherAPIExpectedConditions, weatherAPIExpectedWindSpeed, weatherAPIExpectedWindDirection),
|
Arguments.arguments(weatherAPI(), 4, weatherAPIExpectedTemperatures, weatherAPIExpectedConditions, weatherAPIExpectedWindSpeed, weatherAPIExpectedWindDirection),
|
||||||
Arguments.arguments(openWeatherMap(), 4, openWeatherMapExpectedTemperatures, openWeatherMapExpectedConditions, openWeatherMapExpectedWindSpeed, openWeatherMapExpectedWindDirection)
|
Arguments.arguments(openWeatherMap(), 4, openWeatherMapExpectedTemperatures, openWeatherMapExpectedConditions, openWeatherMapExpectedWindSpeed, openWeatherMapExpectedWindDirection),
|
||||||
|
Arguments.arguments(openMeteo(), 4, openMeteoExpectedTemperatures, openMeteoExpectedConditions, openMeteoExpectedWindSpeed, openMeteoExpectedWindDirection)
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -115,9 +140,15 @@ public class WeatherDataAPITest {
|
|||||||
|
|
||||||
return Stream.of(
|
return Stream.of(
|
||||||
Arguments.arguments(weatherAPI()),
|
Arguments.arguments(weatherAPI()),
|
||||||
Arguments.arguments(openWeatherMap())
|
Arguments.arguments(openWeatherMap()),
|
||||||
|
Arguments.arguments(openMeteo())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For coverage, not yet implemented
|
||||||
|
* @param weatherDataAPI api to test
|
||||||
|
*/
|
||||||
@ParameterizedTest(name = "[{0}] Get temperature for a specific hour")
|
@ParameterizedTest(name = "[{0}] Get temperature for a specific hour")
|
||||||
@MethodSource
|
@MethodSource
|
||||||
public void testGetTemperatureByHours(WeatherDataAPI weatherDataAPI) {
|
public void testGetTemperatureByHours(WeatherDataAPI weatherDataAPI) {
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
package eirb.pg203.fakeJSONFetcher;
|
||||||
|
|
||||||
|
import eirb.pg203.utils.FileResourcesUtils;
|
||||||
|
import eirb.pg203.utils.JSONFetcherInterface;
|
||||||
|
import eirb.pg203.utils.SplitQueryUrl;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class FakeJSONFetcherOpenMeteo implements JSONFetcherInterface {
|
||||||
|
private JSONObject responseExample() {
|
||||||
|
return FileResourcesUtils.getFileFromResourceAsJson("OpenMeteo/Bordeaux-partial-cloudy-rain-sunny.json");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JSONObject fetch(URL url) throws IOException {
|
||||||
|
return responseExample();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JSONArray fetchArray(URL url) throws IOException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
{
|
||||||
|
"latitude": 44.84,
|
||||||
|
"longitude": -0.58000016,
|
||||||
|
"generationtime_ms": 0.1360177993774414,
|
||||||
|
"utc_offset_seconds": 0,
|
||||||
|
"timezone": "GMT",
|
||||||
|
"timezone_abbreviation": "GMT",
|
||||||
|
"elevation": 15,
|
||||||
|
"daily_units": {
|
||||||
|
"time": "iso8601",
|
||||||
|
"weather_code": "wmo code",
|
||||||
|
"temperature_2m_max": "°C",
|
||||||
|
"temperature_2m_min": "°C",
|
||||||
|
"wind_speed_10m_max": "km/h",
|
||||||
|
"wind_direction_10m_dominant": "°"
|
||||||
|
},
|
||||||
|
"daily": {
|
||||||
|
"time": [
|
||||||
|
"2024-11-23",
|
||||||
|
"2024-11-24",
|
||||||
|
"2024-11-25",
|
||||||
|
"2024-11-26"
|
||||||
|
],
|
||||||
|
"weather_code": [
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
63,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"temperature_2m_max": [
|
||||||
|
12.3,
|
||||||
|
17.2,
|
||||||
|
15.4,
|
||||||
|
13.7
|
||||||
|
],
|
||||||
|
"temperature_2m_min": [
|
||||||
|
2.9,
|
||||||
|
9.2,
|
||||||
|
9.2,
|
||||||
|
7.9
|
||||||
|
],
|
||||||
|
"wind_speed_10m_max": [
|
||||||
|
17.6,
|
||||||
|
20.6,
|
||||||
|
21.7,
|
||||||
|
9.4
|
||||||
|
],
|
||||||
|
"wind_direction_10m_dominant": [
|
||||||
|
151,
|
||||||
|
149,
|
||||||
|
187,
|
||||||
|
177
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user