All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.specmatic.conversions.ExampleRequestBuilder.kt Maven / Gradle / Ivy

Go to download

Turn your contracts into executable specifications. Contract Driven Development - Collaboratively Design & Independently Deploy MicroServices & MicroFrontends.

There is a newer version: 2.0.37
Show newest version
package io.specmatic.conversions

import io.specmatic.core.HttpPathPattern
import io.specmatic.core.HttpRequest
import io.specmatic.core.pattern.parsedValue

class ExampleRequestBuilder(
    examplePathParams: Map>,
    exampleHeaderParams: Map>,
    exampleQueryParams: Map>,
    val httpPathPattern: HttpPathPattern,
    private val httpMethod: String,
    val securitySchemes: Map
) {
    fun examplesWithRequestBodies(exampleBodies: Map, contentType: String): Map> {
        val examplesWithBodies: Map> = exampleBodies.mapValues { (exampleName, bodyValue) ->
            val bodies: List = if(exampleName in examplesBasedOnParameters) {
                examplesBasedOnParameters.getValue(exampleName).map { exampleRequest ->
                    exampleRequest
                        .copy(
                            headers = exampleRequest.headers + mapOf("Content-Type" to contentType),
                            body = parsedValue(bodyValue))
                }
            } else {
                val httpRequest = HttpRequest(
                    method = httpMethod,
                    path = httpPathPattern.path,
                    headers = mapOf("Content-Type" to contentType),
                    body = parsedValue(bodyValue)
                )

                val requestsWithSecurityParams = securitySchemes.map { (_, securityScheme) ->
                    securityScheme.addTo(httpRequest)
                }

                requestsWithSecurityParams
            }

            bodies
        }

        val examplesWithoutBodies = (examplesBasedOnParameters.keys - exampleBodies.keys).associate { key ->
            key to examplesBasedOnParameters.getValue(key)
        }

        val allExamples = examplesWithBodies + examplesWithoutBodies

        return allExamples
    }

    private val unionOfParameterKeys =
        (exampleQueryParams.keys + examplePathParams.keys + exampleHeaderParams.keys).distinct()

    val examplesBasedOnParameters: Map> = unionOfParameterKeys.associateWith { exampleName ->
        val queryParams = exampleQueryParams[exampleName] ?: emptyMap()
        val pathParams = examplePathParams[exampleName] ?: emptyMap()
        val headerParams = exampleHeaderParams[exampleName] ?: emptyMap()

        val path = toConcretePath(pathParams, httpPathPattern)

        val httpRequest =
            HttpRequest(method = httpMethod, path = path, queryParametersMap = queryParams, headers = headerParams)

        val requestsWithSecurityParams: List = securitySchemes.map { (_, securityScheme) ->
            securityScheme.addTo(httpRequest)
        }

        requestsWithSecurityParams
    }

}

private fun toConcretePath(
    pathParams: Map,
    httpPathPattern: HttpPathPattern
): String {
    val path = pathParams.entries.fold(httpPathPattern.toOpenApiPath()) { acc, (key, value) ->
        acc.replace("{$key}", value)
    }
    return path
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy