From 793b8277f01af11a2b5e6bf2df4a2b671e6b4e98 Mon Sep 17 00:00:00 2001 From: Jose Andres Tejerina Date: Wed, 25 Feb 2026 16:30:35 -0300 Subject: [PATCH] feat: add missing formatters in config and UT --- .../RSVPInvitationAuditLogFormatter.php | 4 +- config/audit_log.php | 32 +++++ .../CompanyAuditLogFormatterTest.php | 97 +++++++++++++++ ...sentationCategoryAuditLogFormatterTest.php | 104 ++++++++++++++++ ...tionCategoryGroupAuditLogFormatterTest.php | 99 +++++++++++++++ .../PresentationTypeAuditLogFormatterTest.php | 98 +++++++++++++++ .../Formatters/RSVPAuditLogFormatterTest.php | 115 ++++++++++++++++++ .../RSVPInvitationAuditLogFormatterTest.php | 111 +++++++++++++++++ ...PQuestionTemplateAuditLogFormatterTest.php | 105 ++++++++++++++++ .../RSVPTemplateAuditLogFormatterTest.php | 112 +++++++++++++++++ 10 files changed, 875 insertions(+), 2 deletions(-) create mode 100644 tests/OpenTelemetry/Formatters/CompanyAuditLogFormatterTest.php create mode 100644 tests/OpenTelemetry/Formatters/PresentationCategoryAuditLogFormatterTest.php create mode 100644 tests/OpenTelemetry/Formatters/PresentationCategoryGroupAuditLogFormatterTest.php create mode 100644 tests/OpenTelemetry/Formatters/PresentationTypeAuditLogFormatterTest.php create mode 100644 tests/OpenTelemetry/Formatters/RSVPAuditLogFormatterTest.php create mode 100644 tests/OpenTelemetry/Formatters/RSVPInvitationAuditLogFormatterTest.php create mode 100644 tests/OpenTelemetry/Formatters/RSVPQuestionTemplateAuditLogFormatterTest.php create mode 100644 tests/OpenTelemetry/Formatters/RSVPTemplateAuditLogFormatterTest.php diff --git a/app/Audit/ConcreteFormatters/RSVPInvitationAuditLogFormatter.php b/app/Audit/ConcreteFormatters/RSVPInvitationAuditLogFormatter.php index 345080bba..646658f9a 100644 --- a/app/Audit/ConcreteFormatters/RSVPInvitationAuditLogFormatter.php +++ b/app/Audit/ConcreteFormatters/RSVPInvitationAuditLogFormatter.php @@ -29,8 +29,8 @@ public function format($subject, array $change_set): ?string } try { - $attendeeEmail = $subject->getAttendee()?->getEmail() ?? 'Unknown'; - $attendeeId = $subject->getAttendee()?->getId() ?? 'unknown'; + $attendeeEmail = $subject->getInvitee()?->getEmail() ?? 'Unknown'; + $attendeeId = $subject->getInvitee()?->getId() ?? 'unknown'; $eventTitle = $subject->getEvent()?->getTitle() ?? 'Unknown Event'; $eventId = $subject->getEvent()?->getId() ?? 'unknown'; $id = $subject->getId() ?? 'unknown'; diff --git a/config/audit_log.php b/config/audit_log.php index 87fcae5d3..3df30d59f 100644 --- a/config/audit_log.php +++ b/config/audit_log.php @@ -256,5 +256,37 @@ 'enabled' => true, 'strategy' => \App\Audit\ConcreteFormatters\ExtraQuestionTypeValueAuditLogFormatter::class, ], + \models\main\Company::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\CompanyAuditLogFormatter::class, + ], + \models\summit\PresentationCategory::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\PresentationCategoryAuditLogFormatter::class, + ], + \models\summit\PresentationCategoryGroup::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\PresentationCategoryGroupAuditLogFormatter::class, + ], + \models\summit\PresentationType::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\PresentationTypeAuditLogFormatter::class, + ], + \models\summit\RSVP::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\RSVPAuditLogFormatter::class, + ], + \App\Models\Foundation\Summit\Events\RSVP\RSVPInvitation::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\RSVPInvitationAuditLogFormatter::class, + ], + \App\Models\Foundation\Summit\Events\RSVP\RSVPQuestionTemplate::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\RSVPQuestionTemplateAuditLogFormatter::class, + ], + \App\Models\Foundation\Summit\Events\RSVP\RSVPTemplate::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\RSVPTemplateAuditLogFormatter::class, + ], ] ]; diff --git a/tests/OpenTelemetry/Formatters/CompanyAuditLogFormatterTest.php b/tests/OpenTelemetry/Formatters/CompanyAuditLogFormatterTest.php new file mode 100644 index 000000000..3870bd5b3 --- /dev/null +++ b/tests/OpenTelemetry/Formatters/CompanyAuditLogFormatterTest.php @@ -0,0 +1,97 @@ +mockSubject = $this->createMockSubject(); + } + + protected function tearDown(): void + { + Mockery::close(); + parent::tearDown(); + } + + private function createMockSubject(): mixed + { + $mock = Mockery::mock('models\main\Company'); + + // Configure return values + $mock->shouldReceive('getId')->andReturn(1); + $mock->shouldReceive('getName')->andReturn('TechCorp Inc'); + $mock->shouldReceive('getCity')->andReturn('San Francisco'); + $mock->shouldReceive('getCountry')->andReturn('USA'); + $mock->shouldReceive('isDisplayOnSite')->andReturn(true); + + return $mock; + } + + public function testSubjectCreationAuditMessage(): void + { + $formatter = new CompanyAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('created', $result); + $this->assertStringContainsString('TechCorp Inc', $result); + $this->assertStringContainsString('San Francisco', $result); + } + + public function testSubjectUpdateAuditMessage(): void + { + $formatter = new CompanyAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE); + $formatter->setContext(AuditContextBuilder::default()->build()); + $changeSet = [ + 'city' => ['San Francisco', 'Los Angeles'], + 'country' => ['USA', 'USA'] + ]; + + $result = $formatter->format($this->mockSubject, $changeSet); + + $this->assertNotNull($result); + $this->assertStringContainsString('updated', $result); + } + + public function testSubjectDeletionAuditMessage(): void + { + $formatter = new CompanyAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_DELETION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('deleted', $result); + } + + public function testFormatterReturnsNullForInvalidSubject(): void + { + $formatter = new CompanyAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $result = $formatter->format(new \stdClass(), []); + $this->assertNull($result); + } +} diff --git a/tests/OpenTelemetry/Formatters/PresentationCategoryAuditLogFormatterTest.php b/tests/OpenTelemetry/Formatters/PresentationCategoryAuditLogFormatterTest.php new file mode 100644 index 000000000..fd8645452 --- /dev/null +++ b/tests/OpenTelemetry/Formatters/PresentationCategoryAuditLogFormatterTest.php @@ -0,0 +1,104 @@ +mockSummit = $this->createMockSummit(); + $this->mockSubject = $this->createMockSubject(); + } + + protected function tearDown(): void + { + Mockery::close(); + parent::tearDown(); + } + + private function createMockSummit(): mixed + { + $mock = Mockery::mock('models\summit\Summit'); + $mock->shouldReceive('getName')->andReturn('OpenStack Summit 2024'); + return $mock; + } + + private function createMockSubject(): mixed + { + $mock = Mockery::mock('models\summit\PresentationCategory'); + + // Configure return values + $mock->shouldReceive('getId')->andReturn(10); + $mock->shouldReceive('getTitle')->andReturn('Cloud Architecture'); + $mock->shouldReceive('getCode')->andReturn('CLOUD-ARCH'); + $mock->shouldReceive('getSummit')->andReturn($this->mockSummit); + + return $mock; + } + + public function testSubjectCreationAuditMessage(): void + { + $formatter = new PresentationCategoryAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('created', $result); + $this->assertStringContainsString('Cloud Architecture', $result); + $this->assertStringContainsString('CLOUD-ARCH', $result); + } + + public function testSubjectUpdateAuditMessage(): void + { + $formatter = new PresentationCategoryAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE); + $formatter->setContext(AuditContextBuilder::default()->build()); + $changeSet = [ + 'title' => ['Cloud Architecture', 'Infrastructure & Architecture'] + ]; + + $result = $formatter->format($this->mockSubject, $changeSet); + + $this->assertNotNull($result); + $this->assertStringContainsString('updated', $result); + } + + public function testSubjectDeletionAuditMessage(): void + { + $formatter = new PresentationCategoryAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_DELETION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('deleted', $result); + } + + public function testFormatterReturnsNullForInvalidSubject(): void + { + $formatter = new PresentationCategoryAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $result = $formatter->format(new \stdClass(), []); + $this->assertNull($result); + } +} diff --git a/tests/OpenTelemetry/Formatters/PresentationCategoryGroupAuditLogFormatterTest.php b/tests/OpenTelemetry/Formatters/PresentationCategoryGroupAuditLogFormatterTest.php new file mode 100644 index 000000000..15ec41c18 --- /dev/null +++ b/tests/OpenTelemetry/Formatters/PresentationCategoryGroupAuditLogFormatterTest.php @@ -0,0 +1,99 @@ +mockSubject = $this->createMockSubject(); + } + + protected function tearDown(): void + { + Mockery::close(); + parent::tearDown(); + } + + private function createMockSubject(): mixed + { + $mockSummit = Mockery::mock('models\summit\Summit'); + $mockSummit->shouldReceive('getName')->andReturn('OpenStack Summit'); + + $mock = Mockery::mock('models\summit\PresentationCategoryGroup'); + + // Configure return values + $mock->shouldReceive('getId')->andReturn(5); + $mock->shouldReceive('getName')->andReturn('Technical Tracks'); + $mock->shouldReceive('getDescription')->andReturn('Group for technical presentations'); + $mock->shouldReceive('getSummit')->andReturn($mockSummit); + $mock->shouldReceive('getColor')->andReturn('#FF5733'); + $mock->shouldReceive('getMaxAttendeeVotes')->andReturn(3); + + return $mock; + } + + public function testSubjectCreationAuditMessage(): void + { + $formatter = new PresentationCategoryGroupAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('created', $result); + $this->assertStringContainsString('Technical Tracks', $result); + } + + public function testSubjectUpdateAuditMessage(): void + { + $formatter = new PresentationCategoryGroupAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE); + $formatter->setContext(AuditContextBuilder::default()->build()); + $changeSet = [ + 'name' => ['Technical Tracks', 'Core Technical Topics'] + ]; + + $result = $formatter->format($this->mockSubject, $changeSet); + + $this->assertNotNull($result); + $this->assertStringContainsString('updated', $result); + } + + public function testSubjectDeletionAuditMessage(): void + { + $formatter = new PresentationCategoryGroupAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_DELETION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('deleted', $result); + } + + public function testFormatterReturnsNullForInvalidSubject(): void + { + $formatter = new PresentationCategoryGroupAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $result = $formatter->format(new \stdClass(), []); + $this->assertNull($result); + } +} diff --git a/tests/OpenTelemetry/Formatters/PresentationTypeAuditLogFormatterTest.php b/tests/OpenTelemetry/Formatters/PresentationTypeAuditLogFormatterTest.php new file mode 100644 index 000000000..00822dbaa --- /dev/null +++ b/tests/OpenTelemetry/Formatters/PresentationTypeAuditLogFormatterTest.php @@ -0,0 +1,98 @@ +mockSubject = $this->createMockSubject(); + } + + protected function tearDown(): void + { + Mockery::close(); + parent::tearDown(); + } + + private function createMockSubject(): mixed + { + $mockSummit = Mockery::mock('models\summit\Summit'); + $mockSummit->shouldReceive('getName')->andReturn('OpenStack Summit 2024'); + + $mock = Mockery::mock('models\summit\PresentationType'); + + // Configure return values + $mock->shouldReceive('getId')->andReturn(2); + $mock->shouldReceive('getType')->andReturn('Keynote'); + $mock->shouldReceive('getSummit')->andReturn($mockSummit); + $mock->shouldReceive('getMaxSpeakers')->andReturn(1); + $mock->shouldReceive('isUseSpeakers')->andReturn(true); + + return $mock; + } + + public function testSubjectCreationAuditMessage(): void + { + $formatter = new PresentationTypeAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('created', $result); + $this->assertStringContainsString('Keynote', $result); + } + + public function testSubjectUpdateAuditMessage(): void + { + $formatter = new PresentationTypeAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE); + $formatter->setContext(AuditContextBuilder::default()->build()); + $changeSet = [ + 'name' => ['Keynote', 'Opening Keynote'] + ]; + + $result = $formatter->format($this->mockSubject, $changeSet); + + $this->assertNotNull($result); + $this->assertStringContainsString('updated', $result); + } + + public function testSubjectDeletionAuditMessage(): void + { + $formatter = new PresentationTypeAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_DELETION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('deleted', $result); + } + + public function testFormatterReturnsNullForInvalidSubject(): void + { + $formatter = new PresentationTypeAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $result = $formatter->format(new \stdClass(), []); + $this->assertNull($result); + } +} diff --git a/tests/OpenTelemetry/Formatters/RSVPAuditLogFormatterTest.php b/tests/OpenTelemetry/Formatters/RSVPAuditLogFormatterTest.php new file mode 100644 index 000000000..9816cfef3 --- /dev/null +++ b/tests/OpenTelemetry/Formatters/RSVPAuditLogFormatterTest.php @@ -0,0 +1,115 @@ +mockEvent = $this->createMockEvent(); + $this->mockUser = $this->createMockUser(); + $this->mockSubject = $this->createMockSubject(); + } + + protected function tearDown(): void + { + Mockery::close(); + parent::tearDown(); + } + + private function createMockEvent(): mixed + { + $mock = Mockery::mock('models\summit\SummitEvent'); + $mock->shouldReceive('getTitle')->andReturn('Welcome Reception'); + $mock->shouldReceive('getId')->andReturn(100); + return $mock; + } + + private function createMockUser(): mixed + { + $mock = Mockery::mock('models\main\Member'); + $mock->shouldReceive('getEmail')->andReturn('john@example.com'); + $mock->shouldReceive('getId')->andReturn(50); + return $mock; + } + + private function createMockSubject(): mixed + { + $mock = Mockery::mock('models\summit\RSVP'); + + // Configure return values + $mock->shouldReceive('getId')->andReturn(15); + $mock->shouldReceive('getEvent')->andReturn($this->mockEvent); + $mock->shouldReceive('getOwner')->andReturn($this->mockUser); + $mock->shouldReceive('getStatus')->andReturn('confirmed'); + $mock->shouldReceive('getSeatType')->andReturn('standard'); + + return $mock; + } + + public function testSubjectCreationAuditMessage(): void + { + $formatter = new RSVPAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('created', $result); + $this->assertStringContainsString('Welcome Reception', $result); + } + + public function testSubjectUpdateAuditMessage(): void + { + $formatter = new RSVPAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE); + $formatter->setContext(AuditContextBuilder::default()->build()); + $changeSet = [ + 'is_attending' => [true, false] + ]; + + $result = $formatter->format($this->mockSubject, $changeSet); + + $this->assertNotNull($result); + $this->assertStringContainsString('updated', $result); + } + + public function testSubjectDeletionAuditMessage(): void + { + $formatter = new RSVPAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_DELETION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('deleted', $result); + } + + public function testFormatterReturnsNullForInvalidSubject(): void + { + $formatter = new RSVPAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $result = $formatter->format(new \stdClass(), []); + $this->assertNull($result); + } +} diff --git a/tests/OpenTelemetry/Formatters/RSVPInvitationAuditLogFormatterTest.php b/tests/OpenTelemetry/Formatters/RSVPInvitationAuditLogFormatterTest.php new file mode 100644 index 000000000..8b5ae58e5 --- /dev/null +++ b/tests/OpenTelemetry/Formatters/RSVPInvitationAuditLogFormatterTest.php @@ -0,0 +1,111 @@ +mockSubject = $this->createMockSubject(); + } + + protected function tearDown(): void + { + Mockery::close(); + parent::tearDown(); + } + + private function createMockEvent(): mixed + { + $mock = Mockery::mock('models\summit\SummitEvent'); + $mock->shouldReceive('getTitle')->andReturn('Wedding Event'); + $mock->shouldReceive('getId')->andReturn(200); + return $mock; + } + + private function createMockAttendee(): mixed + { + $mock = Mockery::mock('models\summit\SummitAttendee'); + $mock->shouldReceive('getEmail')->andReturn('attendee@example.com'); + $mock->shouldReceive('getId')->andReturn(75); + return $mock; + } + + private function createMockSubject(): mixed + { + $mock = Mockery::mock('App\Models\Foundation\Summit\Events\RSVP\RSVPInvitation'); + + // Configure return values + $mock->shouldReceive('getId')->andReturn(20); + $mock->shouldReceive('getInvitee')->andReturn($this->createMockAttendee()); + $mock->shouldReceive('getEvent')->andReturn($this->createMockEvent()); + + return $mock; + } + + public function testSubjectCreationAuditMessage(): void + { + $formatter = new RSVPInvitationAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('created', $result); + $this->assertStringContainsString('attendee@example.com', $result); + $this->assertStringContainsString('Wedding Event', $result); + } + + public function testSubjectUpdateAuditMessage(): void + { + $formatter = new RSVPInvitationAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE); + $formatter->setContext(AuditContextBuilder::default()->build()); + $changeSet = [ + 'confirmed' => [false, true] + ]; + + $result = $formatter->format($this->mockSubject, $changeSet); + + $this->assertNotNull($result); + $this->assertStringContainsString('updated', $result); + $this->assertStringContainsString('attendee@example.com', $result); + } + + public function testSubjectDeletionAuditMessage(): void + { + $formatter = new RSVPInvitationAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_DELETION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('deleted', $result); + } + + public function testFormatterReturnsNullForInvalidSubject(): void + { + $formatter = new RSVPInvitationAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $result = $formatter->format(new \stdClass(), []); + $this->assertNull($result); + } +} diff --git a/tests/OpenTelemetry/Formatters/RSVPQuestionTemplateAuditLogFormatterTest.php b/tests/OpenTelemetry/Formatters/RSVPQuestionTemplateAuditLogFormatterTest.php new file mode 100644 index 000000000..cc006898d --- /dev/null +++ b/tests/OpenTelemetry/Formatters/RSVPQuestionTemplateAuditLogFormatterTest.php @@ -0,0 +1,105 @@ +mockSubject = $this->createMockSubject(); + } + + protected function tearDown(): void + { + Mockery::close(); + parent::tearDown(); + } + + private function createMockTemplate(): mixed + { + $mock = Mockery::mock('App\Models\Foundation\Summit\Events\RSVP\RSVPTemplate'); + $mock->shouldReceive('getId')->andReturn(999); + return $mock; + } + + private function createMockSubject(): mixed + { + $mock = Mockery::mock('App\Models\Foundation\Summit\Events\RSVP\RSVPQuestionTemplate'); + + // Configure return values + $mock->shouldReceive('getId')->andReturn(25); + $mock->shouldReceive('getName')->andReturn('attendance_question'); + $mock->shouldReceive('getLabel')->andReturn('Will you attend?'); + $mock->shouldReceive('getTemplate')->andReturn($this->createMockTemplate()); + $mock->shouldReceive('isMandatory')->andReturn(true); + $mock->shouldReceive('getOrder')->andReturn(1); + + return $mock; + } + + public function testSubjectCreationAuditMessage(): void + { + $formatter = new RSVPQuestionTemplateAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('created', $result); + $this->assertStringContainsString('Will you attend?', $result); + $this->assertStringContainsString('required', $result); + } + + public function testSubjectUpdateAuditMessage(): void + { + $formatter = new RSVPQuestionTemplateAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE); + $formatter->setContext(AuditContextBuilder::default()->build()); + $changeSet = [ + 'label' => ['Will you attend?', 'Can you attend?'] + ]; + + $result = $formatter->format($this->mockSubject, $changeSet); + + $this->assertNotNull($result); + $this->assertStringContainsString('updated', $result); + $this->assertStringContainsString('Will you attend?', $result); + } + + public function testSubjectDeletionAuditMessage(): void + { + $formatter = new RSVPQuestionTemplateAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_DELETION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('deleted', $result); + } + + public function testFormatterReturnsNullForInvalidSubject(): void + { + $formatter = new RSVPQuestionTemplateAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $result = $formatter->format(new \stdClass(), []); + $this->assertNull($result); + } +} diff --git a/tests/OpenTelemetry/Formatters/RSVPTemplateAuditLogFormatterTest.php b/tests/OpenTelemetry/Formatters/RSVPTemplateAuditLogFormatterTest.php new file mode 100644 index 000000000..fb6140106 --- /dev/null +++ b/tests/OpenTelemetry/Formatters/RSVPTemplateAuditLogFormatterTest.php @@ -0,0 +1,112 @@ +mockSummit = $this->createMockSummit(); + $this->mockSubject = $this->createMockSubject(); + } + + protected function tearDown(): void + { + Mockery::close(); + parent::tearDown(); + } + + private function createMockSummit(): mixed + { + $mock = Mockery::mock('models\summit\Summit'); + $mock->shouldReceive('getName')->andReturn('Summit 2024'); + return $mock; + } + + private function createMockSubject(): mixed + { + $mockQuestions = Mockery::mock('Doctrine\Common\Collections\ArrayCollection'); + $mockQuestions->shouldReceive('count')->andReturn(3); + + $mockCreatedBy = Mockery::mock('models\main\Member'); + $mockCreatedBy->shouldReceive('getFirstName')->andReturn('Admin'); + $mockCreatedBy->shouldReceive('getLastName')->andReturn('User'); + + $mock = Mockery::mock('App\Models\Foundation\Summit\Events\RSVP\RSVPTemplate'); + + // Configure return values + $mock->shouldReceive('getId')->andReturn(30); + $mock->shouldReceive('getTitle')->andReturn('Gala Dinner RSVP'); + $mock->shouldReceive('getSummit')->andReturn($this->mockSummit); + $mock->shouldReceive('isEnabled')->andReturn(true); + $mock->shouldReceive('getCreatedBy')->andReturn($mockCreatedBy); + $mock->shouldReceive('getQuestions')->andReturn($mockQuestions); + + return $mock; + } + + public function testSubjectCreationAuditMessage(): void + { + $formatter = new RSVPTemplateAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('created', $result); + $this->assertStringContainsString('Gala Dinner RSVP', $result); + } + + public function testSubjectUpdateAuditMessage(): void + { + $formatter = new RSVPTemplateAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_UPDATE); + $formatter->setContext(AuditContextBuilder::default()->build()); + $changeSet = [ + 'title' => ['Gala Dinner RSVP', 'Cocktail Dinner RSVP'] + ]; + + $result = $formatter->format($this->mockSubject, $changeSet); + + $this->assertNotNull($result); + $this->assertStringContainsString('updated', $result); + } + + public function testSubjectDeletionAuditMessage(): void + { + $formatter = new RSVPTemplateAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_DELETION); + $formatter->setContext(AuditContextBuilder::default()->build()); + $result = $formatter->format($this->mockSubject, []); + + $this->assertNotNull($result); + $this->assertStringContainsString('deleted', $result); + } + + public function testFormatterReturnsNullForInvalidSubject(): void + { + $formatter = new RSVPTemplateAuditLogFormatter(IAuditStrategy::EVENT_ENTITY_CREATION); + $result = $formatter->format(new \stdClass(), []); + $this->assertNull($result); + } +}