Skip to content

Commit 5ea5494

Browse files
fix: add otlp test changes
1 parent b6bb39e commit 5ea5494

5 files changed

Lines changed: 143 additions & 53 deletions

tests/OpenTelemetry/AuditEventTypesTest.php

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,36 @@
33
namespace Tests\OpenTelemetry;
44

55
use App\Audit\AuditLogOtlpStrategy;
6+
use App\Audit\AuditContext;
67
use OpenTelemetry\API\Trace\StatusCode;
78

89
class AuditEventTypesTest extends OpenTelemetryTestCase
910
{
11+
private const MOCK_ENTITY_ID = 999;
12+
private const MOCK_ENTITY_TITLE = 'Test Entity';
13+
private const NEW_ENTITY_TITLE = 'New Entity';
14+
private const TEST_TYPE = 'test';
15+
private const OLD_TITLE = 'Old Title';
16+
private const NEW_TITLE = 'New Title';
17+
private const DELETED_ID = 999;
18+
private const CLEANUP_REASON = 'Test cleanup';
19+
private const USER_ID = 999;
20+
private const USER_EMAIL = 'test@example.com';
21+
private const USER_FIRST_NAME = 'Test';
22+
private const USER_LAST_NAME = 'User';
23+
private const TEST_APP = 'test-app';
24+
private const TEST_FLOW = 'test-flow';
25+
private const TEST_ROUTE = 'api.test';
26+
private const TEST_HTTP_METHOD = 'POST';
27+
private const TEST_CLIENT_IP = '127.0.0.1';
28+
private const TEST_USER_AGENT = 'Test-Agent/1.0';
29+
private const SPAN_CREATION = 'test.audit.creation';
30+
private const SPAN_UPDATE = 'test.audit.update';
31+
private const SPAN_DELETION = 'test.audit.deletion';
32+
private const CREATION_COMPLETED = 'Creation audit completed';
33+
private const UPDATE_COMPLETED = 'Update audit completed';
34+
private const DELETION_COMPLETED = 'Deletion audit completed';
35+
1036
private AuditLogOtlpStrategy $auditStrategy;
1137

1238
protected function setUp(): void
@@ -23,20 +49,22 @@ public function testEntityCreationAudit(): void
2349
}
2450

2551
$tracer = $this->app->make(\OpenTelemetry\API\Trace\TracerInterface::class);
26-
$span = $tracer->spanBuilder('test.audit.creation')->startSpan();
52+
$span = $tracer->spanBuilder(self::SPAN_CREATION)->startSpan();
2753
$spanScope = $span->activate();
2854

2955
try {
30-
$mockEntity = (object) ['id' => 999, 'title' => 'Test Entity'];
31-
$data = ['title' => 'New Entity', 'type' => 'test'];
56+
$mockEntity = (object) ['id' => self::MOCK_ENTITY_ID, 'title' => self::MOCK_ENTITY_TITLE];
57+
$data = ['title' => self::NEW_ENTITY_TITLE, 'type' => self::TEST_TYPE];
58+
$ctx = $this->createAuditContext();
3259

3360
$this->auditStrategy->audit(
3461
$mockEntity,
3562
$data,
36-
AuditLogOtlpStrategy::EVENT_ENTITY_CREATION
63+
AuditLogOtlpStrategy::EVENT_ENTITY_CREATION,
64+
$ctx
3765
);
3866

39-
$span->setStatus(StatusCode::STATUS_OK, 'Creation audit completed');
67+
$span->setStatus(StatusCode::STATUS_OK, self::CREATION_COMPLETED);
4068
$this->assertTrue(true);
4169
} catch (\Exception $e) {
4270
$span->recordException($e);
@@ -54,20 +82,22 @@ public function testEntityUpdateAudit(): void
5482
}
5583

5684
$tracer = $this->app->make(\OpenTelemetry\API\Trace\TracerInterface::class);
57-
$span = $tracer->spanBuilder('test.audit.update')->startSpan();
85+
$span = $tracer->spanBuilder(self::SPAN_UPDATE)->startSpan();
5886
$spanScope = $span->activate();
5987

