forked from loafle/openapi-generator-original
		
	[Kotlin client] Improve JSON parser (#2981)
* [Kotlin client] Improve JSON parser * fix import in model for threetenbp date
This commit is contained in:
		
							parent
							
								
									213c015c95
								
							
						
					
					
						commit
						c4bf6588aa
					
				@ -166,14 +166,14 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co
 | 
			
		||||
        typeMapping.put("ByteArray", "kotlin.ByteArray");
 | 
			
		||||
        typeMapping.put("number", "java.math.BigDecimal");
 | 
			
		||||
        typeMapping.put("date-time", "java.time.LocalDateTime");
 | 
			
		||||
        typeMapping.put("date", "java.time.LocalDateTime");
 | 
			
		||||
        typeMapping.put("date", "java.time.LocalDate");
 | 
			
		||||
        typeMapping.put("file", "java.io.File");
 | 
			
		||||
        typeMapping.put("array", "kotlin.Array");
 | 
			
		||||
        typeMapping.put("list", "kotlin.collections.List");
 | 
			
		||||
        typeMapping.put("map", "kotlin.collections.Map");
 | 
			
		||||
        typeMapping.put("object", "kotlin.Any");
 | 
			
		||||
        typeMapping.put("binary", "kotlin.Array<kotlin.Byte>");
 | 
			
		||||
        typeMapping.put("Date", "java.time.LocalDateTime");
 | 
			
		||||
        typeMapping.put("Date", "java.time.LocalDate");
 | 
			
		||||
        typeMapping.put("DateTime", "java.time.LocalDateTime");
 | 
			
		||||
 | 
			
		||||
        instantiationTypes.put("array", "kotlin.arrayOf");
 | 
			
		||||
 | 
			
		||||
@ -131,6 +131,7 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
 | 
			
		||||
            typeMapping.put("DateTime", "LocalDateTime");
 | 
			
		||||
            importMapping.put("LocalDate", "org.threeten.bp.LocalDate");
 | 
			
		||||
            importMapping.put("LocalDateTime", "org.threeten.bp.LocalDateTime");
 | 
			
		||||
            defaultIncludes.add("org.threeten.bp.LocalDate");
 | 
			
		||||
            defaultIncludes.add("org.threeten.bp.LocalDateTime");
 | 
			
		||||
        } else if (DateLibrary.STRING.value.equals(dateLibrary)) {
 | 
			
		||||
            typeMapping.put("date-time", "kotlin.String");
 | 
			
		||||
@ -166,5 +167,8 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
 | 
			
		||||
        supportingFiles.add(new SupportingFile("infrastructure/Serializer.kt.mustache", infrastructureFolder, "Serializer.kt"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("infrastructure/Errors.kt.mustache", infrastructureFolder, "Errors.kt"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("infrastructure/ByteArrayAdapter.kt.mustache", infrastructureFolder, "ByteArrayAdapter.kt"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("infrastructure/LocalDateAdapter.kt.mustache", infrastructureFolder, "LocalDateAdapter.kt"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("infrastructure/LocalDateTimeAdapter.kt.mustache", infrastructureFolder, "LocalDateTimeAdapter.kt"));
 | 
			
		||||
        supportingFiles.add(new SupportingFile("infrastructure/UUIDAdapter.kt.mustache", infrastructureFolder, "UUIDAdapter.kt"));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -15,9 +15,6 @@ import {{packageName}}.infrastructure.RequestMethod
 | 
			
		||||
import {{packageName}}.infrastructure.ResponseType
 | 
			
		||||
import {{packageName}}.infrastructure.Success
 | 
			
		||||
import {{packageName}}.infrastructure.toMultiValue
 | 
			
		||||
{{#threetenbp}}
 | 
			
		||||
import org.threeten.bp.LocalDateTime
 | 
			
		||||
{{/threetenbp}}
 | 
			
		||||
 | 
			
		||||
{{#operations}}
 | 
			
		||||
class {{classname}}(basePath: kotlin.String = "{{{basePath}}}") : ApiClient(basePath) {
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,8 @@
 | 
			
		||||
package {{packageName}}.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.KotlinJsonAdapterFactory
 | 
			
		||||
import com.squareup.moshi.Moshi
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
import com.squareup.moshi.Rfc3339DateJsonAdapter
 | 
			
		||||
import okhttp3.OkHttpClient
 | 
			
		||||
import okhttp3.RequestBody
 | 
			
		||||
import okhttp3.MediaType
 | 
			
		||||
@ -12,7 +11,7 @@ import okhttp3.HttpUrl
 | 
			
		||||
import okhttp3.ResponseBody
 | 
			
		||||
import okhttp3.Request
 | 
			
		||||
import java.io.File
 | 
			
		||||
import java.util.UUID
 | 
			
		||||
import java.util.Date
 | 
			
		||||
 | 
			
		||||
open class ApiClient(val baseUrl: String) {
 | 
			
		||||
    companion object {
 | 
			
		||||
@ -63,12 +62,11 @@ open class ApiClient(val baseUrl: String) {
 | 
			
		||||
            return null
 | 
			
		||||
        }
 | 
			
		||||
        return when(mediaType) {
 | 
			
		||||
            JsonMediaType -> Moshi.Builder().add(object {
 | 
			
		||||
                    @ToJson
 | 
			
		||||
                    fun toJson(uuid: UUID) = uuid.toString()
 | 
			
		||||
                    @FromJson
 | 
			
		||||
                    fun fromJson(s: String) = UUID.fromString(s)
 | 
			
		||||
                })
 | 
			
		||||
            JsonMediaType -> Moshi.Builder()
 | 
			
		||||
                .add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
 | 
			
		||||
                .add(LocalDateTimeAdapter())
 | 
			
		||||
                .add(LocalDateAdapter())
 | 
			
		||||
                .add(UUIDAdapter())
 | 
			
		||||
                .add(ByteArrayAdapter())
 | 
			
		||||
                .add(KotlinJsonAdapterFactory())
 | 
			
		||||
                .build().adapter(T::class.java).fromJson(bodyContent)
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,25 @@
 | 
			
		||||
package {{packageName}}.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
{{^threetenbp}}
 | 
			
		||||
import java.time.LocalDate
 | 
			
		||||
import java.time.format.DateTimeFormatter
 | 
			
		||||
{{/threetenbp}}
 | 
			
		||||
{{#threetenbp}}
 | 
			
		||||
import org.threeten.bp.LocalDate
 | 
			
		||||
import org.threeten.bp.format.DateTimeFormatter
 | 
			
		||||
{{/threetenbp}}
 | 
			
		||||
 | 
			
		||||
class LocalDateAdapter {
 | 
			
		||||
    @ToJson
 | 
			
		||||
    fun toJson(value: LocalDate): String {
 | 
			
		||||
        return DateTimeFormatter.ISO_LOCAL_DATE.format(value)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @FromJson
 | 
			
		||||
    fun fromJson(value: String): LocalDate {
 | 
			
		||||
        return LocalDate.parse(value, DateTimeFormatter.ISO_LOCAL_DATE)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,25 @@
 | 
			
		||||
package {{packageName}}.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
{{^threetenbp}}
 | 
			
		||||
import java.time.LocalDateTime
 | 
			
		||||
import java.time.format.DateTimeFormatter
 | 
			
		||||
{{/threetenbp}}
 | 
			
		||||
{{#threetenbp}}
 | 
			
		||||
import org.threeten.bp.LocalDateTime
 | 
			
		||||
import org.threeten.bp.format.DateTimeFormatter
 | 
			
		||||
{{/threetenbp}}
 | 
			
		||||
 | 
			
		||||
class LocalDateTimeAdapter {
 | 
			
		||||
    @ToJson
 | 
			
		||||
    fun toJson(value: LocalDateTime): String {
 | 
			
		||||
        return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(value)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @FromJson
 | 
			
		||||
    fun fromJson(value: String): LocalDateTime {
 | 
			
		||||
        return LocalDateTime.parse(value, DateTimeFormatter.ISO_LOCAL_DATE_TIME)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -3,12 +3,16 @@ package {{packageName}}.infrastructure
 | 
			
		||||
import com.squareup.moshi.KotlinJsonAdapterFactory
 | 
			
		||||
import com.squareup.moshi.Moshi
 | 
			
		||||
import com.squareup.moshi.Rfc3339DateJsonAdapter
 | 
			
		||||
import java.util.*
 | 
			
		||||
import java.util.Date
 | 
			
		||||
 | 
			
		||||
object Serializer {
 | 
			
		||||
    @JvmStatic
 | 
			
		||||
    val moshi: Moshi = Moshi.Builder()
 | 
			
		||||
        .add(KotlinJsonAdapterFactory())
 | 
			
		||||
        .add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
 | 
			
		||||
        .add(LocalDateTimeAdapter())
 | 
			
		||||
        .add(LocalDateAdapter())
 | 
			
		||||
        .add(UUIDAdapter())
 | 
			
		||||
        .add(ByteArrayAdapter())
 | 
			
		||||
        .add(KotlinJsonAdapterFactory())
 | 
			
		||||
        .build()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,13 @@
 | 
			
		||||
package {{packageName}}.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
import java.util.UUID
 | 
			
		||||
 | 
			
		||||
class UUIDAdapter {
 | 
			
		||||
    @ToJson
 | 
			
		||||
    fun toJson(uuid: UUID) = uuid.toString()
 | 
			
		||||
 | 
			
		||||
    @FromJson
 | 
			
		||||
    fun fromJson(s: String) = UUID.fromString(s)
 | 
			
		||||
}
 | 
			
		||||
@ -3,9 +3,6 @@ package {{modelPackage}}
 | 
			
		||||
 | 
			
		||||
{{#imports}}import {{import}}
 | 
			
		||||
{{/imports}}
 | 
			
		||||
{{#threetenbp}}
 | 
			
		||||
import org.threeten.bp.LocalDateTime
 | 
			
		||||
{{/threetenbp}}
 | 
			
		||||
 | 
			
		||||
{{#models}}
 | 
			
		||||
{{#model}}
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,8 @@
 | 
			
		||||
package org.openapitools.client.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.KotlinJsonAdapterFactory
 | 
			
		||||
import com.squareup.moshi.Moshi
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
import com.squareup.moshi.Rfc3339DateJsonAdapter
 | 
			
		||||
import okhttp3.OkHttpClient
 | 
			
		||||
import okhttp3.RequestBody
 | 
			
		||||
import okhttp3.MediaType
 | 
			
		||||
@ -12,7 +11,7 @@ import okhttp3.HttpUrl
 | 
			
		||||
import okhttp3.ResponseBody
 | 
			
		||||
import okhttp3.Request
 | 
			
		||||
import java.io.File
 | 
			
		||||
import java.util.UUID
 | 
			
		||||
import java.util.Date
 | 
			
		||||
 | 
			
		||||
open class ApiClient(val baseUrl: String) {
 | 
			
		||||
    companion object {
 | 
			
		||||
@ -63,12 +62,11 @@ open class ApiClient(val baseUrl: String) {
 | 
			
		||||
            return null
 | 
			
		||||
        }
 | 
			
		||||
        return when(mediaType) {
 | 
			
		||||
            JsonMediaType -> Moshi.Builder().add(object {
 | 
			
		||||
                    @ToJson
 | 
			
		||||
                    fun toJson(uuid: UUID) = uuid.toString()
 | 
			
		||||
                    @FromJson
 | 
			
		||||
                    fun fromJson(s: String) = UUID.fromString(s)
 | 
			
		||||
                })
 | 
			
		||||
            JsonMediaType -> Moshi.Builder()
 | 
			
		||||
                .add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
 | 
			
		||||
                .add(LocalDateTimeAdapter())
 | 
			
		||||
                .add(LocalDateAdapter())
 | 
			
		||||
                .add(UUIDAdapter())
 | 
			
		||||
                .add(ByteArrayAdapter())
 | 
			
		||||
                .add(KotlinJsonAdapterFactory())
 | 
			
		||||
                .build().adapter(T::class.java).fromJson(bodyContent)
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,19 @@
 | 
			
		||||
package org.openapitools.client.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
import java.time.LocalDate
 | 
			
		||||
import java.time.format.DateTimeFormatter
 | 
			
		||||
 | 
			
		||||
class LocalDateAdapter {
 | 
			
		||||
    @ToJson
 | 
			
		||||
    fun toJson(value: LocalDate): String {
 | 
			
		||||
        return DateTimeFormatter.ISO_LOCAL_DATE.format(value)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @FromJson
 | 
			
		||||
    fun fromJson(value: String): LocalDate {
 | 
			
		||||
        return LocalDate.parse(value, DateTimeFormatter.ISO_LOCAL_DATE)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,19 @@
 | 
			
		||||
package org.openapitools.client.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
import java.time.LocalDateTime
 | 
			
		||||
import java.time.format.DateTimeFormatter
 | 
			
		||||
 | 
			
		||||
class LocalDateTimeAdapter {
 | 
			
		||||
    @ToJson
 | 
			
		||||
    fun toJson(value: LocalDateTime): String {
 | 
			
		||||
        return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(value)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @FromJson
 | 
			
		||||
    fun fromJson(value: String): LocalDateTime {
 | 
			
		||||
        return LocalDateTime.parse(value, DateTimeFormatter.ISO_LOCAL_DATE_TIME)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -3,12 +3,16 @@ package org.openapitools.client.infrastructure
 | 
			
		||||
import com.squareup.moshi.KotlinJsonAdapterFactory
 | 
			
		||||
import com.squareup.moshi.Moshi
 | 
			
		||||
import com.squareup.moshi.Rfc3339DateJsonAdapter
 | 
			
		||||
import java.util.*
 | 
			
		||||
import java.util.Date
 | 
			
		||||
 | 
			
		||||
object Serializer {
 | 
			
		||||
    @JvmStatic
 | 
			
		||||
    val moshi: Moshi = Moshi.Builder()
 | 
			
		||||
        .add(KotlinJsonAdapterFactory())
 | 
			
		||||
        .add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
 | 
			
		||||
        .add(LocalDateTimeAdapter())
 | 
			
		||||
        .add(LocalDateAdapter())
 | 
			
		||||
        .add(UUIDAdapter())
 | 
			
		||||
        .add(ByteArrayAdapter())
 | 
			
		||||
        .add(KotlinJsonAdapterFactory())
 | 
			
		||||
        .build()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,13 @@
 | 
			
		||||
package org.openapitools.client.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
import java.util.UUID
 | 
			
		||||
 | 
			
		||||
class UUIDAdapter {
 | 
			
		||||
    @ToJson
 | 
			
		||||
    fun toJson(uuid: UUID) = uuid.toString()
 | 
			
		||||
 | 
			
		||||
    @FromJson
 | 
			
		||||
    fun fromJson(s: String) = UUID.fromString(s)
 | 
			
		||||
}
 | 
			
		||||
@ -2,8 +2,11 @@ package org.openapitools.client
 | 
			
		||||
 | 
			
		||||
import io.kotlintest.shouldBe
 | 
			
		||||
import io.kotlintest.matchers.numerics.shouldBeGreaterThan
 | 
			
		||||
import io.kotlintest.matchers.string.shouldContain
 | 
			
		||||
import io.kotlintest.shouldThrow
 | 
			
		||||
import io.kotlintest.specs.ShouldSpec
 | 
			
		||||
import org.openapitools.client.apis.PetApi
 | 
			
		||||
import org.openapitools.client.infrastructure.ClientException
 | 
			
		||||
import org.openapitools.client.models.Category
 | 
			
		||||
import org.openapitools.client.models.Pet
 | 
			
		||||
import org.openapitools.client.models.Tag
 | 
			
		||||
@ -11,8 +14,11 @@ import org.openapitools.client.models.Tag
 | 
			
		||||
class PetApiTest : ShouldSpec() {
 | 
			
		||||
    init {
 | 
			
		||||
 | 
			
		||||
        val petId:Long = 10006
 | 
			
		||||
        val api = PetApi()
 | 
			
		||||
 | 
			
		||||
        should("add a pet") {
 | 
			
		||||
            val petId:Long = 10006
 | 
			
		||||
 | 
			
		||||
            val pet = Pet(
 | 
			
		||||
                    id = petId,
 | 
			
		||||
                    name = "kotlin client test",
 | 
			
		||||
@ -20,15 +26,11 @@ class PetApiTest : ShouldSpec() {
 | 
			
		||||
                    category = Category(petId, "test kotlin category"),
 | 
			
		||||
                    tags = arrayOf(Tag(petId, "test kotlin tag"))
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            val api = PetApi()
 | 
			
		||||
            api.addPet(pet)
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        should("get pet by id") {
 | 
			
		||||
            val petId: Long = 10006
 | 
			
		||||
            val api = PetApi()
 | 
			
		||||
            val result = api.getPetById(petId)
 | 
			
		||||
 | 
			
		||||
            result.id shouldBe (petId)
 | 
			
		||||
@ -42,7 +44,6 @@ class PetApiTest : ShouldSpec() {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        should("find pet by status") {
 | 
			
		||||
            val api = PetApi()
 | 
			
		||||
            val result = api.findPetsByStatus(arrayOf("available"))
 | 
			
		||||
 | 
			
		||||
            result.size.shouldBeGreaterThan(0)
 | 
			
		||||
@ -58,15 +59,12 @@ class PetApiTest : ShouldSpec() {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        should("update a pet") {
 | 
			
		||||
            val petId:Long = 10007
 | 
			
		||||
            val pet = Pet(
 | 
			
		||||
                    id = petId,
 | 
			
		||||
                    name = "kotlin client updatePet",
 | 
			
		||||
                    status = Pet.Status.pending,
 | 
			
		||||
                    photoUrls = arrayOf("http://test_kotlin_unit_test.com")
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            val api = PetApi()
 | 
			
		||||
            api.updatePet(pet)
 | 
			
		||||
 | 
			
		||||
            // verify updated Pet
 | 
			
		||||
@ -77,14 +75,10 @@ class PetApiTest : ShouldSpec() {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //TODO the test fail cause client doesn't support other JSON contentType/Accept
 | 
			
		||||
        /*
 | 
			
		||||
        should("update a pet with form") {
 | 
			
		||||
            val petId:Long = 10007
 | 
			
		||||
            val name = "kotlin client updatePet with Form"
 | 
			
		||||
            val status = "pending"
 | 
			
		||||
 | 
			
		||||
            val api = PetApi()
 | 
			
		||||
            api.updatePetWithForm(petId, name, status)
 | 
			
		||||
 | 
			
		||||
            // verify updated Pet
 | 
			
		||||
@ -94,7 +88,16 @@ class PetApiTest : ShouldSpec() {
 | 
			
		||||
            result.status shouldBe (Pet.Status.pending)
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        */
 | 
			
		||||
 | 
			
		||||
        should("delete a pet") {
 | 
			
		||||
            api.deletePet(petId, "apiKey")
 | 
			
		||||
 | 
			
		||||
            // verify updated Pet
 | 
			
		||||
            val exception = shouldThrow<ClientException> {
 | 
			
		||||
                api.getPetById(petId)
 | 
			
		||||
            }
 | 
			
		||||
            exception.message?.shouldContain("Pet not found")
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -25,7 +25,6 @@ import org.openapitools.client.infrastructure.RequestMethod
 | 
			
		||||
import org.openapitools.client.infrastructure.ResponseType
 | 
			
		||||
import org.openapitools.client.infrastructure.Success
 | 
			
		||||
import org.openapitools.client.infrastructure.toMultiValue
 | 
			
		||||
import org.threeten.bp.LocalDateTime
 | 
			
		||||
 | 
			
		||||
class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiClient(basePath) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -24,7 +24,6 @@ import org.openapitools.client.infrastructure.RequestMethod
 | 
			
		||||
import org.openapitools.client.infrastructure.ResponseType
 | 
			
		||||
import org.openapitools.client.infrastructure.Success
 | 
			
		||||
import org.openapitools.client.infrastructure.toMultiValue
 | 
			
		||||
import org.threeten.bp.LocalDateTime
 | 
			
		||||
 | 
			
		||||
class StoreApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiClient(basePath) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -24,7 +24,6 @@ import org.openapitools.client.infrastructure.RequestMethod
 | 
			
		||||
import org.openapitools.client.infrastructure.ResponseType
 | 
			
		||||
import org.openapitools.client.infrastructure.Success
 | 
			
		||||
import org.openapitools.client.infrastructure.toMultiValue
 | 
			
		||||
import org.threeten.bp.LocalDateTime
 | 
			
		||||
 | 
			
		||||
class UserApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiClient(basePath) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,8 @@
 | 
			
		||||
package org.openapitools.client.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.KotlinJsonAdapterFactory
 | 
			
		||||
import com.squareup.moshi.Moshi
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
import com.squareup.moshi.Rfc3339DateJsonAdapter
 | 
			
		||||
import okhttp3.OkHttpClient
 | 
			
		||||
import okhttp3.RequestBody
 | 
			
		||||
import okhttp3.MediaType
 | 
			
		||||
@ -12,7 +11,7 @@ import okhttp3.HttpUrl
 | 
			
		||||
import okhttp3.ResponseBody
 | 
			
		||||
import okhttp3.Request
 | 
			
		||||
import java.io.File
 | 
			
		||||
import java.util.UUID
 | 
			
		||||
import java.util.Date
 | 
			
		||||
 | 
			
		||||
open class ApiClient(val baseUrl: String) {
 | 
			
		||||
    companion object {
 | 
			
		||||
@ -63,12 +62,11 @@ open class ApiClient(val baseUrl: String) {
 | 
			
		||||
            return null
 | 
			
		||||
        }
 | 
			
		||||
        return when(mediaType) {
 | 
			
		||||
            JsonMediaType -> Moshi.Builder().add(object {
 | 
			
		||||
                    @ToJson
 | 
			
		||||
                    fun toJson(uuid: UUID) = uuid.toString()
 | 
			
		||||
                    @FromJson
 | 
			
		||||
                    fun fromJson(s: String) = UUID.fromString(s)
 | 
			
		||||
                })
 | 
			
		||||
            JsonMediaType -> Moshi.Builder()
 | 
			
		||||
                .add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
 | 
			
		||||
                .add(LocalDateTimeAdapter())
 | 
			
		||||
                .add(LocalDateAdapter())
 | 
			
		||||
                .add(UUIDAdapter())
 | 
			
		||||
                .add(ByteArrayAdapter())
 | 
			
		||||
                .add(KotlinJsonAdapterFactory())
 | 
			
		||||
                .build().adapter(T::class.java).fromJson(bodyContent)
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,19 @@
 | 
			
		||||
package org.openapitools.client.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
import org.threeten.bp.LocalDate
 | 
			
		||||
import org.threeten.bp.format.DateTimeFormatter
 | 
			
		||||
 | 
			
		||||
class LocalDateAdapter {
 | 
			
		||||
    @ToJson
 | 
			
		||||
    fun toJson(value: LocalDate): String {
 | 
			
		||||
        return DateTimeFormatter.ISO_LOCAL_DATE.format(value)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @FromJson
 | 
			
		||||
    fun fromJson(value: String): LocalDate {
 | 
			
		||||
        return LocalDate.parse(value, DateTimeFormatter.ISO_LOCAL_DATE)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,19 @@
 | 
			
		||||
package org.openapitools.client.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
import org.threeten.bp.LocalDateTime
 | 
			
		||||
import org.threeten.bp.format.DateTimeFormatter
 | 
			
		||||
 | 
			
		||||
class LocalDateTimeAdapter {
 | 
			
		||||
    @ToJson
 | 
			
		||||
    fun toJson(value: LocalDateTime): String {
 | 
			
		||||
        return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(value)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @FromJson
 | 
			
		||||
    fun fromJson(value: String): LocalDateTime {
 | 
			
		||||
        return LocalDateTime.parse(value, DateTimeFormatter.ISO_LOCAL_DATE_TIME)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -3,12 +3,16 @@ package org.openapitools.client.infrastructure
 | 
			
		||||
import com.squareup.moshi.KotlinJsonAdapterFactory
 | 
			
		||||
import com.squareup.moshi.Moshi
 | 
			
		||||
import com.squareup.moshi.Rfc3339DateJsonAdapter
 | 
			
		||||
import java.util.*
 | 
			
		||||
import java.util.Date
 | 
			
		||||
 | 
			
		||||
object Serializer {
 | 
			
		||||
    @JvmStatic
 | 
			
		||||
    val moshi: Moshi = Moshi.Builder()
 | 
			
		||||
        .add(KotlinJsonAdapterFactory())
 | 
			
		||||
        .add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
 | 
			
		||||
        .add(LocalDateTimeAdapter())
 | 
			
		||||
        .add(LocalDateAdapter())
 | 
			
		||||
        .add(UUIDAdapter())
 | 
			
		||||
        .add(ByteArrayAdapter())
 | 
			
		||||
        .add(KotlinJsonAdapterFactory())
 | 
			
		||||
        .build()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,13 @@
 | 
			
		||||
package org.openapitools.client.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
import java.util.UUID
 | 
			
		||||
 | 
			
		||||
class UUIDAdapter {
 | 
			
		||||
    @ToJson
 | 
			
		||||
    fun toJson(uuid: UUID) = uuid.toString()
 | 
			
		||||
 | 
			
		||||
    @FromJson
 | 
			
		||||
    fun fromJson(s: String) = UUID.fromString(s)
 | 
			
		||||
}
 | 
			
		||||
@ -11,7 +11,6 @@
 | 
			
		||||
*/
 | 
			
		||||
package org.openapitools.client.models
 | 
			
		||||
 | 
			
		||||
import org.threeten.bp.LocalDateTime
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.Json
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,6 @@
 | 
			
		||||
*/
 | 
			
		||||
package org.openapitools.client.models
 | 
			
		||||
 | 
			
		||||
import org.threeten.bp.LocalDateTime
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.Json
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,6 @@
 | 
			
		||||
*/
 | 
			
		||||
package org.openapitools.client.models
 | 
			
		||||
 | 
			
		||||
import org.threeten.bp.LocalDateTime
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.Json
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,6 @@ package org.openapitools.client.models
 | 
			
		||||
 | 
			
		||||
import org.openapitools.client.models.Category
 | 
			
		||||
import org.openapitools.client.models.Tag
 | 
			
		||||
import org.threeten.bp.LocalDateTime
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.Json
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,6 @@
 | 
			
		||||
*/
 | 
			
		||||
package org.openapitools.client.models
 | 
			
		||||
 | 
			
		||||
import org.threeten.bp.LocalDateTime
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.Json
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,6 @@
 | 
			
		||||
*/
 | 
			
		||||
package org.openapitools.client.models
 | 
			
		||||
 | 
			
		||||
import org.threeten.bp.LocalDateTime
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.Json
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
@ -2,8 +2,11 @@ package org.openapitools.client
 | 
			
		||||
 | 
			
		||||
import io.kotlintest.shouldBe
 | 
			
		||||
import io.kotlintest.matchers.numerics.shouldBeGreaterThan
 | 
			
		||||
import io.kotlintest.matchers.string.shouldContain
 | 
			
		||||
import io.kotlintest.shouldThrow
 | 
			
		||||
import io.kotlintest.specs.ShouldSpec
 | 
			
		||||
import org.openapitools.client.apis.PetApi
 | 
			
		||||
import org.openapitools.client.infrastructure.ClientException
 | 
			
		||||
import org.openapitools.client.models.Category
 | 
			
		||||
import org.openapitools.client.models.Pet
 | 
			
		||||
import org.openapitools.client.models.Tag
 | 
			
		||||
@ -11,8 +14,11 @@ import org.openapitools.client.models.Tag
 | 
			
		||||
class PetApiTest : ShouldSpec() {
 | 
			
		||||
    init {
 | 
			
		||||
 | 
			
		||||
        val petId:Long = 10006
 | 
			
		||||
        val api = PetApi()
 | 
			
		||||
 | 
			
		||||
        should("add a pet") {
 | 
			
		||||
            val petId:Long = 10006
 | 
			
		||||
 | 
			
		||||
            val pet = Pet(
 | 
			
		||||
                    id = petId,
 | 
			
		||||
                    name = "kotlin client test",
 | 
			
		||||
@ -20,15 +26,11 @@ class PetApiTest : ShouldSpec() {
 | 
			
		||||
                    category = Category(petId, "test kotlin category"),
 | 
			
		||||
                    tags = arrayOf(Tag(petId, "test kotlin tag"))
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            val api = PetApi()
 | 
			
		||||
            api.addPet(pet)
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        should("get pet by id") {
 | 
			
		||||
            val petId: Long = 10006
 | 
			
		||||
            val api = PetApi()
 | 
			
		||||
            val result = api.getPetById(petId)
 | 
			
		||||
 | 
			
		||||
            result.id shouldBe (petId)
 | 
			
		||||
@ -42,7 +44,6 @@ class PetApiTest : ShouldSpec() {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        should("find pet by status") {
 | 
			
		||||
            val api = PetApi()
 | 
			
		||||
            val result = api.findPetsByStatus(arrayOf("available"))
 | 
			
		||||
 | 
			
		||||
            result.size.shouldBeGreaterThan(0)
 | 
			
		||||
@ -58,15 +59,12 @@ class PetApiTest : ShouldSpec() {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        should("update a pet") {
 | 
			
		||||
            val petId:Long = 10007
 | 
			
		||||
            val pet = Pet(
 | 
			
		||||
                    id = petId,
 | 
			
		||||
                    name = "kotlin client updatePet",
 | 
			
		||||
                    status = Pet.Status.pending,
 | 
			
		||||
                    photoUrls = arrayOf("http://test_kotlin_unit_test.com")
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            val api = PetApi()
 | 
			
		||||
            api.updatePet(pet)
 | 
			
		||||
 | 
			
		||||
            // verify updated Pet
 | 
			
		||||
@ -77,14 +75,10 @@ class PetApiTest : ShouldSpec() {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //TODO the test fail cause client doesn't support other JSON contentType/Accept
 | 
			
		||||
        /*
 | 
			
		||||
        should("update a pet with form") {
 | 
			
		||||
            val petId:Long = 10007
 | 
			
		||||
            val name = "kotlin client updatePet with Form"
 | 
			
		||||
            val status = "pending"
 | 
			
		||||
 | 
			
		||||
            val api = PetApi()
 | 
			
		||||
            api.updatePetWithForm(petId, name, status)
 | 
			
		||||
 | 
			
		||||
            // verify updated Pet
 | 
			
		||||
@ -94,7 +88,16 @@ class PetApiTest : ShouldSpec() {
 | 
			
		||||
            result.status shouldBe (Pet.Status.pending)
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        */
 | 
			
		||||
 | 
			
		||||
        should("delete a pet") {
 | 
			
		||||
            api.deletePet(petId, "apiKey")
 | 
			
		||||
 | 
			
		||||
            // verify updated Pet
 | 
			
		||||
            val exception = shouldThrow<ClientException> {
 | 
			
		||||
                api.getPetById(petId)
 | 
			
		||||
            }
 | 
			
		||||
            exception.message?.shouldContain("Pet not found")
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,8 @@
 | 
			
		||||
package org.openapitools.client.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.KotlinJsonAdapterFactory
 | 
			
		||||
import com.squareup.moshi.Moshi
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
import com.squareup.moshi.Rfc3339DateJsonAdapter
 | 
			
		||||
import okhttp3.OkHttpClient
 | 
			
		||||
import okhttp3.RequestBody
 | 
			
		||||
import okhttp3.MediaType
 | 
			
		||||
@ -12,7 +11,7 @@ import okhttp3.HttpUrl
 | 
			
		||||
import okhttp3.ResponseBody
 | 
			
		||||
import okhttp3.Request
 | 
			
		||||
import java.io.File
 | 
			
		||||
import java.util.UUID
 | 
			
		||||
import java.util.Date
 | 
			
		||||
 | 
			
		||||
open class ApiClient(val baseUrl: String) {
 | 
			
		||||
    companion object {
 | 
			
		||||
@ -63,12 +62,11 @@ open class ApiClient(val baseUrl: String) {
 | 
			
		||||
            return null
 | 
			
		||||
        }
 | 
			
		||||
        return when(mediaType) {
 | 
			
		||||
            JsonMediaType -> Moshi.Builder().add(object {
 | 
			
		||||
                    @ToJson
 | 
			
		||||
                    fun toJson(uuid: UUID) = uuid.toString()
 | 
			
		||||
                    @FromJson
 | 
			
		||||
                    fun fromJson(s: String) = UUID.fromString(s)
 | 
			
		||||
                })
 | 
			
		||||
            JsonMediaType -> Moshi.Builder()
 | 
			
		||||
                .add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
 | 
			
		||||
                .add(LocalDateTimeAdapter())
 | 
			
		||||
                .add(LocalDateAdapter())
 | 
			
		||||
                .add(UUIDAdapter())
 | 
			
		||||
                .add(ByteArrayAdapter())
 | 
			
		||||
                .add(KotlinJsonAdapterFactory())
 | 
			
		||||
                .build().adapter(T::class.java).fromJson(bodyContent)
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,19 @@
 | 
			
		||||
package org.openapitools.client.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
import java.time.LocalDate
 | 
			
		||||
import java.time.format.DateTimeFormatter
 | 
			
		||||
 | 
			
		||||
class LocalDateAdapter {
 | 
			
		||||
    @ToJson
 | 
			
		||||
    fun toJson(value: LocalDate): String {
 | 
			
		||||
        return DateTimeFormatter.ISO_LOCAL_DATE.format(value)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @FromJson
 | 
			
		||||
    fun fromJson(value: String): LocalDate {
 | 
			
		||||
        return LocalDate.parse(value, DateTimeFormatter.ISO_LOCAL_DATE)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,19 @@
 | 
			
		||||
package org.openapitools.client.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
import java.time.LocalDateTime
 | 
			
		||||
import java.time.format.DateTimeFormatter
 | 
			
		||||
 | 
			
		||||
class LocalDateTimeAdapter {
 | 
			
		||||
    @ToJson
 | 
			
		||||
    fun toJson(value: LocalDateTime): String {
 | 
			
		||||
        return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(value)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @FromJson
 | 
			
		||||
    fun fromJson(value: String): LocalDateTime {
 | 
			
		||||
        return LocalDateTime.parse(value, DateTimeFormatter.ISO_LOCAL_DATE_TIME)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -3,12 +3,16 @@ package org.openapitools.client.infrastructure
 | 
			
		||||
import com.squareup.moshi.KotlinJsonAdapterFactory
 | 
			
		||||
import com.squareup.moshi.Moshi
 | 
			
		||||
import com.squareup.moshi.Rfc3339DateJsonAdapter
 | 
			
		||||
import java.util.*
 | 
			
		||||
import java.util.Date
 | 
			
		||||
 | 
			
		||||
object Serializer {
 | 
			
		||||
    @JvmStatic
 | 
			
		||||
    val moshi: Moshi = Moshi.Builder()
 | 
			
		||||
        .add(KotlinJsonAdapterFactory())
 | 
			
		||||
        .add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
 | 
			
		||||
        .add(LocalDateTimeAdapter())
 | 
			
		||||
        .add(LocalDateAdapter())
 | 
			
		||||
        .add(UUIDAdapter())
 | 
			
		||||
        .add(ByteArrayAdapter())
 | 
			
		||||
        .add(KotlinJsonAdapterFactory())
 | 
			
		||||
        .build()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,13 @@
 | 
			
		||||
package org.openapitools.client.infrastructure
 | 
			
		||||
 | 
			
		||||
import com.squareup.moshi.FromJson
 | 
			
		||||
import com.squareup.moshi.ToJson
 | 
			
		||||
import java.util.UUID
 | 
			
		||||
 | 
			
		||||
class UUIDAdapter {
 | 
			
		||||
    @ToJson
 | 
			
		||||
    fun toJson(uuid: UUID) = uuid.toString()
 | 
			
		||||
 | 
			
		||||
    @FromJson
 | 
			
		||||
    fun fromJson(s: String) = UUID.fromString(s)
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,48 @@
 | 
			
		||||
package org.openapitools.client
 | 
			
		||||
 | 
			
		||||
import io.kotlintest.shouldBe
 | 
			
		||||
import io.kotlintest.specs.ShouldSpec
 | 
			
		||||
import org.openapitools.client.apis.PetApi
 | 
			
		||||
import org.openapitools.client.apis.StoreApi
 | 
			
		||||
import org.openapitools.client.models.Order
 | 
			
		||||
import org.openapitools.client.models.Pet
 | 
			
		||||
import java.time.LocalDateTime.now
 | 
			
		||||
 | 
			
		||||
class StoreApiTest : ShouldSpec() {
 | 
			
		||||
    init {
 | 
			
		||||
 | 
			
		||||
        val petId:Long = 10006
 | 
			
		||||
        val petApi = PetApi()
 | 
			
		||||
        val storeApi = StoreApi()
 | 
			
		||||
 | 
			
		||||
        val pet = Pet(
 | 
			
		||||
                id = petId,
 | 
			
		||||
                name = "kotlin client test",
 | 
			
		||||
                photoUrls = arrayOf("http://test_kotlin_unit_test.com")
 | 
			
		||||
        )
 | 
			
		||||
        petApi.addPet(pet)
 | 
			
		||||
 | 
			
		||||
        should("add an order") {
 | 
			
		||||
 | 
			
		||||
            val order = Order(
 | 
			
		||||
                    id = 12,
 | 
			
		||||
                    petId = petId,
 | 
			
		||||
                    quantity = 2,
 | 
			
		||||
                    shipDate = now(),
 | 
			
		||||
                    complete = true
 | 
			
		||||
            )
 | 
			
		||||
            storeApi.placeOrder(order);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        should("get order by id") {
 | 
			
		||||
            val result = storeApi.getOrderById(12)
 | 
			
		||||
 | 
			
		||||
            // verify order
 | 
			
		||||
            result.petId shouldBe (petId)
 | 
			
		||||
            result.quantity shouldBe (2)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user