zenstruck / browser

A fluent interface for your Symfony functional tests.
MIT License
185 stars 17 forks source link

Confusing `assertJsonMatches` exception message when arrays are equal but not same #127

Open flohw opened 1 year ago

flohw commented 1 year ago

Hello,

I just faced an issue with assertJsonMatches method (note for search engine: which calls json()->assertMatches) can throw a weird exception message : (array:assoc)" to be the same as "(array:assoc)".

It turns out that's because I didn't ordered my array the same way the api endpoint tested returns its.

Value returned by the API:

{
    "errors": {
       "last_name": ["Invalid value"],
       "first_name": ["Invalid value"],
    }
}

Test:

assertJsonMatches('errors', [
    'first_name' => ['Invalid value'],
    'last_name' => ['Invalid value'],
]); // This will throw the exception message above

The same issue applies for multidimensional arrays.

I hope this can be easily fixed. I have no idea how for now. :exploding_head:

Thank you!

kbond commented 1 year ago

I feel like the current behaviour is expected...?

This should be possible using the array subset assertions but I think we need some DX improvements:

Assert::that($browser->json()->decoded()['errors'])
    ->hasSubset(['first_name' => ['Invalid value']])
    ->hasSubset(['last_name' => ['Invalid value']])
;

First, does the above code work for you scenario?

nikophil commented 1 year ago

Maybe we can use https://github.com/sebastianbergmann/diff ?

flohw commented 1 year ago

I feel like the current behaviour is expected...?

It is! There is no problem with that. This is about the error message which may be unclear. The arrays were equals but not the same as the order matters: in both cases we have an associative array. Not the same due to different key order between expected and actual arrays.

I'm not sure the message is improvable.

First, does the above code work for you scenario?

It does.

kbond commented 1 year ago

This is about the error message which may be unclear.

Ah, I misunderstood. Indeed, that error message isn't great.

https://github.com/sebastianbergmann/diff

Agreed.