Skip to content
This repository has been archived by the owner on May 27, 2023. It is now read-only.

Commit

Permalink
Merge branch 'release/0.3.7'
Browse files Browse the repository at this point in the history
  • Loading branch information
IvanChepurnyi committed Oct 31, 2014
2 parents decb1d4 + cdc2129 commit 01d53b8
Show file tree
Hide file tree
Showing 10 changed files with 279 additions and 13 deletions.
36 changes: 30 additions & 6 deletions app/code/community/EcomDev/PHPUnit/Model/Fixture/Processor/Eav.php
Expand Up @@ -89,10 +89,15 @@ public function apply(array $data, $key, EcomDev_PHPUnit_Model_FixtureInterface
$this->getResource()->beginTransaction();

foreach ($data as $entityType => $values) {
$eavLoaders[] = $this->_getEavLoader($entityType)
$eavLoaders[$entityType] = $this->_getEavLoader($entityType)
->setFixture($fixture)
->setOptions($fixture->getOptions())
->loadEntity($entityType, $values);
->setOptions($fixture->getOptions());

if ($eavLoaders[$entityType] instanceof EcomDev_PHPUnit_Model_Mysql4_Fixture_RestoreAwareInterface) {
$eavLoaders[$entityType]->saveData($entityType);
}

$eavLoaders[$entityType]->loadEntity($entityType, $values);
}

$this->getResource()->commit();
Expand Down Expand Up @@ -126,16 +131,35 @@ public function discard(array $data, $key, EcomDev_PHPUnit_Model_FixtureInterfac
EcomDev_PHPUnit_Model_FixtureInterface::SCOPE_SHARED);
}

$typesToRestore = array();
$this->getResource()->beginTransaction();
foreach (array_keys($data) as $entityType) {
$eavLoader = $this->_getEavLoader($entityType);

if (in_array($entityType, $ignoreCleanUp)) {
if ($eavLoader instanceof EcomDev_PHPUnit_Model_Mysql4_Fixture_RestoreAwareInterface) {
$eavLoader->clearData($entityType);
}
continue;
}
$this->_getEavLoader($entityType)
->cleanEntity($entityType);
}

$eavLoader->cleanEntity($entityType);

if ($eavLoader instanceof EcomDev_PHPUnit_Model_Mysql4_Fixture_RestoreAwareInterface) {
$typesToRestore[$entityType] = $eavLoader;
}
}
$this->getResource()->commit();

if ($typesToRestore) {
$this->getResource()->beginTransaction();
foreach ($typesToRestore as $entityType => $eavLoader) {
$eavLoader->restoreData($entityType)
->clearData($entityType);
}
$this->getResource()->commit();
}