6088
try {
61-
$mockEntity = (object) ['id' => 999, 'title' => 'Test Entity'];
62-
$data = ['title' => ['Old Title', 'New Title']];
89+
$mockEntity = (object) ['id' => self::MOCK_ENTITY_ID, 'title' => self::MOCK_ENTITY_TITLE];
90+
$data = ['title' => [self::OLD_TITLE, self::NEW_TITLE]];
91+
$ctx = $this->createAuditContext();
6392

6493
$this->auditStrategy->audit(
6594
$mockEntity,
6695
$data,
67-
AuditLogOtlpStrategy::EVENT_ENTITY_UPDATE
96+
AuditLogOtlpStrategy::EVENT_ENTITY_UPDATE,
97+
$ctx
6898
);
6999

70-
$span->setStatus(StatusCode::STATUS_OK, 'Update audit completed');
100+
$span->setStatus(StatusCode::STATUS_OK, self::UPDATE_COMPLETED);
71101
$this->assertTrue(true);
72102
} catch (\Exception $e) {
73103
$span->recordException($e);
@@ -85,20 +115,22 @@ public function testEntityDeletionAudit(): void
85115
}
86116

87117
$tracer = $this->app->make(\OpenTelemetry\API\Trace\TracerInterface::class);
88-
$span = $tracer->spanBuilder('test.audit.deletion')->startSpan();
118+
$span = $tracer->spanBuilder(self::SPAN_DELETION)->startSpan();
89119
$spanScope = $span->activate();
90120

91121
try {
92-
$mockEntity = (object) ['id' => 999, 'title' => 'Test Entity'];
93-
$data = ['deleted_id' => 999, 'reason' => 'Test cleanup'];
122+
$mockEntity = (object) ['id' => self::MOCK_ENTITY_ID, 'title' => self::MOCK_ENTITY_TITLE];
123+
$data = ['deleted_id' => self::DELETED_ID, 'reason' => self::CLEANUP_REASON];
124+
$ctx = $this->createAuditContext();
94125

95126
$this->auditStrategy->audit(
96127
$mockEntity,
97128
$data,
98-
AuditLogOtlpStrategy::EVENT_ENTITY_DELETION
129+
AuditLogOtlpStrategy::EVENT_ENTITY_DELETION,
130+
$ctx
99131
);
100132

101-
$span->setStatus(StatusCode::STATUS_OK, 'Deletion audit completed');
133+
$span->setStatus(StatusCode::STATUS_OK, self::DELETION_COMPLETED);
102134
$this->assertTrue(true);
103135
} catch (\Exception $e) {
104136
$span->recordException($e);
@@ -116,4 +148,21 @@ private function isOpenTelemetryEnabled(): bool
116148
{
117149
return getenv('OTEL_SERVICE_ENABLED') === 'true';
118150
}
151+
152+
private function createAuditContext(): AuditContext
153+
{
154+
return new AuditContext(
155+
userId: self::USER_ID,
156+
userEmail: self::USER_EMAIL,
157+
userFirstName: self::USER_FIRST_NAME,
158+
userLastName: self::USER_LAST_NAME,
159+
uiApp: self::TEST_APP,
160+
uiFlow: self::TEST_FLOW,
161+
route: self::TEST_ROUTE,
162+
rawRoute: self::TEST_ROUTE,
163+
httpMethod: self::TEST_HTTP_METHOD,
164+
clientIp: self::TEST_CLIENT_IP,
165+
userAgent: self::TEST_USER_AGENT,
166+
);
167+
}
119168
}

tests/OpenTelemetry/AuditOtlpStrategyTest.php

Lines changed: 57 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,23 @@ class AuditOtlpStrategyTest extends OpenTelemetryTestCase
2626
use InsertSummitTestData;
2727
use InsertMemberTestData;
2828

