1
0
mirror of https://github.com/flarum/core.git synced 2025-08-01 14:10:37 +02:00

feat: discussion UTF-8 slug driver (#3606)

* feat: add utf-8 slug driver
* test: add tests for slugging expectations
* fix: non-word characters aren't removed

Signed-off-by: Sami Mazouz <ilyasmazouz@gmail.com>
Co-authored-by: Alexander Skvortsov <sasha.skvortsov109@gmail.com>
This commit is contained in:
Sami Mazouz
2022-08-21 15:27:41 +01:00
committed by GitHub
parent ec97ee41f9
commit f7dd609b26
4 changed files with 143 additions and 1 deletions

View File

@@ -0,0 +1,93 @@
<?php
/*
* This file is part of Flarum.
*
* For detailed copyright and license information, please view the
* LICENSE file that was distributed with this source code.
*/
namespace integration\slugger;
use Carbon\Carbon;
use Flarum\Discussion\Discussion;
use Flarum\Http\SlugManager;
use Flarum\Testing\integration\RetrievesAuthorizedUsers;
use Flarum\Testing\integration\TestCase;
use Flarum\User\User;
class SlugDriverTest extends TestCase
{
use RetrievesAuthorizedUsers;
protected function setUp(): void
{
parent::setUp();
$this->prepareDatabase([
'users' => [
$this->normalUser(),
],
'discussions' => [
['id' => 20, 'title' => 'Empty discussion', 'created_at' => Carbon::now()->toDateTimeString(), 'user_id' => 2, 'first_post_id' => null, 'comment_count' => 0, 'is_private' => 0],
['id' => 21, 'title' => 'తెలుగు', 'created_at' => Carbon::now()->toDateTimeString(), 'user_id' => 2, 'first_post_id' => null, 'comment_count' => 0, 'is_private' => 0],
['id' => 22, 'title' => '支持中文吗', 'created_at' => Carbon::now()->toDateTimeString(), 'user_id' => 2, 'first_post_id' => null, 'comment_count' => 0, 'is_private' => 0],
['id' => 23, 'title' => 'తెలుగు%$', 'created_at' => Carbon::now()->toDateTimeString(), 'user_id' => 2, 'first_post_id' => null, 'comment_count' => 0, 'is_private' => 0],
['id' => 24, 'title' => '支持中文吗%*', 'created_at' => Carbon::now()->toDateTimeString(), 'user_id' => 2, 'first_post_id' => null, 'comment_count' => 0, 'is_private' => 0],
],
]);
}
/**
* @dataProvider slugInstancePairDataProvider
* @test
*/
public function slugger_formats_the_correct_slug_from_instance(string $driver, string $modelClassName, int $id, string $slug)
{
$this->setting("slug_driver_$modelClassName", $driver);
/** @var SlugManager $slugger */
$slugger = $this->app()->getContainer()->make(SlugManager::class)->forResource($modelClassName);
$instance = $modelClassName::query()->find($id);
/** @see Discussion::setTitleAttribute() */
if ($modelClassName === Discussion::class) {
$instance->title = $instance->title;
}
$this->assertEquals($slug, $slugger->toSlug($instance));
}
/**
* @dataProvider slugInstancePairDataProvider
* @test
*/
public function slugger_returns_the_correct_instance_from_slug(string $driver, string $modelClassName, int $id, string $slug)
{
$this->setting("slug_driver_$modelClassName", $driver);
/** @var SlugManager $slugger */
$slugger = $this->app()->getContainer()->make(SlugManager::class)->forResource($modelClassName);
$this->assertEquals($modelClassName::query()->find($id), $slugger->fromSlug($slug, User::query()->find(1)));
}
public function slugInstancePairDataProvider(): array
{
return [
['default', Discussion::class, 20, '20-empty-discussion'],
['default', Discussion::class, 21, '21'],
['default', Discussion::class, 22, '22'],
['utf8', Discussion::class, 20, '20-empty-discussion'],
['utf8', Discussion::class, 21, '21-తెలుగు'],
['utf8', Discussion::class, 22, '22-支持中文吗'],
['utf8', Discussion::class, 23, '23-తెలుగు'],
['utf8', Discussion::class, 24, '24-支持中文吗'],
['default', User::class, 2, 'normal'],
['id', User::class, 2, '2'],
];
}
}