return $this;
}
}
Expand Up @@ -22,7 +22,10 @@
*/
abstract class EcomDev_PHPUnit_Model_Mysql4_Fixture_AbstractEav
extends EcomDev_PHPUnit_Model_Mysql4_Fixture_AbstractComplex
implements EcomDev_PHPUnit_Model_Mysql4_Fixture_RestoreAwareInterface
{
const RESTORE_KEY = 'restore_%s_data';

/**
* List of indexers required to build
*
Expand All @@ -37,6 +40,20 @@ abstract class EcomDev_PHPUnit_Model_Mysql4_Fixture_AbstractEav
*/
protected $_originalIndexers = array();

/**
* List of tables that should be restored after run
*
* @var string[]
*/
protected $_restoreTables = array();

/**
* Default data for eav entity
*
* @var array
*/
protected $_defaultData = array();

/**
* Retrieve required indexers for re-building
*
Expand Down Expand Up @@ -99,6 +116,69 @@ public function cleanEntity($entityType)
return $this;
}


/**
* Saves data for restoring it after fixture has been cleaned up
*
* @param string $code storage code
* @return $this
*/
public function saveData($code)
{
if ($this->_restoreTables) {
$storageKey = sprintf(self::RESTORE_KEY, $code);
$data = array();
foreach ($this->_restoreTables as $table) {
$select = $this->_getReadAdapter()->select();
$select->from($table);
$data[$table] = $this->_getReadAdapter()->fetchAll($select);
}
$this->_fixture->setStorageData($storageKey, $data);
}

return $this;
}

/**
* Restored saved data
*
* @param string $code storage code
* @return $this
*/
public function restoreData($code)
{
if ($this->_restoreTables) {
$storageKey = sprintf(self::RESTORE_KEY, $code);
$data = $this->_fixture->getStorageData($storageKey);
foreach ($this->_restoreTables as $table) {
if (!empty($data[$table])) {
$this->_getWriteAdapter()->insertOnDuplicate(
$table,
$data[$table]
);
}
}
}

return $this;
}

/**
* Clears storage from stored backup data
*
* @param $code
* @return $this
*/
public function clearData($code)
{
if ($this->_restoreTables) {
$storageKey = sprintf(self::RESTORE_KEY, $code);
$this->_fixture->setStorageData($storageKey, array());
}

return $this;
}

/**
* Loads EAV data into DB tables
*
Expand Down Expand Up @@ -139,16 +219,43 @@ public function loadEntity($entityType, $values)
// and rows list as value
// See getCustomTableRecords
$customValues = array();

if ($this->_defaultData) {
$dataToInsert = $this->_defaultData;
// Prevent insertion of default data,
// if there is already data available
foreach ($values as $index => $row) {
if (isset($row[$this->_getEntityIdField($entityTypeModel)])
&& isset($dataToInsert[$this->_getEntityIdField($entityTypeModel)])) {
$dataToInsert = array();
break;
}
}

foreach ($dataToInsert as $row) {
array_unshift($values, $row);
}
}


foreach ($values as $index => &$row) {
foreach ($values as $index => $row) {
if (!isset($row[$this->_getEntityIdField($entityTypeModel)])) {
throw new RuntimeException('Entity Id should be specified in EAV fixture');
}

// Fulfill necessary information
$row['entity_type_id'] = $entityTypeModel->getEntityTypeId();
$values[$index]['entity_type_id'] = $entityTypeModel->getEntityTypeId();
$row = $values[$index];

if (!isset($row['attribute_set_id'])) {
$row['attribute_set_id'] = $entityTypeModel->getDefaultAttributeSetId();
$defaultAttributeSet = $entityTypeModel->getDefaultAttributeSetId();

// Fix Magento core issue with attribute set information for customer and its address
if (in_array($entityType, array('customer', 'customer_address'))) {
$defaultAttributeSet = 0;
}

$values[$index]['attribute_set_id'] = $defaultAttributeSet;
}

// Preparing entity table record
Expand Down
Expand Up @@ -23,9 +23,36 @@
*/
class EcomDev_PHPUnit_Model_Mysql4_Fixture_Eav_Catalog_Category extends EcomDev_PHPUnit_Model_Mysql4_Fixture_Eav_Catalog_Abstract
{
const XML_PATH_DEFAULT_DATA = 'phpunit/suite/fixture/default_data/category';

protected $_requiredIndexers = array(
'catalog_category_flat'
);

protected function _construct()
{
parent::_construct();
$defaultData = Mage::getConfig()->getNode(self::XML_PATH_DEFAULT_DATA);

if ($defaultData) {
foreach ($defaultData->children() as $item) {
if (!isset($item->entity_id)) {
continue;
}

$entityId = (string)$item->entity_id;
$this->_defaultData[$entityId] = array();
foreach ($item->children() as $value) {
$this->_defaultData[$entityId][$value->getName()] = (string)$value;
}
}
}

$this->_restoreTables[] = $this->getTable('catalog/category');
foreach (array('datetime', 'decimal', 'int', 'text', 'varchar') as $suffix) {
$this->_restoreTables[] = $this->getTable(array('catalog/category', $suffix));
}
}

/**
* Overridden to add easy fixture loading for product associations
Expand Down
@@ -0,0 +1,28 @@
<?php

interface EcomDev_PHPUnit_Model_Mysql4_Fixture_RestoreAwareInterface
{
/**
* Saves data for restoring it after fixture has been cleaned up
*
* @param string $code storage code
* @return $this
*/
public function saveData($code);

/**
* Restored saved data
*
* @param string $code storage code
* @return $this
*/
public function restoreData($code);

/**
* Clears storage from stored backup data
*
* @param $code
* @return $this
*/
public function clearData($code);
}
1 change: 1 addition & 0 deletions app/code/community/EcomDev/PHPUnit/Test/Case.php
Expand Up @@ -24,6 +24,7 @@
*
* @method EcomDev_PHPUnit_Mock_Proxy mockClassAlias(string $type, $classAlias, array $methods = array(), array $constructorArgs = array())
* @method EcomDev_PHPUnit_Mock_Proxy mockModel($classAlias, array $methods = array(), array $constructorArgs = array())
* @method EcomDev_PHPUnit_Mock_Proxy mockResourceModel($classAlias, array $methods = array(), array $constructorArgs = array())
* @method EcomDev_PHPUnit_Mock_Proxy mockBlock($classAlias, array $methods = array(), array $constructorArgs = array())
* @method EcomDev_PHPUnit_Mock_Proxy mockHelper($classAlias, array $methods = array(), array $constructorArgs = array())
* @method EcomDev_PHPUnit_Mock_Proxy mockSession($classAlias, array $methods = array())
Expand Down
15 changes: 15 additions & 0 deletions app/code/community/EcomDev/PHPUnit/Test/Case/Helper/Mock.php
Expand Up @@ -55,6 +55,21 @@ public function helperMockModel($classAlias, array $methods = array(), array $co
return $this->helperMockClassAlias('model', $classAlias, $methods, $constructorArgs);
}

/**
* Creates a mock for a resource model by its class alias
*
* @param string $classAlias
* @param array $methods
* @param array $constructorArgs
*
* @return EcomDev_PHPUnit_Mock_Proxy
*/
public function helperMockResourceModel($classAlias, array $methods = array(), array $constructorArgs = array())
{
return $this->helperMockClassAlias('resource_model', $classAlias, $methods, $constructorArgs);
}


/**
* Creates a mock for a block by its class alias
*
Expand Down
3 changes: 2 additions & 1 deletion app/code/community/EcomDev/PHPUnit/Test/Case/Util.php
Expand Up @@ -501,7 +501,7 @@ public static function getGroupedClassName($type, $classAlias)
public static function getGroupedClassMockBuilder(PHPUnit_Framework_TestCase $testCase, $type, $classAlias)
{
$className = self::getGroupedClassName($type, $classAlias);
return new EcomDev_PHPUnit_Mock_Proxy($testCase, $className);
return new EcomDev_PHPUnit_Mock_Proxy($testCase, $className, $classAlias);
}

/**
Expand All @@ -511,6 +511,7 @@ public static function getGroupedClassMockBuilder(PHPUnit_Framework_TestCase $te
public static function setUp()
{
self::app()->resetDispatchedEvents();
self::$originalStore = Mage::app()->getStore()->getCode();
}

/**
Expand Down
6 changes: 3 additions & 3 deletions app/code/community/EcomDev/PHPUnit/Test/Listener.php
Expand Up @@ -173,16 +173,16 @@ public function endTest(PHPUnit_Framework_Test $test, $time)
));

if ($test instanceof PHPUnit_Framework_TestCase) {
EcomDev_PHPUnit_Helper::tearDown();
EcomDev_PHPUnit_Test_Case_Util::tearDown();

EcomDev_PHPUnit_Test_Case_Util::getFixture(get_class($test))
->setScope(EcomDev_PHPUnit_Model_FixtureInterface::SCOPE_LOCAL)
->discard(); // Clear applied fixture

if (EcomDev_PHPUnit_Test_Case_Util::getExpectation(get_class($test))->isLoaded()) {
EcomDev_PHPUnit_Test_Case_Util::getExpectation(get_class($test))->discard();
}

EcomDev_PHPUnit_Test_Case_Util::tearDown();
EcomDev_PHPUnit_Helper::tearDown();
}

Mage::dispatchEvent('phpunit_test_end_after', array(
Expand Down
31 changes: 31 additions & 0 deletions app/code/community/EcomDev/PHPUnit/etc/config.xml
Expand Up @@ -114,6 +114,37 @@
<catalog_product>ecomdev_phpunit/fixture_eav_catalog_product</catalog_product>
<catalog_category>ecomdev_phpunit/fixture_eav_catalog_category</catalog_category>
</eav>
<default_data>
<category>
<root>
<entity_id>1</entity_id>
<parent_id>0</parent_id>
<path>1</path>
<position>0</position>
<level>0</level>
<children_count>1</children_count>
<name>Root Catalog</name>
<url_key>root-catalog</url_key>
<is_active>1</is_active>
<is_anchor>0</is_anchor>
<attribute_set_id>0</attribute_set_id>
</root>
<default_category>
<entity_id>2</entity_id>
<parent_id>1</parent_id>
<path>1/2</path>
<position>1</position>
<level>1</level>
<children_count>0</children_count>
<name>Default Category</name>
<url_key>default-category</url_key>
<is_active>1</is_active>
<is_anchor>0</is_anchor>
<display_mode>PRODUCTS</display_mode>
<include_in_menu>1</include_in_menu>
</default_category>
</category>
</default_data>
</fixture>
<app>
<!-- Application class name for running tests -->
Expand Down

0 comments on commit 01d53b8

Please sign in to comment.