2 require_once 'CiviTest/CiviUnitTestCase.php';
3 require_once 'CiviTest/Contact.php';
4 require_once 'CiviTest/Custom.php';
7 * Class CRM_Core_TransactionTest
9 class CRM_Core_TransactionTest
extends CiviUnitTestCase
{
13 $this->quickCleanup(array('civicrm_contact', 'civicrm_activity'));
16 function testDefaultCommit_RawInsert_1xOuter() {
20 $transactionalFunction_outermost = function () use (&$cid, $test) {
21 $tx = new CRM_Core_Transaction();
22 $r = CRM_Core_DAO
::executeQuery("INSERT INTO civicrm_contact(first_name,last_name) VALUES ('ff', 'll')");
23 $cid = mysql_insert_id();
24 $test->assertContactsExist(array($cid), TRUE);
26 // End of outermost $tx; COMMIT will execute ASAP
29 $transactionalFunction_outermost();
30 $test->assertContactsExist(array($cid), TRUE);
33 function testDefaultCommit_BaoCreate_1xOuter() {
37 $transactionalFunction_outermost = function () use (&$cid, $test) {
38 $tx = new CRM_Core_Transaction();
40 'contact_type' => 'Individual',
44 $r = CRM_Contact_BAO_Contact
::create($params);
46 $test->assertContactsExist(array($cid), TRUE);
48 // End of outermost $tx; COMMIT will execute ASAP
51 $transactionalFunction_outermost();
52 $test->assertContactsExist(array($cid), TRUE);
55 function testRollback_RawInsert_1xOuter() {
59 $transactionalFunction_outermost = function() use (&$cid, $test) {
60 $tx = new CRM_Core_Transaction();
62 $r = CRM_Core_DAO
::executeQuery("INSERT INTO civicrm_contact(first_name,last_name) VALUES ('ff', 'll')");
63 $cid = mysql_insert_id();
65 $test->assertContactsExist(array($cid), TRUE);
67 $tx->rollback(); // Mark ROLLBACK, but don't execute yet
69 // End of outermost $tx; ROLLBACK will execute ASAP
72 $transactionalFunction_outermost();
73 $test->assertContactsExist(array($cid), FALSE);
77 * Test in which an outer function ($transactionalFunction_outermost) makes multiple calls
78 * to inner functions ($transactionalFunction_inner) but then rollsback the entire set.
80 function testRollback_RawInsert_2xInner() {
84 $transactionalFunction_inner = function() use (&$cids, $test) {
85 $tx = new CRM_Core_Transaction();
87 $r = CRM_Core_DAO
::executeQuery("INSERT INTO civicrm_contact(first_name,last_name) VALUES ('ff', 'll')");
88 $cid = mysql_insert_id();
91 $test->assertContactsExist($cids, TRUE);
93 // End of inner $tx; neither COMMIT nor ROLLBACK b/c another $tx remains
96 $transactionalFunction_outermost = function() use (&$cids, $test, $transactionalFunction_inner) {
97 $tx = new CRM_Core_Transaction();
99 $transactionalFunction_inner();
100 $transactionalFunction_inner();
102 $tx->rollback(); // Mark ROLLBACK, but don't execute yet
104 $test->assertContactsExist($cids, TRUE); // not yet rolled back
106 // End of outermost $tx; ROLLBACK will execute ASAP
109 $transactionalFunction_outermost();
110 $test->assertContactsExist($cids, FALSE);
113 function testRollback_BaoCreate_1xOuter() {
117 $transactionalFunction_outermost = function() use (&$cid, $test) {
118 $tx = new CRM_Core_Transaction();
121 'contact_type' => 'Individual',
125 $r = CRM_Contact_BAO_Contact
::create($params);
128 $test->assertContactsExist(array($cid), TRUE);
130 $tx->rollback(); // Mark ROLLBACK, but don't execute yet
132 // End of outermost $tx; ROLLBACK will execute ASAP
135 $transactionalFunction_outermost();
137 // No outstanding $tx -- ROLLBACK should be done
138 $test->assertContactsExist(array($cid), FALSE);
142 * Test in which an outer function ($transactionalFunction_outermost) makes multiple calls
143 * to inner functions ($transactionalFunction_inner) but then rollsback the entire set.
145 function testRollback_BaoCreate_2xInner() {
149 $transactionalFunction_inner = function() use (&$cids, $test) {
150 $tx = new CRM_Core_Transaction();
153 'contact_type' => 'Individual',
157 $r = CRM_Contact_BAO_Contact
::create($params);
161 $test->assertContactsExist($cids, TRUE);
163 // end of inner $tx; neither COMMIT nor ROLLBACK b/c it's inner
166 $transactionalFunction_outermost = function() use (&$cids, $test, $transactionalFunction_inner) {
167 $tx = new CRM_Core_Transaction();
169 $transactionalFunction_inner();
170 $transactionalFunction_inner();
172 $tx->rollback(); // Mark ROLLBACK, but don't execute yet
174 $test->assertContactsExist($cids, TRUE); // not yet rolled back
176 // End of outermost $tx; ROLLBACK will execute ASAP
179 $transactionalFunction_outermost();
181 // No outstanding $tx -- ROLLBACK should be done
182 $test->assertContactsExist($cids, FALSE);
189 public function assertContactsExist($cids, $exist = TRUE) {
190 foreach ($cids as $cid) {
191 $this->assertTrue(is_numeric($cid));
192 $this->assertDBQuery($exist ?
1 : 0, 'SELECT count(*) FROM civicrm_contact WHERE id = %1', array(
193 1 => array($cid, 'Integer'),