Passed
Pull Request — master (#19)
by Tim
05:32
created

BannerSelectionControllerTest   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 74
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 47
dl 0
loc 74
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_no_content_response_is_returned() 0 10 1
A test_given_no_cookies_passed_through_request_then_controller_creates_cookies_with_updated_default_values() 0 27 1
A test_given_banner_is_to_be_shown_then_redirect_response_is_returned() 0 11 1
A test_given_controller_receives_cookies_values_are_passed_onto_use_case() 0 7 1
A test_given_no_cookies_then_assign_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
 * @package WMDE\BannerServer\Tests\Unit\Controller
22
 */
23
class BannerSelectionControllerTest extends \PHPUnit\Framework\TestCase {
24
	private const BANNER_DIRECTORY = 'banners/';
25
26
	public function test_given_controller_receives_cookies_values_are_passed_onto_use_case() {
27
		$mockUseCase = $this->createMock( BannerSelectionUseCase::class );
28
		$mockUseCase->expects( $this->once() )->method( 'provideBannerRequest' )->with(
29
			VisitorFixture::getTestVisitor()
30
		);
31
		$controller = new BannerSelectionController( $mockUseCase, self::BANNER_DIRECTORY );
32
		$controller->selectBanner( VisitorFixture::getReturningVisitorRequest() );
33
	}
34
35
	public function test_given_no_cookies_then_assign_default_values() {
36
		$mockUseCase = $this->createMock( BannerSelectionUseCase::class );
37
		$mockUseCase->expects( $this->once() )->method( 'provideBannerRequest' )->with(
38
			VisitorFixture::getFirstTimeVisitor()
39
		);
40
		$controller = new BannerSelectionController( $mockUseCase, self::BANNER_DIRECTORY );
41
		$controller->selectBanner( new Request() );
42
	}
43
44
	public function test_given_no_cookies_passed_through_request_then_controller_creates_cookies_with_updated_default_values() {
45
		$testUseCase = new BannerSelectionUseCase(
46
			CampaignFixture::getTrueRandomTestCampaignCollection(),
47
			new ImpressionThreshold( 10 ),
48
			new FakeRandomIntegerGenerator( 100 )
49
		);
50
		$controller = new BannerSelectionController( $testUseCase, self::BANNER_DIRECTORY );
51
		$response = $controller->selectBanner( new Request() );
52
53
		$cookies = $response->headers->getCookies();
54
55
		$this->assertEquals( 2, count( $cookies ) );
56
57
		$this->assertEquals( BannerSelectionController::BUCKET_COOKIE, $cookies[0]->getName() );
58
		$this->assertEquals( 'test', $cookies[0]->getValue() );
59
		$this->assertEquals(
60
			( new \DateTime( '2099-12-31 23:59:59' ) )->modify( '+2 week' )->getTimestamp(),
61
			$cookies[0]->getExpiresTime(),
62
			'Cookie life-time should be the campaign expiration date plus two weeks.'
63
		);
64
65
		$this->assertEquals( BannerSelectionController::IMPRESSION_COUNT_COOKIE, $cookies[1]->getName() );
66
		$this->assertEquals( '1', $cookies[1]->getValue() );
67
		$this->assertEquals(
68
			( new \DateTime( 'midnight first day of next year' ) )->getTimestamp(),
69
			$cookies[1]->getExpiresTime(),
70
			'Cookie life-time should be the campaign expiration date plus two weeks.'
71
		);
72
	}
73
74
	public function test_given_banner_is_to_be_shown_then_redirect_response_is_returned() {
75
		$testUseCase = new BannerSelectionUseCase(
76
			CampaignFixture::getTrueRandomTestCampaignCollection(),
77
			new ImpressionThreshold( 10 ),
78
			new FakeRandomIntegerGenerator( 100 )
79
		);
80
		$controller = new BannerSelectionController( $testUseCase, self::BANNER_DIRECTORY );
81
		$response = $controller->selectBanner( new Request() );
82
83
		$this->assertInstanceOf( RedirectResponse::class, $response );
84
		$this->assertEquals( 'banners/TestBanner.js', $response->headers->get( 'location' ) );
85
	}
86
87
	public function test_given_impression_limit_is_reached_then_no_content_response_is_returned() {
88
		$testUseCase = new BannerSelectionUseCase(
89
			CampaignFixture::getTrueRandomTestCampaignCollection(),
90
			new ImpressionThreshold( VisitorFixture::VISITOR_TEST_IMPRESSION_COUNT ),
91
			new FakeRandomIntegerGenerator( 100 )
92
		);
93
		$controller = new BannerSelectionController( $testUseCase, self::BANNER_DIRECTORY );
94
		$response = $controller->selectBanner( VisitorFixture::getReturningVisitorRequest() );
95
96
		$this->assertEquals( Response::HTTP_NO_CONTENT, $response->getStatusCode() );
97
	}
98
}
99