mirror of
https://github.com/elyby/accounts.git
synced 2025-05-31 14:11:46 +05:30
Rework tests structure. Upgrade codeception to 2.5.3. Merge params configuration into app configuration.
This commit is contained in:
33
common/tests/_support/ApplicationRedisBridge.php
Normal file
33
common/tests/_support/ApplicationRedisBridge.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace common\tests\_support;
|
||||
|
||||
use Codeception\Exception\ModuleConfigException;
|
||||
use Codeception\Module;
|
||||
use Yii;
|
||||
|
||||
class ApplicationRedisBridge extends Module {
|
||||
|
||||
protected $config = [
|
||||
'module' => 'Redis',
|
||||
];
|
||||
|
||||
public function _initialize(): void {
|
||||
if (!$this->hasModule($this->config['module'])) {
|
||||
throw new ModuleConfigException($this, 'This module should be used together with Redis module');
|
||||
}
|
||||
|
||||
/** @var \Codeception\Module\Redis $module */
|
||||
$module = $this->getModule($this->config['module']);
|
||||
$config = $module->_getConfig();
|
||||
$config['host'] = Yii::$app->redis->hostname;
|
||||
$config['port'] = Yii::$app->redis->port;
|
||||
$config['database'] = Yii::$app->redis->database;
|
||||
$module->_setConfig($config);
|
||||
if ($module->driver !== null) {
|
||||
$module->_initialize();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
63
common/tests/_support/FixtureHelper.php
Normal file
63
common/tests/_support/FixtureHelper.php
Normal file
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
namespace common\tests\_support;
|
||||
|
||||
use Codeception\Module;
|
||||
use Codeception\TestInterface;
|
||||
use common\tests\fixtures\AccountFixture;
|
||||
use common\tests\fixtures\AccountSessionFixture;
|
||||
use common\tests\fixtures\EmailActivationFixture;
|
||||
use common\tests\fixtures\MinecraftAccessKeyFixture;
|
||||
use common\tests\fixtures\OauthClientFixture;
|
||||
use common\tests\fixtures\OauthSessionFixture;
|
||||
use common\tests\fixtures\UsernameHistoryFixture;
|
||||
use yii\test\FixtureTrait;
|
||||
use yii\test\InitDbFixture;
|
||||
|
||||
/**
|
||||
* This helper is used to populate the database with needed fixtures before any tests are run.
|
||||
* All fixtures will be loaded before the suite is started and unloaded after it completes.
|
||||
*
|
||||
* TODO: try to remove
|
||||
*/
|
||||
class FixtureHelper extends Module {
|
||||
|
||||
/**
|
||||
* Redeclare visibility because codeception includes all public methods that do not start with "_"
|
||||
* and are not excluded by module settings, in actor class.
|
||||
*/
|
||||
use FixtureTrait {
|
||||
loadFixtures as protected;
|
||||
fixtures as protected;
|
||||
globalFixtures as protected;
|
||||
unloadFixtures as protected;
|
||||
getFixtures as protected;
|
||||
getFixture as protected;
|
||||
}
|
||||
|
||||
public function _before(TestInterface $test) {
|
||||
$this->loadFixtures();
|
||||
}
|
||||
|
||||
public function _after(TestInterface $test) {
|
||||
$this->unloadFixtures();
|
||||
}
|
||||
|
||||
public function globalFixtures() {
|
||||
return [
|
||||
InitDbFixture::class,
|
||||
];
|
||||
}
|
||||
|
||||
public function fixtures() {
|
||||
return [
|
||||
'accounts' => AccountFixture::class,
|
||||
'accountSessions' => AccountSessionFixture::class,
|
||||
'emailActivations' => EmailActivationFixture::class,
|
||||
'usernamesHistory' => UsernameHistoryFixture::class,
|
||||
'oauthClients' => OauthClientFixture::class,
|
||||
'oauthSessions' => OauthSessionFixture::class,
|
||||
'minecraftAccessKeys' => MinecraftAccessKeyFixture::class,
|
||||
];
|
||||
}
|
||||
|
||||
}
|
31
common/tests/_support/Mockery.php
Normal file
31
common/tests/_support/Mockery.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
namespace common\tests\_support;
|
||||
|
||||
use Codeception\Module;
|
||||
use Codeception\TestInterface;
|
||||
|
||||
class Mockery extends Module {
|
||||
|
||||
/**
|
||||
* @var bool Run mockery expectations after test or not
|
||||
*/
|
||||
private $assert_mocks = true;
|
||||
|
||||
public function _before(TestInterface $test) {
|
||||
\Mockery::globalHelpers();
|
||||
}
|
||||
|
||||
public function _after(TestInterface $test) {
|
||||
if ($this->assert_mocks) {
|
||||
\Mockery::close();
|
||||
} else {
|
||||
\Mockery::getContainer()->mockery_close();
|
||||
\Mockery::resetContainer();
|
||||
}
|
||||
}
|
||||
|
||||
public function _failed(TestInterface $test, $fail) {
|
||||
$this->assert_mocks = false;
|
||||
}
|
||||
|
||||
}
|
16
common/tests/_support/ProtectedCaller.php
Normal file
16
common/tests/_support/ProtectedCaller.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
namespace common\tests\_support;
|
||||
|
||||
use ReflectionClass;
|
||||
|
||||
trait ProtectedCaller {
|
||||
|
||||
protected function callProtected($object, string $function, ...$args) {
|
||||
$class = new ReflectionClass($object);
|
||||
$method = $class->getMethod($function);
|
||||
$method->setAccessible(true);
|
||||
|
||||
return $method->invokeArgs($object, $args);
|
||||
}
|
||||
|
||||
}
|
26
common/tests/_support/UnitTester.php
Normal file
26
common/tests/_support/UnitTester.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
namespace common\tests;
|
||||
|
||||
/**
|
||||
* Inherited Methods
|
||||
* @method void wantToTest($text)
|
||||
* @method void wantTo($text)
|
||||
* @method void execute($callable)
|
||||
* @method void expectTo($prediction)
|
||||
* @method void expect($prediction)
|
||||
* @method void amGoingTo($argumentation)
|
||||
* @method void am($role)
|
||||
* @method void lookForwardTo($achieveValue)
|
||||
* @method void comment($description)
|
||||
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
|
||||
*
|
||||
* @SuppressWarnings(PHPMD)
|
||||
*/
|
||||
class UnitTester extends \Codeception\Actor {
|
||||
use _generated\UnitTesterActions;
|
||||
|
||||
/**
|
||||
* Define custom actions here
|
||||
*/
|
||||
|
||||
}
|
56
common/tests/_support/queue/CodeceptionQueueHelper.php
Normal file
56
common/tests/_support/queue/CodeceptionQueueHelper.php
Normal file
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
namespace common\tests\_support\queue;
|
||||
|
||||
use Codeception\Exception\ModuleException;
|
||||
use Codeception\Module;
|
||||
use Codeception\Module\Yii2;
|
||||
|
||||
class CodeceptionQueueHelper extends Module {
|
||||
|
||||
/**
|
||||
* Returns last sent message
|
||||
*
|
||||
* @return \yii\queue\JobInterface|null
|
||||
*/
|
||||
public function grabLastQueuedJob() {
|
||||
$messages = $this->grabQueueJobs();
|
||||
$last = end($messages);
|
||||
if ($last === false) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $last;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns array of all sent amqp messages.
|
||||
* Each message is `\PhpAmqpLib\Message\AMQPMessage` instance.
|
||||
* Useful to perform additional checks using `Asserts` module.
|
||||
*
|
||||
* @param string|null $exchange
|
||||
* @return \yii\queue\JobInterface[]
|
||||
* @throws ModuleException
|
||||
*/
|
||||
public function grabQueueJobs() {
|
||||
$amqp = $this->grabComponent('queue');
|
||||
if (!$amqp instanceof Queue) {
|
||||
throw new ModuleException($this, 'AMQP module is not mocked, can\'t test messages');
|
||||
}
|
||||
|
||||
return $amqp->getMessages();
|
||||
}
|
||||
|
||||
private function grabComponent(string $component) {
|
||||
return $this->getYii2()->grabComponent($component);
|
||||
}
|
||||
|
||||
private function getYii2(): Yii2 {
|
||||
$yii2 = $this->getModule('Yii2');
|
||||
if (!$yii2 instanceof Yii2) {
|
||||
throw new ModuleException($this, 'Yii2 module must be configured');
|
||||
}
|
||||
|
||||
return $yii2;
|
||||
}
|
||||
|
||||
}
|
32
common/tests/_support/queue/Queue.php
Normal file
32
common/tests/_support/queue/Queue.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
namespace common\tests\_support\queue;
|
||||
|
||||
use yii\base\NotSupportedException;
|
||||
use yii\queue\Queue as BaseQueue;
|
||||
|
||||
class Queue extends BaseQueue {
|
||||
|
||||
private $messages = [];
|
||||
|
||||
public function __set($name, $value) {
|
||||
// Yii2 components may contains some configuration
|
||||
// But we just ignore it for this mock component
|
||||
}
|
||||
|
||||
public function push($job) {
|
||||
$this->messages[] = $job;
|
||||
}
|
||||
|
||||
public function status($id) {
|
||||
throw new NotSupportedException('Status is not supported in the driver.');
|
||||
}
|
||||
|
||||
public function getMessages() {
|
||||
return $this->messages;
|
||||
}
|
||||
|
||||
protected function pushMessage($message, $ttr, $delay, $priority) {
|
||||
// This function is abstract, but will be not called
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user