refactor validation

This commit is contained in:
Pig Fang 2020-06-02 18:34:10 +08:00
parent b8ab1f41e5
commit e4d8289eba
2 changed files with 18 additions and 32 deletions

View File

@ -17,6 +17,7 @@ use Blessing\Filter;
use Blessing\Rejection; use Blessing\Rejection;
use Illuminate\Contracts\Events\Dispatcher; use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
class PlayerController extends Controller class PlayerController extends Controller
{ {
@ -78,6 +79,7 @@ class PlayerController extends Controller
new Rules\PlayerName(), new Rules\PlayerName(),
'min:'.option('player_name_length_min'), 'min:'.option('player_name_length_min'),
'max:'.option('player_name_length_max'), 'max:'.option('player_name_length_max'),
'unique:players',
], ],
])['name']; ])['name'];
$name = $filter->apply('new_player_name', $name); $name = $filter->apply('new_player_name', $name);
@ -89,10 +91,6 @@ class PlayerController extends Controller
return json($can->getReason(), 1); return json($can->getReason(), 1);
} }
if (Player::where('name', $name)->count() > 0) {
return json(trans('user.player.add.repeated'), 6);
}
if ($user->score < (int) option('score_per_player')) { if ($user->score < (int) option('score_per_player')) {
return json(trans('user.player.add.lack-score'), 7); return json(trans('user.player.add.lack-score'), 7);
} }
@ -162,6 +160,7 @@ class PlayerController extends Controller
new Rules\PlayerName(), new Rules\PlayerName(),
'min:'.option('player_name_length_min'), 'min:'.option('player_name_length_min'),
'max:'.option('player_name_length_max'), 'max:'.option('player_name_length_max'),
Rule::unique('players')->ignore($pid),
], ],
])['name']; ])['name'];
$name = $filter->apply('new_player_name', $name); $name = $filter->apply('new_player_name', $name);
@ -174,10 +173,6 @@ class PlayerController extends Controller
return json($can->getReason(), 1); return json($can->getReason(), 1);
} }
if (Player::where('name', $name)->count() > 0) {
return json(trans('user.player.rename.repeated'), 6);
}
$old = $player->replicate(); $old = $player->replicate();
$player->name = $name; $player->name = $name;
$player->save(); $player->save();

View File

@ -60,8 +60,13 @@ class PlayerControllerTest extends TestCase
['name' => 'yjsnpi'] ['name' => 'yjsnpi']
)->assertJsonValidationErrors('name'); )->assertJsonValidationErrors('name');
// Lack of score // with an existed player name
option(['player_name_rule' => 'official']); option(['player_name_rule' => 'official']);
$existed = factory(Player::class)->create();
$this->postJson('/user/player/add', ['name' => $existed->name])
->assertJsonValidationErrors('name');
// Lack of score
$user = factory(User::class)->create(['score' => 0]); $user = factory(User::class)->create(['score' => 0]);
$this->actingAs($user)->postJson( $this->actingAs($user)->postJson(
'/user/player/add', '/user/player/add',
@ -140,16 +145,6 @@ class PlayerControllerTest extends TestCase
User::find($user->uid)->score User::find($user->uid)->score
); );
// Add a existed player
Event::fake();
$this->postJson('/user/player/add', ['name' => '角色名'])
->assertJson([
'code' => 6,
'message' => trans('user.player.add.repeated'),
]);
Event::assertNotDispatched('player.adding');
Event::assertNotDispatched('player.added');
// Single player // Single player
option(['single_player' => true]); option(['single_player' => true]);
$this->postJson('/user/player/add', ['name' => 'abc']) $this->postJson('/user/player/add', ['name' => 'abc'])
@ -260,19 +255,10 @@ class PlayerControllerTest extends TestCase
$this->postJson('/user/player/rename/'.$player->pid, ['name' => '\\']) $this->postJson('/user/player/rename/'.$player->pid, ['name' => '\\'])
->assertJsonValidationErrors('name'); ->assertJsonValidationErrors('name');
// Use a duplicated player name // with an existed player name
$name = factory(Player::class)->create()->name; $existed = factory(Player::class)->create();
$this->postJson('/user/player/rename/'.$player->pid, ['name' => $name]) $this->postJson('/user/player/rename/'.$player->pid, ['name' => $existed->name])
->assertJson([ ->assertJsonValidationErrors('name');
'code' => 6,
'message' => trans('user.player.rename.repeated'),
]);
Event::assertDispatched('player.renaming');
$filter->assertApplied('new_player_name', function ($newName) use ($name) {
$this->assertEquals($name, $newName);
return true;
});
// Rejected by filter // Rejected by filter
$filter = Fakes\Filter::fake(); $filter = Fakes\Filter::fake();
@ -315,6 +301,11 @@ class PlayerControllerTest extends TestCase
return true; return true;
}); });
$filter->assertApplied('new_player_name', function ($name) {
$this->assertEquals('new_name', $name);
return true;
});
// Single player // Single player
option(['single_player' => true]); option(['single_player' => true]);