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}