rules(), 'name'); $validator = Validator::make($data, $rules); $passed = $validator->passes(); // Can be debug with // dd($validator->failed()); $this->assertTrue($passed); } public function provideDataValidateNameSuccess() { return [ [['name' => 'Valid name']], [['name' => str_repeat('a', RegisterRequest::NAME_MAX_LENGTH)]], ]; } /** * @param array $data Request data * * @dataProvider provideDataValidateNameFailed */ public function testValidateNameFailedWhenMissingInput($data) { $request = new RegisterRequest; $rules = array_only($request->rules(), 'name'); $validator = Validator::make($data, $rules); $passed = $validator->passes(); $this->assertFalse($passed); } public function provideDataValidateNameFailed() { return [ [[]], [['name' => ' ']], [['name' => '']], ]; } public function testValidateNameFailedWhenExceedingMaxlength() { $request = new RegisterRequest; $rules = array_only($request->rules(), 'name'); $validator = Validator::make([ 'name' => str_repeat('a', RegisterRequest::NAME_MAX_LENGTH + 1), ], $rules); $passed = $validator->passes(); $this->assertFalse($passed); } /** * Fake database connection when using some db rules, e.g. unique, exists... */ private function fakeDatabaseRuleVerifier($validator) { $presenceVerifier = Mockery::mock(PresenceVerifierInterface::class); /* * Interface PresenceVerifierInterface does not have method setConnection, * but validator call that method somewhere, so we need to mock that method also. * * It's a hack, not good * https://github.com/laravel/framework/issues/12250 */ $presenceVerifier->shouldReceive('setConnection'); $validator->setPresenceVerifier($presenceVerifier); return $presenceVerifier; } /** * @param array $data Request data * * @dataProvider provideDataValidateEmailSuccess */ public function testValidateEmailSuccess($data) { $request = new RegisterRequest; $rules = array_only($request->rules(), 'email'); $validator = Validator::make($data, $rules); $presenceVerifier = $this->fakeDatabaseRuleVerifier($validator); $presenceVerifier->shouldReceive('getCount')->andReturn(0); $passed = $validator->passes(); $this->assertTrue($passed); } public function provideDataValidateEmailSuccess() { return [ [['email' => 'validemail@example.com']], ]; } /** * @param array $data Request data * * @dataProvider provideDataValidateEmailFailedWhenEmailInvalid */ public function testValidateEmailFailedWhenEmailInvalid($data) { $request = new RegisterRequest; $rules = array_only($request->rules(), 'email'); $validator = Validator::make($data, $rules); $presenceVerifier = $this->fakeDatabaseRuleVerifier($validator); // We are testing email format // so we make getCount return 0, meaning email had not existed in db $presenceVerifier->shouldReceive('getCount')->andReturn(0); $passed = $validator->passes(); $this->assertFalse($passed); } public function provideDataValidateEmailFailedWhenEmailInvalid() { return [ [[]], [['email' => '']], [['email' => ' ']], [['email' => 'missingdomain']], [['email' => '@missinguser.com']], [['email' => 'invalidchar &*@example.com']], [['email' => 'exceedlength' . str_repeat('a', RegisterRequest::EMAIL_MAX_LENGTH + 1) . '@example.com']], ]; } public function testValidateEmailFailedWhenEmailExisted() { $request = new RegisterRequest; $rules = array_only($request->rules(), 'email'); $validator = Validator::make([ 'email' => 'existedemail@example.com', ], $rules); $presenceVerifier = $this->fakeDatabaseRuleVerifier($validator); $presenceVerifier->shouldReceive('getCount')->andReturn(1); $passed = $validator->passes(); $this->assertFalse($passed); } /** * @param array $data Request data * * @dataProvider provideDataValidatePasswordFailedWhenInputInvalid */ public function testValidatePasswordFailedWhenInputInvalid($data) { $request = new RegisterRequest; $rules = array_only($request->rules(), 'password'); $validator = Validator::make($data, $rules); $passed = $validator->passes(); $this->assertFalse($passed); } public function provideDataValidatePasswordFailedWhenInputInvalid() { return [ [[]], [['password' => '']], [['password' => ' ']], [['password' => str_repeat('a', RegisterRequest::PASSWORD_MIN_LENGTH - 1)]], ]; } /** * @param array $data Request data * * @dataProvider provideDataValidatePasswordSuccess */ public function testValidatePasswordSuccess($data) { $request = new RegisterRequest; $rules = array_only($request->rules(), 'password'); $validator = Validator::make($data, $rules); $passed = $validator->passes(); $this->assertTrue($passed); } public function provideDataValidatePasswordSuccess() { return [ [['password' => ' 12345678 ', 'password_confirmation' => ' 12345678 ']], [ [ 'password' => str_repeat('a', RegisterRequest::PASSWORD_MIN_LENGTH), 'password_confirmation' => str_repeat('a', RegisterRequest::PASSWORD_MIN_LENGTH), ], ], [ [ 'password' => str_repeat('a', RegisterRequest::PASSWORD_MIN_LENGTH + 1), 'password_confirmation' => str_repeat('a', RegisterRequest::PASSWORD_MIN_LENGTH + 1), ], ], ]; } }