Passed
Pull Request — 1.x (#23)
by Wouter
02:36
created

HasHttpBrowser::httpBrowser()   B

Complexity

Conditions 10
Paths 42

Size

Total Lines 51
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 10
eloc 26
c 1
b 0
f 0
nc 42
nop 2
dl 0
loc 51
rs 7.6666

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Zenstruck\Browser\Test;
4
5
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
6
use Symfony\Component\BrowserKit\HttpBrowser as HttpBrowserClient;
7
use Symfony\Component\Panther\PantherTestCase;
8
use Zenstruck\Browser\HttpBrowser;
9
10
trait HasHttpBrowser
11
{
12
    /** @var HttpBrowserClient[] */
13
    private static array $httpBrowserClients = [];
14
15
    /**
16
     * @internal
17
     * @after
18
     */
19
    final public static function _resetHttpBrowserClients(): void
20
    {
21
        self::$httpBrowserClients = [];
22
    }
23
24
    protected function httpBrowser(array $kernelOptions = [], array $pantherOptions = []): HttpBrowser
25
    {
26
        $class = $_SERVER['HTTP_BROWSER_CLASS'] ?? HttpBrowser::class;
27
28
        if (!\is_a($class, HttpBrowser::class, true)) {
29
            throw new \RuntimeException(\sprintf('"HTTP_BROWSER_CLASS" env variable must reference a class that extends %s.', HttpBrowser::class));
30
        }
31
32
        $baseUri = $_SERVER['HTTP_BROWSER_URI'] ?? null;
33
34
        if (!$baseUri && !$this instanceof PantherTestCase) {
35
            throw new \RuntimeException(\sprintf('If not using "HTTP_BROWSER_URI", your TestCase must extend "%s".', PantherTestCase::class));
36
        }
37
38
        if (!$baseUri) {
39
            self::startWebServer($pantherOptions);
40
41
            $baseUri = self::$baseUri;
42
        }
43
44
        // copied from PantherTestCaseTrait::createHttpBrowserClient()
45
        $client = new HttpBrowserClient();
46
        $urlComponents = \parse_url($baseUri);
47
        $host = $urlComponents['host'];
48
49
        if (isset($urlComponents['port'])) {
50
            $host .= ":{$urlComponents['port']}";
51
        }
52
53
        $client->setServerParameter('HTTP_HOST', $host);
54
55
        if ('https' === ($urlComponents['scheme'] ?? 'http')) {
56
            $client->setServerParameter('HTTPS', 'true');
57
        }
58
59
        $browser = new $class(self::$httpBrowserClients[] = $client);
60
61
        if ($this instanceof KernelTestCase) {
62
            if (!static::$booted) {
0 ignored issues
show
Bug introduced by
The property booted is declared protected in Symfony\Bundle\FrameworkBundle\Test\KernelTestCase and cannot be accessed from this context.
Loading history...
63
                static::bootKernel($kernelOptions);
64
            }
65
66
            if (static::$container->has('profiler')) {
0 ignored issues
show
Bug introduced by
The property container is declared protected in Symfony\Bundle\FrameworkBundle\Test\KernelTestCase and cannot be accessed from this context.
Loading history...
67
                $browser->setProfiler(static::$container->get('profiler'));
68
            }
69
        }
70
71
        BrowserExtension::registerBrowser($browser);
72
73
        return $browser
74
            ->setSourceDir($_SERVER['BROWSER_SOURCE_DIR'] ?? './var/browser/source')
75
        ;
76
    }
77
}
78