|
|
@@ -435,9 +435,12 @@ class TableTest extends TestCase
|
|
|
'table' => 'users',
|
|
|
'connection' => $this->connection,
|
|
|
]);
|
|
|
- $table->eventManager()->attach(function ($event, $query, $options) {
|
|
|
- $query->limit(1);
|
|
|
- }, 'Model.beforeFind');
|
|
|
+ $table->eventManager()->on(
|
|
|
+ 'Model.beforeFind',
|
|
|
+ function ($event, $query, $options) {
|
|
|
+ $query->limit(1);
|
|
|
+ }
|
|
|
+ );
|
|
|
|
|
|
$result = $table->find('all')->all();
|
|
|
$this->assertCount(1, $result, 'Should only have 1 record, limit 1 applied.');
|
|
|
@@ -456,10 +459,13 @@ class TableTest extends TestCase
|
|
|
'connection' => $this->connection,
|
|
|
]);
|
|
|
$expected = ['One', 'Two', 'Three'];
|
|
|
- $table->eventManager()->attach(function ($event, $query, $options) use ($expected) {
|
|
|
- $query->setResult($expected);
|
|
|
- $event->stopPropagation();
|
|
|
- }, 'Model.beforeFind');
|
|
|
+ $table->eventManager()->on(
|
|
|
+ 'Model.beforeFind',
|
|
|
+ function ($event, $query, $options) use ($expected) {
|
|
|
+ $query->setResult($expected);
|
|
|
+ $event->stopPropagation();
|
|
|
+ }
|
|
|
+ );
|
|
|
|
|
|
$query = $table->find('all');
|
|
|
$query->limit(1);
|
|
|
@@ -1680,7 +1686,7 @@ class TableTest extends TestCase
|
|
|
$this->assertSame($data, $entity);
|
|
|
$entity->set('password', 'foo');
|
|
|
};
|
|
|
- $table->eventManager()->attach($listener, 'Model.beforeSave');
|
|
|
+ $table->eventManager()->on('Model.beforeSave', $listener);
|
|
|
$this->assertSame($data, $table->save($data));
|
|
|
$this->assertEquals($data->id, self::$nextUserId);
|
|
|
$row = $table->find('all')->where(['id' => self::$nextUserId])->first();
|
|
|
@@ -1708,8 +1714,8 @@ class TableTest extends TestCase
|
|
|
$listener2 = function ($e, $entity, $options) {
|
|
|
$this->assertTrue($options['crazy']);
|
|
|
};
|
|
|
- $table->eventManager()->attach($listener1, 'Model.beforeSave');
|
|
|
- $table->eventManager()->attach($listener2, 'Model.beforeSave');
|
|
|
+ $table->eventManager()->on('Model.beforeSave', $listener1);
|
|
|
+ $table->eventManager()->on('Model.beforeSave', $listener2);
|
|
|
$this->assertSame($data, $table->save($data));
|
|
|
$this->assertEquals($data->id, self::$nextUserId);
|
|
|
|
|
|
@@ -1736,7 +1742,7 @@ class TableTest extends TestCase
|
|
|
$e->stopPropagation();
|
|
|
return $entity;
|
|
|
};
|
|
|
- $table->eventManager()->attach($listener, 'Model.beforeSave');
|
|
|
+ $table->eventManager()->on('Model.beforeSave', $listener);
|
|
|
$this->assertSame($data, $table->save($data));
|
|
|
$this->assertNull($data->id);
|
|
|
$row = $table->find('all')->where(['id' => self::$nextUserId])->first();
|
|
|
@@ -1763,10 +1769,104 @@ class TableTest extends TestCase
|
|
|
$this->assertSame($data, $entity);
|
|
|
$called = true;
|
|
|
};
|
|
|
- $table->eventManager()->attach($listener, 'Model.afterSave');
|
|
|
+ $table->eventManager()->on('Model.afterSave', $listener);
|
|
|
+
|
|
|
+ $calledAfterCommit = false;
|
|
|
+ $listenerAfterCommit = function ($e, $entity, $options) use ($data, &$calledAfterCommit) {
|
|
|
+ $this->assertSame($data, $entity);
|
|
|
+ $calledAfterCommit = true;
|
|
|
+ };
|
|
|
+ $table->eventManager()->on('Model.afterSaveCommit', $listenerAfterCommit);
|
|
|
+
|
|
|
$this->assertSame($data, $table->save($data));
|
|
|
$this->assertEquals($data->id, self::$nextUserId);
|
|
|
$this->assertTrue($called);
|
|
|
+ $this->assertTrue($calledAfterCommit);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Asserts that afterSaveCommit is also triggered for non-atomic saves
|
|
|
+ *
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ public function testAfterSaveCommitForNonAtomic()
|
|
|
+ {
|
|
|
+ $table = TableRegistry::get('users');
|
|
|
+ $data = new \Cake\ORM\Entity([
|
|
|
+ 'username' => 'superuser',
|
|
|
+ 'created' => new Time('2013-10-10 00:00'),
|
|
|
+ 'updated' => new Time('2013-10-10 00:00')
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $called = false;
|
|
|
+ $listener = function ($e, $entity, $options) use ($data, &$called) {
|
|
|
+ $this->assertSame($data, $entity);
|
|
|
+ $called = true;
|
|
|
+ };
|
|
|
+ $table->eventManager()->on('Model.afterSave', $listener);
|
|
|
+
|
|
|
+ $calledAfterCommit = false;
|
|
|
+ $listenerAfterCommit = function ($e, $entity, $options) use ($data, &$calledAfterCommit) {
|
|
|
+ $calledAfterCommit = true;
|
|
|
+ };
|
|
|
+ $table->eventManager()->on('Model.afterSaveCommit', $listenerAfterCommit);
|
|
|
+
|
|
|
+ $this->assertSame($data, $table->save($data, ['atomic' => false]));
|
|
|
+ $this->assertEquals($data->id, self::$nextUserId);
|
|
|
+ $this->assertTrue($called);
|
|
|
+ $this->assertTrue($calledAfterCommit);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Asserts the afterSaveCommit is not triggered if transaction is running.
|
|
|
+ *
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ public function testAfterSaveCommitWithTransactionRunning()
|
|
|
+ {
|
|
|
+ $table = TableRegistry::get('users');
|
|
|
+ $data = new \Cake\ORM\Entity([
|
|
|
+ 'username' => 'superuser',
|
|
|
+ 'created' => new Time('2013-10-10 00:00'),
|
|
|
+ 'updated' => new Time('2013-10-10 00:00')
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $called = false;
|
|
|
+ $listener = function ($e, $entity, $options) use (&$called) {
|
|
|
+ $called = true;
|
|
|
+ };
|
|
|
+ $table->eventManager()->on('Model.afterSaveCommit', $listener);
|
|
|
+
|
|
|
+ $this->connection->begin();
|
|
|
+ $this->assertSame($data, $table->save($data));
|
|
|
+ $this->assertFalse($called);
|
|
|
+ $this->connection->commit();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Asserts the afterSaveCommit is not triggered if transaction is running.
|
|
|
+ *
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ public function testAfterSaveCommitWithNonAtomicAndTransactionRunning()
|
|
|
+ {
|
|
|
+ $table = TableRegistry::get('users');
|
|
|
+ $data = new \Cake\ORM\Entity([
|
|
|
+ 'username' => 'superuser',
|
|
|
+ 'created' => new Time('2013-10-10 00:00'),
|
|
|
+ 'updated' => new Time('2013-10-10 00:00')
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $called = false;
|
|
|
+ $listener = function ($e, $entity, $options) use (&$called) {
|
|
|
+ $called = true;
|
|
|
+ };
|
|
|
+ $table->eventManager()->on('Model.afterSaveCommit', $listener);
|
|
|
+
|
|
|
+ $this->connection->begin();
|
|
|
+ $this->assertSame($data, $table->save($data, ['atomic' => false]));
|
|
|
+ $this->assertFalse($called);
|
|
|
+ $this->connection->commit();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1807,9 +1907,55 @@ class TableTest extends TestCase
|
|
|
$listener = function ($e, $entity, $options) use ($data, &$called) {
|
|
|
$called = true;
|
|
|
};
|
|
|
- $table->eventManager()->attach($listener, 'Model.afterSave');
|
|
|
+ $table->eventManager()->on('Model.afterSave', $listener);
|
|
|
+
|
|
|
+ $calledAfterCommit = false;
|
|
|
+ $listenerAfterCommit = function ($e, $entity, $options) use ($data, &$calledAfterCommit) {
|
|
|
+ $calledAfterCommit = true;
|
|
|
+ };
|
|
|
+ $table->eventManager()->on('Model.afterSaveCommit', $listenerAfterCommit);
|
|
|
+
|
|
|
$this->assertFalse($table->save($data));
|
|
|
$this->assertFalse($called);
|
|
|
+ $this->assertFalse($calledAfterCommit);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Asserts that afterSaveCommit callback is triggered only for primary table
|
|
|
+ *
|
|
|
+ * @group save
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ public function testAfterSaveCommitTriggeredOnlyForPrimaryTable()
|
|
|
+ {
|
|
|
+ $entity = new \Cake\ORM\Entity([
|
|
|
+ 'title' => 'A Title',
|
|
|
+ 'body' => 'A body'
|
|
|
+ ]);
|
|
|
+ $entity->author = new \Cake\ORM\Entity([
|
|
|
+ 'name' => 'Jose'
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $table = TableRegistry::get('articles');
|
|
|
+ $table->belongsTo('authors');
|
|
|
+
|
|
|
+ $calledForArticle = false;
|
|
|
+ $listenerForArticle = function ($e, $entity, $options) use (&$calledForArticle) {
|
|
|
+ $calledForArticle = true;
|
|
|
+ };
|
|
|
+ $table->eventManager()->on('Model.afterSaveCommit', $listenerForArticle);
|
|
|
+
|
|
|
+ $calledForAuthor = false;
|
|
|
+ $listenerForAuthor = function ($e, $entity, $options) use (&$calledForAuthor) {
|
|
|
+ $calledForAuthor = true;
|
|
|
+ };
|
|
|
+ $table->authors->eventManager()->on('Model.afterSaveCommit', $listenerForAuthor);
|
|
|
+
|
|
|
+ $this->assertSame($entity, $table->save($entity));
|
|
|
+ $this->assertFalse($entity->isNew());
|
|
|
+ $this->assertFalse($entity->author->isNew());
|
|
|
+ $this->assertTrue($calledForArticle);
|
|
|
+ $this->assertFalse($calledForAuthor);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -2070,7 +2216,7 @@ class TableTest extends TestCase
|
|
|
$this->assertFalse($entity->isNew());
|
|
|
$called = true;
|
|
|
};
|
|
|
- $table->eventManager()->attach($listener, 'Model.beforeSave');
|
|
|
+ $table->eventManager()->on('Model.beforeSave', $listener);
|
|
|
$this->assertSame($entity, $table->save($entity));
|
|
|
$this->assertTrue($called);
|
|
|
}
|
|
|
@@ -2321,12 +2467,12 @@ class TableTest extends TestCase
|
|
|
public function testDeleteCallbacks()
|
|
|
{
|
|
|
$entity = new \Cake\ORM\Entity(['id' => 1, 'name' => 'mark']);
|
|
|
- $options = new \ArrayObject(['atomic' => true, 'checkRules' => false]);
|
|
|
+ $options = new \ArrayObject(['atomic' => true, 'checkRules' => false, '_primary' => true]);
|
|
|
|
|
|
$mock = $this->getMock('Cake\Event\EventManager');
|
|
|
|
|
|
$mock->expects($this->at(0))
|
|
|
- ->method('attach');
|
|
|
+ ->method('on');
|
|
|
|
|
|
$mock->expects($this->at(1))
|
|
|
->method('dispatch');
|
|
|
@@ -2351,12 +2497,84 @@ class TableTest extends TestCase
|
|
|
)
|
|
|
));
|
|
|
|
|
|
+ $mock->expects($this->at(4))
|
|
|
+ ->method('dispatch')
|
|
|
+ ->with($this->logicalAnd(
|
|
|
+ $this->attributeEqualTo('_name', 'Model.afterDeleteCommit'),
|
|
|
+ $this->attributeEqualTo(
|
|
|
+ 'data',
|
|
|
+ ['entity' => $entity, 'options' => $options]
|
|
|
+ )
|
|
|
+ ));
|
|
|
+
|
|
|
$table = TableRegistry::get('users', ['eventManager' => $mock]);
|
|
|
$entity->isNew(false);
|
|
|
$table->delete($entity, ['checkRules' => false]);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * Test afterDeleteCommit is also called for non-atomic delete
|
|
|
+ *
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ public function testDeleteCallbacksNonAtomic()
|
|
|
+ {
|
|
|
+ $table = TableRegistry::get('users');
|
|
|
+
|
|
|
+ $data = $table->get(1);
|
|
|
+ $options = new \ArrayObject(['atomic' => false, 'checkRules' => false]);
|
|
|
+
|
|
|
+ $called = false;
|
|
|
+ $listener = function ($e, $entity, $options) use ($data, &$called) {
|
|
|
+ $this->assertSame($data, $entity);
|
|
|
+ $called = true;
|
|
|
+ };
|
|
|
+ $table->eventManager()->on('Model.afterDelete', $listener);
|
|
|
+
|
|
|
+ $calledAfterCommit = false;
|
|
|
+ $listenerAfterCommit = function ($e, $entity, $options) use ($data, &$calledAfterCommit) {
|
|
|
+ $calledAfterCommit = true;
|
|
|
+ };
|
|
|
+ $table->eventManager()->on('Model.afterDeleteCommit', $listenerAfterCommit);
|
|
|
+
|
|
|
+ $table->delete($data, ['atomic' => false]);
|
|
|
+ $this->assertTrue($called);
|
|
|
+ $this->assertTrue($calledAfterCommit);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Test that afterDeleteCommit is only triggered for primary table
|
|
|
+ *
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ public function testAfterDeleteCommitTriggeredOnlyForPrimaryTable()
|
|
|
+ {
|
|
|
+ $table = TableRegistry::get('authors');
|
|
|
+ $table->hasOne('articles', [
|
|
|
+ 'foreignKey' => 'author_id',
|
|
|
+ 'dependent' => true,
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $called = false;
|
|
|
+ $listener = function ($e, $entity, $options) use (&$called) {
|
|
|
+ $called = true;
|
|
|
+ };
|
|
|
+ $table->eventManager()->on('Model.afterDeleteCommit', $listener);
|
|
|
+
|
|
|
+ $called2 = false;
|
|
|
+ $listener = function ($e, $entity, $options) use (&$called2) {
|
|
|
+ $called2 = true;
|
|
|
+ };
|
|
|
+ $table->articles->eventManager()->on('Model.afterDeleteCommit', $listener);
|
|
|
+
|
|
|
+ $entity = $table->get(1);
|
|
|
+ $this->assertTrue($table->delete($entity));
|
|
|
+
|
|
|
+ $this->assertTrue($called);
|
|
|
+ $this->assertFalse($called2);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* Test delete beforeDelete can abort the delete.
|
|
|
*
|
|
|
* @return void
|
|
|
@@ -3588,7 +3806,7 @@ class TableTest extends TestCase
|
|
|
$cb = function ($event) use (&$count) {
|
|
|
$count++;
|
|
|
};
|
|
|
- EventManager::instance()->attach($cb, 'Model.initialize');
|
|
|
+ EventManager::instance()->on('Model.initialize', $cb);
|
|
|
$articles = TableRegistry::get('Articles');
|
|
|
|
|
|
$this->assertEquals(1, $count, 'Callback should be called');
|
|
|
@@ -3621,7 +3839,7 @@ class TableTest extends TestCase
|
|
|
$cb = function ($event) use (&$count) {
|
|
|
$count++;
|
|
|
};
|
|
|
- EventManager::instance()->attach($cb, 'Model.buildValidator');
|
|
|
+ EventManager::instance()->on('Model.buildValidator', $cb);
|
|
|
$articles = TableRegistry::get('Articles');
|
|
|
$articles->validator();
|
|
|
$this->assertEquals(1, $count, 'Callback should be called');
|
|
|
@@ -3700,33 +3918,33 @@ class TableTest extends TestCase
|
|
|
$eventManager = $table->eventManager();
|
|
|
|
|
|
$associationBeforeFindCount = 0;
|
|
|
- $table->association('authors')->target()->eventManager()->attach(
|
|
|
+ $table->association('authors')->target()->eventManager()->on(
|
|
|
+ 'Model.beforeFind',
|
|
|
function (Event $event, Query $query, ArrayObject $options, $primary) use (&$associationBeforeFindCount) {
|
|
|
$this->assertTrue(is_bool($primary));
|
|
|
$associationBeforeFindCount ++;
|
|
|
- },
|
|
|
- 'Model.beforeFind'
|
|
|
+ }
|
|
|
);
|
|
|
|
|
|
$beforeFindCount = 0;
|
|
|
- $eventManager->attach(
|
|
|
+ $eventManager->on(
|
|
|
+ 'Model.beforeFind',
|
|
|
function (Event $event, Query $query, ArrayObject $options, $primary) use (&$beforeFindCount) {
|
|
|
$this->assertTrue(is_bool($primary));
|
|
|
$beforeFindCount ++;
|
|
|
- },
|
|
|
- 'Model.beforeFind'
|
|
|
+ }
|
|
|
);
|
|
|
$table->find()->contain('authors')->first();
|
|
|
$this->assertEquals(1, $associationBeforeFindCount);
|
|
|
$this->assertEquals(1, $beforeFindCount);
|
|
|
|
|
|
$buildValidatorCount = 0;
|
|
|
- $eventManager->attach(
|
|
|
+ $eventManager->on(
|
|
|
+ 'Model.buildValidator',
|
|
|
$callback = function (Event $event, Validator $validator, $name) use (&$buildValidatorCount) {
|
|
|
$this->assertTrue(is_string($name));
|
|
|
$buildValidatorCount ++;
|
|
|
- },
|
|
|
- 'Model.buildValidator'
|
|
|
+ }
|
|
|
);
|
|
|
$table->validator();
|
|
|
$this->assertEquals(1, $buildValidatorCount);
|
|
|
@@ -3736,38 +3954,38 @@ class TableTest extends TestCase
|
|
|
$afterRulesCount =
|
|
|
$beforeSaveCount =
|
|
|
$afterSaveCount = 0;
|
|
|
- $eventManager->attach(
|
|
|
+ $eventManager->on(
|
|
|
+ 'Model.buildRules',
|
|
|
function (Event $event, RulesChecker $rules) use (&$buildRulesCount) {
|
|
|
$buildRulesCount ++;
|
|
|
- },
|
|
|
- 'Model.buildRules'
|
|
|
+ }
|
|
|
);
|
|
|
- $eventManager->attach(
|
|
|
+ $eventManager->on(
|
|
|
+ 'Model.beforeRules',
|
|
|
function (Event $event, Entity $entity, ArrayObject $options, $operation) use (&$beforeRulesCount) {
|
|
|
$this->assertTrue(is_string($operation));
|
|
|
$beforeRulesCount ++;
|
|
|
- },
|
|
|
- 'Model.beforeRules'
|
|
|
+ }
|
|
|
);
|
|
|
- $eventManager->attach(
|
|
|
+ $eventManager->on(
|
|
|
+ 'Model.afterRules',
|
|
|
function (Event $event, Entity $entity, ArrayObject $options, $result, $operation) use (&$afterRulesCount) {
|
|
|
$this->assertTrue(is_bool($result));
|
|
|
$this->assertTrue(is_string($operation));
|
|
|
$afterRulesCount ++;
|
|
|
- },
|
|
|
- 'Model.afterRules'
|
|
|
+ }
|
|
|
);
|
|
|
- $eventManager->attach(
|
|
|
+ $eventManager->on(
|
|
|
+ 'Model.beforeSave',
|
|
|
function (Event $event, Entity $entity, ArrayObject $options) use (&$beforeSaveCount) {
|
|
|
$beforeSaveCount ++;
|
|
|
- },
|
|
|
- 'Model.beforeSave'
|
|
|
+ }
|
|
|
);
|
|
|
- $eventManager->attach(
|
|
|
+ $eventManager->on(
|
|
|
+ 'Model.afterSave',
|
|
|
$afterSaveCallback = function (Event $event, Entity $entity, ArrayObject $options) use (&$afterSaveCount) {
|
|
|
$afterSaveCount ++;
|
|
|
- },
|
|
|
- 'Model.afterSave'
|
|
|
+ }
|
|
|
);
|
|
|
$entity = new Entity(['title' => 'Title']);
|
|
|
$this->assertNotFalse($table->save($entity));
|
|
|
@@ -3779,17 +3997,17 @@ class TableTest extends TestCase
|
|
|
|
|
|
$beforeDeleteCount =
|
|
|
$afterDeleteCount = 0;
|
|
|
- $eventManager->attach(
|
|
|
+ $eventManager->on(
|
|
|
+ 'Model.beforeDelete',
|
|
|
function (Event $event, Entity $entity, ArrayObject $options) use (&$beforeDeleteCount) {
|
|
|
$beforeDeleteCount ++;
|
|
|
- },
|
|
|
- 'Model.beforeDelete'
|
|
|
+ }
|
|
|
);
|
|
|
- $eventManager->attach(
|
|
|
+ $eventManager->on(
|
|
|
+ 'Model.afterDelete',
|
|
|
function (Event $event, Entity $entity, ArrayObject $options) use (&$afterDeleteCount) {
|
|
|
$afterDeleteCount ++;
|
|
|
- },
|
|
|
- 'Model.afterDelete'
|
|
|
+ }
|
|
|
);
|
|
|
$this->assertTrue($table->delete($entity, ['checkRules' => false]));
|
|
|
$this->assertEquals(1, $beforeDeleteCount);
|