2 require_once 'CiviTest/CiviUnitTestCase.php';
3 require_once 'CiviTest/Contact.php';
4 require_once 'CiviTest/Custom.php';
5 class CRM_Core_TransactionTest
extends CiviUnitTestCase
{
9 $this->quickCleanup(array('civicrm_contact', 'civicrm_activity'));
12 function testDefaultCommit_RawInsert_1xOuter() {
16 $transactionalFunction_outermost = function () use (&$cid, $test) {
17 $tx = new CRM_Core_Transaction();
18 $r = CRM_Core_DAO
::executeQuery("INSERT INTO civicrm_contact(first_name,last_name) VALUES ('ff', 'll')");
19 $cid = mysql_insert_id();
20 $test->assertContactsExist(array($cid), TRUE);
22 // End of outermost $tx; COMMIT will execute ASAP
25 $transactionalFunction_outermost();
26 $test->assertContactsExist(array($cid), TRUE);
29 function testDefaultCommit_BaoCreate_1xOuter() {
33 $transactionalFunction_outermost = function () use (&$cid, $test) {
34 $tx = new CRM_Core_Transaction();
36 'contact_type' => 'Individual',
40 $r = CRM_Contact_BAO_Contact
::create($params);
42 $test->assertContactsExist(array($cid), TRUE);
44 // End of outermost $tx; COMMIT will execute ASAP
47 $transactionalFunction_outermost();
48 $test->assertContactsExist(array($cid), TRUE);
51 function testRollback_RawInsert_1xOuter() {
55 $transactionalFunction_outermost = function() use (&$cid, $test) {
56 $tx = new CRM_Core_Transaction();
58 $r = CRM_Core_DAO
::executeQuery("INSERT INTO civicrm_contact(first_name,last_name) VALUES ('ff', 'll')");
59 $cid = mysql_insert_id();
61 $test->assertContactsExist(array($cid), TRUE);
63 $tx->rollback(); // Mark ROLLBACK, but don't execute yet
65 // End of outermost $tx; ROLLBACK will execute ASAP
68 $transactionalFunction_outermost();
69 $test->assertContactsExist(array($cid), FALSE);
73 * Test in which an outer function ($transactionalFunction_outermost) makes multiple calls
74 * to inner functions ($transactionalFunction_inner) but then rollsback the entire set.
76 function testRollback_RawInsert_2xInner() {
80 $transactionalFunction_inner = function() use (&$cids, $test) {
81 $tx = new CRM_Core_Transaction();
83 $r = CRM_Core_DAO
::executeQuery("INSERT INTO civicrm_contact(first_name,last_name) VALUES ('ff', 'll')");
84 $cid = mysql_insert_id();
87 $test->assertContactsExist($cids, TRUE);
89 // End of inner $tx; neither COMMIT nor ROLLBACK b/c another $tx remains
92 $transactionalFunction_outermost = function() use (&$cids, $test, $transactionalFunction_inner) {
93 $tx = new CRM_Core_Transaction();
95 $transactionalFunction_inner();
96 $transactionalFunction_inner();
98 $tx->rollback(); // Mark ROLLBACK, but don't execute yet
100 $test->assertContactsExist($cids, TRUE); // not yet rolled back
102 // End of outermost $tx; ROLLBACK will execute ASAP
105 $transactionalFunction_outermost();
106 $test->assertContactsExist($cids, FALSE);
109 function testRollback_BaoCreate_1xOuter() {
113 $transactionalFunction_outermost = function() use (&$cid, $test) {
114 $tx = new CRM_Core_Transaction();
117 'contact_type' => 'Individual',
121 $r = CRM_Contact_BAO_Contact
::create($params);
124 $test->assertContactsExist(array($cid), TRUE);
126 $tx->rollback(); // Mark ROLLBACK, but don't execute yet
128 // End of outermost $tx; ROLLBACK will execute ASAP
131 $transactionalFunction_outermost();
133 // No outstanding $tx -- ROLLBACK should be done
134 $test->assertContactsExist(array($cid), FALSE);
138 * Test in which an outer function ($transactionalFunction_outermost) makes multiple calls
139 * to inner functions ($transactionalFunction_inner) but then rollsback the entire set.
141 function testRollback_BaoCreate_2xInner() {
145 $transactionalFunction_inner = function() use (&$cids, $test) {
146 $tx = new CRM_Core_Transaction();
149 'contact_type' => 'Individual',
153 $r = CRM_Contact_BAO_Contact
::create($params);
157 $test->assertContactsExist($cids, TRUE);
159 // end of inner $tx; neither COMMIT nor ROLLBACK b/c it's inner
162 $transactionalFunction_outermost = function() use (&$cids, $test, $transactionalFunction_inner) {
163 $tx = new CRM_Core_Transaction();
165 $transactionalFunction_inner();
166 $transactionalFunction_inner();
168 $tx->rollback(); // Mark ROLLBACK, but don't execute yet
170 $test->assertContactsExist($cids, TRUE); // not yet rolled back
172 // End of outermost $tx; ROLLBACK will execute ASAP
175 $transactionalFunction_outermost();
177 // No outstanding $tx -- ROLLBACK should be done
178 $test->assertContactsExist($cids, FALSE);
181 public function assertContactsExist($cids, $exist = TRUE) {
182 foreach ($cids as $cid) {
183 $this->assertTrue(is_numeric($cid));
184 $this->assertDBQuery($exist ?
1 : 0, 'SELECT count(*) FROM civicrm_contact WHERE id = %1', array(
185 1 => array($cid, 'Integer'),