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

HasHttpBrowser::_resetHttpBrowserClients()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
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