diff --git a/app/code/Magento/AdminNotification/Setup/InstallSchema.php b/app/code/Magento/AdminNotification/Setup/InstallSchema.php index 31b8842ee72e5502ff200716c3761e519c378a45..f8118f245e8ff3cebc4cdf1e2adfc5ee3075a4ba 100644 --- a/app/code/Magento/AdminNotification/Setup/InstallSchema.php +++ b/app/code/Magento/AdminNotification/Setup/InstallSchema.php @@ -45,7 +45,7 @@ class InstallSchema implements InstallSchemaInterface 'date_added', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Create date' )->addColumn( 'title', @@ -112,7 +112,7 @@ class InstallSchema implements InstallSchemaInterface 'created_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Create date' )->setComment( 'Admin System Messages' diff --git a/app/code/Magento/Cron/Setup/InstallSchema.php b/app/code/Magento/Cron/Setup/InstallSchema.php index cc7b419fa4e66bbbfbb9468768fde123f37f1d03..e3368c677742fe41a016adc40ed7293e3e072dcf 100644 --- a/app/code/Magento/Cron/Setup/InstallSchema.php +++ b/app/code/Magento/Cron/Setup/InstallSchema.php @@ -57,7 +57,7 @@ class InstallSchema implements InstallSchemaInterface 'created_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Created At' )->addColumn( 'scheduled_at', diff --git a/app/code/Magento/Customer/Setup/InstallSchema.php b/app/code/Magento/Customer/Setup/InstallSchema.php index 6f6750f3797043f4f25cfb78b4fd5e83bd0f0b6a..e74309026a57bd6f342c9d09c4276cb64e1857e9 100644 --- a/app/code/Magento/Customer/Setup/InstallSchema.php +++ b/app/code/Magento/Customer/Setup/InstallSchema.php @@ -81,13 +81,13 @@ class InstallSchema implements InstallSchemaInterface 'created_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Created At' )->addColumn( 'updated_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE], 'Updated At' )->addColumn( 'is_active', @@ -134,7 +134,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Entity' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_address_entity' */ @@ -174,13 +174,13 @@ class InstallSchema implements InstallSchemaInterface 'created_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Created At' )->addColumn( 'updated_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE], 'Updated At' )->addColumn( 'is_active', @@ -202,7 +202,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Address Entity' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_address_entity_datetime' */ @@ -287,7 +287,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Address Entity Datetime' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_address_entity_decimal' */ @@ -372,7 +372,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Address Entity Decimal' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_address_entity_int' */ @@ -447,7 +447,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Address Entity Int' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_address_entity_text' */ @@ -524,7 +524,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Address Entity Text' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_address_entity_varchar' */ @@ -609,7 +609,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Address Entity Varchar' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_entity_datetime' */ @@ -684,7 +684,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Entity Datetime' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_entity_decimal' */ @@ -759,7 +759,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Entity Decimal' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_entity_int' */ @@ -834,7 +834,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Entity Int' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_entity_text' */ @@ -906,7 +906,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Entity Text' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_entity_varchar' */ @@ -981,7 +981,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Entity Varchar' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_group' */ @@ -1009,7 +1009,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Group' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_eav_attribute' */ @@ -1073,7 +1073,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Eav Attribute' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_form_attribute' */ @@ -1104,7 +1104,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Form Attribute' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_eav_attribute_website' */ @@ -1165,7 +1165,7 @@ class InstallSchema implements InstallSchemaInterface 'Customer Eav Attribute Website' ); $installer->getConnection()->createTable($table); - + /** * Create table 'customer_visitor' */ @@ -1193,8 +1193,8 @@ class InstallSchema implements InstallSchemaInterface 'Visitor Table' ); $installer->getConnection()->createTable($table); - + $installer->endSetup(); - + } } diff --git a/app/code/Magento/Downloadable/Setup/InstallSchema.php b/app/code/Magento/Downloadable/Setup/InstallSchema.php index e7043312e7a49331987f862339b2d8463041f45f..f377662176a55473a8bd1461f7db95c44a440043 100644 --- a/app/code/Magento/Downloadable/Setup/InstallSchema.php +++ b/app/code/Magento/Downloadable/Setup/InstallSchema.php @@ -216,14 +216,14 @@ class InstallSchema implements InstallSchemaInterface 'created_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Date of creation' ) ->addColumn( 'updated_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE], 'Date of modification' ) ->addColumn( @@ -390,14 +390,14 @@ class InstallSchema implements InstallSchemaInterface 'created_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Creation Time' ) ->addColumn( 'updated_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE], 'Update Time' ) ->addIndex( diff --git a/app/code/Magento/Eav/Setup/InstallSchema.php b/app/code/Magento/Eav/Setup/InstallSchema.php index 244cfe2d85e9e56e0e5771ef30b4c3b8888fbc0f..24c041c7e2c05bd1365bfb0166cae0f253d3c0c5 100644 --- a/app/code/Magento/Eav/Setup/InstallSchema.php +++ b/app/code/Magento/Eav/Setup/InstallSchema.php @@ -179,13 +179,13 @@ class InstallSchema implements InstallSchemaInterface 'created_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Created At' )->addColumn( 'updated_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE], 'Updated At' )->addColumn( 'is_active', diff --git a/app/code/Magento/Integration/Setup/InstallSchema.php b/app/code/Magento/Integration/Setup/InstallSchema.php index 7c6bfda56692ba91f7ceb1170b00f28b055c88a4..9588da6905210f53b0c47aaecc05c1f483d30107 100644 --- a/app/code/Magento/Integration/Setup/InstallSchema.php +++ b/app/code/Magento/Integration/Setup/InstallSchema.php @@ -316,13 +316,13 @@ class InstallSchema implements InstallSchemaInterface 'created_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Creation Time' )->addColumn( 'updated_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_UPDATE], 'Update Time' )->addColumn( 'setup_type', diff --git a/app/code/Magento/Log/Setup/InstallSchema.php b/app/code/Magento/Log/Setup/InstallSchema.php index 1cf4f0832bf5032958659da8bc0b55f24b244371..372d41188ca9e537430493c40e5342e5e89fadbf 100644 --- a/app/code/Magento/Log/Setup/InstallSchema.php +++ b/app/code/Magento/Log/Setup/InstallSchema.php @@ -95,7 +95,7 @@ class InstallSchema implements InstallSchemaInterface 'created_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Creation Time' )->addColumn( 'deleted_at', @@ -147,7 +147,7 @@ class InstallSchema implements InstallSchemaInterface 'add_date', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Date' )->setComment( 'Log Summary Table' diff --git a/app/code/Magento/ProductAlert/Setup/InstallSchema.php b/app/code/Magento/ProductAlert/Setup/InstallSchema.php index 8ccda0176f7682591e0a283f97287450c331ae2d..9926f11ef1196ec4729cdb8c68a56c64ab5be4e5 100644 --- a/app/code/Magento/ProductAlert/Setup/InstallSchema.php +++ b/app/code/Magento/ProductAlert/Setup/InstallSchema.php @@ -63,7 +63,7 @@ class InstallSchema implements InstallSchemaInterface 'add_date', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Product alert add date' )->addColumn( 'last_send_date', @@ -148,7 +148,7 @@ class InstallSchema implements InstallSchemaInterface 'add_date', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Product alert add date' )->addColumn( 'send_date', diff --git a/app/code/Magento/Reports/Setup/InstallSchema.php b/app/code/Magento/Reports/Setup/InstallSchema.php index 707597f5a747a2192ff1cb20072745c0a6e21ff4..7e619a704833f703ce6f0c9f97e4a37333e1912e 100644 --- a/app/code/Magento/Reports/Setup/InstallSchema.php +++ b/app/code/Magento/Reports/Setup/InstallSchema.php @@ -73,7 +73,7 @@ class InstallSchema implements InstallSchemaInterface 'added_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Added At' ) ->addIndex( @@ -181,7 +181,7 @@ class InstallSchema implements InstallSchemaInterface 'added_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Added At' ) ->addIndex( @@ -288,7 +288,7 @@ class InstallSchema implements InstallSchemaInterface 'logged_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Logged At' ) ->addColumn( @@ -411,7 +411,7 @@ class InstallSchema implements InstallSchemaInterface 'added_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Added At' ) ->addIndex( @@ -517,7 +517,7 @@ class InstallSchema implements InstallSchemaInterface 'added_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Added At' ) ->addIndex( diff --git a/app/code/Magento/Review/Setup/InstallSchema.php b/app/code/Magento/Review/Setup/InstallSchema.php index 276b7389bff8fd84a89d735d65747ae079a59320..147688bdf15e3b7dbab52eefab5c1104c547a77a 100644 --- a/app/code/Magento/Review/Setup/InstallSchema.php +++ b/app/code/Magento/Review/Setup/InstallSchema.php @@ -84,7 +84,7 @@ class InstallSchema implements InstallSchemaInterface 'created_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Review create date' ) ->addColumn( diff --git a/app/code/Magento/Sales/Setup/InstallSchema.php b/app/code/Magento/Sales/Setup/InstallSchema.php index fd517941e38a02bb475a13e56ab6100dd531a911..93192e49bb663de74eaf6f9c87948ed058a649a4 100644 --- a/app/code/Magento/Sales/Setup/InstallSchema.php +++ b/app/code/Magento/Sales/Setup/InstallSchema.php @@ -1308,13 +1308,13 @@ class InstallSchema implements InstallSchemaInterface 'created_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Created At' )->addColumn( 'updated_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE], 'Updated At' )->addColumn( 'product_id', diff --git a/app/code/Magento/Search/Setup/InstallSchema.php b/app/code/Magento/Search/Setup/InstallSchema.php index 3c20f81310ed0b9ecc5c0bd6cbb08c82eafcce28..d58c0da9a8946015c721e96229746d6beae6703a 100644 --- a/app/code/Magento/Search/Setup/InstallSchema.php +++ b/app/code/Magento/Search/Setup/InstallSchema.php @@ -104,7 +104,7 @@ class InstallSchema implements InstallSchemaInterface 'updated_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, - ['nullable' => false], + ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE], 'Updated at' ) ->addIndex( diff --git a/lib/internal/Magento/Framework/DB/Ddl/Table.php b/lib/internal/Magento/Framework/DB/Ddl/Table.php index eee5ed9bc320a574eec14163bcf05fa4b21fd353..a623ba4c0fb3398a107d72140fe711adfa19b946 100644 --- a/lib/internal/Magento/Framework/DB/Ddl/Table.php +++ b/lib/internal/Magento/Framework/DB/Ddl/Table.php @@ -59,7 +59,7 @@ class Table const MAX_VARBINARY_SIZE = 2147483648; /** - * Default values for timestampses - fill with current timestamp on inserting record, on changing and both cases + * Default values for timestamps - fill with current timestamp on inserting record, on changing and both cases */ const TIMESTAMP_INIT_UPDATE = 'TIMESTAMP_INIT_UPDATE'; diff --git a/lib/internal/Magento/Framework/Model/AbstractModel.php b/lib/internal/Magento/Framework/Model/AbstractModel.php index 43223069055fdaab1fe7decf6754233bf990ab5a..fcd03252a4160d16805909a3bc45492f896f2e85 100644 --- a/lib/internal/Magento/Framework/Model/AbstractModel.php +++ b/lib/internal/Magento/Framework/Model/AbstractModel.php @@ -127,6 +127,13 @@ abstract class AbstractModel extends \Magento\Framework\Object */ protected $_actionValidator; + /** + * Array to store object's original data + * + * @var array + */ + protected $storedData = []; + /** * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry @@ -301,6 +308,7 @@ abstract class AbstractModel extends \Magento\Framework\Object $this->_afterLoad(); $this->setOrigData(); $this->_hasDataChanges = false; + $this->updateStoredData(); return $this; } @@ -354,6 +362,7 @@ abstract class AbstractModel extends \Magento\Framework\Object { $this->getResource()->afterLoad($this); $this->_afterLoad(); + $this->updateStoredData(); return $this; } @@ -566,6 +575,7 @@ abstract class AbstractModel extends \Magento\Framework\Object $this->_eventManager->dispatch('model_save_after', ['object' => $this]); $this->_eventManager->dispatch('clean_cache_by_tags', ['object' => $this]); $this->_eventManager->dispatch($this->_eventPrefix . '_save_after', $this->_getEventData()); + $this->updateStoredData(); return $this; } @@ -611,6 +621,7 @@ abstract class AbstractModel extends \Magento\Framework\Object $this->_eventManager->dispatch('model_delete_after', ['object' => $this]); $this->_eventManager->dispatch('clean_cache_by_tags', ['object' => $this]); $this->_eventManager->dispatch($this->_eventPrefix . '_delete_after', $this->_getEventData()); + $this->storedData = []; return $this; } @@ -689,4 +700,29 @@ abstract class AbstractModel extends \Magento\Framework\Object { return $this; } + + /** + * Synchronize object's stored data with the actual data + * + * @return $this + */ + private function updateStoredData() + { + if (isset($this->_data)) { + $this->storedData = $this->_data; + } else { + $this->storedData = []; + } + return $this; + } + + /** + * Model StoredData getter + * + * @return array + */ + public function getStoredData() + { + return $this->storedData; + } } diff --git a/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php b/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php index 393c90be8e000891cad8ca84d83e6e8cbcf3ccc7..351365b08d9eb57d45b6b65a50c53edbb93d482c 100644 --- a/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php +++ b/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php @@ -417,9 +417,10 @@ abstract class AbstractDb extends \Magento\Framework\Model\Resource\AbstractReso * Not auto increment primary key support */ if ($this->_isPkAutoIncrement) { - $data = $this->_prepareDataForSave($object); - unset($data[$this->getIdFieldName()]); - $this->_getWriteAdapter()->update($this->getMainTable(), $data, $condition); + $data = $this->prepareDataForUpdate($object); + if (!empty($data)) { + $this->_getWriteAdapter()->update($this->getMainTable(), $data, $condition); + } } else { $select = $this->_getWriteAdapter()->select()->from( $this->getMainTable(), @@ -428,8 +429,7 @@ abstract class AbstractDb extends \Magento\Framework\Model\Resource\AbstractReso $condition ); if ($this->_getWriteAdapter()->fetchOne($select) !== false) { - $data = $this->_prepareDataForSave($object); - unset($data[$this->getIdFieldName()]); + $data = $this->prepareDataForUpdate($object); if (!empty($data)) { $this->_getWriteAdapter()->update($this->getMainTable(), $data, $condition); } @@ -770,4 +770,27 @@ abstract class AbstractDb extends \Magento\Framework\Model\Resource\AbstractReso } return $checksum; } + + /** + * Get the array of data fields that was changed or added + * + * @param \Magento\Framework\Model\AbstractModel $object + * @return array + */ + protected function prepareDataForUpdate($object) + { + $data = $object->getData(); + foreach ($object->getStoredData() as $key => $value) { + if (array_key_exists($key, $data) && $data[$key] === $value) { + unset($data[$key]); + } + } + $dataObject = clone $object; + $dataObject->setData($data); + $data = $this->_prepareDataForTable($dataObject, $this->getMainTable()); + unset($data[$this->getIdFieldName()]); + unset($dataObject); + + return $data; + } } diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/AbstractModelTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/AbstractModelTest.php index 49b76a75b8ac30215540f4ebee497986fa232d84..71df4ee8ed9475b92e10972758dc62b3b5926bb3 100644 --- a/lib/internal/Magento/Framework/Model/Test/Unit/AbstractModelTest.php +++ b/lib/internal/Magento/Framework/Model/Test/Unit/AbstractModelTest.php @@ -108,4 +108,22 @@ class AbstractModelTest extends \PHPUnit_Framework_TestCase $this->resourceMock->expects($this->once())->method('delete')->with($this->model); $this->model->delete(); } + + public function testUpdateStoredData() + { + $this->model->setData( + [ + 'id' => 1000, + 'name' => 'Test Name' + ] + ); + $this->assertEmpty($this->model->getStoredData()); + $this->model->afterLoad(); + $this->assertEquals($this->model->getData(), $this->model->getStoredData()); + $this->model->setData('value', 'Test Value'); + $this->model->afterSave(); + $this->assertEquals($this->model->getData(), $this->model->getStoredData()); + $this->model->afterDelete(); + $this->assertEmpty($this->model->getStoredData()); + } } diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Resource/Db/AbstractDbTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Resource/Db/AbstractDbTest.php index 66e49e079e7f0f340db69bf355c973c1b894e9a9..6745f6d62c7412089519d0bd6569d0ef29624cbd 100644 --- a/lib/internal/Magento/Framework/Model/Test/Unit/Resource/Db/AbstractDbTest.php +++ b/lib/internal/Magento/Framework/Model/Test/Unit/Resource/Db/AbstractDbTest.php @@ -61,7 +61,12 @@ class AbstractDbTest extends \PHPUnit_Framework_TestCase $this->_model = $this->getMockForAbstractClass( 'Magento\Framework\Model\Resource\Db\AbstractDb', - [$contextMock] + [$contextMock], + '', + true, + true, + true, + ['_prepareDataForTable'] ); } @@ -422,4 +427,85 @@ class AbstractDbTest extends \PHPUnit_Framework_TestCase [null, false] ]; } + + public function testPrepareDataForUpdate() + { + $adapterInterfaceMock = $this->getMock('\Magento\Framework\DB\Adapter\AdapterInterface', [], [], '', false); + $context = (new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this))->getObject( + 'Magento\Framework\Model\Context' + ); + $registryMock = $this->getMock('\Magento\Framework\Registry', [], [], '', false); + $resourceMock = $this->getMock( + 'Magento\Framework\Model\Resource\Db\AbstractDb', + [ + '_construct', + '_getReadAdapter', + '_getWriteAdapter', + '__wakeup', + 'getIdFieldName' + ], + [], + '', + false + ); + $adapterMock = $this->getMock('Magento\Framework\DB\Adapter\AdapterInterface', [], [], '', false); + $resourceMock->expects($this->any()) + ->method('_getWriteAdapter') + ->will($this->returnValue($adapterMock)); + $resourceCollectionMock = $this->getMock('Magento\Framework\Data\Collection\Db', [], [], '', false); + $abstractModelMock = $this->getMockForAbstractClass( + 'Magento\Framework\Model\AbstractModel', + [$context, $registryMock, $resourceMock, $resourceCollectionMock] + ); + $data = 'tableName'; + $this->_resourcesMock->expects($this->any()) + ->method('getConnection') + ->will($this->returnValue($adapterInterfaceMock) + ); + $this->_resourcesMock->expects($this->any())->method('getTableName')->with($data)->will( + $this->returnValue('tableName') + ); + $this->_resourcesMock->expects($this->any()) + ->method('_getWriteAdapter') + ->will($this->returnValue($adapterInterfaceMock)); + $mainTableReflection = new \ReflectionProperty( + 'Magento\Framework\Model\Resource\Db\AbstractDb', + '_mainTable' + ); + $mainTableReflection->setAccessible(true); + $mainTableReflection->setValue($this->_model, 'tableName'); + $idFieldNameReflection = new \ReflectionProperty( + 'Magento\Framework\Model\Resource\Db\AbstractDb', + '_idFieldName' + ); + $idFieldNameReflection->setAccessible(true); + $idFieldNameReflection->setValue($this->_model, 'idFieldName'); + $adapterInterfaceMock->expects($this->any())->method('save')->with('tableName', 'idFieldName'); + $adapterInterfaceMock->expects($this->any())->method('quoteInto')->will($this->returnValue('idFieldName')); + + $abstractModelMock->setIdFieldName('id'); + $abstractModelMock->setData( + [ + 'id' => 12345, + 'name' => 'Test Name', + 'value' => 'Test Value' + ] + ); + $abstractModelMock->afterLoad(); + $this->assertEquals($abstractModelMock->getData(), $abstractModelMock->getStoredData()); + $newData = ['value' => 'Test Value New']; + $this->_model->expects($this->once())->method('_prepareDataForTable')->will($this->returnValue($newData)); + $abstractModelMock->addData($newData); + $this->assertNotEquals($abstractModelMock->getData(), $abstractModelMock->getStoredData()); + $abstractModelMock->isObjectNew(false); + $adapterInterfaceMock->expects($this->once()) + ->method('update') + ->with( + 'tableName', + $newData, + 'idFieldName' + ); + + $this->_model->save($abstractModelMock); + } }