the browser-facing portion of osu!
at master 90 lines 2.9 kB view raw
1<?php 2 3// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0. 4// See the LICENCE file in the repository root for full licence text. 5 6namespace Tests\Models\Score\Best; 7 8use App\Models\Beatmap; 9use App\Models\Score\Best\Model; 10use App\Models\UserStatistics; 11use Tests\TestCase; 12 13class ModelTest extends TestCase 14{ 15 private static function getRandomRuleset(): string 16 { 17 return array_rand(Beatmap::MODES); 18 } 19 20 public function testDelete() 21 { 22 $class = Model::getClass(static::getRandomRuleset()); 23 $score = $class::factory()->create(); 24 25 $this->expectCountChange(fn () => $class::count(), -1); 26 27 $score->delete(); 28 } 29 30 public function testDeleteAlsoDecrementUserRankCount() 31 { 32 $ruleset = static::getRandomRuleset(); 33 $class = Model::getClass($ruleset); 34 $score = $class::factory()->create(['rank' => 'X']); 35 $stats = UserStatistics\Model::getClass($ruleset)::factory()->create([ 36 'user_id' => $score->user_id, 37 'x_rank_count' => 10, 38 ]); 39 40 $this->expectCountChange(fn () => $stats->fresh()->x_rank_count, -1); 41 42 $score->delete(); 43 } 44 45 public function testDeleteNonPersonalBestKeepUserRankCount() 46 { 47 $ruleset = static::getRandomRuleset(); 48 $class = Model::getClass($ruleset); 49 $bestScore = $class::factory()->create(['rank' => 'X']); 50 $score = $class::factory()->create([ 51 'beatmap_id' => $bestScore->beatmap_id, 52 'rank' => 'A', 53 'score' => $bestScore->score - 10, 54 'user_id' => $bestScore->user_id, 55 ]); 56 $stats = UserStatistics\Model::getClass($ruleset)::factory()->create([ 57 'a_rank_count' => 10, 58 'user_id' => $score->user_id, 59 'x_rank_count' => 10, 60 ]); 61 62 $this->expectCountChange(fn () => $stats->fresh()->a_rank_count, 0); 63 $this->expectCountChange(fn () => $stats->fresh()->x_rank_count, 0); 64 65 $score->delete(); 66 } 67 68 public function testDeletePersonalBestUpdateUserRankCountWhenThereIsOtherScore() 69 { 70 $ruleset = static::getRandomRuleset(); 71 $class = Model::getClass($ruleset); 72 $bestScore = $class::factory()->create(['rank' => 'X']); 73 $score = $class::factory()->create([ 74 'beatmap_id' => $bestScore->beatmap_id, 75 'rank' => 'A', 76 'score' => $bestScore->score - 10, 77 'user_id' => $bestScore->user_id, 78 ]); 79 $stats = UserStatistics\Model::getClass($ruleset)::factory()->create([ 80 'a_rank_count' => 10, 81 'user_id' => $score->user_id, 82 'x_rank_count' => 10, 83 ]); 84 85 $this->expectCountChange(fn () => $stats->fresh()->a_rank_count, 1); 86 $this->expectCountChange(fn () => $stats->fresh()->x_rank_count, -1); 87 88 $bestScore->delete(); 89 } 90}