29+
private const TEST_APP = 'test-app';
30+
private const TEST_FLOW = 'test-flow';
31+
private const TEST_ROUTE = 'api.summits.update';
32+
private const TEST_HTTP_METHOD = 'PUT';
33+
private const TEST_CLIENT_IP = '127.0.0.1';
34+
private const TEST_USER_AGENT = 'Test-Agent/1.0';
35+
private const SPAN_SUMMIT_CHANGE = 'test.audit.summit_change';
36+
private const SPAN_SUMMIT_EVENT_CHANGE = 'test.audit.summit_event_change';
37+
private const SPAN_NO_ACTIVE_SPAN = 'test.audit.no_span';
38+
private const SPAN_EMPTY_CHANGESET = 'test.audit.empty_changeset';
39+
private const SUFFIX_TEST = '[TEST]';
40+
private const SUFFIX_UPDATED = '[UPDATED]';
41+
private const SPAN_EVENT_STARTED = 'test.started';
42+
private const EVENT_COMPLETED = 'Summit audit completed';
43+
private const EVENT_CHANGE_COMPLETED = 'SummitEvent audit completed';
44+
private const EVENT_EMPTY_COMPLETED = 'Empty changeset audit completed';
45+
2946
private AuditLogOtlpStrategy $auditStrategy;
3047

3148
protected function setUp(): void
@@ -51,24 +68,26 @@ public function testAuditSummitChangeWithOtlp(): void
5168
$this->skipIfOpenTelemetryDisabled();
5269

5370
$tracer = $this->app->make(TracerInterface::class);
54-
$span = $tracer->spanBuilder('test.audit.summit_change')->startSpan();
71+
$span = $tracer->spanBuilder(self::SPAN_SUMMIT_CHANGE)->startSpan();
5572
$spanScope = $span->activate();
5673

