Scrutinizer GitHub App not installed

We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.

Install GitHub App

Failed Conditions
Pull Request — main (#1498)
by Dan
04:47
created

PageIntegrationTest::test_showUnderAttack()   A

Complexity

Conditions 5
Paths 6

Size

Total Lines 33
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 20
c 1
b 0
f 0
nc 6
nop 6
dl 0
loc 33
rs 9.2888
1
<?php declare(strict_types=1);
2
3
namespace SmrTest\lib\DefaultGame;
4
5
use AbstractSmrPlayer;
6
use PHPUnit\Framework\TestCase;
7
use Smr\Container\DiContainer;
8
use Smr\Page\Page;
9
use Smr\Session;
10
11
/**
12
 * This is an integration test, but does not need to extend BaseIntegrationTest
13
 * since we are not (or should not be!) writing any data.
14
 *
15
 * @covers Smr\Page\Page
16
 */
17
class PageIntegrationTest extends TestCase {
18
19
	protected function setUp(): void {
20
		// Reset the DI container for each test to ensure independence.
21
		DiContainer::initialize(false);
22
	}
23
24
	public function test_href(): void {
25
		// Create an arbitrary Page
26
		$page = new Page();
27
28
		// Pre-initialize the Smr\Session, since it uses 'rand', and we don't
29
		// want it to interfere with our rand seed when we call `href`, which
30
		// internally requires an Smr\Session.
31
		Session::getInstance();
32
33
		// The Page should not be modified when href() is called
34
		$expected = clone $page;
35
		srand(0); // for a deterministic SN
36
		$href = $page->href();
37
		self::assertSame(LOADER_URI . '?sn=qpbqzr', $href);
38
		self::assertEquals($expected, $page);
39
	}
40
41
	/**
42
	 * Tests the showUnderAttack method in a variety of scenarios. We test
43
	 * consecutive page loads to ensure that a positive result persists
44
	 * across page loads (both ajax and non-ajax).
45
	 *
46
	 * @testWith [true, true, null, false, true, true]
47
	 *           [true, false, null, true, true, true]
48
	 *           [true, true, null, true, true, true]
49
	 *           [false, false, true, true, false, true]
50
	 *           [false, true, true, true, false, true]
51
	 */
52
	public function test_showUnderAttack(bool $underAttack1, bool $ajax1, ?bool $underAttack2, bool $ajax2, bool $expected1, bool $expected2): void {
53
		$getPlayer = function(bool $underAttack, bool $ajax): AbstractSmrPlayer {
54
			$mockPlayer = $this->createMock(AbstractSmrPlayer::class);
55
			$mockPlayer
56
				->method('isUnderAttack')
57
				->willReturn($underAttack);
58
			$mockPlayer
59
				->expects(self::exactly($ajax ? 0 : 1))
60
				->method('setUnderAttack')
61
				->with(false);
62
			return $mockPlayer;
63
		};
64
65
		// Simulated player state for the first page load
66
		$mockPlayerPage1 = $getPlayer($underAttack1, $ajax1);
67
68
		// Simulated player state for the second page load
69
		if ($underAttack2 === null) {
70
			// This condition implies that there was no external factor changing the
71
			// player state between page loads, so the expected return value of its
72
			// isUnderAttack method depends on if setUnderAttack was called before.
73
			$underAttack2 = $ajax1 ? $underAttack1 : false;
74
		}
75
		$mockPlayerPage2 = $getPlayer($underAttack2, $ajax2);
76
77
		$page1 = new Page();
78
		$result1 = $page1->showUnderAttack($mockPlayerPage1, $ajax1);
79
		self::assertSame($expected1, $result1);
80
81
		// If the second page is ajax, it reuses the previous Page object
82
		$page2 = $ajax2 ? $page1 : new Page();
83
		$result2 = $page2->showUnderAttack($mockPlayerPage2, $ajax2);
84
		self::assertSame($expected2, $result2);
85
	}
86
87
}
88