Merge pull request #465 from pestphp/v2_json_fix

Makes `json` expectation usable in Higher Order Tests
This commit is contained in:
Nuno Maduro
2022-01-23 23:29:35 +00:00
committed by GitHub
3 changed files with 27 additions and 2 deletions

View File

@ -62,7 +62,7 @@ final class Expectation
/** /**
* Creates a new expectation with the decoded JSON value. * Creates a new expectation with the decoded JSON value.
* *
* @return self<mixed> * @return self<array<int|string, mixed>|bool>
*/ */
public function json(): Expectation public function json(): Expectation
{ {
@ -70,7 +70,10 @@ final class Expectation
InvalidExpectationValue::expected('string'); InvalidExpectationValue::expected('string');
} }
return $this->toBeJson()->and(json_decode($this->value, true)); /** @var array<int|string, mixed>|bool $value */
$value = json_decode($this->value, true);
return $this->toBeJson()->and($value);
} }
/** /**

View File

@ -79,6 +79,16 @@ final class HigherOrderExpectation
return $this->expect($value); return $this->expect($value);
} }
/**
* Creates a new expectation with the decoded JSON value.
*
* @return self<TOriginalValue, array<string|int, mixed>|bool>
*/
public function json(): self
{
return new self($this->original, $this->expectation->json()->value);
}
/** /**
* Dynamically calls methods on the class with the given arguments. * Dynamically calls methods on the class with the given arguments.
* *

View File

@ -74,8 +74,20 @@ it('works with higher order tests')
->name()->toEqual('Has Methods') ->name()->toEqual('Has Methods')
->books()->each->toBeArray; ->books()->each->toBeArray;
it('works consistently with the json expectation method', function () {
expect(new HasMethods())
->jsonString()->json()->id->toBe(1)
->jsonString()->json()->name->toBe('Has Methods')->toBeString()
->jsonString()->json()->quantity->toBe(20)->toBeInt();
});
class HasMethods class HasMethods
{ {
public function jsonString(): string
{
return '{ "id": 1, "name": "Has Methods", "quantity": 20 }';
}
public function name() public function name()
{ {
return 'Has Methods'; return 'Has Methods';