diff --git a/app/Models/BonusScore.php b/app/Models/BonusScore.php index 0423629..0a58cd5 100644 --- a/app/Models/BonusScore.php +++ b/app/Models/BonusScore.php @@ -2,11 +2,14 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; class BonusScore extends Model { + use hasFactory; + protected $guarded = []; public function entry(): BelongsTo diff --git a/app/Observers/BonusScoreObserver.php b/app/Observers/BonusScoreObserver.php index 79878fd..10cc620 100644 --- a/app/Observers/BonusScoreObserver.php +++ b/app/Observers/BonusScoreObserver.php @@ -33,20 +33,4 @@ class BonusScoreObserver $calculator = app(TotalEntryScores::class); $calculator($bonusScore->entry, true); } - - /** - * Handle the ScoreSheet "restored" event. - */ - public function restored(BonusScore $bonusScore): void - { - // - } - - /** - * Handle the ScoreSheet "force deleted" event. - */ - public function forceDeleted(BonusScore $bonusScore): void - { - // - } } diff --git a/database/factories/BonusScoreFactory.php b/database/factories/BonusScoreFactory.php new file mode 100644 index 0000000..c984fb6 --- /dev/null +++ b/database/factories/BonusScoreFactory.php @@ -0,0 +1,36 @@ + $this->faker->randomNumber(), + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now(), + + 'entry_id' => Entry::factory(), + 'user_id' => User::factory(), + 'originally_scored_entry' => Entry::factory(), + ]; + } + + public function forEntry(Entry $entry): self + { + return $this->state(function (array $attributes) use ($entry) { + return [ + 'entry_id' => $entry->id, + ]; + }); + } +} diff --git a/tests/Feature/app/Observers/BonusScoreObserverTest.php b/tests/Feature/app/Observers/BonusScoreObserverTest.php new file mode 100644 index 0000000..6d9a1e9 --- /dev/null +++ b/tests/Feature/app/Observers/BonusScoreObserverTest.php @@ -0,0 +1,60 @@ +mock = Mockery::mock(TotalEntryScores::class); + app()->instance(TotalEntryScores::class, $this->mock); +}); + +it('recalculates total scores when bonus score is created', function () { + $entry = Entry::factory()->create(); + + $this->mock->shouldReceive('__invoke') + ->once() + ->withAnyArgs() + ->andReturn(null); + + BonusScore::factory() + ->forEntry($entry) + ->create(); + +}); + +it('recalculates total scores when bonus score is updated', function () { + $this->mock->shouldReceive('__invoke') + ->once() + ->withAnyArgs() + ->andReturn(null); + $bonusScore = BonusScore::factory()->create(); + + $this->mock->shouldReceive('__invoke') + ->once() + ->withAnyArgs() + ->andReturn(null); + + $bonusScore->update(['score' => 95]); +}); + +it('recalculates total scores when bonus score is deleted', function () { + DB::table('bonus_scores')->insert([ + 'entry_id' => Entry::factory()->create()->id, + 'user_id' => User::factory()->create()->id, + 'originally_scored_entry' => Entry::factory()->create()->id, + 'score' => 28, + ]); + $bonusScore = BonusScore::first(); + + $this->mock->shouldReceive('__invoke') + ->once() + ->withAnyArgs() + ->andReturn(null); + + $bonusScore->delete(); +});