Добавлен action для формы восстановления пароля

This commit is contained in:
ErickSkrauch 2016-05-10 23:25:04 +03:00
parent a29cb76cbf
commit c6547b6540
8 changed files with 166 additions and 12 deletions

View File

@ -1,7 +1,9 @@
<?php
namespace api\controllers;
use api\models\ForgotPasswordForm;
use api\models\LoginForm;
use common\helpers\StringHelper;
use Yii;
use yii\filters\AccessControl;
use yii\helpers\ArrayHelper;
@ -11,13 +13,13 @@ class AuthenticationController extends Controller {
public function behaviors() {
return ArrayHelper::merge(parent::behaviors(), [
'authenticator' => [
'except' => ['login'],
'except' => ['login', 'forgot-password'],
],
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'actions' => ['login'],
'actions' => ['login', 'forgot-password'],
'allow' => true,
'roles' => ['?'],
],
@ -29,6 +31,7 @@ class AuthenticationController extends Controller {
public function verbs() {
return [
'login' => ['POST'],
'forgot-password' => ['POST'],
];
}
@ -54,4 +57,40 @@ class AuthenticationController extends Controller {
];
}
public function actionForgotPassword() {
$model = new ForgotPasswordForm();
$model->load(Yii::$app->request->post());
if ($model->forgotPassword() === false) {
$data = [
'success' => false,
'errors' => $this->normalizeModelErrors($model->getErrors()),
];
if (ArrayHelper::getValue($data['errors'], 'login') === 'error.email_frequency') {
$emailActivation = $model->getEmailActivation();
$data['data'] = [
'canRepeatIn' => $emailActivation->canRepeatIn(),
'repeatFrequency' => $emailActivation->repeatTimeout,
];
}
return $data;
}
$emailActivation = $model->getEmailActivation();
$response = [
'success' => true,
'data' => [
'canRepeatIn' => $emailActivation->canRepeatIn(),
'repeatFrequency' => $emailActivation->repeatTimeout,
],
];
if ($model->getLoginAttribute() !== 'email') {
$response['data']['emailMask'] = StringHelper::getEmailMask($model->getAccount()->email);
}
return $response;
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace common\helpers;
class StringHelper {
public static function getEmailMask($email) {
$username = explode('@', $email)[0];
$usernameLength = mb_strlen($username);
$maskChars = '**';
if ($usernameLength === 1) {
$mask = $maskChars;
} elseif($usernameLength === 2) {
$mask = mb_substr($username, 0, 1) . $maskChars;
} elseif($usernameLength === 3) {
$mask = mb_substr($username, 0, 1) . $maskChars . mb_substr($username, 2, 1);
} else {
$mask = mb_substr($username, 0, 2) . $maskChars . mb_substr($username, -2, 2);
}
return $mask . mb_substr($email, $usernameLength);
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace tests\codeception\api\_pages;
use yii\codeception\BasePage;
/**
* @property \tests\codeception\api\FunctionalTester $actor
*/
class AuthenticationRoute extends BasePage {
public function login($login = '', $password = '') {
$this->route = ['authentication/login'];
$this->actor->sendPOST($this->getUrl(), [
'login' => $login,
'password' => $password,
]);
}
public function forgotPassword($login = '') {
$this->route = ['authentication/forgot-password'];
$this->actor->sendPOST($this->getUrl(), [
'login' => $login,
]);
}
}

View File

@ -1,7 +1,7 @@
<?php
namespace tests\codeception\api;
use tests\codeception\api\_pages\LoginRoute;
use tests\codeception\api\_pages\AuthenticationRoute;
/**
* Inherited Methods
@ -23,7 +23,7 @@ class FunctionalTester extends \Codeception\Actor {
public function loggedInAsActiveAccount() {
$I = $this;
$route = new LoginRoute($I);
$route = new AuthenticationRoute($I);
$route->login('Admin', 'password_0');
$I->canSeeResponseIsJson();
$I->canSeeResponseJsonMatchesJsonPath('$.jwt');

View File

@ -4,7 +4,7 @@ namespace tests\codeception\api\functional;
use Codeception\Specify;
use common\models\Account;
use tests\codeception\api\_pages\AccountsRoute;
use tests\codeception\api\_pages\LoginRoute;
use tests\codeception\api\_pages\AuthenticationRoute;
use tests\codeception\api\FunctionalTester;
class AccountsChangePasswordCest {
@ -38,7 +38,7 @@ class AccountsChangePasswordCest {
$I->notLoggedIn();
$loginRoute = new LoginRoute($I);
$loginRoute = new AuthenticationRoute($I);
$loginRoute->login('Admin', 'new-password');
$I->canSeeResponseCodeIs(200);
$I->canSeeResponseContainsJson([

View File

@ -0,0 +1,49 @@
<?php
namespace codeception\api\functional;
use tests\codeception\api\_pages\AuthenticationRoute;
use tests\codeception\api\FunctionalTester;
class ForgotPasswordCest {
public function testForgotPasswordByEmail(FunctionalTester $I) {
$route = new AuthenticationRoute($I);
$I->wantTo('create new password recover request by passing email');
$route->forgotPassword('admin@ely.by');
$I->canSeeResponseContainsJson([
'success' => true,
]);
$I->canSeeResponseJsonMatchesJsonPath('$.data.canRepeatIn');
$I->canSeeResponseJsonMatchesJsonPath('$.data.repeatFrequency');
}
public function testForgotPasswordByUsername(FunctionalTester $I) {
$route = new AuthenticationRoute($I);
$I->wantTo('create new password recover request by passing username');
$route->forgotPassword('Admin');
$I->canSeeResponseContainsJson([
'success' => true,
]);
$I->canSeeResponseJsonMatchesJsonPath('$.data.canRepeatIn');
$I->canSeeResponseJsonMatchesJsonPath('$.data.repeatFrequency');
$I->canSeeResponseJsonMatchesJsonPath('$.data.emailMask');
}
public function testDataForFrequencyError(FunctionalTester $I) {
$route = new AuthenticationRoute($I);
$I->wantTo('get info about time to repeat recover password request');
$route->forgotPassword('Notch');
$I->canSeeResponseContainsJson([
'success' => false,
'errors' => [
'login' => 'error.email_frequency',
],
]);
$I->canSeeResponseJsonMatchesJsonPath('$.data.canRepeatIn');
$I->canSeeResponseJsonMatchesJsonPath('$.data.repeatFrequency');
}
}

View File

@ -1,12 +1,12 @@
<?php
namespace tests\codeception\api;
use tests\codeception\api\_pages\LoginRoute;
use tests\codeception\api\_pages\AuthenticationRoute;
class LoginCest {
public function testLoginEmailOrUsername(FunctionalTester $I) {
$route = new LoginRoute($I);
$route = new AuthenticationRoute($I);
$I->wantTo('see error.login_required expected if login is not set');
$route->login();
@ -61,7 +61,7 @@ class LoginCest {
}
public function testLoginPassword(FunctionalTester $I) {
$route = new LoginRoute($I);
$route = new AuthenticationRoute($I);
$I->wantTo('see password doesn\'t have errors if email or username not set');
$route->login();
@ -104,7 +104,7 @@ class LoginCest {
}
public function testLoginByUsernameCorrect(FunctionalTester $I) {
$route = new LoginRoute($I);
$route = new AuthenticationRoute($I);
$I->wantTo('login into account using correct username and password');
$route->login('Admin', 'password_0');
@ -116,7 +116,7 @@ class LoginCest {
}
public function testLoginByEmailCorrect(FunctionalTester $I) {
$route = new LoginRoute($I);
$route = new AuthenticationRoute($I);
$I->wantTo('login into account using correct email and password');
$route->login('admin@ely.by', 'password_0');
@ -127,7 +127,7 @@ class LoginCest {
}
public function testLoginInAccWithPasswordMethod(FunctionalTester $I) {
$route = new LoginRoute($I);
$route = new AuthenticationRoute($I);
$I->wantTo('login into account with old password hash function using correct username and password');
$route->login('AccWithOldPassword', '12345678');

View File

@ -0,0 +1,16 @@
<?php
namespace codeception\common\unit\helpers;
use common\helpers\StringHelper;
class StringHelperTest extends \PHPUnit_Framework_TestCase {
public function testGetEmailMask() {
$this->assertEquals('**@ely.by', StringHelper::getEmailMask('e@ely.by'));
$this->assertEquals('e**@ely.by', StringHelper::getEmailMask('es@ely.by'));
$this->assertEquals('e**i@ely.by', StringHelper::getEmailMask('eri@ely.by'));
$this->assertEquals('er**ch@ely.by', StringHelper::getEmailMask('erickskrauch@ely.by'));
$this->assertEquals('эр**уч@елу.бел', StringHelper::getEmailMask('эрикскрауч@елу.бел'));
}
}