Skip to content

Commit 500bbb7

Browse files
fix: add new UT and fix for formatters
1 parent e2be02b commit 500bbb7

5 files changed

Lines changed: 260 additions & 4 deletions

app/Audit/ConcreteFormatters/SponsorSummitRegistrationDiscountCodeAuditLogFormatter.php

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,24 @@
2222

2323
class SponsorSummitRegistrationDiscountCodeAuditLogFormatter extends AbstractAuditLogFormatter
2424
{
25+
private function buildDiscountDetails($subject): string
26+
{
27+
$details = [];
28+
29+
$rate = $subject->getRate();
30+
$amount = $subject->getAmount();
31+
32+
if ($rate > 0) {
33+
$details[] = sprintf("rate: %.2f%%", $rate);
34+
}
35+
36+
if ($amount > 0) {
37+
$details[] = sprintf("amount: $%.2f", $amount);
38+
}
39+
40+
return implode(", ", $details);
41+
}
42+
2543
public function format($subject, array $change_set): ?string
2644
{
2745
if (!$subject instanceof SponsorSummitRegistrationDiscountCode) {
@@ -34,35 +52,39 @@ public function format($subject, array $change_set): ?string
3452
$summit = $subject->getSummit();
3553
$summit_name = $summit ? ($summit->getName() ?? 'Unknown Summit') : 'Unknown Summit';
3654
$sponsor_id = $subject->getSponsorId() ?? 'unknown';
55+
$discount_details = $this->buildDiscountDetails($subject);
3756

3857
switch ($this->event_type) {
3958
case IAuditStrategy::EVENT_ENTITY_CREATION:
4059
return sprintf(
41-
"Sponsor Registration Discount Code '%s' (ID: %s) for Sponsor %s in Summit '%s' created by user %s",
60+
"Sponsor Registration Discount Code '%s' (ID: %s) for Sponsor %s in Summit '%s' with %s created by user %s",
4261
$code,
4362
$id,
4463
$sponsor_id,
4564
$summit_name,
65+
$discount_details,
4666
$this->getUserInfo()
4767
);
4868

4969
case IAuditStrategy::EVENT_ENTITY_UPDATE:
5070
$details = $this->buildChangeDetails($change_set);
5171
return sprintf(
52-
"Sponsor Registration Discount Code '%s' (ID: %s) in Summit '%s' updated: %s by user %s",
72+
"Sponsor Registration Discount Code '%s' (ID: %s) in Summit '%s' updated: %s (current: %s) by user %s",
5373
$code,
5474
$id,
5575
$summit_name,
5676
$details,
77+
$discount_details,
5778
$this->getUserInfo()
5879
);
5980

6081
case IAuditStrategy::EVENT_ENTITY_DELETION:
6182
return sprintf(
62-
"Sponsor Registration Discount Code '%s' (ID: %s) in Summit '%s' deleted by user %s",
83+
"Sponsor Registration Discount Code '%s' (ID: %s) in Summit '%s' with %s was deleted by user %s",
6384
$code,
6485
$id,
6586
$summit_name,
87+
$discount_details,
6688
$this->getUserInfo()
6789
);
6890
}

app/Audit/ConcreteFormatters/SponsorUserInfoGrantAuditLogFormatter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public function format($subject, array $change_set): ?string
3838
switch ($this->event_type) {
3939
case IAuditStrategy::EVENT_ENTITY_CREATION:
4040
return sprintf(
41-
"Sponsor User Info Grant (ID: %s) granting access to user '%s' for Sponsor %s created by user %s",
41+
"Sponsor User Info Grant (ID: %s) granting access to user '%s' for Sponsor %s created by user %s",
4242
$id,
4343
$user_email,
4444
$sponsor_id,
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<?php
2+
3+
namespace Tests\OpenTelemetry\Formatters;
4+
5+
use App\Audit\ConcreteFormatters\SponsorAuditLogFormatter;
6+
use App\Audit\Interfaces\IAuditStrategy;
7+
use Tests\OpenTelemetry\Formatters\Support\AuditContextBuilder;
8+
use Mockery;
9+
use Tests\TestCase;
10+
11+
class SponsorFormatterTest extends TestCase
12+
{
13+
private const SPONSOR_ID = 42;
14+
private const COMPANY_NAME = 'OpenStack Foundation';
15+
private const SUMMIT_NAME = 'OpenStack Summit 2024';
16+
private const SPONSOR_ORDER = 1;
17+
18+
private mixed $mockSubject;
19+
20+
protected function setUp(): void
21+
{
22+
parent::setUp();
23+
$this->mockSubject = $this->createMockSubject();
24+
}
25+
26+
protected function tearDown(): void
27+
{
28+
Mockery::close();
29+
parent::tearDown();
30+
}
31+
32+
private function createMockSubject(): mixed
33+
{
34+
$mockCompany = Mockery::mock('models\main\Company');
35+
$mockCompany->shouldReceive('getName')->andReturn(self::COMPANY_NAME);
36+
37+
$mockSummit = Mockery::mock('models\summit\Summit');
38+
$mockSummit->shouldReceive('getName')->andReturn(self::SUMMIT_NAME);
39+
40+
$mock = Mockery::mock('models\summit\Sponsor');
41+
$mock->shouldReceive('getId')->andReturn(self::SPONSOR_ID);
42+
$mock->shouldReceive('getCompany')->andReturn($mockCompany);
43+
$mock->shouldReceive('getSummit')->andReturn($mockSummit);
44+
$mock->shouldReceive('getOrder')->andReturn(self::SPONSOR_ORDER);
45+
46+
return $mock;
47+
}
48+
49+
public function testSubjectCreationAuditMessage(): void
50+
{
51+
$formatter = new SponsorAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION);
52+
$formatter->setContext(AuditContextBuilder::default()->build());
53+
$result = $formatter->format($this->mockSubject, []);
54+
55+
$this->assertNotNull($result);
56+
$this->assertStringContainsString('created', $result);
57+
$this->assertStringContainsString(self::COMPANY_NAME, $result);
58+
$this->assertStringContainsString(self::SUMMIT_NAME, $result);
59+
$this->assertStringContainsString((string)self::SPONSOR_ID, $result);
60+
$this->assertStringContainsString('order', $result);
61+
}
62+
63+
public function testSubjectUpdateAuditMessage(): void
64+
{
65+
$formatter = new SponsorAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE);
66+
$formatter->setContext(AuditContextBuilder::default()->build());
67+
$changeSet = ['order' => [1, 2]];
68+
69+
$result = $formatter->format($this->mockSubject, $changeSet);
70+
71+
$this->assertNotNull($result);
72+
$this->assertStringContainsString('updated', $result);
73+
$this->assertStringContainsString(self::COMPANY_NAME, $result);
74+
}
75+
76+
public function testSubjectDeletionAuditMessage(): void
77+
{
78+
$formatter = new SponsorAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_DELETION);
79+
$formatter->setContext(AuditContextBuilder::default()->build());
80+
$result = $formatter->format($this->mockSubject, []);
81+
82+
$this->assertNotNull($result);
83+
$this->assertStringContainsString('deleted', $result);
84+
$this->assertStringContainsString(self::COMPANY_NAME, $result);
85+
}
86+
87+
public function testFormatterReturnsNullForInvalidSubject(): void
88+
{
89+
$formatter = new SponsorAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION);
90+
$formatter->setContext(AuditContextBuilder::default()->build());
91+
$result = $formatter->format(new \stdClass(), []);
92+
93+
$this->assertNull($result);
94+
}
95+
96+
public function testFormatterHandlesEmptyChangeSet(): void
97+
{
98+
$formatter = new SponsorAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE);
99+
$formatter->setContext(AuditContextBuilder::default()->build());
100+
$result = $formatter->format($this->mockSubject, []);
101+
102+
$this->assertNotNull($result);
103+
$this->assertStringContainsString('updated', $result);
104+
}
105+
}

