Open myleshyson opened 3 years ago
Currently my workaround for this is a custom extension that starts a transaction before a test and rolls everything back afterwards.
tests/_support/TransactionExtension.php
<?php
use Codeception\Events;
use yii\db\Transaction;
class TransactionExtension extends \Codeception\Extension
{
/**
* @var Transaction
*/
protected $transaction;
public static $events = array(
Events::TEST_BEFORE => 'beforeTest',
Events::TEST_AFTER => 'afterTest',
);
// methods that handle events
public function beforeTest(\Codeception\Event\TestEvent $e) {
$this->transaction = \Craft::$app->getDb()->beginTransaction();
}
public function afterTest(\Codeception\Event\TestEvent $e)
{
$this->transaction->rollBack();
}
}
tests/integration.suite.yml
# Codeception Test Suite Configuration
#
# Suite for unit or integration tests.
actor: UnitTester
extensions:
enabled: [TransactionExtension]
modules:
enabled:
- \craft\test\Craft
- Asserts
- \Helper\Unit
Ok new update. Seems like this is happening because the Connection::EVENT_AFTER_OPEN
is never getting triggered, so transactions don't happen in tests because that's what the Yii2 codeception module relies on. And it seems like that event would only ever get called if there's not a PDO connection already established.
The above workaround was actually interfering with fixtures as well, so what I ended up doing to get everything (fixtures, projectConfig, transactions) working together is manually triggering a Connection::EVENT_AFTER_OPEN
event before each test, which ensured the yii2 modules picked up connections properly and thus rolled back properly. So new workaround currently looks like:
tests/_support/Helper/MyModule.php
<?php
namespace Helper;
use Codeception\TestInterface;
use craft\test\Craft;
use yii\db\Connection;
class MyModule extends Craft
{
public function _before(TestInterface $test)
{
parent::_before($test);
\Craft::$app->getDb()->trigger(Connection::EVENT_AFTER_OPEN);
}
}
codeception.yml
actor: Tester
paths:
tests: tests
log: tests/_output
data: tests/_data
support: tests/_support
envs: tests/_envs
bootstrap: _bootstrap.php
params:
- tests/.env
modules:
config:
\Helper\MyModule:
configFile: "tests/_craft/config/test.php"
entryUrl: "http://host.docker.internal/index.php"
projectConfig: {
folder: "config/project",
reset: false
}
migrations: []
plugins: []
cleanup: true
transaction: true
dbSetup: { clean: true, setupCraft: true }
Thanks for that... there probably is some wonkiness here we'll have to look into, either in Yii2's codeception module or how we're extending it.
I'm gonna close this. For anybody else finding themselves here I ended up just replacing codeception entirely with craft-pest. Way simpler to setup and transactions work great.
Ok looping back to this. Pest is fantastic, but it's also missing some great bells and whistles that Codception comes with. Just opened a pull request to actually try and address the underlying issue.
Description
I'm noticing that even though I'm setting
transaction: true
incodeception.yml
, database operations made within tests aren't rolled back after the test is done. Here's the test file i'm running. There's no modules or plugins enabled for this test instance.Steps to reproduce
Additional info