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

commonTest.io.kotest.assertions.json.EqualIgnoringUnknownTest.kt Maven / Gradle / Ivy

package io.kotest.assertions.json

import io.kotest.assertions.json.shouldEqualSpecifiedJson
import io.kotest.assertions.shouldFail
import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.throwable.shouldHaveMessage
import io.kotest.property.Arb
import io.kotest.property.arbitrary.Codepoint
import io.kotest.property.arbitrary.az
import io.kotest.property.arbitrary.string
import io.kotest.property.checkAll

class EqualIgnoringUnknownTest : FunSpec(
   {
      test("extra field in actual - passes") {
         checkAll(Arb.string(1..10, Codepoint.az())) { string ->
            val a = """ { "a" : "$string", "b": "bar" } """
            val b = """ { "a" : "$string" }"""

            a shouldEqualSpecifiedJson b
         }
      }

      test("expected field has different value - should fail") {
         val a = """ { "a" : "foo", "b" : "bar" } """
         val b = """ { "a" : "foo", "b" : "baz" } """

         a shouldEqualSpecifiedJson a

         shouldFail {
            a shouldEqualSpecifiedJson b
         }.shouldHaveMessage(
            """At 'b' expected 'baz' but was 'bar'

expected:<{
  "a": "foo",
  "b": "baz"
}> but was:<{
  "a": "foo",
  "b": "bar"
}>"""
         )
      }

      test("actual missing field") {
         val a = """ { "a" : "foo" } """
         val b = """ { "a" : "foo", "b": "bar" } """

         shouldFail {
            a shouldEqualSpecifiedJson b
         }.shouldHaveMessage(
            """The top level object was missing expected field(s) [b]

expected:<{
  "a": "foo",
  "b": "bar"
}> but was:<{
  "a": "foo"
}>"""
         )
      }

      context("Nested object") {
         test("extra field is ok") {
            checkAll(Arb.string(1..10, Codepoint.az())) { string ->
               val a = """ { "wrapper": { "a" : "$string", "b": "bar" } }"""
               val b = """ { "wrapper": { "a" : "$string" } }"""

               a shouldEqualSpecifiedJson b
            }
         }

         test("nested expected value differs") {
            val a = """ { "wrapper": { "a" : "foo", "b": "bar" } }"""
            val b = """ { "wrapper": { "a" : "foo", "b": "baz" } }"""

            a shouldEqualSpecifiedJson a

            shouldFail {
               a shouldEqualSpecifiedJson b
            }.shouldHaveMessage(
               """At 'wrapper.b' expected 'baz' but was 'bar'

expected:<{
  "wrapper": {
    "a": "foo",
    "b": "baz"
  }
}> but was:<{
  "wrapper": {
    "a": "foo",
    "b": "bar"
  }
}>"""
            )
         }

         test("actual missing field") {
            val a = """ { "wrapper": { "a" : "foo" } } """
            val b = """ { "wrapper": { "a" : "foo", "b": "bar" } } """

            shouldFail {
               a shouldEqualSpecifiedJson b
            }.shouldHaveMessage(
               """At 'wrapper' object was missing expected field(s) [b]

expected:<{
  "wrapper": {
    "a": "foo",
    "b": "bar"
  }
}> but was:<{
  "wrapper": {
    "a": "foo"
  }
}>"""
            )
         }

      }

      context("Arrays") {
         test("extra field is ok") {
            checkAll(Arb.string(1..10, Codepoint.az())) { string ->
               val a = """ { "wrapper": [{ "a" : "$string", "b": "bar" }] }"""
               val b = """ { "wrapper": [{ "a" : "$string" }] }"""

               a shouldEqualSpecifiedJson b
            }
         }

         test("nested expected value differs") {
            val a = """ { "wrapper": [{ "a" : "foo", "b": "bar" }] }"""
            val b = """ { "wrapper": [{ "a" : "foo", "b": "baz" }] }"""

            a shouldEqualSpecifiedJson a

            shouldFail {
               a shouldEqualSpecifiedJson b
            }.shouldHaveMessage(
               """At 'wrapper.[0].b' expected 'baz' but was 'bar'

expected:<{
  "wrapper": [
    {
      "a": "foo",
      "b": "baz"
    }
  ]
}> but was:<{
  "wrapper": [
    {
      "a": "foo",
      "b": "bar"
    }
  ]
}>"""
            )
         }

         test("actual missing field") {
            val a = """ { "wrapper": [ { "a" : "foo" } ] } """
            val b = """ { "wrapper": [ { "a" : "foo", "b": "bar" } ] } """

            shouldFail {
               a shouldEqualSpecifiedJson b
            }.shouldHaveMessage(
               """At 'wrapper.[0]' object was missing expected field(s) [b]

expected:<{
  "wrapper": [
    {
      "a": "foo",
      "b": "bar"
    }
  ]
}> but was:<{
  "wrapper": [
    {
      "a": "foo"
    }
  ]
}>"""
            )
         }

         test("extra fields ok with different order array") {
            val a = """ { "wrapper": [{ "c" : "baz" }, { "a" : "foo", "b": "bar" } ] }"""
            val b = """ { "wrapper": [{ "a" : "foo" }, { "c" : "baz" } ] }"""

            a shouldEqualSpecifiedJsonIgnoringOrder b
         }
      }
   }
)




© 2015 - 2025 Weber Informatics LLC | Privacy Policy