From 324a7764691c7b6952f8b88fb635007b49500542 Mon Sep 17 00:00:00 2001 From: komp15 <77535280+komp15@users.noreply.github.com> Date: Thu, 29 Sep 2022 19:09:10 +0200 Subject: [PATCH 1/2] :bug: Migrated to skd parking provider --- .../java/dev/wms/pwrapi/api/ParkingAPI.java | 6 +- .../wms/pwrapi/dao/parking/ParkingDAO.java | 7 +- .../pwrapi/dao/parking/ParkingDAOImpl.java | 152 +++++++++--------- .../dto/parking/ParkingWithHistory.java | 15 ++ .../deserialization/ParkingArrayElement.java | 2 + .../service/parking/ParkingService.java | 3 +- .../service/parking/ParkingServiceImpl.java | 3 +- .../wms/pwrapi/parking/ParkingDAOTest.java | 21 +++ 8 files changed, 121 insertions(+), 88 deletions(-) create mode 100644 src/main/java/dev/wms/pwrapi/dto/parking/ParkingWithHistory.java create mode 100644 src/test/java/dev/wms/pwrapi/parking/ParkingDAOTest.java diff --git a/src/main/java/dev/wms/pwrapi/api/ParkingAPI.java b/src/main/java/dev/wms/pwrapi/api/ParkingAPI.java index 95b1811..19873b4 100644 --- a/src/main/java/dev/wms/pwrapi/api/ParkingAPI.java +++ b/src/main/java/dev/wms/pwrapi/api/ParkingAPI.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import dev.wms.pwrapi.dto.parking.Parking; +import dev.wms.pwrapi.dto.parking.ParkingWithHistory; import dev.wms.pwrapi.service.parking.ParkingService; import lombok.AllArgsConstructor; import org.springframework.http.HttpStatus; @@ -34,9 +35,8 @@ public ResponseEntity> getProcessedParkingInfo() throws JsonProces @GetMapping("/raw") @Operation(summary = "Returns raw request data from iparking.pwr.edu.pl", description = "You can use it to get raw, unprocessed data from iparking.pwr.edu.pl Especially useful when you want to graph parking usage") - public ResponseEntity getRawParkingInfo() throws IOException{ - String result = parkingService.getRawParkingData(); - return ResponseEntity.status(HttpStatus.OK).body(result); + public ResponseEntity> getRawParkingInfo() throws IOException{ + return ResponseEntity.status(HttpStatus.OK).body(parkingService.getRawParkingData()); } diff --git a/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAO.java b/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAO.java index 938b871..056493b 100644 --- a/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAO.java +++ b/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAO.java @@ -1,9 +1,10 @@ package dev.wms.pwrapi.dao.parking; import dev.wms.pwrapi.dto.parking.Parking; +import dev.wms.pwrapi.dto.parking.ParkingWithHistory; import java.io.IOException; -import java.util.ArrayList; +import java.util.List; public interface ParkingDAO { /** @@ -11,12 +12,12 @@ public interface ParkingDAO { * @return List of parking objects * @throws IOException When deserialization goes wrong */ - ArrayList getProcessedParkingInfo() throws IOException; + List getProcessedParkingInfo() throws IOException; /** * Returns unprocessed response from server. Works like proxy * @return JSON Response from server * @throws IOException When deserialization goes wrong */ - String getRawParkingData() throws IOException; + List getRawParkingData() throws IOException; } diff --git a/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAOImpl.java b/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAOImpl.java index e54dadf..c4a679d 100644 --- a/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAOImpl.java +++ b/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAOImpl.java @@ -1,109 +1,101 @@ package dev.wms.pwrapi.dao.parking; import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; - -import com.fasterxml.jackson.databind.ObjectMapper; - +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import dev.wms.pwrapi.dto.parking.ParkingWithHistory; +import org.jetbrains.annotations.NotNull; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; import org.springframework.stereotype.Repository; -import dev.wms.pwrapi.dto.parking.deserialization.ParkingArrayElement; -import dev.wms.pwrapi.dto.parking.deserialization.ParkingResponse; import dev.wms.pwrapi.dto.parking.Parking; -import dev.wms.pwrapi.utils.parking.ParkingGeneralUtils; -import dev.wms.pwrapi.utils.parking.exceptions.WrongResponseCode; -import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; -import okhttp3.RequestBody; import okhttp3.Response; @Repository public class ParkingDAOImpl implements ParkingDAO { - @Override - public ArrayList getProcessedParkingInfo() throws IOException{ - - ArrayList result = new ArrayList(); - - OkHttpClient client = new OkHttpClient().newBuilder() - .build(); - MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded; charset=UTF-8"); - RequestBody body = RequestBody.create(mediaType, "o=get_parks&ts=1652019293233"); - Request request = new Request.Builder() - .url("https://iparking.pwr.edu.pl/modules/iparking/scripts/ipk_operations.php") - .method("POST", body) - .addHeader("sec-ch-ua", "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"100\", \"Google Chrome\";v=\"100\"") - .addHeader("Accept", "application/json, text/javascript, */*; q=0.01") - .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") - .addHeader("X-Requested-With", "XMLHttpRequest") - .addHeader("sec-ch-ua-mobile", "?0") - .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36") - .addHeader("sec-ch-ua-platform", "\"Windows\"") - .addHeader("Sec-Fetch-Site", "same-origin") - .addHeader("Sec-Fetch-Mode", "cors") - .addHeader("Sec-Fetch-Dest", "empty") - .addHeader("Referer", "https://iparking.pwr.edu.pl/") - .addHeader("Origin", "https://iparking.pwr.edu.pl") - .build(); - Response response = client.newCall(request).execute(); - - // System.out.println(response.body().string()); - - ParkingResponse deserialized = new ObjectMapper().readValue(response.body().string(), ParkingResponse.class); - System.out.println(deserialized); - - //process the response - - if(deserialized.getSuccess() != 0) throw new WrongResponseCode(); - - for(ParkingArrayElement parking : deserialized.getPlaces()){ + public List getProcessedParkingInfo() throws IOException{ + return parseProcessed(fetchParkingWebsite()); + } - Parking toAdd = new Parking().builder() - .name(ParkingGeneralUtils.determineParking(parking.getParking_id())) - .lastUpdate(parking.getCzas_pomiaru()) - .leftPlaces(Integer.valueOf(parking.getLiczba_miejsc())) - .trend(Integer.valueOf(parking.getTrend())) - .build(); + @Override + public List getRawParkingData() throws IOException{ + return parseWithDetails(fetchParkingWebsite()); + } - result.add(toAdd); + private Document fetchParkingWebsite() throws IOException { + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + Request request = new Request.Builder() + .url("https://skd.pwr.edu.pl/") + .addHeader("sec-ch-ua", "\"Google Chrome\";v=\"105\", \"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"105\"") + .addHeader("sec-ch-ua-mobile", "?0") + .addHeader("sec-ch-ua-platform", "\"macOS\"") + .addHeader("Upgrade-Insecure-Requests", "1") + .addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36") + .addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9") + .addHeader("Sec-Fetch-Site", "same-origin") + .addHeader("Sec-Fetch-Mode", "navigate") + .addHeader("Sec-Fetch-User", "?1") + .addHeader("Sec-Fetch-Dest", "document") + .addHeader("host", "skd.pwr.edu.pl") + .build(); + Response response = client.newCall(request).execute(); + return Jsoup.parse(response.body().string()); } + private List parseProcessed(Element page){ + List result = new ArrayList<>(); + Matcher matcher = Pattern.compile("\"type\":\"put\",\"key\":\"text\",\"feat\":7,\"value\":\"\\d+").matcher(page.html()); + matcher.find(); + + result.add(new Parking("Parking Wrońskiego", getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); + matcher.find(); + result.add(new Parking("C13", getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); + matcher.find(); + result.add(new Parking("D20", getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); + matcher.find(); + result.add(new Parking("Geocentrum", getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); + matcher.find(); + result.add(new Parking("Architektura", getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); return result; } - @Override - public String getRawParkingData() throws IOException{ - - OkHttpClient client = new OkHttpClient().newBuilder() - .build(); - MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded; charset=UTF-8"); - RequestBody body = RequestBody.create(mediaType, "o=get_parks&ts=1652019293233"); - Request request = new Request.Builder() - .url("https://iparking.pwr.edu.pl/modules/iparking/scripts/ipk_operations.php") - .method("POST", body) - .addHeader("sec-ch-ua", "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"100\", \"Google Chrome\";v=\"100\"") - .addHeader("Accept", "application/json, text/javascript, */*; q=0.01") - .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") - .addHeader("X-Requested-With", "XMLHttpRequest") - .addHeader("sec-ch-ua-mobile", "?0") - .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36") - .addHeader("sec-ch-ua-platform", "\"Windows\"") - .addHeader("Sec-Fetch-Site", "same-origin") - .addHeader("Sec-Fetch-Mode", "cors") - .addHeader("Sec-Fetch-Dest", "empty") - .addHeader("Referer", "https://iparking.pwr.edu.pl/") - .addHeader("Origin", "https://iparking.pwr.edu.pl") - // .addHeader("Cookie", "PHPSESSID=sgn0fqbs1vg9bjotuum1aha957") - .build(); - Response response = client.newCall(request).execute(); + private List parseWithDetails(Element page){ + List result = new ArrayList<>(); + Matcher matcher = Pattern.compile("(?<=\\\\\"data\\\\\":\\[)(.*?)(?=\\])").matcher(page.html()); + matcher.find(); + result.add(new ParkingWithHistory("Parking Wrońskiego", getMeasurmentTime(), matcher.group())); + matcher.find(); + result.add(new ParkingWithHistory("C13", getMeasurmentTime(), matcher.group())); + matcher.find(); + result.add(new ParkingWithHistory("D20", getMeasurmentTime(), matcher.group())); + matcher.find(); + result.add(new ParkingWithHistory("Geocentrum", getMeasurmentTime(), matcher.group())); + matcher.find(); + result.add(new ParkingWithHistory("Architektura", getMeasurmentTime(), matcher.group())); + return result; + } - return response.body().string(); + @NotNull + private String getMeasurmentTime() { + return LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); + } + private int getPlacesFromResponse(Matcher matcher) { + return Integer.parseInt(matcher.group().split("value\":\"")[1]); } - } diff --git a/src/main/java/dev/wms/pwrapi/dto/parking/ParkingWithHistory.java b/src/main/java/dev/wms/pwrapi/dto/parking/ParkingWithHistory.java new file mode 100644 index 0000000..5a28153 --- /dev/null +++ b/src/main/java/dev/wms/pwrapi/dto/parking/ParkingWithHistory.java @@ -0,0 +1,15 @@ +package dev.wms.pwrapi.dto.parking; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class ParkingWithHistory { + private String name; + private String lastUpdate; + private String history; + +} diff --git a/src/main/java/dev/wms/pwrapi/dto/parking/deserialization/ParkingArrayElement.java b/src/main/java/dev/wms/pwrapi/dto/parking/deserialization/ParkingArrayElement.java index dcafe0f..d4b437e 100644 --- a/src/main/java/dev/wms/pwrapi/dto/parking/deserialization/ParkingArrayElement.java +++ b/src/main/java/dev/wms/pwrapi/dto/parking/deserialization/ParkingArrayElement.java @@ -6,12 +6,14 @@ import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.ToString; @Data @ToString +@AllArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) public class ParkingArrayElement { diff --git a/src/main/java/dev/wms/pwrapi/service/parking/ParkingService.java b/src/main/java/dev/wms/pwrapi/service/parking/ParkingService.java index 4fd6c58..11418e8 100644 --- a/src/main/java/dev/wms/pwrapi/service/parking/ParkingService.java +++ b/src/main/java/dev/wms/pwrapi/service/parking/ParkingService.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import dev.wms.pwrapi.dto.parking.Parking; +import dev.wms.pwrapi.dto.parking.ParkingWithHistory; import java.io.IOException; import java.util.List; @@ -10,5 +11,5 @@ public interface ParkingService { List getParkingData() throws JsonProcessingException, IOException; - String getRawParkingData() throws IOException; + List getRawParkingData() throws IOException; } diff --git a/src/main/java/dev/wms/pwrapi/service/parking/ParkingServiceImpl.java b/src/main/java/dev/wms/pwrapi/service/parking/ParkingServiceImpl.java index 70e3376..de95264 100644 --- a/src/main/java/dev/wms/pwrapi/service/parking/ParkingServiceImpl.java +++ b/src/main/java/dev/wms/pwrapi/service/parking/ParkingServiceImpl.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import dev.wms.pwrapi.dto.parking.Parking; +import dev.wms.pwrapi.dto.parking.ParkingWithHistory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ public List getParkingData() throws JsonProcessingException, IOExceptio } @Override - public String getRawParkingData() throws IOException{ + public List getRawParkingData() throws IOException{ return parkingDAO.getRawParkingData(); } diff --git a/src/test/java/dev/wms/pwrapi/parking/ParkingDAOTest.java b/src/test/java/dev/wms/pwrapi/parking/ParkingDAOTest.java new file mode 100644 index 0000000..bbae053 --- /dev/null +++ b/src/test/java/dev/wms/pwrapi/parking/ParkingDAOTest.java @@ -0,0 +1,21 @@ +package dev.wms.pwrapi.parking; + +import dev.wms.pwrapi.dao.parking.ParkingDAO; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.io.IOException; + +@SpringBootTest +public class ParkingDAOTest { + + @Autowired + private ParkingDAO parkingDAO; + + @Test + public void getProcessedParkingInfoShouldWork() throws IOException { + System.out.println(parkingDAO.getRawParkingData()); + } + +} From 9aefb8516b50e8d76160497720eb4dd077ed0765 Mon Sep 17 00:00:00 2001 From: komp15 <77535280+komp15@users.noreply.github.com> Date: Fri, 30 Sep 2022 10:23:44 +0200 Subject: [PATCH 2/2] :recycle: :memo: Done refactor and updated the documentation --- .../java/dev/wms/pwrapi/api/ParkingAPI.java | 6 +-- .../wms/pwrapi/dao/parking/ParkingDAO.java | 2 +- .../pwrapi/dao/parking/ParkingDAOImpl.java | 52 ++++++++----------- .../utils/parking/ParkingGeneralUtils.java | 34 ------------ .../wms/pwrapi/parking/ParkingDAOTest.java | 16 +++++- .../dev/wms/pwrapi/parking/ParkingTests.java | 31 +++++++++-- .../wms/pwrapi/parking/ParkingUtilsTests.java | 41 --------------- 7 files changed, 66 insertions(+), 116 deletions(-) delete mode 100644 src/main/java/dev/wms/pwrapi/utils/parking/ParkingGeneralUtils.java delete mode 100644 src/test/java/dev/wms/pwrapi/parking/ParkingUtilsTests.java diff --git a/src/main/java/dev/wms/pwrapi/api/ParkingAPI.java b/src/main/java/dev/wms/pwrapi/api/ParkingAPI.java index 19873b4..8285856 100644 --- a/src/main/java/dev/wms/pwrapi/api/ParkingAPI.java +++ b/src/main/java/dev/wms/pwrapi/api/ParkingAPI.java @@ -25,7 +25,7 @@ public class ParkingAPI { private ParkingService parkingService; @GetMapping - @Operation(summary = "Returns processed data from iparking.pwr.edu.pl", description = "You can use it to get data from iparking.pwr.edu.pl in simple format") + @Operation(summary = "Returns processed data from skd.pwr.edu.pl", description = "You can use it to get data from skd.pwr.edu.pl in simple format") public ResponseEntity> getProcessedParkingInfo() throws JsonProcessingException, IOException{ List result = parkingService.getParkingData(); return ResponseEntity.status(HttpStatus.OK).body(result); @@ -33,8 +33,8 @@ public ResponseEntity> getProcessedParkingInfo() throws JsonProces } @GetMapping("/raw") - @Operation(summary = "Returns raw request data from iparking.pwr.edu.pl", - description = "You can use it to get raw, unprocessed data from iparking.pwr.edu.pl Especially useful when you want to graph parking usage") + @Operation(summary = "Returns history data from skd.pwr.edu.pl", + description = "You can use it to get parking history data from last 24h") public ResponseEntity> getRawParkingInfo() throws IOException{ return ResponseEntity.status(HttpStatus.OK).body(parkingService.getRawParkingData()); } diff --git a/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAO.java b/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAO.java index 056493b..184c184 100644 --- a/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAO.java +++ b/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAO.java @@ -15,7 +15,7 @@ public interface ParkingDAO { List getProcessedParkingInfo() throws IOException; /** - * Returns unprocessed response from server. Works like proxy + * Returns parking information and array containing history of parking places for the last 24 hours * @return JSON Response from server * @throws IOException When deserialization goes wrong */ diff --git a/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAOImpl.java b/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAOImpl.java index c4a679d..bea780b 100644 --- a/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAOImpl.java +++ b/src/main/java/dev/wms/pwrapi/dao/parking/ParkingDAOImpl.java @@ -9,20 +9,24 @@ import java.util.regex.Pattern; import dev.wms.pwrapi.dto.parking.ParkingWithHistory; +import dev.wms.pwrapi.utils.http.HttpUtils; import org.jetbrains.annotations.NotNull; -import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.springframework.stereotype.Repository; import dev.wms.pwrapi.dto.parking.Parking; import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; @Repository public class ParkingDAOImpl implements ParkingDAO { + public static final String PARKING_WRONSKIEGO = "Parking Wrońskiego"; + public static final String C_13 = "C13"; + public static final String D_20 = "D20"; + public static final String GEOCENTRUM = "Geocentrum"; + public static final String ARCHITEKTURA = "Architektura"; + @Override public List getProcessedParkingInfo() throws IOException{ return parseProcessed(fetchParkingWebsite()); @@ -36,38 +40,22 @@ public List getRawParkingData() throws IOException{ private Document fetchParkingWebsite() throws IOException { OkHttpClient client = new OkHttpClient().newBuilder() .build(); - Request request = new Request.Builder() - .url("https://skd.pwr.edu.pl/") - .addHeader("sec-ch-ua", "\"Google Chrome\";v=\"105\", \"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"105\"") - .addHeader("sec-ch-ua-mobile", "?0") - .addHeader("sec-ch-ua-platform", "\"macOS\"") - .addHeader("Upgrade-Insecure-Requests", "1") - .addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36") - .addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9") - .addHeader("Sec-Fetch-Site", "same-origin") - .addHeader("Sec-Fetch-Mode", "navigate") - .addHeader("Sec-Fetch-User", "?1") - .addHeader("Sec-Fetch-Dest", "document") - .addHeader("host", "skd.pwr.edu.pl") - .build(); - Response response = client.newCall(request).execute(); - return Jsoup.parse(response.body().string()); + return HttpUtils.makeRequestWithClientAndGetDocument(client, "https://skd.pwr.edu.pl/"); } private List parseProcessed(Element page){ List result = new ArrayList<>(); Matcher matcher = Pattern.compile("\"type\":\"put\",\"key\":\"text\",\"feat\":7,\"value\":\"\\d+").matcher(page.html()); matcher.find(); - - result.add(new Parking("Parking Wrońskiego", getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); + result.add(new Parking(PARKING_WRONSKIEGO, getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); matcher.find(); - result.add(new Parking("C13", getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); + result.add(new Parking(C_13, getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); matcher.find(); - result.add(new Parking("D20", getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); + result.add(new Parking(D_20, getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); matcher.find(); - result.add(new Parking("Geocentrum", getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); + result.add(new Parking(GEOCENTRUM, getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); matcher.find(); - result.add(new Parking("Architektura", getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); + result.add(new Parking(ARCHITEKTURA, getMeasurmentTime(), getPlacesFromResponse(matcher), 0)); return result; } @@ -76,19 +64,23 @@ private List parseWithDetails(Element page){ List result = new ArrayList<>(); Matcher matcher = Pattern.compile("(?<=\\\\\"data\\\\\":\\[)(.*?)(?=\\])").matcher(page.html()); matcher.find(); - result.add(new ParkingWithHistory("Parking Wrońskiego", getMeasurmentTime(), matcher.group())); + result.add(new ParkingWithHistory(PARKING_WRONSKIEGO, getMeasurmentTime(), sanitizeArray(matcher.group()))); matcher.find(); - result.add(new ParkingWithHistory("C13", getMeasurmentTime(), matcher.group())); + result.add(new ParkingWithHistory(C_13, getMeasurmentTime(), sanitizeArray(matcher.group()))); matcher.find(); - result.add(new ParkingWithHistory("D20", getMeasurmentTime(), matcher.group())); + result.add(new ParkingWithHistory(D_20, getMeasurmentTime(), sanitizeArray(matcher.group()))); matcher.find(); - result.add(new ParkingWithHistory("Geocentrum", getMeasurmentTime(), matcher.group())); + result.add(new ParkingWithHistory(GEOCENTRUM, getMeasurmentTime(), sanitizeArray(matcher.group()))); matcher.find(); - result.add(new ParkingWithHistory("Architektura", getMeasurmentTime(), matcher.group())); + result.add(new ParkingWithHistory(ARCHITEKTURA, getMeasurmentTime(), sanitizeArray(matcher.group()))); return result; } + private String sanitizeArray(String array){ + return "[" + array + "]"; + } + @NotNull private String getMeasurmentTime() { return LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); diff --git a/src/main/java/dev/wms/pwrapi/utils/parking/ParkingGeneralUtils.java b/src/main/java/dev/wms/pwrapi/utils/parking/ParkingGeneralUtils.java deleted file mode 100644 index d14c0c1..0000000 --- a/src/main/java/dev/wms/pwrapi/utils/parking/ParkingGeneralUtils.java +++ /dev/null @@ -1,34 +0,0 @@ -package dev.wms.pwrapi.utils.parking; - -public class ParkingGeneralUtils { - - /** - * Determines parking based on ID in JSON response from parking server. Returns "Unknown Id" on unknown id - * @param id ID from JSON response - * @return Name of Parking - */ - public static String determineParking(String id){ - - switch (id) { - case "5" -> { - return "D20"; - } - case "4" -> { - return "Parking Wrońskiego"; - } - case "2" -> { - return "C13"; - } - case "6" -> { - return "Geocentrum"; - } - case "7" -> { - return "Architektura"; - } - } - - return "Unknown parking id: " + id; - - } - -} diff --git a/src/test/java/dev/wms/pwrapi/parking/ParkingDAOTest.java b/src/test/java/dev/wms/pwrapi/parking/ParkingDAOTest.java index bbae053..0344ab6 100644 --- a/src/test/java/dev/wms/pwrapi/parking/ParkingDAOTest.java +++ b/src/test/java/dev/wms/pwrapi/parking/ParkingDAOTest.java @@ -1,11 +1,15 @@ package dev.wms.pwrapi.parking; import dev.wms.pwrapi.dao.parking.ParkingDAO; +import dev.wms.pwrapi.dto.parking.Parking; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.io.IOException; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; @SpringBootTest public class ParkingDAOTest { @@ -13,9 +17,17 @@ public class ParkingDAOTest { @Autowired private ParkingDAO parkingDAO; + /** + * Because of migration to SKD service, trend feature is no longer supported, and trend should be equal + * to zero + * @throws IOException + */ @Test - public void getProcessedParkingInfoShouldWork() throws IOException { - System.out.println(parkingDAO.getRawParkingData()); + public void trendShouldAlwaysBeZero() throws IOException { + List result = parkingDAO.getProcessedParkingInfo(); + for(Parking parking : result){ + assertEquals(0, parking.getTrend()); + } } } diff --git a/src/test/java/dev/wms/pwrapi/parking/ParkingTests.java b/src/test/java/dev/wms/pwrapi/parking/ParkingTests.java index cf34366..263afeb 100644 --- a/src/test/java/dev/wms/pwrapi/parking/ParkingTests.java +++ b/src/test/java/dev/wms/pwrapi/parking/ParkingTests.java @@ -1,15 +1,12 @@ package dev.wms.pwrapi.parking; -import dev.wms.pwrapi.api.ParkingAPI; import io.restassured.http.ContentType; -import io.restassured.module.mockmvc.RestAssuredMockMvc; -import org.junit.jupiter.api.BeforeAll; +import org.hamcrest.Matcher; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import static io.restassured.RestAssured.*; -import static io.restassured.matcher.RestAssuredMatchers.*; import static io.restassured.module.jsv.JsonSchemaValidator.matchesJsonSchemaInClasspath; import static org.hamcrest.Matchers.*; @@ -51,10 +48,34 @@ public void allParkingNamesShouldBeAccessible(){ @Test public void responseTypeShouldBeJSON(){ - get("api/parking").then() .contentType(ContentType.JSON); + } + + @Test + public void detailsEndpointShouldContainAllParkingNames(){ + + get("api/parking/raw").then() + .body("[0].name", oneOf("D20", "Parking Wrońskiego", "C13", "Geocentrum", "Architektura")) + .body("[1].name", oneOf("D20", "Parking Wrońskiego", "C13", "Geocentrum", "Architektura")) + .body("[2].name", oneOf("D20", "Parking Wrońskiego", "C13", "Geocentrum", "Architektura")) + .body("[3].name", oneOf("D20", "Parking Wrońskiego", "C13", "Geocentrum", "Architektura")) + .body("[4].name", oneOf("D20", "Parking Wrońskiego", "C13", "Geocentrum", "Architektura")); + + } + + @Test + public void historyEndpointShouldBeAnArrayWrappedInString(){ + get("api/parking/raw").then() + .body("[0].history", getArrayMatcher()) + .body("[1].history", getArrayMatcher()) + .body("[2].history", getArrayMatcher()) + .body("[3].history", getArrayMatcher()) + .body("[4].history", getArrayMatcher()); + } + private Matcher getArrayMatcher(){ + return allOf(startsWith("["), endsWith("]"), not(containsString("(")), not(containsString(")"))); } diff --git a/src/test/java/dev/wms/pwrapi/parking/ParkingUtilsTests.java b/src/test/java/dev/wms/pwrapi/parking/ParkingUtilsTests.java deleted file mode 100644 index 2b2a2ff..0000000 --- a/src/test/java/dev/wms/pwrapi/parking/ParkingUtilsTests.java +++ /dev/null @@ -1,41 +0,0 @@ -package dev.wms.pwrapi.parking; - -import dev.wms.pwrapi.utils.parking.ParkingGeneralUtils; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Random; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class ParkingUtilsTests { - - @Test - public void determineParkingShouldReturnUnknownIdOnUnknownId(){ - - Random random = new Random(); - - for(int i = 0; i < 30; i++){ - int nonExistingParkingId = random.nextInt()+200; - assertEquals("Unknown parking id: " + nonExistingParkingId, - ParkingGeneralUtils.determineParking(String.valueOf(nonExistingParkingId))); - - } - - } - - - @Test - public void determineParkingShouldReturnParkingNameOnKnownIds(){ - - List knownIds = List.of("5","4","2","6","7"); - List expectedResponses = List.of("D20", "Parking Wrońskiego", "C13", "Geocentrum", "Architektura"); - - for(int i = 0; i < knownIds.size(); i++){ - assertEquals(expectedResponses.get(i), ParkingGeneralUtils.determineParking(knownIds.get(i))); - } - - } - - -}