From c7cdf85cc4b52b8023397fbc47fe7edd4b62c79e Mon Sep 17 00:00:00 2001 From: Ruslan Demyanovsky Date: Sat, 20 Jul 2024 21:23:06 +0200 Subject: [PATCH] Support predicates array for AND, OR, NOT --- src/Formatter.php | 30 ++++++++++++-- tests/Unit/FormatterTest.php | 76 ++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 4 deletions(-) diff --git a/src/Formatter.php b/src/Formatter.php index 74405d8..8dfb231 100644 --- a/src/Formatter.php +++ b/src/Formatter.php @@ -94,17 +94,39 @@ private function responseToArray(Response $response): array /** * @return array */ - private function predicateToArray(Predicate $predicate): array + private function predicateToArray(Predicate $predicate, bool $withAdditionalFields = true): array { $operator = $predicate->getOperator(); - $value = $operator === Predicate::OPERATOR_INJECT ? $predicate->getInjectJs() : $predicate->getConfig(); + + switch ($operator) { + case Predicate::OPERATOR_INJECT: + $value = $predicate->getInjectJs(); + break; + case Predicate::OPERATOR_AND: + case Predicate::OPERATOR_OR: + case Predicate::OPERATOR_NOT: + $value = []; + foreach ($predicate->getConfig() as $predicateOperator => $predicateConfig) { + if ($predicateConfig instanceof Predicate) { + $value = array_merge($value, $this->predicateToArray($predicateConfig, false)); + } else { + $value[$predicateOperator] = $predicateConfig; + } + } + break; + default: + $value = $predicate->getConfig(); + } $array = [ $operator => $value, - 'caseSensitive' => $predicate->isCaseSensitive(), - 'except' => $predicate->getExcept(), ]; + if (true === $withAdditionalFields) { + $array['caseSensitive'] = $predicate->isCaseSensitive(); + $array['except'] = $predicate->getExcept(); + } + if ($predicate->getXPath() !== null) { $array['xpath'] = [ 'selector' => $predicate->getXPath()->getSelector(), diff --git a/tests/Unit/FormatterTest.php b/tests/Unit/FormatterTest.php index c0512b0..5d1535d 100644 --- a/tests/Unit/FormatterTest.php +++ b/tests/Unit/FormatterTest.php @@ -148,4 +148,80 @@ public function testSchemaAttached(): void $this->assertArrayHasKey('schema', $array); } + + public function testPredicateWithPredicates(): void + { + $predicate1 = new Predicate(Predicate::OPERATOR_EQUALS); + $predicate1->setConfig(['path' => '/test1']); + + $predicate2 = new Predicate(Predicate::OPERATOR_START_WITH); + $predicate2->setConfig(['path' => '/test2']); + + $predicate = new Predicate(Predicate::OPERATOR_AND); + $predicate->setConfig([ + $predicate1->getOperator() => $predicate1, + $predicate2->getOperator() => $predicate2, + ]); + + $stub = new Stub(); + $stub->addPredicate($predicate); + + $imposter = new Imposter('Test imposter', 1234, Imposter::PROTOCOL_HTTPS); + $imposter->addStub($stub); + + $formatter = new Formatter(); + $array = $formatter->imposterToArray($imposter); + $this->assertNotEmpty($array); + $this->assertArrayHasKey('stubs', $array); + $this->assertArrayHasKey('predicates', $array['stubs'][0]); + $this->assertSame([ + [ + 'and' => [ + 'equals' => [ + 'path' => '/test1', + ], + 'startsWith' => [ + 'path' => '/test2', + ], + ], + 'caseSensitive' => false, + 'except' => '', + ], + ], $array['stubs'][0]['predicates']); + } + + public function testPredicateWithPredicatesAsArray(): void + { + $predicate = new Predicate(Predicate::OPERATOR_AND); + $predicate->setConfig([ + Predicate::OPERATOR_EQUALS => ['path' => '/test1'], + Predicate::OPERATOR_START_WITH => ['path' => '/test2'], + ]); + + $stub = new Stub(); + $stub->addPredicate($predicate); + + $imposter = new Imposter('Test imposter', 1234, Imposter::PROTOCOL_HTTPS); + $imposter->addStub($stub); + + $formatter = new Formatter(); + $array = $formatter->imposterToArray($imposter); + $this->assertNotEmpty($array); + $this->assertArrayHasKey('stubs', $array); + $this->assertArrayHasKey('predicates', $array['stubs'][0]); + $this->assertSame([ + [ + 'and' => [ + 'equals' => [ + 'path' => '/test1', + ], + 'startsWith' => [ + 'path' => '/test2', + ], + ], + 'caseSensitive' => false, + 'except' => '', + ], + ], $array['stubs'][0]['predicates']); + } }