mirror of
https://github.com/elyby/accounts.git
synced 2025-05-31 14:11:46 +05:30
В проект внедрён RabbitMQ.
Контроллер для работы с RabbitMQ научился создавать типизированные аргументы для $body Добавлена таблица с историей ников Добавлена таблица Mojang ников Добавлена проверка активированности аккаунта в AccountsController
This commit is contained in:
@@ -1,11 +1,3 @@
|
||||
# Codeception Test Suite Configuration
|
||||
|
||||
# suite for functional (integration) tests.
|
||||
# emulate web requests and make application process them.
|
||||
# (tip: better to use with frameworks).
|
||||
|
||||
# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.
|
||||
#basic/web/index.php
|
||||
class_name: FunctionalTester
|
||||
modules:
|
||||
enabled:
|
||||
@@ -14,6 +6,7 @@ modules:
|
||||
- tests\codeception\common\_support\FixtureHelper
|
||||
- REST
|
||||
- Redis
|
||||
- AMQP
|
||||
config:
|
||||
Yii2:
|
||||
configFile: '../config/api/functional.php'
|
||||
@@ -21,3 +14,10 @@ modules:
|
||||
host: localhost
|
||||
port: 6379
|
||||
database: 1
|
||||
AMQP:
|
||||
host: localhost
|
||||
port: 5672
|
||||
username: 'ely-accounts-tester'
|
||||
password: 'tester-password'
|
||||
vhost: '/account.ely.by/tests'
|
||||
queues: ['account-operations']
|
||||
|
@@ -5,7 +5,6 @@ use Codeception\Scenario;
|
||||
use Codeception\Specify;
|
||||
use common\models\Account;
|
||||
use tests\codeception\api\_pages\AccountsRoute;
|
||||
use tests\codeception\api\_pages\LoginRoute;
|
||||
use tests\codeception\api\functional\_steps\AccountSteps;
|
||||
use tests\codeception\api\FunctionalTester;
|
||||
|
||||
|
@@ -4,6 +4,7 @@ namespace tests\codeception\api\models;
|
||||
use api\models\ChangeUsernameForm;
|
||||
use Codeception\Specify;
|
||||
use common\models\Account;
|
||||
use common\models\UsernameHistory;
|
||||
use tests\codeception\api\unit\DbTestCase;
|
||||
use tests\codeception\common\fixtures\AccountFixture;
|
||||
use Yii;
|
||||
@@ -31,9 +32,17 @@ class ChangeUsernameFormTest extends DbTestCase {
|
||||
]);
|
||||
expect($model->change())->true();
|
||||
expect(Account::findOne(1)->username)->equals('my_new_nickname');
|
||||
expect(UsernameHistory::findOne(['username' => 'my_new_nickname']))->isInstanceOf(UsernameHistory::class);
|
||||
});
|
||||
}
|
||||
|
||||
public function testCreateTask() {
|
||||
$model = new DummyChangeUsernameForm();
|
||||
$model->createTask('1', 'test1', 'test');
|
||||
// TODO: у меня пока нет идей о том, чтобы это как-то успешно протестировать, увы
|
||||
// но по крайней мере можно убедиться, что оно не падает где-то на этом шаге
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// TODO: тут образуется магическая переменная 1, что не круто. После перехода на php7 можно заюзать анонимный класс
|
||||
|
@@ -13,3 +13,4 @@ $_SERVER['SERVER_NAME'] = 'localhost';
|
||||
$_SERVER['SERVER_PORT'] = '80';
|
||||
|
||||
Yii::setAlias('@tests', dirname(dirname(__DIR__)));
|
||||
\Codeception\Specify\Config::setDeepClone(false);
|
||||
|
11
tests/codeception/common/fixtures/MojangUsernameFixture.php
Normal file
11
tests/codeception/common/fixtures/MojangUsernameFixture.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
namespace tests\codeception\common\fixtures;
|
||||
|
||||
use common\models\MojangUsername;
|
||||
use yii\test\ActiveFixture;
|
||||
|
||||
class MojangUsernameFixture extends ActiveFixture {
|
||||
|
||||
public $modelClass = MojangUsername::class;
|
||||
|
||||
}
|
23
tests/codeception/common/fixtures/data/mojang-usernames.php
Normal file
23
tests/codeception/common/fixtures/data/mojang-usernames.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
return [
|
||||
'ErickSkrauch' => [
|
||||
'username' => 'ErickSkrauch',
|
||||
'uuid' => '3e3ee6c35afa48abb61e8cd8c42fc0d9',
|
||||
'last_pulled_at' => 1461429129,
|
||||
],
|
||||
'Notch' => [
|
||||
'username' => 'Notch',
|
||||
'uuid' => '069a79f444e94726a5befca90e38aaf5',
|
||||
'last_pulled_at' => 1461429207,
|
||||
],
|
||||
'not-exists' => [
|
||||
'username' => '100_not_exists',
|
||||
'uuid' => 'f8d4ac1fb24d423483d619832b5d475c',
|
||||
'last_pulled_at' => 1461433981,
|
||||
],
|
||||
'uuid-changed' => [
|
||||
'username' => 'jeb',
|
||||
'uuid' => 'ef4c8352cecc417bbcae32f1f3e2828b',
|
||||
'last_pulled_at' => 1461434315,
|
||||
],
|
||||
];
|
@@ -5,11 +5,13 @@ use Codeception\Specify;
|
||||
use common\components\UserPass;
|
||||
use common\models\Account;
|
||||
use tests\codeception\common\fixtures\AccountFixture;
|
||||
use tests\codeception\common\fixtures\MojangUsernameFixture;
|
||||
use tests\codeception\common\unit\DbTestCase;
|
||||
use Yii;
|
||||
|
||||
/**
|
||||
* @property array $accounts
|
||||
* @property array $mojangAccounts
|
||||
*/
|
||||
class AccountTest extends DbTestCase {
|
||||
use Specify;
|
||||
@@ -20,6 +22,10 @@ class AccountTest extends DbTestCase {
|
||||
'class' => AccountFixture::class,
|
||||
'dataFile' => '@tests/codeception/common/fixtures/data/accounts.php',
|
||||
],
|
||||
'mojangAccounts' => [
|
||||
'class' => MojangUsernameFixture::class,
|
||||
'dataFile' => '@tests/codeception/common/fixtures/data/mojang-usernames.php',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -73,6 +79,7 @@ class AccountTest extends DbTestCase {
|
||||
}
|
||||
|
||||
public function testValidateEmail() {
|
||||
// TODO: пропускать этот тест, если падает ошибка с недостпуностью интернет соединения
|
||||
$this->specify('email required', function() {
|
||||
$model = new Account(['email' => null]);
|
||||
expect($model->validate(['email']))->false();
|
||||
@@ -149,4 +156,18 @@ class AccountTest extends DbTestCase {
|
||||
});
|
||||
}
|
||||
|
||||
public function testHasMojangUsernameCollision() {
|
||||
$this->specify('Expect true if collision with current username', function() {
|
||||
$model = new Account();
|
||||
$model->username = 'ErickSkrauch';
|
||||
expect($model->hasMojangUsernameCollision())->true();
|
||||
});
|
||||
|
||||
$this->specify('Expect false if some rare username without any collision on Mojang', function() {
|
||||
$model = new Account();
|
||||
$model->username = 'rare-username';
|
||||
expect($model->hasMojangUsernameCollision())->false();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -25,5 +25,10 @@ return [
|
||||
'redis' => [
|
||||
'database' => 1,
|
||||
],
|
||||
'amqp' => [
|
||||
'user' => 'ely-accounts-tester',
|
||||
'password' => 'tester-password',
|
||||
'vhost' => '/account.ely.by/tests',
|
||||
],
|
||||
],
|
||||
];
|
||||
|
@@ -1,11 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace tests\codeception\console\unit;
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
class DbTestCase extends \yii\codeception\DbTestCase
|
||||
{
|
||||
public $appConfig = '@tests/codeception/config/console/config.php';
|
||||
class DbTestCase extends \yii\codeception\DbTestCase {
|
||||
|
||||
public $appConfig = '@tests/codeception/config/console/unit.php';
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
namespace codeception\console\unit\controllers;
|
||||
|
||||
use Codeception\Specify;
|
||||
use common\models\amqp\UsernameChanged;
|
||||
use common\models\MojangUsername;
|
||||
use console\controllers\AccountQueueController;
|
||||
use tests\codeception\common\fixtures\AccountFixture;
|
||||
use tests\codeception\common\fixtures\MojangUsernameFixture;
|
||||
use tests\codeception\console\unit\DbTestCase;
|
||||
use Yii;
|
||||
|
||||
/**
|
||||
* @property array $accounts
|
||||
* @property array $mojangUsernames
|
||||
*/
|
||||
class AccountQueueControllerTest extends DbTestCase {
|
||||
use Specify;
|
||||
|
||||
public function fixtures() {
|
||||
return [
|
||||
'accounts' => [
|
||||
'class' => AccountFixture::class,
|
||||
'dataFile' => '@tests/codeception/common/fixtures/data/accounts.php',
|
||||
],
|
||||
'mojangUsernames' => [
|
||||
'class' => MojangUsernameFixture::class,
|
||||
'dataFile' => '@tests/codeception/common/fixtures/data/mojang-usernames.php',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public function testRouteUsernameChanged() {
|
||||
// TODO: пропустить тест, если у нас нету интернета
|
||||
$controller = new AccountQueueController('account-queue', Yii::$app);
|
||||
$this->specify('Update last_pulled_at time if username exists', function() use ($controller) {
|
||||
$accountInfo = $this->accounts['admin'];
|
||||
$body = new UsernameChanged([
|
||||
'accountId' => $accountInfo['id'],
|
||||
'oldUsername' => $accountInfo['username'],
|
||||
'newUsername' => 'Notch',
|
||||
]);
|
||||
$controller->routeUsernameChanged($body);
|
||||
/** @var MojangUsername|null $mojangUsername */
|
||||
$mojangUsername = MojangUsername::findOne('Notch');
|
||||
expect($mojangUsername)->isInstanceOf(MojangUsername::class);
|
||||
expect($mojangUsername->last_pulled_at)->greaterThan($this->mojangUsernames['Notch']['last_pulled_at']);
|
||||
expect($mojangUsername->last_pulled_at)->lessOrEquals(time());
|
||||
});
|
||||
|
||||
$this->specify('Add new MojangUsername if don\'t exists', function() use ($controller) {
|
||||
$accountInfo = $this->accounts['admin'];
|
||||
$body = new UsernameChanged([
|
||||
'accountId' => $accountInfo['id'],
|
||||
'oldUsername' => $accountInfo['username'],
|
||||
'newUsername' => 'Chest',
|
||||
]);
|
||||
$controller->routeUsernameChanged($body);
|
||||
/** @var MojangUsername|null $mojangUsername */
|
||||
$mojangUsername = MojangUsername::findOne('Chest');
|
||||
expect($mojangUsername)->isInstanceOf(MojangUsername::class);
|
||||
});
|
||||
|
||||
$this->specify('Remove MojangUsername, if now it\'s does\'t exists', function() use ($controller) {
|
||||
$accountInfo = $this->accounts['admin'];
|
||||
$username = $this->mojangUsernames['not-exists']['username'];
|
||||
$body = new UsernameChanged([
|
||||
'accountId' => $accountInfo['id'],
|
||||
'oldUsername' => $accountInfo['username'],
|
||||
'newUsername' => $username,
|
||||
]);
|
||||
$controller->routeUsernameChanged($body);
|
||||
/** @var MojangUsername|null $mojangUsername */
|
||||
$mojangUsername = MojangUsername::findOne($username);
|
||||
expect($mojangUsername)->null();
|
||||
});
|
||||
|
||||
$this->specify('Update uuid if username for now owned by other player', function() use ($controller) {
|
||||
$accountInfo = $this->accounts['admin'];
|
||||
$mojangInfo = $this->mojangUsernames['uuid-changed'];
|
||||
$username = $mojangInfo['username'];
|
||||
$body = new UsernameChanged([
|
||||
'accountId' => $accountInfo['id'],
|
||||
'oldUsername' => $accountInfo['username'],
|
||||
'newUsername' => $username,
|
||||
]);
|
||||
$controller->routeUsernameChanged($body);
|
||||
/** @var MojangUsername|null $mojangUsername */
|
||||
$mojangUsername = MojangUsername::findOne($username);
|
||||
expect($mojangUsername)->isInstanceOf(MojangUsername::class);
|
||||
expect($mojangUsername->uuid)->notEquals($mojangInfo['uuid']);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user