Skip to content

Commit 0d74a21

Browse files
committed
Add various exclusion-supporting filter tests
1 parent 205b2a9 commit 0d74a21

11 files changed

Lines changed: 707 additions & 0 deletions
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
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+
6+
declare(strict_types=1);
7+
8+
namespace Tests\Libraries\Search\BeatmapsetSearch;
9+
10+
use App\Models\Beatmap;
11+
use App\Models\Beatmapset;
12+
13+
class ConvertsFilterTest extends TestCase
14+
{
15+
public static function dataProvider(): array
16+
{
17+
return [
18+
[['q' => 'cs=4'], [1, 2]],
19+
[['q' => '-cs=4'], [0, 3]],
20+
[['m' => 0, 'q' => 'cs=4'], [1]],
21+
[['m' => 3, 'q' => 'cs=4'], [2]],
22+
[['m' => 0, 'q' => '-cs=4'], [0]],
23+
[['m' => 3, 'q' => '-cs=4'], [3]],
24+
25+
[['c' => 'converts', 'q' => 'cs=4',], [0, 1, 2]],
26+
[['c' => 'converts', 'q' => '-cs=4',], [3]],
27+
[['c' => 'converts', 'm' => 0, 'q' => 'cs=4',], [1]],
28+
[['c' => 'converts', 'm' => 3, 'q' => 'cs=4'], [0, 2]],
29+
[['c' => 'converts', 'm' => 0, 'q' => '-cs=4'], [0]],
30+
[['c' => 'converts', 'm' => 3, 'q' => '-cs=4'], [1, 3]],
31+
];
32+
}
33+
34+
public static function setUpBeforeClass(): void
35+
{
36+
parent::setUpBeforeClass();
37+
38+
static::withDbAccess(function () {
39+
$factory = Beatmapset::factory()->ranked();
40+
$beatmapFactory = Beatmap::factory()->ranked();
41+
static::$beatmapsets = [
42+
$factory->has(
43+
$beatmapFactory
44+
->ruleset('osu')
45+
->state([
46+
// converted to mania diff_size 4
47+
'countNormal' => 1,
48+
'countSlider' => 1,
49+
'countSpinner' => 1,
50+
'diff_size' => 1,
51+
'diff_overall' => 1,
52+
])
53+
)
54+
->create(),
55+
56+
$factory->has(
57+
$beatmapFactory
58+
->ruleset('osu')
59+
->state([
60+
// converted to mania diff_size 7
61+
'countNormal' => 100,
62+
'countSlider' => 1,
63+
'countSpinner' => 1,
64+
'diff_size' => 4,
65+
'diff_overall' => 4,
66+
])
67+
)
68+
->create(),
69+
70+
$factory->has(
71+
$beatmapFactory
72+
->ruleset('mania')
73+
->state([
74+
'countNormal' => 1,
75+
'countSlider' => 1,
76+
'countSpinner' => 1,
77+
'diff_size' => 4,
78+
'diff_overall' => 1,
79+
])
80+
)
81+
->create(),
82+
83+
$factory->has(
84+
$beatmapFactory
85+
->ruleset('mania')
86+
->state([
87+
'countNormal' => 100,
88+
'countSlider' => 1,
89+
'countSpinner' => 1,
90+
'diff_size' => 7,
91+
'diff_overall' => 1,
92+
])
93+
)
94+
->create(),
95+
];
96+
97+
static::refresh();
98+
});
99+
}
100+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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+
6+
declare(strict_types=1);
7+
8+
namespace Tests\Libraries\Search\BeatmapsetSearch;
9+
10+
use App\Models\Beatmapset;
11+
use App\Models\User;
12+
13+
class CreatorFilterTest extends TestCase
14+
{
15+
public static function dataProvider(): array
16+
{
17+
return [
18+
'include lookup user' => [['q' => 'creator=mapper'], [0, 1]],
19+
'include non-lookup user' => [['q' => 'creator=someone'], [0, 3]],
20+
'exclude lookup user' => [['q' => '-creator=mapper'], [2, 3, 4]],
21+
'exclude non-lookup user' => [['q' => '-creator=someone'], [1, 2, 4]],
22+
];
23+
}
24+
25+
public static function setUpBeforeClass(): void
26+
{
27+
parent::setUpBeforeClass();
28+
29+
static::withDbAccess(function () {
30+
$factory = Beatmapset::factory()->ranked();
31+
$mapper1 = User::factory()->create(['username' => 'mapper']);
32+
$mapper2 = User::factory()->create(['username' => 'another_mapper']);
33+
34+
static::$beatmapsets = [
35+
$factory->withBeatmaps()->withBeatmaps(guestMapper: $mapper1)->create(['creator' => 'someone']),
36+
$factory->withBeatmaps()->create(['user_id' => $mapper1]),
37+
$factory->withBeatmaps()->create(['user_id' => $mapper2]),
38+
$factory->withBeatmaps()->create(['creator' => 'someone_else']),
39+
$factory->withBeatmaps()->create(['creator' => 'unknown_mapper']),
40+
];
41+
static::refresh();
42+
});
43+
}
44+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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+
6+
declare(strict_types=1);
7+
8+
namespace Tests\Libraries\Search\BeatmapsetSearch;
9+
10+
use App\Models\Beatmap;
11+
use App\Models\Beatmapset;
12+
13+
class DifficultyFilterTest extends TestCase
14+
{
15+
public static function dataProvider(): array
16+
{
17+
return [
18+
[['q' => 'difficulty=hard'], [1, 2]],
19+
[['q' => 'difficulty="very mapper"'], [2]],
20+
[['q' => 'difficulty="very hard"'], []],
21+
[['q' => 'difficulty=""very easy""'], [0]],
22+
[['q' => '-difficulty=hard'], [0]],
23+
[['q' => '-difficulty="very mapper"'], [1]],
24+
[['q' => '-difficulty="very hard"'], []],
25+
[['q' => '-difficulty=""very easy""'], [1, 2]],
26+
[['q' => '-difficulty="hard easy"'], []],
27+
];
28+
}
29+
30+
public static function setUpBeforeClass(): void
31+
{
32+
parent::setUpBeforeClass();
33+
34+
static::withDbAccess(function () {
35+
$factory = Beatmapset::factory()->ranked();
36+
$beatmapFactory = Beatmap::factory()
37+
->state(fn (array $attr, Beatmapset $set) => [
38+
'approved' => $set->approved,
39+
'user_id' => $set->user_id,
40+
]);
41+
42+
static::$beatmapsets = [
43+
$factory
44+
->has($beatmapFactory->state(['version' => 'very easy']))
45+
->has($beatmapFactory->state(['version' => 'normal']))
46+
->create(),
47+
$factory
48+
->has($beatmapFactory->state(['version' => 'normal']))
49+
->has($beatmapFactory->state(['version' => 'hard']))
50+
->create(),
51+
$factory
52+
->has($beatmapFactory->state(['version' => 'mapper name very nice']))
53+
->has($beatmapFactory->state(['version' => 'hard']))
54+
->create(),
55+
];
56+
static::refresh();
57+
});
58+
}
59+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
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+
6+
declare(strict_types=1);
7+
8+
namespace Tests\Libraries\Search\BeatmapsetSearch;
9+
10+
use App\Models\Artist;
11+
use App\Models\ArtistTrack;
12+
use App\Models\Beatmapset;
13+
use Illuminate\Database\Eloquent\Factories\Sequence;
14+
15+
class FeaturedArtistFilterTest extends TestCase
16+
{
17+
public static function dataProvider(): array
18+
{
19+
return [
20+
[['q' => 'featured_artist=1'], [0, 2, 4]],
21+
[['q' => '-featured_artist=1'], [1, 3, 5, 6]],
22+
[['c' => 'featured_artists'], [0, 1, 2, 3, 4, 5]],
23+
[
24+
['c' => 'featured_artists', 'q' => '-featured_artist=1'],
25+
[1, 3, 5],
26+
],
27+
];
28+
}
29+
30+
public static function setUpBeforeClass(): void
31+
{
32+
parent::setUpBeforeClass();
33+
34+
static::withDbAccess(function () {
35+
$artists = Artist::factory()
36+
->count(2)
37+
->state(new Sequence(fn (Sequence $sequence) => ['id' => $sequence->index + 1]))
38+
->create();
39+
40+
// multiple tracks per artist
41+
$tracks = ArtistTrack::factory()
42+
->count(4)
43+
->state(new Sequence(fn (Sequence $sequence) => ['artist_id' => $artists[$sequence->index % 2]]))
44+
->create();
45+
46+
// multiple beatmapsets on at least one track
47+
static::$beatmapsets = Beatmapset::factory()
48+
->ranked()
49+
->withBeatmaps()
50+
->count(6)
51+
->state(new Sequence(fn (Sequence $sequence) => ['track_id' => $tracks[$sequence->index % 4]]))
52+
->create();
53+
54+
// extra non-featured artist beatmapset
55+
static::$beatmapsets[] = Beatmapset::factory()
56+
->ranked()
57+
->withBeatmaps()
58+
->create();
59+
60+
static::refresh();
61+
});
62+
}
63+
64+
public static function tearDownAfterClass(): void
65+
{
66+
parent::tearDownAfterClass();
67+
68+
static::withDbAccess(function () {
69+
ArtistTrack::truncate();
70+
Artist::query()->delete(); // can't truncate with foreign key.
71+
});
72+
}
73+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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+
6+
declare(strict_types=1);
7+
8+
namespace Tests\Libraries\Search\BeatmapsetSearch;
9+
10+
use App\Models\Beatmap;
11+
use App\Models\Beatmapset;
12+
13+
class ManiaKeysFilterTest extends TestCase
14+
{
15+
public static function dataProvider(): array
16+
{
17+
return [
18+
[['q' => 'keys=7'], [1, 3]],
19+
[['q' => '-keys=7'], [2]],
20+
];
21+
}
22+
23+
public static function setUpBeforeClass(): void
24+
{
25+
parent::setUpBeforeClass();
26+
27+
static::withDbAccess(function () {
28+
$beatmapsetFactory = Beatmapset::factory()->ranked();
29+
$beatmapFactory = Beatmap::factory()->ruleset('mania')->state(['approved' => Beatmapset::STATES['ranked']]);
30+
31+
static::$beatmapsets = [
32+
$beatmapsetFactory->withBeatmaps('osu')->create(),
33+
$beatmapsetFactory->has($beatmapFactory->state(['diff_size' => 7]))->create(),
34+
$beatmapsetFactory->has($beatmapFactory->state(['diff_size' => 4]))->create(),
35+
$beatmapsetFactory
36+
->has($beatmapFactory->state(['diff_size' => 4]))
37+
->has($beatmapFactory->state(['diff_size' => 7]))
38+
->create(),
39+
];
40+
static::refresh();
41+
});
42+
}
43+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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+
6+
declare(strict_types=1);
7+
8+
namespace Tests\Libraries\Search\BeatmapsetSearch;
9+
10+
use App\Models\Beatmapset;
11+
use DateTime;
12+
use DateTimeInterface;
13+
14+
class RankedFilterTest extends TestCase
15+
{
16+
public static function dataProvider(): array
17+
{
18+
// Includes created and updated date tests.
19+
static $keys = ['created', 'ranked', 'updated'];
20+
21+
$data = [];
22+
foreach ($keys as $key) {
23+
// BeatmapsetQueryParserTest will handle the other date formats
24+
$data[] = [['q' => "{$key}=2024"], [2, 3, 4]];
25+
$data[] = [['q' => "{$key}=2024-02"], [2, 3]];
26+
$data[] = [['q' => "{$key}=2024-02-28"], [3]];
27+
$data[] = [['q' => "{$key}=2024"], [2, 3, 4]];
28+
$data[] = [['q' => "{$key}>2023"], [2, 3, 4]];
29+
$data[] = [['q' => "{$key}>=2023"], [1, 2, 3, 4]];
30+
$data[] = [['q' => "{$key}<2023"], [0]];
31+
$data[] = [['q' => "{$key}<=2023"], [0, 1]];
32+
33+
$data[] = [['q' => "-{$key}=2024"], [0, 1]];
34+
$data[] = [['q' => "-{$key}=2024-02"], [0, 1, 4]];
35+
$data[] = [['q' => "-{$key}=2024-02-28"], [0, 1, 2, 4]];
36+
$data[] = [['q' => "-{$key}>2023"], [0, 1]];
37+
$data[] = [['q' => "-{$key}>=2023"], [0]];
38+
$data[] = [['q' => "-{$key}<2023"], [1, 2, 3, 4]];
39+
$data[] = [['q' => "-{$key}<=2023"], [2, 3, 4]];
40+
41+
$data[] = [['q' => "{$key}<=2024 -{$key}=2024-02"], [0, 1, 4]];
42+
}
43+
44+
return $data;
45+
}
46+
47+
public static function setUpBeforeClass(): void
48+
{
49+
parent::setUpBeforeClass();
50+
51+
static::withDbAccess(function () {
52+
$factory = Beatmapset::factory()->withBeatmaps();
53+
$helper = fn (DateTimeInterface $date) => $factory->ranked($date)->state([
54+
'last_update' => $date,
55+
'submit_date' => $date,
56+
]);
57+
static::$beatmapsets = [
58+
$helper(new DateTime('2022-02-25'))->state(['approved' => Beatmapset::STATES['approved']])->create(),
59+
$helper(new DateTime('2023-02-26'))->state(['approved' => Beatmapset::STATES['loved']])->create(),
60+
$helper(new DateTime('2024-02-27'))->create(),
61+
$helper(new DateTime('2024-02-28'))->create(),
62+
$helper(new DateTime('2024-03-05'))->create(),
63+
];
64+
static::refresh();
65+
});
66+
}
67+
}

0 commit comments

Comments
 (0)