From 3639707bbe4ac8a9feb12f37552fd8f456bf417e Mon Sep 17 00:00:00 2001 From: tonis Date: Fri, 8 Apr 2022 19:28:21 +0700 Subject: [PATCH] add brand and changelog to ClearanceStatus --- build.gradle | 2 +- hmkit-fleet-consumer | 2 +- src/main/kotlin/HMKitFleet.kt | 2 +- src/main/kotlin/model/ClearanceStatus.kt | 18 ++++- src/main/kotlin/network/ClearanceRequests.kt | 5 +- .../network/ClearanceRequestsTest.kt | 77 +++++++++++++++++++ 6 files changed, 98 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 768ecc6..562c844 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ ext { coroutinesVersion = "1.4.0" koinVersion = '3.1.4' ver = [ - "hmkit-fleet" : "0.3.2", + "hmkit-fleet" : "0.4.0", "hmkit-crypto-telematics": "0.1", "hmkit-auto-api" : "3.12.1", ] diff --git a/hmkit-fleet-consumer b/hmkit-fleet-consumer index debc77d..d9f0b9a 160000 --- a/hmkit-fleet-consumer +++ b/hmkit-fleet-consumer @@ -1 +1 @@ -Subproject commit debc77dc35154cc05ded79f95184863f1765cc15 +Subproject commit d9f0b9aa598c6b1deb3f85cb6fcfb87b424efaa6 diff --git a/src/main/kotlin/HMKitFleet.kt b/src/main/kotlin/HMKitFleet.kt index a73744f..eab3620 100644 --- a/src/main/kotlin/HMKitFleet.kt +++ b/src/main/kotlin/HMKitFleet.kt @@ -72,7 +72,7 @@ object HMKitFleet { vin: String, brand: Brand, controlMeasures: List? = null - ): CompletableFuture> = GlobalScope.future { + ): CompletableFuture> = GlobalScope.future { logger.debug("HMKitFleet: requestClearance: $vin") koin.get().requestClearance(vin, brand, controlMeasures) } diff --git a/src/main/kotlin/model/ClearanceStatus.kt b/src/main/kotlin/model/ClearanceStatus.kt index 9dc06b8..5a8b41e 100644 --- a/src/main/kotlin/model/ClearanceStatus.kt +++ b/src/main/kotlin/model/ClearanceStatus.kt @@ -27,7 +27,10 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -data class ClearanceStatus(val vin: String, val status: Status) { +data class RequestClearanceResponse(val vin: String, val status: ClearanceStatus.Status) + +@Serializable +data class ClearanceStatus(val vin: String, val status: Status, val brand:Brand? = null, val changelog:List = emptyList()) { @Serializable enum class Status { @SerialName("approved") @@ -43,6 +46,15 @@ data class ClearanceStatus(val vin: String, val status: Status) { REVOKED, @SerialName("rejected") - REJECTED + REJECTED, + + @SerialName("canceling") + CANCELING, + + @SerialName("canceled") + CANCELED } -} \ No newline at end of file +} + +@Serializable +data class ChangeLogItem(val status: ClearanceStatus.Status, val timestamp:String) \ No newline at end of file diff --git a/src/main/kotlin/network/ClearanceRequests.kt b/src/main/kotlin/network/ClearanceRequests.kt index d09ac30..097d4f8 100644 --- a/src/main/kotlin/network/ClearanceRequests.kt +++ b/src/main/kotlin/network/ClearanceRequests.kt @@ -27,6 +27,7 @@ import kotlinx.serialization.json.* import com.highmobility.hmkitfleet.model.Brand import com.highmobility.hmkitfleet.model.ControlMeasure import com.highmobility.hmkitfleet.model.ClearanceStatus +import com.highmobility.hmkitfleet.model.RequestClearanceResponse import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody @@ -48,7 +49,7 @@ internal class ClearanceRequests( vin: String, brand: Brand, controlMeasures: List? - ): Response { + ): Response { val body = requestBody(vin, brand, controlMeasures) val authToken = authTokenRequests.getAuthToken() @@ -71,7 +72,7 @@ internal class ClearanceRequests( val statuses = jsonElement["vehicles"] as JsonArray for (statusElement in statuses) { val status = - Json.decodeFromJsonElement(statusElement) + Json.decodeFromJsonElement(statusElement) if (status.vin == vin) { return Response(status, null) } diff --git a/src/test/kotlin/com/highmobility/hmkitfleet/network/ClearanceRequestsTest.kt b/src/test/kotlin/com/highmobility/hmkitfleet/network/ClearanceRequestsTest.kt index 73695b0..24ebf09 100644 --- a/src/test/kotlin/com/highmobility/hmkitfleet/network/ClearanceRequestsTest.kt +++ b/src/test/kotlin/com/highmobility/hmkitfleet/network/ClearanceRequestsTest.kt @@ -158,10 +158,12 @@ internal class ClearanceRequestsTest : BaseTest() { """ [ { + "brand":"bmw", "vin": "WBADT43452G296403", "status": "pending" }, { + "brand":"bmw", "vin": "WBADT43452G296404", "status": "pending" } @@ -191,6 +193,81 @@ internal class ClearanceRequestsTest : BaseTest() { assertTrue(status.response!![1].vin == "WBADT43452G296404") } + @Test + fun parsesChangeLog() { + val mockResponse = MockResponse() + .setResponseCode(HttpURLConnection.HTTP_OK) + .setBody( + """[ + { + "brand":"bmw", + "changelog":[ + { + "status":"pending", + "timestamp":"2022-03-30T12:27:25" + }, + { + "status":"approved", + "timestamp":"2022-03-30T12:27:27" + }, + { + "status":"revoked", + "timestamp":"2022-04-30T12:27:27" + } + ], + "status":"revoked", + "vin":"WBY8P210X07J49112" + }, + { + "brand":"bmw", + "changelog":[ + { + "status":"pending", + "timestamp":"2022-04-01T12:27:25" + }, + { + "status":"approved", + "timestamp":"2022-04-01T12:27:27" + } + ], + "status":"approved", + "vin":"WBY8P210X07J49112" + }, + { + "brand":"bmw", + "changelog":[], + "status":"approved", + "vin":"WBY8P210X07J49112" + }, + { + "brand":"bmw", + "status":"approved", + "vin":"WBY8P210X07J49112" + } + ]""".trimIndent() + ) + + mockWebServer.enqueue(mockResponse) + val mockUrl = mockWebServer.url("").toString() + val webService = ClearanceRequests(client, mockLogger, mockUrl, authTokenRequests) + + val status = runBlocking { + webService.getClearanceStatuses() + } + + assertTrue(status.response!![0].status == ClearanceStatus.Status.REVOKED) + assertTrue(status.response!![0].vin == "WBY8P210X07J49112") + assertTrue(status.response!![0].brand == Brand.BMW) + assertTrue(status.response!![0].changelog.size == 3) + + assertTrue(status.response!![1].status == ClearanceStatus.Status.APPROVED) + assertTrue(status.response!![1].vin == "WBY8P210X07J49112") + assertTrue(status.response!![1].changelog.size == 2) + + assertTrue(status.response!![2].changelog.isEmpty()) + assertTrue(status.response!![2].changelog.isEmpty()) + } + @Test fun getClearanceStatusesAuthTokenError() = runBlocking { testAuthTokenErrorReturned(mockWebServer, authTokenRequests) { mockUrl ->