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

in.specmatic.core.CheckOnlyPatternKeys.kt Maven / Gradle / Ivy

Go to download

Turn your contracts into executable specifications. Contract Driven Development - Collaboratively Design & Independently Deploy MicroServices & MicroFrontends. Deprecation Notice for group ID "in.specmatic" ****************************************************************************************************** Updates for "specmatic-core" will no longer be available under the deprecated group ID "in.specmatic". Please update your dependencies to use the new group ID "io.specmatic". ******************************************************************************************************

There is a newer version: 1.3.39
Show newest version
package `in`.specmatic.core

import `in`.specmatic.core.pattern.Pattern
import `in`.specmatic.core.pattern.isOptional
import `in`.specmatic.core.value.StringValue

internal object CheckOnlyPatternKeys: KeyErrorCheck {
    override fun validate(pattern: Map, actual: Map): KeyError? {
        return validateList(pattern, actual).firstOrNull()
    }

    override fun validateList(pattern: Map, actual: Map): List {
        return pattern.minus("...").keys.filter { key ->
            isMissingKey(actual, key)
        }.map { it.toMissingKeyError() }
    }

    override fun validateListCaseInsensitive(
        pattern: Map,
        actual: Map
    ): List {
        return pattern.minus("...").keys.filter { key ->
            isMissingKeyCaseInsensitive(actual, key)
        }.map { it.toMissingKeyError() }
    }
}

internal fun String.toMissingKeyError(): MissingKeyError {
    return MissingKeyError(this)
}

internal fun isMissingKey(jsonObject: Map, key: String) =
    when {
        isOptional(key) -> false
        else -> key !in jsonObject && "$key?" !in jsonObject && "$key:" !in jsonObject
    }

internal fun isMissingKeyCaseInsensitive(jsonObject: Map, key: String) =
    when {
        isOptional(key) -> false
        else -> {
            val objectWithLowerCaseKeys = jsonObject.mapKeys { it.key.lowercase() }
            val lowerCaseKey = key.lowercase()

            lowerCaseKey !in objectWithLowerCaseKeys && "$lowerCaseKey?" !in objectWithLowerCaseKeys && "$lowerCaseKey:" !in objectWithLowerCaseKeys
        }
    }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy