Completed
Pull Request — master (#19)
by Tim
03:20
created

CampaignTest::getVariantBucket()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
nc 1
nop 0
dl 0
loc 5
rs 10
c 0
b 0
f 0
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 getControlBucket(): Bucket {
15
		return new Bucket(
16
			'C18_WMDE_Test_ctrl',
17
			new Banner( 'C18_WMDE_Test_ctrl_main' ),
18
			new Banner( 'C18_WMDE_Test_ctrl_secondary' )
19
		);
20
	}
21
22
	private function getVariantBucket(): Bucket {
23
		return new Bucket(
24
			'C18_WMDE_Test_var',
25
			new Banner( 'C18_WMDE_Test_var_main' ),
26
			new Banner( 'C18_WMDE_Test_var_secondary' )
27
		);
28
	}
29
30
	public function test_given_time_out_of_date_range_campaign_is_not_active() {
31
		$campaign = new Campaign(
32
			'C18_WMDE_Test',
33
			new \DateTime( '2018-10-01 14:00:00' ),
34
			new \DateTime( '2018-10-31 14:00:00' ),
35
			1,
36
			new FakeRandomInteger( 1 ),
37
			$this->getControlBucket(),
38
			$this->getVariantBucket()
39
		);
40
		$this->assertTrue(
41
			$campaign->isInActiveDateRange( new \DateTime( '2018-10-01 14:00:00' ) ),
42
			'date given is exactly the start date of the campaign'
43
		);
44
		$this->assertTrue(
45
			$campaign->isInActiveDateRange( new \DateTime( '2018-10-20 14:00:00' ) ),
46
			'date given is between the start and the end of the campaign'
47
		);
48
		$this->assertTrue(
49
			$campaign->isInActiveDateRange( new \DateTime( '2018-10-31 14:00:00' ) ),
50
			'date given is exactly the end date of the campaign'
51
		);
52
53
	}
54
55
	public function test_given_time_in_the_date_range_campaign_is_active() {
56
		$campaign = new Campaign(
57
			'C18_WMDE_Test',
58
			new \DateTime( '2018-10-01 14:00:00' ),
59
			new \DateTime( '2018-10-31 14:00:00' ),
60
			1,
61
			new FakeRandomInteger( 1 ),
62
			$this->getControlBucket(),
63
			$this->getVariantBucket()
64
		);
65
		$this->assertFalse(
66
			$campaign->isInActiveDateRange( new \DateTime( '2018-09-22 14:00:00' ) ),
67
			'date given is before the start of the campaign'
68
		);
69
		$this->assertFalse(
70
			$campaign->isInActiveDateRange( new \DateTime( '2018-10-01 13:59:59' ) ),
71
			'date given is before the start of the campaign'
72
		);
73
		$this->assertFalse(
74
			$campaign->isInActiveDateRange( new \DateTime( '2018-10-31 14:00:01' ) ),
75
			'date given is after the end of the campaign'
76
		);
77
	}
78
79
	public function test_given_valid_bucket_id_returns_bucket() {
80
		$campaign = new Campaign(
81
			'C18_WMDE_Test',
82
			new \DateTime( '2018-10-01 14:00:00' ),
83
			new \DateTime( '2018-10-31 14:00:00' ),
84
			1,
85
			new FakeRandomInteger( 1 ),
86
			$this->getControlBucket(),
87
			$this->getVariantBucket()
88
		);
89
		$this->assertEquals(
90
			$campaign->selectBucket( 'C18_WMDE_Test_var' )->getIdentifier(),
91
			'C18_WMDE_Test_var'
92
		);
93
	}
94
95
	public function test_given_invalid_bucket_id_returns_random_bucket() {
96
		$campaign = new Campaign(
97
			'C18_WMDE_Test',
98
			new \DateTime( '2018-10-01 14:00:00' ),
99
			new \DateTime( '2018-10-31 14:00:00' ),
100
			1,
101
			new FakeRandomInteger( 1 ),
102
			$this->getControlBucket(),
103
			$this->getVariantBucket()
104
		);
105
		$this->assertEquals(
106
			$campaign->selectBucket( 'C18_WMDE_Test_var_666' )->getIdentifier(),
107
			'C18_WMDE_Test_var'
108
		);
109
	}
110
111
	public function test_given_no_bucket_id_returns_random_bucket() {
112
		$campaign = new Campaign(
113
			'C18_WMDE_Test',
114
			new \DateTime( '2018-10-01 14:00:00' ),
115
			new \DateTime( '2018-10-31 14:00:00' ),
116
			1,
117
			new FakeRandomInteger( 1 ),
118
			$this->getControlBucket(),
119
			$this->getVariantBucket()
120
		);
121
		$this->assertEquals(
122
			$campaign->selectBucket( null )->getIdentifier(),
123
			'C18_WMDE_Test_var'
124
		);
125
	}
126
127
	public function test_given_max_ratio_limit_is_not_applied() {
128
		$campaign = new Campaign(
129
			'C18_WMDE_Test',
130
			new \DateTime( '2018-10-01 14:00:00' ),
131
			new \DateTime( '2018-10-31 14:00:00' ),
132
			1,
133
			new FakeRandomInteger( 100 ),
134
			$this->getControlBucket(),
135
			$this->getVariantBucket()
136
		);
137
		$this->assertFalse(
138
			$campaign->isRatioLimited()
139
		);
140
	}
141
142
	public function test_given_one_percent_ratio_limit_is_not_applied_for_one_percent_rng() {
143
		$campaign = new Campaign(
144
			'C18_WMDE_Test',
145
			new \DateTime( '2018-10-01 14:00:00' ),
146
			new \DateTime( '2018-10-31 14:00:00' ),
147
			0.01,
148
			new FakeRandomInteger( 1 ),
149
			$this->getControlBucket(),
150
			$this->getVariantBucket()
151
		);
152
		$this->assertFalse(
153
			$campaign->isRatioLimited()
154
		);
155
	}
156
157
158
	public function test_given_one_percent_ratio_limit_is_applied_for_two_percent_rng() {
159
		$campaign = new Campaign(
160
			'C18_WMDE_Test',
161
			new \DateTime( '2018-10-01 14:00:00' ),
162
			new \DateTime( '2018-10-31 14:00:00' ),
163
			0.01,
164
			new FakeRandomInteger( 2 ),
165
			$this->getControlBucket(),
166
			$this->getVariantBucket()
167
		);
168
		$this->assertTrue(
169
			$campaign->isRatioLimited()
170
		);
171
	}
172
}
173