75 lines
1.7 KiB
PHP
75 lines
1.7 KiB
PHP
|
<?php
|
||
|
|
||
|
/**
|
||
|
* PHP version 7.3
|
||
|
*
|
||
|
* @category JsonFormFieldMatcher
|
||
|
* @package RetailCrm\TestUtils
|
||
|
*/
|
||
|
|
||
|
namespace RetailCrm\TestUtils;
|
||
|
|
||
|
use Pock\Comparator\ComparatorLocator;
|
||
|
use Pock\Comparator\RecursiveArrayComparator;
|
||
|
use Pock\Exception\JsonException;
|
||
|
use Pock\Matchers\QueryMatcher;
|
||
|
use Pock\Traits\JsonDecoderTrait;
|
||
|
use Pock\Traits\SeekableStreamDataExtractor;
|
||
|
use Psr\Http\Message\RequestInterface;
|
||
|
|
||
|
/**
|
||
|
* Class JsonFormFieldMatcher
|
||
|
*
|
||
|
* @category JsonFormFieldMatcher
|
||
|
* @package RetailCrm\TestUtils
|
||
|
*/
|
||
|
class JsonFormFieldMatcher extends QueryMatcher
|
||
|
{
|
||
|
use JsonDecoderTrait;
|
||
|
use SeekableStreamDataExtractor;
|
||
|
|
||
|
/** @var string */
|
||
|
private $key;
|
||
|
|
||
|
/**
|
||
|
* @param string $key
|
||
|
* @param string|array<string, mixed> $value
|
||
|
*
|
||
|
* @throws \Pock\Exception\JsonException
|
||
|
*/
|
||
|
public function __construct(string $key, $value)
|
||
|
{
|
||
|
$this->key = $key;
|
||
|
|
||
|
if (is_string($value)) {
|
||
|
parent::__construct(self::jsonDecode($value, true));
|
||
|
} else {
|
||
|
parent::__construct($value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @inheritDoc
|
||
|
*/
|
||
|
public function matches(RequestInterface $request): bool
|
||
|
{
|
||
|
$query = static::parseQuery(static::getStreamData($request->getBody()));
|
||
|
|
||
|
if (empty($query) || !array_key_exists($this->key, $query)) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
$actual = self::jsonDecode($query[$this->key], true);
|
||
|
} catch (JsonException $exception) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (null === $actual) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return ComparatorLocator::get(RecursiveArrayComparator::class)->compare($actual, $this->query);
|
||
|
}
|
||
|
}
|