Browse Source

Fix #14343: Fix `yii\test\ActiveFixture` to use model's DB connection instead of the default one

bizley-patch-1
Bizley 4 years ago committed by GitHub
parent
commit
34441ca549
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      framework/CHANGELOG.md
  2. 8
      framework/test/ActiveFixture.php
  3. 4
      tests/framework/console/controllers/FixtureControllerTest.php
  4. 219
      tests/framework/test/ActiveFixtureTest.php

1
framework/CHANGELOG.md

@ -12,6 +12,7 @@ Yii Framework 2 Change Log
- Bug #17174: Fix `yii\db\BaseActiveRecord::unlink()` to not ignore `on` conditions in `via` relations (bizley)
- Bug #18557: Fix `yii\data\ActiveDataProvider` to handle DB connection configuration of different type than just `yii\db\Connection` (bizley)
- Bug #18526: Fix `yii\caching\DbCache` to work with MSSQL, add `normalizeTableRowData()` to `yii\db\mssql\QueryBuilder::upsert()` (darkdef)
- Bug #14343: Fix `yii\test\ActiveFixture` to use model's DB connection instead of the default one (margori, bizley)
2.0.41.1 March 04, 2021

8
framework/test/ActiveFixture.php

@ -8,6 +8,7 @@
namespace yii\test;
use yii\base\InvalidConfigException;
use yii\db\ActiveRecord;
use yii\db\TableSchema;
/**
@ -58,9 +59,14 @@ class ActiveFixture extends BaseActiveFixture
public function init()
{
parent::init();
if ($this->modelClass === null && $this->tableName === null) {
if ($this->tableName === null) {
if ($this->modelClass === null) {
throw new InvalidConfigException('Either "modelClass" or "tableName" must be set.');
}
/** @var ActiveRecord $modelClass */
$modelClass = $this->modelClass;
$this->db = $modelClass::getDb();
}
}
/**

4
tests/framework/console/controllers/FixtureControllerTest.php

@ -9,10 +9,9 @@ namespace yiiunit\framework\console\controllers;
use Yii;
use yii\console\controllers\FixtureController;
use yiiunit\data\ar\ActiveRecord;
use yiiunit\data\console\controllers\fixtures\DependentActiveFixture;
use yiiunit\data\console\controllers\fixtures\FirstIndependentActiveFixture;
use yiiunit\data\console\controllers\fixtures\FixtureStorage;
use yiiunit\data\console\controllers\fixtures\SecondIndependentActiveFixture;
use yiiunit\framework\db\DatabaseTestCase;
/**
@ -37,6 +36,7 @@ class FixtureControllerTest extends DatabaseTestCase
$db = $this->getConnection();
\Yii::$app->set('db', $db);
ActiveRecord::$db = $db;
$this->_fixtureController = Yii::createObject([
'class' => 'yiiunit\framework\console\controllers\FixtureConsoledController',

219
tests/framework/test/ActiveFixtureTest.php

@ -7,12 +7,121 @@
namespace yiiunit\framework\test;
use Yii;
use yii\db\Connection;
use yii\test\ActiveFixture;
use yii\test\FixtureTrait;
use yiiunit\data\ar\ActiveRecord;
use yiiunit\data\ar\Customer;
use yiiunit\framework\db\DatabaseTestCase;
/**
* @group fixture
* @group db
*/
class ActiveFixtureTest extends DatabaseTestCase
{
protected $driverName = 'mysql';
public function setUp()
{
parent::setUp();
$db = $this->getConnection();
Yii::$app->set('db', $db);
ActiveRecord::$db = $db;
}
public function tearDown()
{
parent::tearDown();
}
public function testGetData()
{
$test = new CustomerDbTestCase();
$test->setUp();
$fixture = $test->getFixture('customers');
$this->assertEquals(CustomerFixture::className(), get_class($fixture));
$this->assertCount(2, $fixture);
$this->assertEquals(1, $fixture['customer1']['id']);
$this->assertEquals('customer1@example.com', $fixture['customer1']['email']);
$this->assertEquals(1, $fixture['customer1']['profile_id']);
$this->assertEquals(2, $fixture['customer2']['id']);
$this->assertEquals('customer2@example.com', $fixture['customer2']['email']);
$this->assertEquals(2, $fixture['customer2']['profile_id']);
$test->tearDown();
}
public function testGetModel()
{
$test = new CustomerDbTestCase();
$test->setUp();
$fixture = $test->getFixture('customers');
$this->assertEquals(Customer::className(), get_class($fixture->getModel('customer1')));
$this->assertEquals(1, $fixture->getModel('customer1')->id);
$this->assertEquals('customer1@example.com', $fixture->getModel('customer1')->email);
$this->assertEquals(1, $fixture['customer1']['profile_id']);
$this->assertEquals(2, $fixture->getModel('customer2')->id);
$this->assertEquals('customer2@example.com', $fixture->getModel('customer2')->email);
$this->assertEquals(2, $fixture['customer2']['profile_id']);
$test->tearDown();
}
public function testDataDirectory()
{
$test = new CustomDirectoryDbTestCase();
$test->setUp();
$fixture = $test->getFixture('customers');
$directory = $fixture->getModel('directory');
$this->assertEquals(1, $directory->id);
$this->assertEquals('directory@example.com', $directory['email']);
$test->tearDown();
}
public function testDataPath()
{
$test = new DataPathDbTestCase();
$test->setUp();
$fixture = $test->getFixture('customers');
$customer = $fixture->getModel('customer1');
$this->assertEquals(1, $customer->id);
$this->assertEquals('customer1@example.com', $customer['email']);
$test->tearDown();
}
public function testTruncate()
{
$test = new TruncateTestCase();
$test->setUp();
$fixture = $test->getFixture('animals');
$this->assertEmpty($fixture->data);
$test->tearDown();
}
/**
* @see https://github.com/yiisoft/yii2/pull/14343
*/
public function testDifferentModelDb()
{
$fixture = new DifferentDbFixture();
$this->assertSame('unique-dsn', $fixture->db->dsn);
$this->assertNotSame('unique-dsn', Yii::$app->getDb()->dsn);
}
}
class ProfileFixture extends ActiveFixture
{
public $modelClass = 'yiiunit\data\ar\Profile';
@ -79,6 +188,19 @@ class AnimalFixture extends ActiveFixture
public $modelClass = 'yiiunit\data\ar\Animal';
}
class DifferentDbFixture extends ActiveFixture
{
public $modelClass = 'yiiunit\framework\test\CustomDb';
}
class CustomDb extends ActiveRecord
{
public static function getDb()
{
return new Connection(['dsn' => 'unique-dsn']);
}
}
class BaseDbTestCase
{
use FixtureTrait;
@ -137,100 +259,3 @@ class TruncateTestCase extends BaseDbTestCase
];
}
}
/**
* @group fixture
* @group db
*/
class ActiveFixtureTest extends DatabaseTestCase
{
protected $driverName = 'mysql';
public function setUp()
{
parent::setUp();
$db = $this->getConnection();
\Yii::$app->set('db', $db);
ActiveRecord::$db = $db;
}
public function tearDown()
{
parent::tearDown();
}
public function testGetData()
{
$test = new CustomerDbTestCase();
$test->setUp();
$fixture = $test->getFixture('customers');
$this->assertEquals(CustomerFixture::className(), get_class($fixture));
$this->assertCount(2, $fixture);
$this->assertEquals(1, $fixture['customer1']['id']);
$this->assertEquals('customer1@example.com', $fixture['customer1']['email']);
$this->assertEquals(1, $fixture['customer1']['profile_id']);
$this->assertEquals(2, $fixture['customer2']['id']);
$this->assertEquals('customer2@example.com', $fixture['customer2']['email']);
$this->assertEquals(2, $fixture['customer2']['profile_id']);
$test->tearDown();
}
public function testGetModel()
{
$test = new CustomerDbTestCase();
$test->setUp();
$fixture = $test->getFixture('customers');
$this->assertEquals(Customer::className(), get_class($fixture->getModel('customer1')));
$this->assertEquals(1, $fixture->getModel('customer1')->id);
$this->assertEquals('customer1@example.com', $fixture->getModel('customer1')->email);
$this->assertEquals(1, $fixture['customer1']['profile_id']);
$this->assertEquals(2, $fixture->getModel('customer2')->id);
$this->assertEquals('customer2@example.com', $fixture->getModel('customer2')->email);
$this->assertEquals(2, $fixture['customer2']['profile_id']);
$test->tearDown();
}
public function testDataDirectory()
{
$test = new CustomDirectoryDbTestCase();
$test->setUp();
$fixture = $test->getFixture('customers');
$directory = $fixture->getModel('directory');
$this->assertEquals(1, $directory->id);
$this->assertEquals('directory@example.com', $directory['email']);
$test->tearDown();
}
public function testDataPath()
{
$test = new DataPathDbTestCase();
$test->setUp();
$fixture = $test->getFixture('customers');
$customer = $fixture->getModel('customer1');
$this->assertEquals(1, $customer->id);
$this->assertEquals('customer1@example.com', $customer['email']);
$test->tearDown();
}
public function testTruncate()
{
$test = new TruncateTestCase();
$test->setUp();
$fixture = $test->getFixture('animals');
$this->assertEmpty($fixture->data);
$test->tearDown();
}
}

Loading…
Cancel
Save