Commit | Line | Data |
---|---|---|
8c68b9c9 TO |
1 | <?php |
2 | ||
3 | namespace Civi\Test; | |
4 | ||
5 | /** | |
6 | * Class DbTestTrait | |
7 | * @package Civi\Test | |
8 | * | |
9 | * This trait is intended for use with PHPUnit-based test cases. | |
10 | */ | |
11 | trait DbTestTrait { | |
12 | ||
13 | abstract public function assertAttributesEquals($expectedValues, $actualValues, $message = NULL); | |
14 | ||
15 | /** | |
16 | * Generic function to compare expected values after an api call to retrieved. | |
17 | * DB values. | |
18 | * | |
19 | * @daoName string DAO Name of object we're evaluating. | |
20 | * @id int Id of object | |
21 | * @match array Associative array of field name => expected value. Empty if asserting | |
22 | * that a DELETE occurred | |
23 | * @delete boolean True if we're checking that a DELETE action occurred. | |
24 | * @param $daoName | |
25 | * @param $id | |
26 | * @param $match | |
27 | * @param bool $delete | |
28 | * @throws \PHPUnit_Framework_AssertionFailedError | |
29 | */ | |
30 | public function assertDBState($daoName, $id, $match, $delete = FALSE) { | |
31 | if (empty($id)) { | |
32 | // adding this here since developers forget to check for an id | |
33 | // and hence we get the first value in the db | |
34 | $this->fail('ID not populated. Please fix your assertDBState usage!!!'); | |
35 | } | |
36 | ||
37 | $object = new $daoName(); | |
38 | $object->id = $id; | |
39 | $verifiedCount = 0; | |
40 | ||
41 | // If we're asserting successful record deletion, make sure object is NOT found. | |
42 | if ($delete) { | |
43 | if ($object->find(TRUE)) { | |
44 | $this->fail("Object not deleted by delete operation: $daoName, $id"); | |
45 | } | |
46 | return; | |
47 | } | |
48 | ||
49 | // Otherwise check matches of DAO field values against expected values in $match. | |
50 | if ($object->find(TRUE)) { | |
51 | $fields = &$object->fields(); | |
52 | foreach ($fields as $name => $value) { | |
53 | $dbName = $value['name']; | |
54 | if (isset($match[$name])) { | |
55 | $verifiedCount++; | |
56 | $this->assertEquals($object->$dbName, $match[$name]); | |
57 | } | |
58 | elseif (isset($match[$dbName])) { | |
59 | $verifiedCount++; | |
60 | $this->assertEquals($object->$dbName, $match[$dbName]); | |
61 | } | |
62 | } | |
63 | } | |
64 | else { | |
65 | $this->fail("Could not retrieve object: $daoName, $id"); | |
66 | } | |
67 | $object->free(); | |
68 | $matchSize = count($match); | |
69 | if ($verifiedCount != $matchSize) { | |
70 | $this->fail("Did not verify all fields in match array: $daoName, $id. Verified count = $verifiedCount. Match array size = $matchSize"); | |
71 | } | |
72 | } | |
73 | ||
74 | /** | |
75 | * Request a record from the DB by seachColumn+searchValue. Success if a record is found. | |
76 | * @param string $daoName | |
77 | * @param $searchValue | |
78 | * @param $returnColumn | |
79 | * @param $searchColumn | |
80 | * @param $message | |
81 | * | |
82 | * @return null|string | |
83 | * @throws \PHPUnit_Framework_AssertionFailedError | |
84 | */ | |
85 | public function assertDBNotNull($daoName, $searchValue, $returnColumn, $searchColumn, $message) { | |
86 | if (empty($searchValue)) { | |
87 | $this->fail("empty value passed to assertDBNotNull"); | |
88 | } | |
89 | $value = \CRM_Core_DAO::getFieldValue($daoName, $searchValue, $returnColumn, $searchColumn, TRUE); | |
90 | $this->assertNotNull($value, $message); | |
91 | ||
92 | return $value; | |
93 | } | |
94 | ||
95 | /** | |
96 | * Request a record from the DB by seachColumn+searchValue. Success if returnColumn value is NULL. | |
97 | * @param string $daoName | |
98 | * @param $searchValue | |
99 | * @param $returnColumn | |
100 | * @param $searchColumn | |
101 | * @param $message | |
102 | */ | |
103 | public function assertDBNull($daoName, $searchValue, $returnColumn, $searchColumn, $message) { | |
104 | $value = \CRM_Core_DAO::getFieldValue($daoName, $searchValue, $returnColumn, $searchColumn, TRUE); | |
105 | $this->assertNull($value, $message); | |
106 | } | |
107 | ||
108 | /** | |
109 | * Request a record from the DB by id. Success if row not found. | |
110 | * @param string $daoName | |
111 | * @param int $id | |
112 | * @param null $message | |
113 | */ | |
114 | public function assertDBRowNotExist($daoName, $id, $message = NULL) { | |
115 | $message = $message ? $message : "$daoName (#$id) should not exist"; | |
116 | $value = \CRM_Core_DAO::getFieldValue($daoName, $id, 'id', 'id', TRUE); | |
117 | $this->assertNull($value, $message); | |
118 | } | |
119 | ||
120 | /** | |
121 | * Request a record from the DB by id. Success if row not found. | |
122 | * @param string $daoName | |
123 | * @param int $id | |
124 | * @param null $message | |
125 | */ | |
126 | public function assertDBRowExist($daoName, $id, $message = NULL) { | |
127 | $message = $message ? $message : "$daoName (#$id) should exist"; | |
128 | $value = \CRM_Core_DAO::getFieldValue($daoName, $id, 'id', 'id', TRUE); | |
129 | $this->assertEquals($id, $value, $message); | |
130 | } | |
131 | ||
132 | /** | |
133 | * Compare a single column value in a retrieved DB record to an expected value. | |
134 | * @param string $daoName | |
135 | * @param $searchValue | |
136 | * @param $returnColumn | |
137 | * @param $searchColumn | |
138 | * @param $expectedValue | |
139 | * @param $message | |
140 | */ | |
141 | public function assertDBCompareValue( | |
142 | $daoName, $searchValue, $returnColumn, $searchColumn, | |
143 | $expectedValue, $message | |
144 | ) { | |
145 | $value = \CRM_Core_DAO::getFieldValue($daoName, $searchValue, $returnColumn, $searchColumn, TRUE); | |
146 | $this->assertEquals($expectedValue, $value, $message); | |
147 | } | |
148 | ||
149 | /** | |
150 | * Compare all values in a single retrieved DB record to an array of expected values. | |
151 | * @param string $daoName | |
152 | * @param array $searchParams | |
153 | * @param $expectedValues | |
154 | */ | |
155 | public function assertDBCompareValues($daoName, $searchParams, $expectedValues) { | |
156 | //get the values from db | |
157 | $dbValues = array(); | |
158 | \CRM_Core_DAO::commonRetrieve($daoName, $searchParams, $dbValues); | |
159 | ||
160 | // compare db values with expected values | |
161 | $this->assertAttributesEquals($expectedValues, $dbValues); | |
162 | } | |
163 | ||
164 | /** | |
165 | * Assert that a SQL query returns a given value. | |
166 | * | |
167 | * The first argument is an expected value. The remaining arguments are passed | |
168 | * to CRM_Core_DAO::singleValueQuery | |
169 | * | |
170 | * Example: $this->assertSql(2, 'select count(*) from foo where foo.bar like "%1"', | |
171 | * array(1 => array("Whiz", "String"))); | |
172 | * @param $expected | |
173 | * @param $query | |
174 | * @param array $params | |
175 | * @param string $message | |
176 | */ | |
177 | public function assertDBQuery($expected, $query, $params = array(), $message = '') { | |
178 | if ($message) { | |
179 | $message .= ': '; | |
180 | } | |
181 | $actual = \CRM_Core_DAO::singleValueQuery($query, $params); | |
182 | $this->assertEquals($expected, $actual, | |
183 | sprintf('%sexpected=[%s] actual=[%s] query=[%s]', | |
184 | $message, $expected, $actual, \CRM_Core_DAO::composeQuery($query, $params, FALSE) | |
185 | ) | |
186 | ); | |
187 | } | |
188 | ||
189 | } |