/** * Tests validation rules for the model. */ public function testLoginFormValidationRules() { $form = Yii::createObject(LoginForm::className()); $this->specify('login is required', function () use($form) { $form->setAttributes(['login' => '']); verify($form->validate())->false(); verify($form->getErrors('login'))->contains('Login cannot be blank.'); }); $this->specify('password is required', function () use($form) { $form->setAttributes(['password' => '']); verify($form->validate())->false(); verify($form->getErrors('password'))->contains('Password cannot be blank.'); }); $this->specify('user should exist in database', function () use($form) { $finder = test::double(Finder::className(), ['findUserByUsernameOrEmail' => null]); $form->setAttributes(['login' => 'tester', 'password' => 'qwerty']); verify($form->validate())->false(); verify($form->getErrors('password'))->contains('Invalid login or password'); $finder->verifyInvoked('findUserByUsernameOrEmail'); }); $this->specify('password should be valid', function () use($form) { test::double(Finder::className(), ['findUserByUsernameOrEmail' => \Yii::createObject(User::className())]); test::double(Security::className(), ['validatePassword' => false]); $form->setAttributes(['password' => 'qwerty']); verify($form->validate(['password']))->false(); verify($form->getErrors('password'))->contains('Invalid login or password'); test::double(Security::className(), ['validatePassword' => true]); verify($form->validate(['password']))->true(); }); $this->specify('user may not be confirmed when enableUnconfirmedLogin is true', function () use($form) { \Yii::$app->getModule('user')->enableUnconfirmedLogin = true; $user = \Yii::createObject(User::className()); test::double($user, ['getIsConfirmed' => true]); test::double(Finder::className(), ['findUserByUsernameOrEmail' => $user]); verify($form->validate())->true(); test::double($user, ['getIsConfirmed' => false]); verify($form->validate())->true(); }); $this->specify('user should be confirmed when enableUnconfirmedLogin is true', function () use($form) { \Yii::$app->getModule('user')->enableUnconfirmedLogin = false; verify($form->validate())->false(); verify($form->getErrors('login'))->contains('You need to confirm your email address'); $user = \Yii::createObject(User::className()); test::double($user, ['getIsConfirmed' => true]); test::double(Finder::className(), ['findUserByUsernameOrEmail' => $user]); verify($form->validate())->true(); }); $this->specify('user should not be blocked', function () use($form) { $user = \Yii::createObject(User::className()); test::double($user, ['getIsBlocked' => true]); test::double(Finder::className(), ['findUserByUsernameOrEmail' => $user]); verify($form->validate())->false(); verify($form->getErrors('login'))->contains('Your account has been blocked'); }); }
/** * @inheritdoc */ public function init() { parent::init(); if (is_string($this->security)) { $component = $this->security; $this->security = Yii::$app->{$component}; } elseif (is_array($this->security)) { $this->security = Yii::createObject(array_merge(['class' => Security::className()], $this->security)); } if (!$this->security instanceof Security) { throw new InvalidConfigException('The `security` attribute must extend `yii\\base\\Security`.'); } }
/** * Generates token with given length * @return string */ public function generate() { $this->security = Instance::ensure($this->security, Security::className()); return $this->security->generateRandomString($this->length); }