Skip to content

Commit eccfc04

Browse files
committed
feat: add consent to analytics with own helper/handler
1 parent 8d583d3 commit eccfc04

File tree

4 files changed

+198
-1
lines changed

4 files changed

+198
-1
lines changed

phpunit.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
colors="true" stopOnFailure="false" beStrictAboutTestsThatDoNotTestAnything="true"
44
beStrictAboutTodoAnnotatedTests="true" testdox="true"
55
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.1/phpunit.xsd"
6-
cacheDirectory=".phpunit.cache" displayDetailsOnTestsThatTriggerDeprecations="true">
6+
cacheDirectory=".phpunit.cache" displayDetailsOnTestsThatTriggerDeprecations="true"
7+
failOnWarning="true">
78
<testsuites>
89
<testsuite name="Units">
910
<directory>test/Unit</directory>

src/Analytics.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use AlexWestergaard\PhpGa4\Helper;
77
use AlexWestergaard\PhpGa4\Facade;
88
use AlexWestergaard\PhpGa4\Exception\Ga4Exception;
9+
use AlexWestergaard\PhpGa4\Helper\ConsentHelper;
910

1011
/**
1112
* Analytics wrapper to contain UserProperties and Events to post on Google Analytics
@@ -14,6 +15,8 @@ class Analytics extends Helper\IOHelper implements Facade\Type\AnalyticsType
1415
{
1516
private Guzzle $guzzle;
1617

18+
private ConsentHelper $consent;
19+
1720
protected null|bool $non_personalized_ads = false;
1821
protected null|int $timestamp_micros;
1922
protected null|string $client_id;
@@ -28,6 +31,7 @@ public function __construct(
2831
) {
2932
parent::__construct();
3033
$this->guzzle = new Guzzle();
34+
$this->consent = new ConsentHelper();
3135
}
3236

3337
public function getParams(): array
@@ -108,6 +112,11 @@ public function addEvent(Facade\Type\EventType ...$events)
108112
return $this;
109113
}
110114

115+
public function consent()
116+
{
117+
return $this->consent;
118+
}
119+
111120
public function post(): void
112121
{
113122
if (empty($this->measurement_id)) {
@@ -122,6 +131,10 @@ public function post(): void
122131
$url .= '?' . http_build_query(['measurement_id' => $this->measurement_id, 'api_secret' => $this->api_secret]);
123132

124133
$body = $this->toArray();
134+
array_merge_recursive(
135+
$this->toArray(),
136+
["consent" => $this->consent->toArray()],
137+
);
125138

126139
$chunkUserProperties = array_chunk($this->user_properties, 25, true);
127140
$this->user_properties = [];

src/Helper/ConsentHelper.php

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
3+
namespace AlexWestergaard\PhpGa4\Helper;
4+
5+
class ConsentHelper
6+
{
7+
const GRANTED = "granted";
8+
const DENIED = "denied";
9+
10+
private ?string $ad_user_data = null;
11+
private ?string $ad_personalization = null;
12+
13+
public function clearAdUserDataPermission(): self
14+
{
15+
$this->ad_user_data = null;
16+
return $this;
17+
}
18+
19+
public function setAdUserDataPermission(bool $allow = false): self
20+
{
21+
$this->ad_user_data = $allow ? self::GRANTED : self::DENIED;
22+
return $this;
23+
}
24+
25+
public function getAdUserDataPermission(): null|string
26+
{
27+
return $this->ad_user_data == null ? null : $this->ad_user_data;
28+
}
29+
30+
public function clearAdPersonalizationPermission(): self
31+
{
32+
$this->ad_personalization = null;
33+
return $this;
34+
}
35+
36+
public function setAdPersonalizationPermission(bool $allow = false): self
37+
{
38+
$this->ad_personalization = $allow ? self::GRANTED : self::DENIED;
39+
return $this;
40+
}
41+
42+
public function getAdPersonalizationPermission(): null|string
43+
{
44+
return $this->ad_personalization == null ? null : $this->ad_personalization;
45+
}
46+
47+
public function toArray(): array
48+
{
49+
$e = [];
50+
51+
if ($this->ad_user_data != null) {
52+
$e["ad_user_data"] = $this->getAdUserDataPermission();
53+
}
54+
55+
if ($this->ad_personalization != null) {
56+
$e["ad_personalization"] = $this->getAdPersonalizationPermission();
57+
}
58+
59+
return $e;
60+
}
61+
}

test/Unit/ConsentTest.php

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
<?php
2+
3+
namespace AlexWestergaard\PhpGa4Test\Unit;
4+
5+
use AlexWestergaard\PhpGa4\Helper\ConsentHelper;
6+
use AlexWestergaard\PhpGa4Test\TestCase;
7+
8+
final class ConsentTest extends TestCase
9+
{
10+
public function test_no_consent_is_empty()
11+
{
12+
$export = $this->analytics->consent()->toArray();
13+
$this->assertIsArray($export);
14+
$this->assertCount(0, $export);
15+
}
16+
17+
public function test_consent_ad_user_data_granted()
18+
{
19+
$this->analytics->consent()->setAdUserDataPermission(true);
20+
21+
$export = $this->analytics->consent()->toArray();
22+
$this->assertIsArray($export);
23+
$this->assertCount(1, $export);
24+
$this->assertArrayHasKey("ad_user_data", $export);
25+
$this->assertArrayNotHasKey("ad_personalization", $export);
26+
$this->assertEquals(ConsentHelper::GRANTED, $export["ad_user_data"]);
27+
}
28+
29+
public function test_consent_ad_personalization_granted()
30+
{
31+
$this->analytics->consent()->setAdPersonalizationPermission(true);
32+
33+
$export = $this->analytics->consent()->toArray();
34+
$this->assertIsArray($export);
35+
$this->assertCount(1, $export);
36+
$this->assertArrayHasKey("ad_personalization", $export);
37+
$this->assertArrayNotHasKey("ad_user_data", $export);
38+
$this->assertEquals(ConsentHelper::GRANTED, $export["ad_personalization"]);
39+
}
40+
41+
public function test_consent_granted()
42+
{
43+
$this->analytics->consent()->setAdUserDataPermission(true);
44+
$this->analytics->consent()->setAdPersonalizationPermission(true);
45+
46+
$export = $this->analytics->consent()->toArray();
47+
$this->assertIsArray($export);
48+
$this->assertCount(2, $export);
49+
$this->assertArrayHasKey("ad_user_data", $export);
50+
$this->assertArrayHasKey("ad_personalization", $export);
51+
$this->assertEquals(ConsentHelper::GRANTED, $export["ad_user_data"]);
52+
$this->assertEquals(ConsentHelper::GRANTED, $export["ad_personalization"]);
53+
}
54+
55+
public function test_consent_granted_posted()
56+
{
57+
$this->analytics->consent()->setAdUserDataPermission(true);
58+
$this->analytics->consent()->setAdPersonalizationPermission(true);
59+
60+
$export = $this->analytics->consent()->toArray();
61+
$this->assertIsArray($export);
62+
$this->assertCount(2, $export);
63+
$this->assertArrayHasKey("ad_user_data", $export);
64+
$this->assertArrayHasKey("ad_personalization", $export);
65+
$this->assertEquals(ConsentHelper::GRANTED, $export["ad_user_data"]);
66+
$this->assertEquals(ConsentHelper::GRANTED, $export["ad_personalization"]);
67+
$this->assertNull($this->analytics->post());
68+
}
69+
70+
public function test_consent_ad_user_data_denied()
71+
{
72+
$this->analytics->consent()->setAdUserDataPermission(false);
73+
74+
$export = $this->analytics->consent()->toArray();
75+
$this->assertIsArray($export);
76+
$this->assertCount(1, $export);
77+
$this->assertArrayHasKey("ad_user_data", $export);
78+
$this->assertArrayNotHasKey("ad_personalization", $export);
79+
$this->assertEquals(ConsentHelper::DENIED, $export["ad_user_data"]);
80+
}
81+
82+
public function test_consent_ad_personalization_denied()
83+
{
84+
$this->analytics->consent()->setAdPersonalizationPermission(false);
85+
86+
$export = $this->analytics->consent()->toArray();
87+
$this->assertIsArray($export);
88+
$this->assertCount(1, $export);
89+
$this->assertArrayHasKey("ad_personalization", $export);
90+
$this->assertArrayNotHasKey("ad_user_data", $export);
91+
$this->assertEquals(ConsentHelper::DENIED, $export["ad_personalization"]);
92+
}
93+
94+
public function test_consent_denied()
95+
{
96+
$this->analytics->consent()->setAdUserDataPermission(false);
97+
$this->analytics->consent()->setAdPersonalizationPermission(false);
98+
99+
$export = $this->analytics->consent()->toArray();
100+
$this->assertIsArray($export);
101+
$this->assertCount(2, $export);
102+
$this->assertArrayHasKey("ad_user_data", $export);
103+
$this->assertArrayHasKey("ad_personalization", $export);
104+
$this->assertEquals(ConsentHelper::DENIED, $export["ad_user_data"]);
105+
$this->assertEquals(ConsentHelper::DENIED, $export["ad_personalization"]);
106+
}
107+
108+
public function test_consent_denied_posted()
109+
{
110+
$this->analytics->consent()->setAdUserDataPermission(false);
111+
$this->analytics->consent()->setAdPersonalizationPermission(false);
112+
113+
$export = $this->analytics->consent()->toArray();
114+
$this->assertIsArray($export);
115+
$this->assertCount(2, $export);
116+
$this->assertArrayHasKey("ad_user_data", $export);
117+
$this->assertArrayHasKey("ad_personalization", $export);
118+
$this->assertEquals(ConsentHelper::DENIED, $export["ad_user_data"]);
119+
$this->assertEquals(ConsentHelper::DENIED, $export["ad_personalization"]);
120+
$this->assertNull($this->analytics->post());
121+
}
122+
}

0 commit comments

Comments
 (0)