Rework tests structure. Upgrade codeception to 2.5.3. Merge params configuration into app configuration.

This commit is contained in:
ErickSkrauch
2019-02-20 22:58:52 +03:00
parent 2eacc581be
commit b05dc6816e
248 changed files with 1503 additions and 1339 deletions

View 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();
}
}
}

View 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,
];
}
}

View 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;
}
}

View 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);
}
}

View 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
*/
}

View 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;
}
}

View 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
}
}