From a9519d39f7dbe5d26808868533fae1617978d2a2 Mon Sep 17 00:00:00 2001 From: mark_story <mark@mark-story.com> Date: Sun, 8 Mar 2015 13:51:46 -0400 Subject: [PATCH] Fix whitelist being empty during afterSave. whitelist should only be reset after afterSave event. Refs #6028 --- lib/Cake/Model/Model.php | 4 +-- lib/Cake/Test/Case/Model/ModelWriteTest.php | 32 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/lib/Cake/Model/Model.php b/lib/Cake/Model/Model.php index 72d4361b7..0bdbf2cab 100644 --- a/lib/Cake/Model/Model.php +++ b/lib/Cake/Model/Model.php @@ -1941,9 +1941,8 @@ class Model extends Object implements CakeEventListener { $this->_saveMulti($joined, $this->id, $db); } - $this->whitelist = $_whitelist; - if (!$success) { + $this->whitelist = $_whitelist; return $success; } @@ -1964,6 +1963,7 @@ class Model extends Object implements CakeEventListener { $this->_clearCache(); $this->validationErrors = array(); + $this->whitelist = $_whitelist; $this->data = false; return $success; diff --git a/lib/Cake/Test/Case/Model/ModelWriteTest.php b/lib/Cake/Test/Case/Model/ModelWriteTest.php index 529d62902..c0349ed48 100644 --- a/lib/Cake/Test/Case/Model/ModelWriteTest.php +++ b/lib/Cake/Test/Case/Model/ModelWriteTest.php @@ -387,6 +387,38 @@ class ModelWriteTest extends BaseModelTest { $this->assertEquals($whitelist, $model->whitelist); } +/** + * Test save() resets the whitelist after afterSave + * + * @return void + */ + public function testSaveResetWhitelistOnSuccess() { + $this->loadFixtures('Post'); + + $callback = array($this, 'callbackForWhitelistReset'); + $model = ClassRegistry::init('Post'); + $model->whitelist = array('author_id', 'title', 'body'); + $model->getEventManager()->attach($callback, 'Model.afterSave'); + $data = array( + 'title' => 'New post', + 'body' => 'Post body', + 'author_id' => 1 + ); + $result = $model->save($data); + $this->assertNotEmpty($result); + } + +/** + * Callback for testing whitelist in afterSave + * + * @param Model $model The model having save called. + * @return void + */ + public function callbackForWhitelistReset($event) { + $expected = array('author_id', 'title', 'body', 'updated', 'created'); + $this->assertEquals($expected, $event->subject()->whitelist); + } + /** * testSaveWithCounterCache method *