validator = new UsernameValidator(); } public function testValidateTrimming(): void { $model = $this->createModel("HereIsJohnny#\u{feff}"); // Zero width no-break space (U+FEFF) $this->validator->validateAttribute($model, 'field'); $this->assertSame(['error.username_invalid'], $model->getErrors('field')); $this->assertSame('HereIsJohnny#', $model->field); } public function testValidateAttributeRequired(): void { $model = $this->createModel(''); $this->validator->validateAttribute($model, 'field'); $this->assertSame(['error.username_required'], $model->getErrors('field')); $model = $this->createModel('username'); $this->validator->validateAttribute($model, 'field'); $this->assertNotSame(['error.username_required'], $model->getErrors('field')); } public function testValidateAttributeLength(): void { $model = $this->createModel('at'); $this->validator->validateAttribute($model, 'field'); $this->assertSame(['error.username_too_short'], $model->getErrors('field')); $model = $this->createModel('erickskrauch_erickskrauch'); $this->validator->validateAttribute($model, 'field'); $this->assertSame(['error.username_too_long'], $model->getErrors('field')); $model = $this->createModel('username'); $this->validator->validateAttribute($model, 'field'); $this->assertNotSame(['error.username_too_short'], $model->getErrors('field')); $this->assertNotSame(['error.username_too_long'], $model->getErrors('field')); } // TODO: rewrite this test with @provider usage public function testValidateAttributePattern(): void { $shouldBeValid = [ 'русский_ник', 'русский_ник_на_грани!', 'numbers1132', '*__*-Stars-*__*', '1-_.!$%^&*()[]', '[ESP]Эрик', 'Свят_помидор;', 'зроблена_ў_беларусі:)', ]; foreach ($shouldBeValid as $nickname) { $model = $this->createModel($nickname); $this->validator->validateAttribute($model, 'field'); $this->assertNotSame(['error.username_invalid'], $model->getErrors('field')); } $shouldBeInvalid = [ 'nick@name', 'spaced nick', 'im#hashed', 'quest?ion', ]; foreach ($shouldBeInvalid as $nickname) { $model = $this->createModel($nickname); $this->validator->validateAttribute($model, 'field'); $this->assertSame(['error.username_invalid'], $model->getErrors('field')); } } public function testValidateAttributeUnique(): void { $this->tester->haveFixtures([ 'accounts' => AccountFixture::class, ]); /** @var \common\models\Account $accountFixture */ $accountFixture = $this->tester->grabFixture('accounts', 'admin'); $model = $this->createModel($accountFixture->username); $this->validator->validateAttribute($model, 'field'); $this->assertSame(['error.username_not_available'], $model->getErrors('field')); $model = $this->createModel($accountFixture->username); $this->validator->accountCallback = fn() => $accountFixture->id; $this->validator->validateAttribute($model, 'field'); $this->assertNotSame(['error.username_not_available'], $model->getErrors('field')); $this->validator->accountCallback = null; $model = $this->createModel('some-unique-username'); $this->validator->validateAttribute($model, 'field'); $this->assertNotSame(['error.username_not_available'], $model->getErrors('field')); } /** * @param string $fieldValue * @return Model&object{ field: string } */ private function createModel(string $fieldValue): Model { $class = new class extends Model { public string $field; }; $class->field = $fieldValue; return $class; } }