Skip to content

Commit 953ae62

Browse files
feat: add missing formatters in config and UT
1 parent 8188557 commit 953ae62

9 files changed

+874
-0
lines changed

config/audit_log.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,5 +256,37 @@
256256
'enabled' => true,
257257
'strategy' => \App\Audit\ConcreteFormatters\ExtraQuestionTypeValueAuditLogFormatter::class,
258258
],
259+
\models\main\Company::class => [
260+
'enabled' => true,
261+
'strategy' => \App\Audit\ConcreteFormatters\CompanyAuditLogFormatter::class,
262+
],
263+
\models\summit\PresentationCategory::class => [
264+
'enabled' => true,
265+
'strategy' => \App\Audit\ConcreteFormatters\PresentationCategoryAuditLogFormatter::class,
266+
],
267+
\models\summit\PresentationCategoryGroup::class => [
268+
'enabled' => true,
269+
'strategy' => \App\Audit\ConcreteFormatters\PresentationCategoryGroupAuditLogFormatter::class,
270+
],
271+
\models\summit\PresentationType::class => [
272+
'enabled' => true,
273+
'strategy' => \App\Audit\ConcreteFormatters\PresentationTypeAuditLogFormatter::class,
274+
],
275+
\models\summit\RSVP::class => [
276+
'enabled' => true,
277+
'strategy' => \App\Audit\ConcreteFormatters\RSVPAuditLogFormatter::class,
278+
],
279+
\App\Models\Foundation\Summit\Events\RSVP\RSVPInvitation::class => [
280+
'enabled' => true,
281+
'strategy' => \App\Audit\ConcreteFormatters\RSVPInvitationAuditLogFormatter::class,
282+
],
283+
\App\Models\Foundation\Summit\Events\RSVP\RSVPQuestionTemplate::class => [
284+
'enabled' => true,
285+
'strategy' => \App\Audit\ConcreteFormatters\RSVPQuestionTemplateAuditLogFormatter::class,
286+
],
287+
\App\Models\Foundation\Summit\Events\RSVP\RSVPTemplate::class => [
288+
'enabled' => true,
289+
'strategy' => \App\Audit\ConcreteFormatters\RSVPTemplateAuditLogFormatter::class,
290+
],
259291
]
260292
];
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
<?php
2+
3+
namespace Tests\OpenTelemetry\Formatters;
4+
5+
/**
6+
* Copyright 2026 OpenStack Foundation
7+
* Licensed under the Apache License, Version 2.0 (the "License");
8+
* you may not use this file except in compliance with the License.
9+
* You may obtain a copy of the License at
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
**/
17+
18+
use App\Audit\ConcreteFormatters\CompanyAuditLogFormatter;
19+
use App\Audit\Interfaces\IAuditStrategy;
20+
use Tests\OpenTelemetry\Formatters\Support\AuditContextBuilder;
21+
use Mockery;
22+
use Tests\TestCase;
23+
24+
class CompanyAuditLogFormatterTest extends TestCase
25+
{
26+
private mixed $mockSubject;
27+
28+
protected function setUp(): void
29+
{
30+
parent::setUp();
31+
$this->mockSubject = $this->createMockSubject();
32+
}
33+
34+
protected function tearDown(): void
35+
{
36+
Mockery::close();
37+
parent::tearDown();
38+
}
39+
40+
private function createMockSubject(): mixed
41+
{
42+
$mock = Mockery::mock('models\main\Company');
43+
44+
// Configure return values
45+
$mock->shouldReceive('getId')->andReturn(1);
46+
$mock->shouldReceive('getName')->andReturn('TechCorp Inc');
47+
$mock->shouldReceive('getCity')->andReturn('San Francisco');
48+
$mock->shouldReceive('getCountry')->andReturn('USA');
49+
$mock->shouldReceive('isDisplayOnSite')->andReturn(true);
50+
51+
return $mock;
52+
}
53+
54+
public function testSubjectCreationAuditMessage(): void
55+
{
56+
$formatter = new CompanyAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION);
57+
$formatter->setContext(AuditContextBuilder::default()->build());
58+
$result = $formatter->format($this->mockSubject, []);
59+
60+
$this->assertNotNull($result);
61+
$this->assertStringContainsString('created', $result);
62+
$this->assertStringContainsString('TechCorp Inc', $result);
63+
$this->assertStringContainsString('San Francisco', $result);
64+
}
65+
66+
public function testSubjectUpdateAuditMessage(): void
67+
{
68+
$formatter = new CompanyAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE);
69+
$formatter->setContext(AuditContextBuilder::default()->build());
70+
$changeSet = [
71+
'city' => ['San Francisco', 'Los Angeles'],
72+
'country' => ['USA', 'USA']
73+
];
74+
75+
$result = $formatter->format($this->mockSubject, $changeSet);
76+
77+
$this->assertNotNull($result);
78+
$this->assertStringContainsString('updated', $result);
79+
}
80+
81+
public function testSubjectDeletionAuditMessage(): void
82+
{
83+
$formatter = new CompanyAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_DELETION);
84+
$formatter->setContext(AuditContextBuilder::default()->build());
85+
$result = $formatter->format($this->mockSubject, []);
86+
87+
$this->assertNotNull($result);
88+
$this->assertStringContainsString('deleted', $result);
89+
}
90+
91+
public function testFormatterReturnsNullForInvalidSubject(): void
92+
{
93+
$formatter = new CompanyAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION);
94+
$result = $formatter->format(new \stdClass(), []);
95+
$this->assertNull($result);
96+
}
97+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<?php
2+
3+
namespace Tests\OpenTelemetry\Formatters;
4+
5+
/**
6+
* Copyright 2026 OpenStack Foundation
7+
* Licensed under the Apache License, Version 2.0 (the "License");
8+
* you may not use this file except in compliance with the License.
9+
* You may obtain a copy of the License at
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
**/
17+
18+
use App\Audit\ConcreteFormatters\PresentationCategoryAuditLogFormatter;
19+
use App\Audit\Interfaces\IAuditStrategy;
20+
use Tests\OpenTelemetry\Formatters\Support\AuditContextBuilder;
21+
use Mockery;
22+
use Tests\TestCase;
23+
24+
class PresentationCategoryAuditLogFormatterTest extends TestCase
25+
{
26+
private mixed $mockSubject;
27+
private mixed $mockSummit;
28+
29+
protected function setUp(): void
30+
{
31+
parent::setUp();
32+
$this->mockSummit = $this->createMockSummit();
33+
$this->mockSubject = $this->createMockSubject();
34+
}
35+
36+
protected function tearDown(): void
37+
{
38+
Mockery::close();
39+
parent::tearDown();
40+
}
41+
42+
private function createMockSummit(): mixed
43+
{
44+
$mock = Mockery::mock('models\summit\Summit');
45+
$mock->shouldReceive('getName')->andReturn('OpenStack Summit 2024');
46+
return $mock;
47+
}
48+
49+
private function createMockSubject(): mixed
50+
{
51+
$mock = Mockery::mock('models\summit\PresentationCategory');
52+
53+
// Configure return values
54+
$mock->shouldReceive('getId')->andReturn(10);
55+
$mock->shouldReceive('getTitle')->andReturn('Cloud Architecture');
56+
$mock->shouldReceive('getCode')->andReturn('CLOUD-ARCH');
57+
$mock->shouldReceive('getSummit')->andReturn($this->mockSummit);
58+
59+
return $mock;
60+
}
61+
62+
public function testSubjectCreationAuditMessage(): void
63+
{
64+
$formatter = new PresentationCategoryAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION);
65+
$formatter->setContext(AuditContextBuilder::default()->build());
66+
$result = $formatter->format($this->mockSubject, []);
67+
68+
$this->assertNotNull($result);
69+
$this->assertStringContainsString('created', $result);
70+
$this->assertStringContainsString('Cloud Architecture', $result);
71+
$this->assertStringContainsString('CLOUD-ARCH', $result);
72+
}
73+
74+
public function testSubjectUpdateAuditMessage(): void
75+
{
76+
$formatter = new PresentationCategoryAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE);
77+
$formatter->setContext(AuditContextBuilder::default()->build());
78+
$changeSet = [
79+
'title' => ['Cloud Architecture', 'Infrastructure & Architecture']
80+
];
81+
82+
$result = $formatter->format($this->mockSubject, $changeSet);
83+
84+
$this->assertNotNull($result);
85+
$this->assertStringContainsString('updated', $result);
86+
}
87+
88+
public function testSubjectDeletionAuditMessage(): void
89+
{
90+
$formatter = new PresentationCategoryAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_DELETION);
91+
$formatter->setContext(AuditContextBuilder::default()->build());
92+
$result = $formatter->format($this->mockSubject, []);
93+
94+
$this->assertNotNull($result);
95+
$this->assertStringContainsString('deleted', $result);
96+
}
97+
98+
public function testFormatterReturnsNullForInvalidSubject(): void
99+
{
100+
$formatter = new PresentationCategoryAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION);
101+
$result = $formatter->format(new \stdClass(), []);
102+
$this->assertNull($result);
103+
}
104+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<?php
2+
3+
namespace Tests\OpenTelemetry\Formatters;
4+
5+
/**
6+
* Copyright 2026 OpenStack Foundation
7+
* Licensed under the Apache License, Version 2.0 (the "License");
8+
* you may not use this file except in compliance with the License.
9+
* You may obtain a copy of the License at
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
**/
17+
18+
use App\Audit\ConcreteFormatters\PresentationCategoryGroupAuditLogFormatter;
19+
use App\Audit\Interfaces\IAuditStrategy;
20+
use Tests\OpenTelemetry\Formatters\Support\AuditContextBuilder;
21+
use Mockery;
22+
use Tests\TestCase;
23+
24+
class PresentationCategoryGroupAuditLogFormatterTest extends TestCase
25+
{
26+
private mixed $mockSubject;
27+
28+
protected function setUp(): void
29+
{
30+
parent::setUp();
31+
$this->mockSubject = $this->createMockSubject();
32+
}
33+
34+
protected function tearDown(): void
35+
{
36+
Mockery::close();
37+
parent::tearDown();
38+
}
39+
40+
private function createMockSubject(): mixed
41+
{
42+
$mockSummit = Mockery::mock('models\summit\Summit');
43+
$mockSummit->shouldReceive('getName')->andReturn('OpenStack Summit');
44+
45+
$mock = Mockery::mock('models\summit\PresentationCategoryGroup');
46+
47+
// Configure return values
48+
$mock->shouldReceive('getId')->andReturn(5);
49+
$mock->shouldReceive('getName')->andReturn('Technical Tracks');
50+
$mock->shouldReceive('getDescription')->andReturn('Group for technical presentations');
51+
$mock->shouldReceive('getSummit')->andReturn($mockSummit);
52+
$mock->shouldReceive('getColor')->andReturn('#FF5733');
53+
$mock->shouldReceive('getMaxAttendeeVotes')->andReturn(3);
54+
55+
return $mock;
56+
}
57+
58+
public function testSubjectCreationAuditMessage(): void
59+
{
60+
$formatter = new PresentationCategoryGroupAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION);
61+
$formatter->setContext(AuditContextBuilder::default()->build());
62+
$result = $formatter->format($this->mockSubject, []);
63+
64+
$this->assertNotNull($result);
65+
$this->assertStringContainsString('created', $result);
66+
$this->assertStringContainsString('Technical Tracks', $result);
67+
}
68+
69+
public function testSubjectUpdateAuditMessage(): void
70+
{
71+
$formatter = new PresentationCategoryGroupAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE);
72+
$formatter->setContext(AuditContextBuilder::default()->build());
73+
$changeSet = [
74+
'name' => ['Technical Tracks', 'Core Technical Topics']
75+
];
76+
77+
$result = $formatter->format($this->mockSubject, $changeSet);
78+
79+
$this->assertNotNull($result);
80+
$this->assertStringContainsString('updated', $result);
81+
}
82+
83+
public function testSubjectDeletionAuditMessage(): void
84+
{
85+
$formatter = new PresentationCategoryGroupAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_DELETION);
86+
$formatter->setContext(AuditContextBuilder::default()->build());
87+
$result = $formatter->format($this->mockSubject, []);
88+
89+
$this->assertNotNull($result);
90+
$this->assertStringContainsString('deleted', $result);
91+
}
92+
93+
public function testFormatterReturnsNullForInvalidSubject(): void
94+
{
95+
$formatter = new PresentationCategoryGroupAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION);
96+
$result = $formatter->format(new \stdClass(), []);
97+
$this->assertNull($result);
98+
}
99+
}

0 commit comments

Comments
 (0)