tests/OpenTelemetry/Formatters/SponsorSummitRegistrationDiscountCodeFormatterTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ public function testSubjectUpdateAuditMessage(): void
7171

7272
$this->assertNotNull($result);
7373
$this->assertStringContainsString('updated', $result);
74+
$this->assertStringContainsString('current:', $result);
75+
$this->assertStringContainsString('rate', $result);
7476
}
7577

7678
public function testSubjectDeletionAuditMessage(): void
@@ -81,6 +83,7 @@ public function testSubjectDeletionAuditMessage(): void
8183

8284
$this->assertNotNull($result);
8385
$this->assertStringContainsString('deleted', $result);
86+
$this->assertStringContainsString('rate', $result);
8487
}
8588

8689
public function testFormatterReturnsNullForInvalidSubject(): void
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
<?php
2+
3+
namespace Tests\OpenTelemetry\Formatters;
4+
5+
use App\Audit\ConcreteFormatters\SummitEventTypeAuditLogFormatter;
6+
use App\Audit\Interfaces\IAuditStrategy;
7+
use Tests\OpenTelemetry\Formatters\Support\AuditContextBuilder;
8+
use Mockery;
9+
use Tests\TestCase;
10+
11+
class SummitEventTypeFormatterTest extends TestCase
12+
{
13+
private const EVENT_TYPE_ID = 123;
14+
private const EVENT_TYPE_NAME = 'Keynote';
15+
private const SUMMIT_NAME = 'OpenStack Summit 2024';
16+
private const EVENT_TYPE_COLOR = '#FF0000';
17+
private const IS_DEFAULT = true;
18+
private const IS_PRIVATE = false;
19+
20+
private mixed $mockSubject;
21+
22+
protected function setUp(): void
23+
{
24+
parent::setUp();
25+
$this->mockSubject = $this->createMockSubject();
26+
}
27+
28+
protected function tearDown(): void
29+
{
30+
Mockery::close();
31+
parent::tearDown();
32+
}
33+
34+
private function createMockSubject(): mixed
35+
{
36+
$mockSummit = Mockery::mock('models\summit\Summit');
37+
$mockSummit->shouldReceive('getName')->andReturn(self::SUMMIT_NAME);
38+
39+
$mock = Mockery::mock('models\summit\SummitEventType');
40+
$mock->shouldReceive('getId')->andReturn(self::EVENT_TYPE_ID);
41+
$mock->shouldReceive('getType')->andReturn(self::EVENT_TYPE_NAME);
42+
$mock->shouldReceive('getSummit')->andReturn($mockSummit);
43+
$mock->shouldReceive('getColor')->andReturn(self::EVENT_TYPE_COLOR);
44+
$mock->shouldReceive('isDefault')->andReturn(self::IS_DEFAULT);
45+
$mock->shouldReceive('isPrivate')->andReturn(self::IS_PRIVATE);
46+
47+
return $mock;
48+
}
49+
50+
public function testSubjectCreationAuditMessage(): void
51+
{
52+
$formatter = new SummitEventTypeAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION);
53+
$formatter->setContext(AuditContextBuilder::default()->build());
54+
$result = $formatter->format($this->mockSubject, []);
55+
56+
$this->assertNotNull($result);
57+
$this->assertStringContainsString('created', $result);
58+
$this->assertStringContainsString(self::EVENT_TYPE_NAME, $result);
59+
$this->assertStringContainsString(self::SUMMIT_NAME, $result);
60+
$this->assertStringContainsString(self::EVENT_TYPE_COLOR, $result);
61+
$this->assertStringContainsString('default: yes', $result);
62+
$this->assertStringContainsString('private: no', $result);
63+
}
64+
65+
public function testSubjectUpdateAuditMessage(): void
66+
{
67+
$formatter = new SummitEventTypeAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE);
68+
$formatter->setContext(AuditContextBuilder::default()->build());
69+
$changeSet = ['color' => ['#FF0000', '#00FF00']];
70+
71+
$result = $formatter->format($this->mockSubject, $changeSet);
72+
73+
$this->assertNotNull($result);
74+
$this->assertStringContainsString('updated', $result);
75+
$this->assertStringContainsString(self::EVENT_TYPE_NAME, $result);
76+
}
77+
78+
public function testSubjectDeletionAuditMessage(): void
79+
{
80+
$formatter = new SummitEventTypeAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_DELETION);
81+
$formatter->setContext(AuditContextBuilder::default()->build());
82+
$result = $formatter->format($this->mockSubject, []);
83+
84+
$this->assertNotNull($result);
85+
$this->assertStringContainsString('deleted', $result);
86+
$this->assertStringContainsString(self::EVENT_TYPE_NAME, $result);
87+
$this->assertStringContainsString(self::EVENT_TYPE_COLOR, $result);
88+
}
89+
90+
public function testFormatterReturnsNullForInvalidSubject(): void
91+
{
92+
$formatter = new SummitEventTypeAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION);
93+
$formatter->setContext(AuditContextBuilder::default()->build());
94+
$result = $formatter->format(new \stdClass(), []);
95+
96+
$this->assertNull($result);
97+
}
98+
99+
public function testFormatterHandlesEmptyChangeSet(): void
100+
{
101+
$formatter = new SummitEventTypeAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE);
102+
$formatter->setContext(AuditContextBuilder::default()->build());
103+
$result = $formatter->format($this->mockSubject, []);
104+
105+
$this->assertNotNull($result);
106+
$this->assertStringContainsString('updated', $result);
107+
}
108+
109+
public function testFormatterHandlesNullCompanyAndSummit(): void
110+
{
111+
$mock = Mockery::mock('models\summit\SummitEventType');
112+
$mock->shouldReceive('getId')->andReturn(self::EVENT_TYPE_ID);
113+
$mock->shouldReceive('getType')->andReturn(self::EVENT_TYPE_NAME);
114+
$mock->shouldReceive('getSummit')->andReturn(null);
115+
$mock->shouldReceive('getColor')->andReturn(self::EVENT_TYPE_COLOR);
116+
$mock->shouldReceive('isDefault')->andReturn(self::IS_DEFAULT);
117+
$mock->shouldReceive('isPrivate')->andReturn(self::IS_PRIVATE);
118+
119+
$formatter = new SummitEventTypeAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION);
120+
$formatter->setContext(AuditContextBuilder::default()->build());
121+
$result = $formatter->format($mock, []);
122+
123+
$this->assertNotNull($result);
124+
$this->assertStringContainsString('Unknown Summit', $result);
125+
}
126+
}

0 commit comments

Comments
 (0)