From 3bda3152d0a9f433fb02b252fdae104725309297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Witold=20Wis=CC=81niewski?= Date: Tue, 14 Jul 2026 08:27:54 +0200 Subject: [PATCH] Added event after counts_to_grades changed --- src/Events/ProjectGradabilityChangedEvent.php | 34 +++++++ src/Models/Project.php | 12 +++ .../ProjectGradabilityChangedEventTest.php | 96 +++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 src/Events/ProjectGradabilityChangedEvent.php create mode 100644 tests/Models/ProjectGradabilityChangedEventTest.php diff --git a/src/Events/ProjectGradabilityChangedEvent.php b/src/Events/ProjectGradabilityChangedEvent.php new file mode 100644 index 0000000..4a35a37 --- /dev/null +++ b/src/Events/ProjectGradabilityChangedEvent.php @@ -0,0 +1,34 @@ +project = $project; + } + + public function getProject(): Project + { + return $this->project; + } + + public function countsToGrade(): bool + { + return (bool) $this->project->counts_to_grade; + } +} diff --git a/src/Models/Project.php b/src/Models/Project.php index 9245ee4..07cb3e9 100644 --- a/src/Models/Project.php +++ b/src/Models/Project.php @@ -3,6 +3,7 @@ namespace EscolaLms\TopicTypeProject\Models; use EscolaLms\TopicTypeProject\Database\Factories\ProjectFactory; +use EscolaLms\TopicTypeProject\Events\ProjectGradabilityChangedEvent; use EscolaLms\TopicTypes\Facades\Markdown; use EscolaLms\TopicTypes\Models\TopicContent\AbstractTopicContent; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -104,4 +105,15 @@ public function getMorphClass() { return self::class; } + + protected static function booted(): void + { + parent::booted(); + + static::updated(function (Project $project) { + if ($project->wasChanged('counts_to_grade')) { + event(new ProjectGradabilityChangedEvent($project)); + } + }); + } } diff --git a/tests/Models/ProjectGradabilityChangedEventTest.php b/tests/Models/ProjectGradabilityChangedEventTest.php new file mode 100644 index 0000000..b120022 --- /dev/null +++ b/tests/Models/ProjectGradabilityChangedEventTest.php @@ -0,0 +1,96 @@ +create(['counts_to_grade' => false]); + + Event::fake([ProjectGradabilityChangedEvent::class]); + + $project->update(['counts_to_grade' => true]); + + Event::assertDispatched( + ProjectGradabilityChangedEvent::class, + fn (ProjectGradabilityChangedEvent $event) => $event->getProject()->is($project) && $event->countsToGrade() === true + ); + } + + public function testEmitsWhenCountsToGradeDisabled(): void + { + $project = Project::factory()->create(['counts_to_grade' => true]); + + Event::fake([ProjectGradabilityChangedEvent::class]); + + $project->update(['counts_to_grade' => false]); + + Event::assertDispatched( + ProjectGradabilityChangedEvent::class, + fn (ProjectGradabilityChangedEvent $event) => $event->getProject()->is($project) && $event->countsToGrade() === false + ); + } + + public function testDoesNotEmitWhenCountsToGradeIsUnchanged(): void + { + $project = Project::factory()->create(['counts_to_grade' => true]); + + Event::fake([ProjectGradabilityChangedEvent::class]); + + $project->update(['value' => 'a different value', 'counts_to_grade' => true]); + + Event::assertNotDispatched(ProjectGradabilityChangedEvent::class); + } + + public function testDoesNotEmitOnCreate(): void + { + Event::fake([ProjectGradabilityChangedEvent::class]); + + Project::factory()->create(['counts_to_grade' => true]); + + Event::assertNotDispatched(ProjectGradabilityChangedEvent::class); + } + + public function testEmitsViaGenericTopicUpdateEndpoint(): void + { + $this->seed(CoursesPermissionSeeder::class); + $project = Project::factory()->create(['counts_to_grade' => false]); + $topic = Topic::factory() + ->for(Lesson::factory()->for(Course::factory())) + ->create([ + 'topicable_type' => Project::class, + 'topicable_id' => $project->getKey(), + ]); + + Event::fake([ProjectGradabilityChangedEvent::class]); + + $this + ->actingAs($this->makeAdmin(), 'api') + ->postJson('/api/admin/topics/' . $topic->getKey(), [ + 'title' => $topic->title, + 'lesson_id' => $topic->lesson_id, + 'topicable_type' => Project::class, + 'value' => $project->value, + 'counts_to_grade' => true, + ]) + ->assertOk(); + + Event::assertDispatched( + ProjectGradabilityChangedEvent::class, + fn (ProjectGradabilityChangedEvent $event) => $event->getProject()->is($project) && $event->countsToGrade() === true + ); + } +}