CRM-14478 - Split CRM_Core_EntityReference into different classes
[civicrm-core.git] / tests / phpunit / CRM / Core / DAOTest.php
CommitLineData
71e5aa5c
ARW
1<?php
2
3require_once 'CiviTest/CiviUnitTestCase.php';
4class CRM_Core_DAOTest extends CiviUnitTestCase {
5 function get_info() {
6 return array(
7 'name' => 'DAO',
8 'description' => 'Test core DAO functions',
9 'group' => 'Core',
10 );
11 }
12
13 function testGetReferenceColumns() {
14 // choose CRM_Core_DAO_Email as an arbitrary example
15 $emailRefs = CRM_Core_DAO_Email::getReferenceColumns();
16 $refsByTarget = array();
17 foreach ($emailRefs as $refSpec) {
18 $refsByTarget[$refSpec->getTargetTable()] = $refSpec;
19 }
20 $this->assertTrue(array_key_exists('civicrm_contact', $refsByTarget));
21 $contactRef = $refsByTarget['civicrm_contact'];
22 $this->assertEquals('contact_id', $contactRef->getReferenceKey());
23 $this->assertEquals('id', $contactRef->getTargetKey());
11626cf1 24 $this->assertEquals('CRM_Core_Reference_Basic', get_class($contactRef));
71e5aa5c
ARW
25 }
26
27 function testGetReferencesToTable() {
28 $refs = CRM_Core_DAO::getReferencesToTable(CRM_Financial_DAO_FinancialType::getTableName());
29 $refsBySource = array();
30 foreach ($refs as $refSpec) {
31 $refsBySource[$refSpec->getReferenceTable()] = $refSpec;
32 }
33 $this->assertTrue(array_key_exists('civicrm_entity_financial_account', $refsBySource));
34 $genericRef = $refsBySource['civicrm_entity_financial_account'];
35 $this->assertEquals('entity_id', $genericRef->getReferenceKey());
36 $this->assertEquals('entity_table', $genericRef->getTypeColumn());
37 $this->assertEquals('id', $genericRef->getTargetKey());
11626cf1 38 $this->assertEquals('CRM_Core_Reference_Dynamic', get_class($genericRef));
71e5aa5c
ARW
39 }
40
41 function testFindReferences() {
42 $params = array(
43 'first_name' => 'Testy',
44 'last_name' => 'McScallion',
45 'contact_type' => 'Individual',
46 );
47
48 $contact = CRM_Contact_BAO_Contact::add($params);
49 $this->assertNotNull($contact->id);
50
51 $params = array(
52 'email' => 'spam@dev.null',
53 'contact_id' => $contact->id,
54 'is_primary' => 0,
55 'location_type_id' => 1,
56 );
57
58 $email = CRM_Core_BAO_Email::add($params);
59
60 $refs = $contact->findReferences();
61 $refsByTable = array();
62 foreach ($refs as $refObj) {
63 $refsByTable[$refObj->__table] = $refObj;
64 }
65
66 $this->assertTrue(array_key_exists('civicrm_email', $refsByTable));
67 $refDao = $refsByTable['civicrm_email'];
68 $refDao->find(TRUE);
69 $this->assertEquals($contact->id, $refDao->contact_id);
70 }
c8950569 71
0c627c6f
TO
72 function composeQueryExamples() {
73 $cases = array();
74 // $cases[] = array('Input-SQL', 'Input-Params', 'Expected-SQL');
75
76 // CASE: No params
77 $cases[] = array(
78 'SELECT * FROM whatever',
79 array(),
80 'SELECT * FROM whatever',
81 );
82
83 // CASE: Integer param
84 $cases[] = array(
85 'SELECT * FROM whatever WHERE id = %1',
86 array(
87 1 => array(10, 'Integer'),
88 ),
89 'SELECT * FROM whatever WHERE id = 10',
90 );
91
92 // CASE: String param
93 $cases[] = array(
94 'SELECT * FROM whatever WHERE name = %1',
95 array(
96 1 => array('Alice', 'String'),
97 ),
98 'SELECT * FROM whatever WHERE name = \'Alice\'',
99 );
100
101 // CASE: Two params
102 $cases[] = array(
103 'SELECT * FROM whatever WHERE name = %1 AND title = %2',
104 array(
105 1 => array('Alice', 'String'),
106 2 => array('Bob', 'String'),
107 ),
108 'SELECT * FROM whatever WHERE name = \'Alice\' AND title = \'Bob\'',
109 );
110
111 // CASE: Two params with special character (%1)
112 $cases[] = array(
113 'SELECT * FROM whatever WHERE name = %1 AND title = %2',
114 array(
115 1 => array('Alice %2', 'String'),
116 2 => array('Bob', 'String'),
117 ),
118 'SELECT * FROM whatever WHERE name = \'Alice %2\' AND title = \'Bob\'',
119 );
120
121 // CASE: Two params with special character ($1)
122 $cases[] = array(
123 'SELECT * FROM whatever WHERE name = %1 AND title = %2',
124 array(
125 1 => array('Alice $1', 'String'),
126 2 => array('Bob', 'String'),
127 ),
128 'SELECT * FROM whatever WHERE name = \'Alice $1\' AND title = \'Bob\'',
129 );
130
131 return $cases;
132 }
133
134 /**
135 * @dataProvider composeQueryExamples
136 */
137 function testComposeQuery($inputSql, $inputParams, $expectSql) {
138 $actualSql = CRM_Core_DAO::composeQuery($inputSql, $inputParams);
139 $this->assertEquals($expectSql, $actualSql);
140 }
e2508c90
PJ
141
142 // CASE: Two params where the %2 is already present in the query
143 // NOTE: This case should rightly FAIL, as using strstr in the replace mechanism will turn
144 // the query into: SELECT * FROM whatever WHERE name = 'Alice' AND title = 'Bob' AND year LIKE ''Bob'012'
145 // So, to avoid such ERROR, the query should be framed like:
146 // 'SELECT * FROM whatever WHERE name = %1 AND title = %3 AND year LIKE '%2012'
147 // $params[3] = array('Bob', 'String');
148 // i.e. the place holder should be unique and should not contain in any other operational use in query
149 function testComposeQueryFailure() {
150 $cases[] = array(
151 'SELECT * FROM whatever WHERE name = %1 AND title = %2 AND year LIKE \'%2012\' ',
152 array(
153 1 => array('Alice', 'String'),
154 2 => array('Bob', 'String'),
155 ),
156 'SELECT * FROM whatever WHERE name = \'Alice\' AND title = \'Bob\' AND year LIKE \'%2012\' ',
157 );
158 list($inputSql, $inputParams, $expectSql) = $cases[0];
159 $actualSql = CRM_Core_DAO::composeQuery($inputSql, $inputParams);
160 $this->assertFalse(($expectSql == $actualSql));
161 }
6842bb53
DL
162
163 function sqlNameDataProvider() {
164 return array(
165 array('this is a long string', 30, FALSE, 'this is a long string'),
166
167 array('this is an even longer string which is exactly 60 character', 60, FALSE, 'this is an even longer string which is exactly 60 character'),
168 array('this is an even longer string which is exactly 60 character', 60, TRUE , 'this is an even longer string which is exactly 60 character'),
169
170 array('this is an even longer string which is a bit more than 60 character', 60, FALSE, 'this is an even longer string which is a bit more than 60 ch'),
a8dd306e 171 array('this is an even longer string which is a bit more than 60 character', 60, TRUE , 'this is an even longer string which is a bit more th_c1cbd519'),
6842bb53
DL
172 );
173 }
174
175 /**
176 * @dataProvider sqlNameDataProvider
177 */
178 function testShortenSQLName($inputData, $length, $makeRandom, $expectedResult) {
179 $this->assertEquals($expectedResult, CRM_Core_DAO::shortenSQLName($inputData, $length, $makeRandom));
180 }
181
71e5aa5c 182}