Passed
Push — master ( 7d7cf1...424d8c )
by Gabriel
37s queued 10s
created

BannerSelectionControllerTest   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 75
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 47
dl 0
loc 75
rs 10
c 0
b 0
f 0
wmc 5

5 Methods

Rating   Name   Duplication   Size   Complexity  
A test_given_impression_limit_is_reached_then_it_returns_no_content_response() 0 10 1
A test_given_banner_is_to_be_shown_then_it_returns_redirect_response() 0 11 1
A test_given_controller_receives_cookies_then_it_passes_cookie_values_to_use_case() 0 7 1
A test_given_no_cookies_passed_through_request_then_it_creates_cookies_with_updated_default_values() 0 27 1
A test_given_no_cookies_then_it_assigns_default_values() 0 7 1
1
<?php
2
3
declare( strict_types = 1 );
4
5
namespace WMDE\BannerServer\Tests\Unit\Controller;
6
7
use Symfony\Component\HttpFoundation\RedirectResponse;
8
use Symfony\Component\HttpFoundation\Request;
9
use Symfony\Component\HttpFoundation\Response;
10
use WMDE\BannerServer\Controller\BannerSelectionController;
11
use WMDE\BannerServer\Entity\BannerSelection\ImpressionThreshold;
12
use WMDE\BannerServer\Tests\Fixtures\CampaignFixture;
13
use WMDE\BannerServer\Tests\Fixtures\VisitorFixture;
14
use WMDE\BannerServer\Tests\Utils\FakeRandomIntegerGenerator;
15
use WMDE\BannerServer\UseCase\BannerSelection\BannerSelectionUseCase;
16
17
/**
18
 * @covers \WMDE\BannerServer\Controller\BannerSelectionController
19
 * Class BannerSelectionControllerTest
20
 */
21
class BannerSelectionControllerTest extends \PHPUnit\Framework\TestCase {
22
23
	private const BANNER_PATH = '/test_banners/';
24
25
	public function test_given_controller_receives_cookies_then_it_passes_cookie_values_to_use_case() {
26
		$mockUseCase = $this->createMock( BannerSelectionUseCase::class );
27
		$mockUseCase->expects( $this->once() )->method( 'selectBanner' )->with(
28
			VisitorFixture::getTestVisitor()
29
		);
30
		$controller = new BannerSelectionController( $mockUseCase, self::BANNER_PATH );
31
		$controller->selectBanner( VisitorFixture::getReturningVisitorRequest() );
32
	}
33
34
	public function test_given_no_cookies_then_it_assigns_default_values() {
35
		$mockUseCase = $this->createMock( BannerSelectionUseCase::class );
36
		$mockUseCase->expects( $this->once() )->method( 'selectBanner' )->with(
37
			VisitorFixture::getFirstTimeVisitor()
38
		);
39
		$controller = new BannerSelectionController( $mockUseCase, self::BANNER_PATH );
40
		$controller->selectBanner( new Request() );
41
	}
42
43
	public function test_given_no_cookies_passed_through_request_then_it_creates_cookies_with_updated_default_values() {
44
		$testUseCase = new BannerSelectionUseCase(
45
			CampaignFixture::getTrueRandomTestCampaignCollection(),
46
			new ImpressionThreshold( 10 ),
47
			new FakeRandomIntegerGenerator( 100 )
48
		);
49
		$controller = new BannerSelectionController( $testUseCase, self::BANNER_PATH );
50
		$response = $controller->selectBanner( new Request() );
51
52
		$cookies = $response->headers->getCookies();
53
54
		$this->assertEquals( 2, count( $cookies ) );
55
56
		$this->assertEquals( BannerSelectionController::BUCKET_COOKIE, $cookies[0]->getName() );
57
		$this->assertEquals( 'test', $cookies[0]->getValue() );
58
		$this->assertEquals(
59
			( new \DateTime( '2099-12-31 23:59:59' ) )->modify( '+2 week' )->getTimestamp(),
60
			$cookies[0]->getExpiresTime(),
61
			'Cookie life-time should be the campaign expiration date plus two weeks.'
62
		);
63
64
		$this->assertEquals( BannerSelectionController::IMPRESSION_COUNT_COOKIE, $cookies[1]->getName() );
65
		$this->assertEquals( '1', $cookies[1]->getValue() );
66
		$this->assertEquals(
67
			( new \DateTime( 'midnight first day of january next year' ) )->getTimestamp(),
68
			$cookies[1]->getExpiresTime(),
69
			'Impression cookie should expire after the campaign season has ended.'
70
		);
71
	}
72
73
	public function test_given_banner_is_to_be_shown_then_it_returns_redirect_response() {
74
		$testUseCase = new BannerSelectionUseCase(
75
			CampaignFixture::getTrueRandomTestCampaignCollection(),
76
			new ImpressionThreshold( 10 ),
77
			new FakeRandomIntegerGenerator( 100 )
78
		);
79
		$controller = new BannerSelectionController( $testUseCase, self::BANNER_PATH );
80
		$response = $controller->selectBanner( new Request() );
81
82
		$this->assertInstanceOf( RedirectResponse::class, $response );
83
		$this->assertEquals( '/test_banners/TestBanner.js', $response->headers->get( 'location' ) );
84
	}
85
86
	public function test_given_impression_limit_is_reached_then_it_returns_no_content_response() {
87
		$testUseCase = new BannerSelectionUseCase(
88
			CampaignFixture::getTrueRandomTestCampaignCollection(),
89
			new ImpressionThreshold( VisitorFixture::VISITOR_TEST_IMPRESSION_COUNT ),
90
			new FakeRandomIntegerGenerator( 100 )
91
		);
92
		$controller = new BannerSelectionController( $testUseCase, self::BANNER_PATH );
93
		$response = $controller->selectBanner( VisitorFixture::getReturningVisitorRequest() );
94
95
		$this->assertEquals( Response::HTTP_NO_CONTENT, $response->getStatusCode() );
96
	}
97
}
98