apiConnection = new ApiConnection($baseUrl, $this->debug); } /** * Make request to api. * * @Given /^(?:|I )[Mm]ake (?PGET|POST|PUT|DELETE) request to (?P.+)$/ * * @param string $method HTTP method name. * @param string $endpoint Relative to base url. * @param mixed $payload Request parameters. * * @return void */ public function request($method, $endpoint, $payload = null) { switch (true) { case $payload instanceof TableNode: $table = $payload->getTable(); $payload = []; foreach ($table as $row) { $payload[current($row)] = next($row); } break; case $payload instanceof PyStringNode: $payload = (array) json_decode($payload->getRaw(), true); $payload = array_filter($payload); if (json_last_error() !== JSON_ERROR_NONE) { throw new \InvalidArgumentException( 'Request error: ' . json_last_error_msg() ); } break; default: $payload = []; } $payload = $this->processor->process($payload); $this->apiConnection->request($method, $endpoint, $payload, $this->authToken); } /** * @Then /^(?:|I )[Gg]ot response with code (?P\d+)$/ * @Then /^(?:|I )[Gg]ot successful response$/ * * @param integer $expected Expected response. * * @return void */ public function checkStatus($expected = 200) { self::assertEquals( $expected, $this->apiConnection->getLastResponse()->getStatusCode() ); } /** * @Then /^(?:|I )[Gg]ot response with content$/ * @Then /^(?:|[Rr]esponse|[Ii]t's )[Cc]ontains$/ * * @param PyStringNode $pattern Pattern for coduo/PHPMatcher. * * @return void */ public function responseMatch(PyStringNode $pattern) { $error = ''; self::assertTrue( $this->match( $this->apiConnection->getLastResponseData(), $pattern->getRaw(), $error ), $error ); } /** * @Then /^(?:|I )[Gg]ot empty response$/ * @Then /^[Rr]esponse is empty$/ * @Then /^[Ii]t's empty$/ * * @return void */ public function emptyResponse() { $error = ''; self::assertTrue( PHPMatcher::match( $this->apiConnection->getLastResponseData(), '', $error ), $error ); } /** * @Given /^(?:|I )[Aa]uthenticated as (?P[\w@\.]+) with password (?P.+)$/ * * @param string $email User email. * @param string $password User password. * * @return void */ public function authenticate($email, $password) { $this->apiConnection ->request('POST', '/security/token/create', [ 'email' => $email, 'password' => $password, ]); self::assertEquals( 200, $this->apiConnection->getLastResponse()->getStatusCode() ); $response = json_decode( $this->apiConnection->getLastResponseData(), true ); self::assertTrue(is_array($response), 'Invalid response from server'); self::assertArrayHasKey('token', $response); $this->authToken = $response['token']; } /** * @Then /^(?:[Oo]ne|(?P\d+)) [Ee]mail is sent$/ * * @param integer $count Expected emails count. * * @return void */ public function emailsCount($count = 1) { $mailer = $this->getMailCollector(); self::assertEquals($count, $mailer->getMessageCount()); } /** * @Then /^[Nn]o emails sent$/ * * @return void */ public function noEmailsSent() { $mailer = $this->getMailCollector(); self::assertEquals(0, $mailer->getMessageCount()); } /** * @Then /^(?:|[Ff]irst )[Ee]mail subject is "(?P[^"]+)"$/ * @Then /^(?P\d+) email subject is "(?P[^"]+)"$/ * * @param string $subject Expected email subject. * @param integer $index Email index. * * @return void */ public function emailSubject($subject, $index = 0) { $mailer = $this->getMailCollector(); /** @var \Swift_Message $message */ $message = $mailer->getMessages()[$index]; self::assertEquals($subject, $message->getSubject()); } /** * @return \Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface|\Symfony\Bundle\SwiftmailerBundle\DataCollector\MessageDataCollector */ protected function getMailCollector() { /** @var Profiler $profiler */ $profiler = $this->container->get('profiler'); $token = current($this->apiConnection->getLastResponse() ->getHeader('X-Debug-Token')); return $profiler->loadProfile($token)->getCollector('swiftmailer'); } }