Browse Source

Add test for dirty.

mscherer 1 year ago
parent
commit
5dba21b1cd

+ 0 - 1
tests/TestCase/I18n/DateTimeTest.php

@@ -3,7 +3,6 @@
 namespace Tools\Test\TestCase\I18n;
 
 use Cake\Core\Configure;
-use Cake\I18n\Date;
 use DateTime as CoreDateTime;
 use Shim\TestSuite\TestCase;
 use Tools\I18n\DateTime;

+ 32 - 0
tests/TestCase/Model/Behavior/AfterSaveBehaviorTest.php

@@ -3,6 +3,7 @@
 namespace Tools\Test\TestCase\Model\Behavior;
 
 use Shim\TestSuite\TestCase;
+use TestApp\Model\Table\PostsTable;
 
 class AfterSaveBehaviorTest extends TestCase {
 
@@ -82,4 +83,35 @@ class AfterSaveBehaviorTest extends TestCase {
 		$this->assertSame(['body' => 'test save'], $entityBefore->extractOriginal(['body']));
 	}
 
+	/**
+	 * @return void
+	 */
+	public function testAfterSaveCallbackWihoutBehavior() {
+		$table = $this->getTableLocator()->get('Posts');
+		$this->assertInstanceOf(PostsTable::class, $table);
+
+		$entity = $table->newEmptyEntity();
+		$entity = $table->patchEntity($entity, ['author_id' => 1, 'title' => 'Some title']);
+
+		$this->assertNotEmpty($entity->getDirty());
+
+		$table->saveOrFail($entity);
+
+		$dirty = $entity->getDirty();
+		$this->assertSame([], $dirty);
+
+		$dirtyBefore = $table->dirtyFieldsBefore;
+		$dirtyAfter = $table->dirtyFieldsAfter;
+
+		$this->assertSame(['author_id', 'title'], $dirtyBefore);
+		$this->assertSame(['author_id', 'title', 'id'], $dirtyAfter);
+
+		// Now we edit existing entity with only one field
+		$entity->title = 'New title';
+		$table->saveOrFail($entity);
+
+		$dirtyAfter = $table->dirtyFieldsAfter;
+		$this->assertSame(['title'], $dirtyAfter);
+	}
+
 }

+ 0 - 1
tests/TestCase/Model/Behavior/ConfirmableBehaviorTest.php

@@ -18,7 +18,6 @@ class ConfirmableBehaviorTest extends TestCase {
 	 */
 	protected $ConfirmableBehavior;
 
-
 	/**
 	 * ConfirmableBehaviorTest::testBasicValidation()
 	 *

+ 35 - 0
tests/test_app/Model/Table/PostsTable.php

@@ -2,7 +2,42 @@
 
 namespace TestApp\Model\Table;
 
+use ArrayObject;
+use Cake\Datasource\EntityInterface;
+use Cake\Event\EventInterface;
 use Tools\Model\Table\Table;
 
 class PostsTable extends Table {
+
+	/**
+	 * @var array<string>
+	 */
+	public array $dirtyFieldsBefore = [];
+
+	/**
+	 * @var array<string>
+	 */
+	public array $dirtyFieldsAfter = [];
+
+	/**
+	 * @param \Cake\Event\EventInterface $event
+	 * @param \Cake\Datasource\EntityInterface $entity
+	 * @param \ArrayObject $options
+	 *
+	 * @return void
+	 */
+	public function beforeSave(EventInterface $event, EntityInterface $entity, ArrayObject $options): void {
+		$this->dirtyFieldsBefore = $entity->getDirty();
+	}
+
+	/**
+	 * @param \Cake\Event\EventInterface $event
+	 * @param \Cake\Datasource\EntityInterface $entity
+	 * @param \ArrayObject $options
+	 *
+	 * @return void
+	 */
+	public function afterSave(EventInterface $event, EntityInterface $entity, ArrayObject $options): void {
+		$this->dirtyFieldsAfter = $entity->getDirty();
+	}
 }