5774
try {
58-
$span->addEvent('test.started', [
75+
$span->addEvent(self::SPAN_EVENT_STARTED, [
5976
'summit_id' => self::$summit->getId(),
6077
'summit_name' => self::$summit->getName()
6178
]);
6279

6380
$simulatedChangeSet = $this->createSummitChangeSet();
81+
$ctx = $this->createAuditContext();
6482

6583
$this->auditStrategy->audit(
6684
self::$summit,
6785
$simulatedChangeSet,
68-
AuditLogOtlpStrategy::EVENT_ENTITY_UPDATE
86+
AuditLogOtlpStrategy::EVENT_ENTITY_UPDATE,
87+
$ctx
6988
);
7089

71-
$span->setStatus(StatusCode::STATUS_OK, 'Summit audit completed');
90+
$span->setStatus(StatusCode::STATUS_OK, self::EVENT_COMPLETED);
7291
$this->assertTrue(true);
7392

7493
} catch (\Exception $e) {
@@ -86,20 +105,22 @@ public function testAuditSummitEventChangeWithOtlp(): void
86105
$this->skipIfOpenTelemetryDisabled();
87106

88107
$tracer = $this->app->make(TracerInterface::class);
89-
$span = $tracer->spanBuilder('test.audit.summit_event_change')->startSpan();
108+
$span = $tracer->spanBuilder(self::SPAN_SUMMIT_EVENT_CHANGE)->startSpan();
90109
$spanScope = $span->activate();
91110

92111
try {
93112
$summitEvent = self::$summit->getEvents()[0];
94113
$simulatedChangeSet = $this->createSummitEventChangeSet($summitEvent);
114+
$ctx = $this->createAuditContext();
95115

96116
$this->auditStrategy->audit(
97117
$summitEvent,
98118
$simulatedChangeSet,
99-
AuditLogOtlpStrategy::EVENT_ENTITY_UPDATE
119+
AuditLogOtlpStrategy::EVENT_ENTITY_UPDATE,
120+
$ctx
100121
);
101122

102-
$span->setStatus(StatusCode::STATUS_OK, 'SummitEvent audit completed');
123+
$span->setStatus(StatusCode::STATUS_OK, self::EVENT_CHANGE_COMPLETED);
103124
$this->assertTrue(true);
104125

105126
} catch (\Exception $e) {
@@ -117,11 +138,13 @@ public function testAuditStrategyWithoutActiveSpan(): void
117138
$this->skipIfOpenTelemetryDisabled();
118139

119140
$simulatedChangeSet = ['name' => ['Old Name', 'New Name']];
141+
$ctx = $this->createAuditContext();
120142

121143
$this->auditStrategy->audit(
122144
self::$summit,
123145
$simulatedChangeSet,
124-
AuditLogOtlpStrategy::EVENT_ENTITY_UPDATE
146+
AuditLogOtlpStrategy::EVENT_ENTITY_UPDATE,
147+
$ctx
125148
);
126149

127150
$this->assertTrue(true);
@@ -132,17 +155,19 @@ public function testAuditStrategyWithEmptyChangeSet(): void
132155
$this->skipIfOpenTelemetryDisabled();
133156

134157
$tracer = $this->app->make(TracerInterface::class);
135-
$span = $tracer->spanBuilder('test.audit.empty_changeset')->startSpan();
158+
$span = $tracer->spanBuilder(self::SPAN_EMPTY_CHANGESET)->startSpan();
136159
$spanScope = $span->activate();
137160

138161
try {
162+
$ctx = $this->createAuditContext();
139163
$this->auditStrategy->audit(
140164
self::$summit,
141165
[],
142-
AuditLogOtlpStrategy::EVENT_ENTITY_UPDATE
166+
AuditLogOtlpStrategy::EVENT_ENTITY_UPDATE,
167+
$ctx
143168
);
144169

145-
$span->setStatus(StatusCode::STATUS_OK, 'Empty changeset audit completed');
170+
$span->setStatus(StatusCode::STATUS_OK, self::EVENT_EMPTY_COMPLETED);
146171
$this->assertTrue(true);
147172

148173
} catch (\Exception $e) {
@@ -165,15 +190,15 @@ private function skipIfOpenTelemetryDisabled(): void
165190
private function createSummitChangeSet(): array
166191
{
167192
return [
168-
'name' => [self::$summit->getName(), self::$summit->getName() . ' [TEST]'],
193+
'name' => [self::$summit->getName(), self::$summit->getName() . self::SUFFIX_TEST],
169194
'description' => ['Original', 'Updated for test']
170195
];
171196
}
172197

173198
private function createSummitEventChangeSet(object $summitEvent): array
174199
{
175200
return [
176-
'title' => [$summitEvent->getTitle(), $summitEvent->getTitle() . ' [TEST]']
201+
'title' => [$summitEvent->getTitle(), $summitEvent->getTitle() . self::SUFFIX_TEST]
177202
];
178203
}
179204

@@ -182,27 +207,33 @@ private function isOpenTelemetryEnabled(): bool
182207
return getenv('OTEL_SERVICE_ENABLED') === 'true';
183208
}
184209

210+
private function createAuditContext(): AuditContext
211+
{
212+
return new AuditContext(
213+
userId: self::$member->getId(),
214+
userEmail: self::$member->getEmail(),
215+
userFirstName: self::$member->getFirstName(),
216+
userLastName: self::$member->getLastName(),
217+
uiApp: self::TEST_APP,
218+
uiFlow: self::TEST_FLOW,
219+
route: self::TEST_ROUTE,
220+
rawRoute: self::TEST_ROUTE,
221+
httpMethod: self::TEST_HTTP_METHOD,
222+
clientIp: self::TEST_CLIENT_IP,
223+
userAgent: self::TEST_USER_AGENT,
224+
);
225+
}
226+
185227

186228
public function testAuditSummitEntityPopulatesSummitIdCorrectly(): void
187229
{
188230
$this->skipIfOpenTelemetryDisabled();
189231

190232
Queue::fake();
191233

192-
$ctx = new AuditContext();
193-
$ctx->userId = self::$member->getId();
194-
$ctx->userEmail = self::$member->getEmail();
195-
$ctx->userFirstName = self::$member->getFirstName();
196-
$ctx->userLastName = self::$member->getLastName();
197-
$ctx->uiApp = 'test-app';
198-
$ctx->uiFlow = 'test-flow';
199-
$ctx->route = 'api.summits.update';
200-
$ctx->httpMethod = 'PUT';
201-
$ctx->clientIp = '127.0.0.1';
202-
$ctx->userAgent = 'Test-Agent/1.0';
203-
234+
$ctx = $this->createAuditContext();
204235
$simulatedChangeSet = [
205-
'name' => [self::$summit->getName(), self::$summit->getName() . ' [UPDATED]']
236+
'name' => [self::$summit->getName(), self::$summit->getName() . self::SUFFIX_UPDATED]
206237
];
207238

208239
$this->auditStrategy->audit(
@@ -215,9 +246,7 @@ public function testAuditSummitEntityPopulatesSummitIdCorrectly(): void
215246
Queue::assertPushed(EmitAuditLogJob::class, function ($job) {
216247
$this->assertArrayHasKey('audit.summit_id', $job->auditData);
217248
$this->assertEquals((string)self::$summit->getId(), $job->auditData['audit.summit_id']);
218-
219249
$this->assertEquals('Summit', $job->auditData['audit.entity']);
220-
221250
return true;
222251
});
223252
}

tests/OpenTelemetry/Formatters/SummitAttendeeBadgeAuditLogFormatterTest.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ class SummitAttendeeBadgeAuditLogFormatterTest extends TestCase
1414
private const TICKET_ID = 789;
1515
private const TICKET_NUMBER = 'TICKET-2024-001';
1616
private const SUMMIT_NAME = 'OpenStack Summit 2024';
17+
private const OWNER_FIRST_NAME = 'John';
18+
private const OWNER_LAST_NAME = 'Doe';
1719

1820
private mixed $mockSubject;
1921

@@ -37,10 +39,15 @@ private function createMockSubject(): mixed
3739
$mockOrder = Mockery::mock('models\summit\SummitOrder');
3840
$mockOrder->shouldReceive('getSummit')->andReturn($mockSummit);
3941

42+
$mockOwner = Mockery::mock('models\summit\SummitAttendee');
43+
$mockOwner->shouldReceive('getFirstName')->andReturn(self::OWNER_FIRST_NAME);
44+
$mockOwner->shouldReceive('getSurname')->andReturn(self::OWNER_LAST_NAME);
45+
4046
$mockTicket = Mockery::mock('models\summit\SummitAttendeeTicket');
4147
$mockTicket->shouldReceive('getId')->andReturn(self::TICKET_ID);
4248
$mockTicket->shouldReceive('getNumber')->andReturn(self::TICKET_NUMBER);
4349
$mockTicket->shouldReceive('getOrder')->andReturn($mockOrder);
50+
$mockTicket->shouldReceive('getOwner')->andReturn($mockOwner);
4451

4552
$mock = Mockery::mock('models\summit\SummitAttendeeBadge');
4653
$mock->shouldReceive('getId')->andReturn(self::BADGE_ID);
@@ -58,8 +65,8 @@ public function testSubjectCreationAuditMessage(): void
5865

5966
$this->assertNotNull($result);
6067
$this->assertStringContainsString('created', $result);
61-
$this->assertStringContainsString(self::TICKET_NUMBER, $result);
62-
$this->assertStringContainsString((string)self::TICKET_ID, $result);
68+
$this->assertStringContainsString(self::OWNER_FIRST_NAME . ' ' . self::OWNER_LAST_NAME, $result);
69+
$this->assertStringContainsString((string)self::BADGE_ID, $result);
6370
}
6471

6572
public function testSubjectUpdateAuditMessage(): void

0 commit comments

Comments
 (0)