Passed
Push — master ( 421eba...09fd73 )
by Alexis
03:20 queued 11s
created

HttpAssertions::assertStatusCode()   B

Complexity

Conditions 6
Paths 4

Size

Total Lines 24

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 6

Importance

Changes 0
Metric Value
dl 0
loc 24
ccs 13
cts 13
cp 1
rs 8.9137
c 0
b 0
f 0
cc 6
nc 4
nop 2
crap 6
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Liip/FunctionalTestBundle
7
 *
8
 * (c) Lukas Kahwe Smith <[email protected]>
9
 *
10
 * This source file is subject to the MIT license that is bundled
11
 * with this source code in the file LICENSE.
12
 */
13
14
namespace Liip\FunctionalTestBundle\Utils;
15
16
use Liip\FunctionalTestBundle\Test\ValidationErrorsConstraint;
17
use PHPUnit\Framework\TestCase;
18
use Symfony\Bundle\FrameworkBundle\Client;
19
use Symfony\Component\DependencyInjection\ContainerInterface;
20
use Symfony\Component\DomCrawler\Crawler;
21
use Symfony\Component\HttpFoundation\Response;
22
23
class HttpAssertions extends TestCase
24
{
25
    /**
26
     * Checks the success state of a response.
27
     *
28
     * @param Response $response Response object
29
     * @param bool     $success  to define whether the response is expected to be successful
30
     * @param string   $type
31
     */
32 6
    public static function isSuccessful(Response $response, bool $success = true, string $type = 'text/html'): void
33
    {
34
        try {
35 6
            $crawler = new Crawler();
36 6
            $crawler->addContent($response->getContent(), $type);
0 ignored issues
show
Security Bug introduced by
It seems like $response->getContent() targeting Symfony\Component\HttpFo...\Response::getContent() can also be of type false; however, Symfony\Component\DomCrawler\Crawler::addContent() does only seem to accept string, did you maybe forget to handle an error condition?
Loading history...
37 5
            if (!count($crawler->filter('title'))) {
38 1
                $title = '['.$response->getStatusCode().'] - '.$response->getContent();
39
            } else {
40 5
                $title = $crawler->filter('title')->text();
41
            }
42 1
        } catch (\Exception $e) {
43 1
            $title = $e->getMessage();
44
        }
45
46 6
        if ($success) {
47 5
            self::assertTrue($response->isSuccessful(), 'The Response was not successful: '.$title);
48
        } else {
49 1
            self::assertFalse($response->isSuccessful(), 'The Response was successful: '.$title);
50
        }
51 5
    }
52
53
    /**
54
     * Asserts that the HTTP response code of the last request performed by
55
     * $client matches the expected code. If not, raises an error with more
56
     * information.
57
     *
58
     * @param int    $expectedStatusCode
59
     * @param Client $client
60
     */
61 12
    public static function assertStatusCode(int $expectedStatusCode, Client $client): void
62
    {
63 12
        $helpfulErrorMessage = '';
64
65 12
        if ($expectedStatusCode !== $client->getResponse()->getStatusCode()) {
66
            // Get a more useful error message, if available
67 3
            if ($exception = $client->getContainer()->get('liip_functional_test.exception_listener')->getLastException()) {
68 1
                $helpfulErrorMessage = $exception->getMessage()."\n\n".$exception->getTraceAsString();
69
            } elseif (
70 2
                $client->getContainer()->has('liip_functional_test.validator') &&
71 2
                count($validationErrors = $client->getContainer()->get('liip_functional_test.validator')->getLastErrors())
72
            ) {
73 1
                $helpfulErrorMessage = "Unexpected validation errors:\n";
74
75 1
                foreach ($validationErrors as $error) {
76 1
                    $helpfulErrorMessage .= sprintf("+ %s: %s\n", $error->getPropertyPath(), $error->getMessage());
77
                }
78
            } else {
79 1
                $helpfulErrorMessage = substr((string) $client->getResponse(), 0, 200);
80
            }
81
        }
82
83 12
        self::assertEquals($expectedStatusCode, $client->getResponse()->getStatusCode(), $helpfulErrorMessage);
84 9
    }
85
86
    /**
87
     * Assert that the last validation errors within $container match the
88
     * expected keys.
89
     *
90
     * @param array              $expected  A flat array of field names
91
     * @param ContainerInterface $container
92
     */
93 4
    public static function assertValidationErrors(array $expected, ContainerInterface $container): void
94
    {
95 4
        if (!$container->has('liip_functional_test.validator')) {
96 1
            trigger_error(sprintf('Method %s() can not be used as the validation component of the Symfony framework is disabled.', __METHOD__), E_USER_WARNING);
97
        }
98
99 3
        self::assertThat(
100 3
            $container->get('liip_functional_test.validator')->getLastErrors(),
101 3
            new ValidationErrorsConstraint($expected),
102 3
            'Validation errors should match.'
103
        );
104 2
    }
105
}
106