1<?php
2
3// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
4// See the LICENCE file in the repository root for full licence text.
5
6namespace Tests;
7
8use Facebook\WebDriver\Chrome\ChromeOptions;
9use Facebook\WebDriver\Remote\DesiredCapabilities;
10use Facebook\WebDriver\Remote\RemoteWebDriver;
11use Facebook\WebDriver\WebDriverDimension;
12use Laravel\Dusk\Browser;
13use Laravel\Dusk\TestCase as BaseTestCase;
14
15abstract class DuskTestCase extends BaseTestCase
16{
17 use CreatesApplication;
18
19 /**
20 * Prepare for Dusk test execution.
21 *
22 * @beforeClass
23 * @return void
24 */
25 public static function prepare()
26 {
27 $chromeDriver = presence(env('DUSK_WEBDRIVER_BIN'));
28 if ($chromeDriver !== null) {
29 static::$chromeDriver = $chromeDriver;
30 }
31
32 if (!present(env('DUSK_WEBDRIVER_URL'))) {
33 static::startChromeDriver(['--port=9515']);
34 }
35 }
36
37 /**
38 * Resets passed browser session.
39 * Currently only clears existing cookies.
40 *
41 * @return void
42 */
43 protected static function resetSession(Browser $browser): void
44 {
45 $browser->driver->manage()->deleteAllCookies();
46 }
47
48 /**
49 * Create the RemoteWebDriver instance.
50 *
51 * @return \Facebook\WebDriver\Remote\RemoteWebDriver
52 */
53 protected function driver()
54 {
55 $options = (new ChromeOptions())->addArguments([
56 '--disable-gpu',
57 '--headless',
58 ]);
59
60 $driver = RemoteWebDriver::create(
61 presence(env('DUSK_WEBDRIVER_URL')) ?? 'http://localhost:9515',
62 DesiredCapabilities::chrome()->setCapability(
63 ChromeOptions::CAPABILITY,
64 $options
65 )
66 );
67
68 // TODO: move this out when/if adding additional tests for mobile layout?
69 $driver->manage()->window()
70 ->setSize(new WebDriverDimension(1920, 1080)); // ensure we get desktop layout
71
72 return $driver;
73 }
74
75 protected function setUp(): void
76 {
77 parent::setUp();
78
79 foreach (static::$browsers as $browser) {
80 static::resetSession($browser);
81 }
82 }
83}