phpunit-wrapper icon indicating copy to clipboard operation
phpunit-wrapper copied to clipboard

JsonContains mismatches nested sequential array

Open jumale opened this issue 6 years ago • 1 comments

Hi, I'm not sure if it's a bug or expected behaviour.

This example matches correctly:

<?php
$actualJson = [
    'foo' => [
        'bar' => ['cat', 'dog']
    ]
];

$expectedJson = ['cat', 'dog'];

(new JsonContains($expectedJson))->evaluate(json_encode($actualJson));
// success

While this example fails - it can not match a sequential array when it's inside of another sequential array:

<?php
$actualJson = [
    'foo' => [
        ['cat', 'dog']
    ]
];

$expectedJson = ['cat', 'dog'];

(new JsonContains($expectedJson))->evaluate(json_encode($actualJson));
// failed

There is a workaround to wrap the expected value in an array one more time, but still looks weird that it does not work in the example above.

<?php
$actualJson = [
    'foo' => [
        ['some noise'],
        ['cat', 'dog'],
        ['some noise'],
    ]
];

$expectedJson = [['cat', 'dog']];

(new JsonContains($expectedJson))->evaluate(json_encode($actualJson));
// success

jumale avatar Feb 25 '19 21:02 jumale

It seems you need to wrap it as many times as amount of sequential arrays on the way to the matched value. In the next example content is a collection of objects and rows is a collection of arrays. And you need to wrap the expected result twice, only then it matches:

<?php
$actualJson = [
    'content' => [
        [
            'rows' => [
                ['cat', 'dog']
            ]
        ]
    ]
];

$expectedJson = [[['cat', 'dog']]];

(new JsonContains($expectedJson))->evaluate(json_encode($actualJson));

jumale avatar Feb 25 '19 21:02 jumale