Passed
Pull Request — master (#19)
by Tim
03:11
created

CampaignTest   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 149
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 94
dl 0
loc 149
rs 10
c 0
b 0
f 0
wmc 9

9 Methods

Rating   Name   Duplication   Size   Complexity  
A test_given_valid_bucket_id_returns_bucket() 0 12 1
A test_given_one_percent_ratio_limit_is_not_applied_for_one_percent_rng() 0 11 1
A test_given_max_ratio_limit_is_not_applied() 0 11 1
A createBuckets() 0 13 1
A test_given_time_out_of_date_range_campaign_is_not_active() 0 20 1
A test_given_no_bucket_id_returns_random_bucket() 0 12 1
A test_given_one_percent_ratio_limit_is_applied_for_two_percent_rng() 0 11 1
A test_given_time_in_the_date_range_campaign_is_active() 0 20 1
A test_given_invalid_bucket_id_returns_random_bucket() 0 12 1
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace WMDE\BannerServer\Tests\Unit\Entity\BannerSelection;
6
7
use WMDE\BannerServer\Entity\BannerSelection\Banner;
8
use WMDE\BannerServer\Entity\BannerSelection\Bucket;
9
use WMDE\BannerServer\Entity\BannerSelection\Campaign;
10
use WMDE\BannerServer\Tests\Utils\FakeRandomInteger;
11
12
class CampaignTest extends \PHPUnit\Framework\TestCase {
13
14
	private function createBuckets(): array {
15
		$buckets = [];
16
		$buckets[] = new Bucket(
17
			'C18_WMDE_Test_ctrl',
18
			new Banner( 'C18_WMDE_Test_ctrl_main' ),
19
			[new Banner( 'C18_WMDE_Test_ctrl_secondary' )]
20
		);
21
		$buckets[] = new Bucket(
22
			'C18_WMDE_Test_var',
23
			new Banner( 'C18_WMDE_Test_var_main' ),
24
			[new Banner( 'C18_WMDE_Test_var_secondary' )]
25
		);
26
		return $buckets;
27
	}
28
29
	public function test_given_time_out_of_date_range_campaign_is_not_active() {
30
		$campaign = new Campaign(
31
			'C18_WMDE_Test',
32
			new \DateTime( '2018-10-01 14:00:00' ),
33
			new \DateTime( '2018-10-31 14:00:00' ),
34
			$this->createBuckets(),
35
			1,
36
			new FakeRandomInteger( 1 )
37
		);
38
		$this->assertTrue(
39
			$campaign->isInActiveDateRange( new \DateTime( '2018-10-01 14:00:00' ) ),
40
			'date given is exactly the start date of the campaign'
41
		);
42
		$this->assertTrue(
43
			$campaign->isInActiveDateRange( new \DateTime( '2018-10-20 14:00:00' ) ),
44
			'date given is between the start and the end of the campaign'
45
		);
46
		$this->assertTrue(
47
			$campaign->isInActiveDateRange( new \DateTime( '2018-10-31 14:00:00' ) ),
48
			'date given is exactly the end date of the campaign'
49
		);
50
51
	}
52
53
	public function test_given_time_in_the_date_range_campaign_is_active() {
54
		$campaign = new Campaign(
55
			'C18_WMDE_Test',
56
			new \DateTime( '2018-10-01 14:00:00' ),
57
			new \DateTime( '2018-10-31 14:00:00' ),
58
			$this->createBuckets(),
59
			1,
60
			new FakeRandomInteger( 1 )
61
		);
62
		$this->assertFalse(
63
			$campaign->isInActiveDateRange( new \DateTime( '2018-09-22 14:00:00' ) ),
64
			'date given is before the start of the campaign'
65
		);
66
		$this->assertFalse(
67
			$campaign->isInActiveDateRange( new \DateTime( '2018-10-01 13:59:59' ) ),
68
			'date given is before the start of the campaign'
69
		);
70
		$this->assertFalse(
71
			$campaign->isInActiveDateRange( new \DateTime( '2018-10-31 14:00:01' ) ),
72
			'date given is after the end of the campaign'
73
		);
74
	}
75
76
	public function test_given_valid_bucket_id_returns_bucket() {
77
		$campaign = new Campaign(
78
			'C18_WMDE_Test',
79
			new \DateTime( '2018-10-01 14:00:00' ),
80
			new \DateTime( '2018-10-31 14:00:00' ),
81
			$this->createBuckets(),
82
			1,
83
			new FakeRandomInteger( 1 )
84
		);
85
		$this->assertEquals(
86
			$campaign->selectBucket( 'C18_WMDE_Test_var' )->getIdentifier(),
87
			'C18_WMDE_Test_var'
88
		);
89
	}
90
91
	public function test_given_invalid_bucket_id_returns_random_bucket() {
92
		$campaign = new Campaign(
93
			'C18_WMDE_Test',
94
			new \DateTime( '2018-10-01 14:00:00' ),
95
			new \DateTime( '2018-10-31 14:00:00' ),
96
			$this->createBuckets(),
97
			1,
98
			new FakeRandomInteger( 1 )
99
		);
100
		$this->assertEquals(
101
			$campaign->selectBucket( 'C18_WMDE_Test_var_666' )->getIdentifier(),
102
			'C18_WMDE_Test_var'
103
		);
104
	}
105
106
	public function test_given_no_bucket_id_returns_random_bucket() {
107
		$campaign = new Campaign(
108
			'C18_WMDE_Test',
109
			new \DateTime( '2018-10-01 14:00:00' ),
110
			new \DateTime( '2018-10-31 14:00:00' ),
111
			$this->createBuckets(),
112
			1,
113
			new FakeRandomInteger( 1 )
114
		);
115
		$this->assertEquals(
116
			$campaign->selectBucket( null )->getIdentifier(),
117
			'C18_WMDE_Test_var'
118
		);
119
	}
120
121
	public function test_given_max_ratio_limit_is_not_applied() {
122
		$campaign = new Campaign(
123
			'C18_WMDE_Test',
124
			new \DateTime( '2018-10-01 14:00:00' ),
125
			new \DateTime( '2018-10-31 14:00:00' ),
126
			$this->createBuckets(),
127
			1,
128
			new FakeRandomInteger( 100 )
129
		);
130
		$this->assertFalse(
131
			$campaign->isRatioLimited()
132
		);
133
	}
134
135
	public function test_given_one_percent_ratio_limit_is_not_applied_for_one_percent_rng() {
136
		$campaign = new Campaign(
137
			'C18_WMDE_Test',
138
			new \DateTime( '2018-10-01 14:00:00' ),
139
			new \DateTime( '2018-10-31 14:00:00' ),
140
			$this->createBuckets(),
141
			0.01,
142
			new FakeRandomInteger( 1 )
143
		);
144
		$this->assertFalse(
145
			$campaign->isRatioLimited()
146
		);
147
	}
148
149
150
	public function test_given_one_percent_ratio_limit_is_applied_for_two_percent_rng() {
151
		$campaign = new Campaign(
152
			'C18_WMDE_Test',
153
			new \DateTime( '2018-10-01 14:00:00' ),
154
			new \DateTime( '2018-10-31 14:00:00' ),
155
			$this->createBuckets(),
156
			0.01,
157
			new FakeRandomInteger( 2 )
158
		);
159
		$this->assertTrue(
160
			$campaign->isRatioLimited()
161
		);
162
	}
163
}
164