PageRenderTime 46ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/jelix-tests/classes/junittestcasedb.class.php

https://github.com/foxmask/Booster
PHP | 256 lines | 226 code | 9 blank | 21 comment | 10 complexity | e0b3b43f972a608ed27ae0593f9e9d78 MD5 | raw file
  1. <?php
  2. /**
  3. * @package jelix
  4. * @subpackage junittests
  5. * @author Laurent
  6. * @contributor Christophe Thiriot
  7. * @copyright 2007-2011 Jouanneau laurent
  8. * @link http://www.jelix.org
  9. * @licence GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  10. */
  11. class jUnitTestCaseDb extends PHPUnit_Framework_TestCase {
  12. /**
  13. * erase all record in a table
  14. */
  15. public function emptyTable($table){
  16. $db = jDb::getConnection($this->dbProfil);
  17. $db->exec('DELETE FROM '.$db->encloseName($table));
  18. }
  19. public function insertRecordsIntoTable($table, $fields, $records, $emptyBefore=false){
  20. if($emptyBefore)
  21. $this->emptytable($table);
  22. $db = jDb::getConnection($this->dbProfile);
  23. $fieldsList = '';
  24. foreach($fields as $f) {
  25. if ($fieldsList != '')
  26. $fieldsList.=',';
  27. $fieldsList .= $db->encloseName($f);
  28. }
  29. $sql = 'INSERT INTO '.$db->encloseName($table).' ('.$fieldsList.') VALUES (';
  30. foreach($records as $rec){
  31. $ins='';
  32. foreach($fields as $f){
  33. $ins.= ','.$db->quote($rec[$f]);
  34. }
  35. $db->exec($sql.substr($ins,1).')');
  36. }
  37. }
  38. /**
  39. * check if the table is empty
  40. */
  41. public function assertTableIsEmpty($table, $message="%s"){
  42. $db = jDb::getConnection($this->dbProfile);
  43. $rs = $db->query('SELECT count(*) as N FROM '.$db->encloseName($table));
  44. if($r=$rs->fetch()){
  45. $message = sprintf( $message, $table. " table should be empty");
  46. if($r->N == 0){
  47. $this->pass($message);
  48. return true;
  49. }else{
  50. $this->fail($message);
  51. return false;
  52. }
  53. }else{
  54. $this->fail(sprintf( $message, $table. " table should be empty, but error when try to get record count"));
  55. return false;
  56. }
  57. }
  58. /**
  59. * check if the table is not empty
  60. */
  61. public function assertTableIsNotEmpty($table, $message="%s"){
  62. $db = jDb::getConnection($this->dbProfil);
  63. $rs = $db->query('SELECT count(*) as N FROM '.$db->encloseName($table));
  64. if($r=$rs->fetch()){
  65. $message = sprintf( $message, $table. " table shouldn't be empty");
  66. if($r->N > 0){
  67. $this->pass($message);
  68. return true;
  69. }else{
  70. $this->fail($message);
  71. return false;
  72. }
  73. }else{
  74. $this->fail(sprintf( $message, $table. " table shouldn't be empty, but error when try to get record count"));
  75. return false;
  76. }
  77. }
  78. /**
  79. * check if a table has a specific number of records
  80. */
  81. public function assertTableHasNRecords($table, $n, $message="%s"){
  82. $db = jDb::getConnection($this->dbProfil);
  83. $rs = $db->query('SELECT count(*) as N FROM '.$db->encloseName($table));
  84. if($r=$rs->fetch()){
  85. $message = sprintf( $message, $table. " table should contains ".$n." records");
  86. if($r->N == $n){
  87. $this->pass($message);
  88. return true;
  89. }else{
  90. $this->fail($message);
  91. return false;
  92. }
  93. }else{
  94. $this->fail(sprintf( $message, $table. " table shouldn't be empty, but error when try to get record count"));
  95. return false;
  96. }
  97. }
  98. /**
  99. * check if all given record are in the table
  100. */
  101. public function assertTableContainsRecords($table, $records, $onlyThem = true, $message ="%s"){
  102. $db = jDb::getConnection($this->dbProfil);
  103. $message = sprintf( $message, $table. " table should contains given records.");
  104. $sql = 'SELECT * FROM '.$db->encloseName($table);
  105. $rs = $db->query($sql);
  106. if(!$rs){
  107. $this->fail($message.' ( no results set)');
  108. return false;
  109. }
  110. $results = array();
  111. foreach($rs as $r){
  112. $results[]=get_object_vars($r);
  113. }
  114. $globalok=true;
  115. $resultsSaved = $results;
  116. foreach($records as $rec){
  117. $ok=false;
  118. foreach($results as $k=>$res){
  119. $sameValues = true;
  120. foreach($rec as $name=>$value){
  121. if($res[$name] != $value) {
  122. $sameValues = false;
  123. break;
  124. }
  125. }
  126. if($sameValues){
  127. unset($results[$k]);
  128. $ok = true;
  129. break;
  130. }
  131. }
  132. if(!$ok){
  133. $globalok = false;
  134. $this->fail($message.'. No record found : '. var_export($rec,true));
  135. }
  136. }
  137. if($onlyThem && count($results) != 0){
  138. $globalok = false;
  139. $this->fail($message.'. Other unknown records exists');
  140. }
  141. if($globalok){
  142. $this->pass($message);
  143. return true;
  144. }else{
  145. $this->sendMessage('Results from database');
  146. $this->dump($resultsSaved);
  147. $this->sendMessage('Records we should find');
  148. $this->dump($records);
  149. return false;
  150. }
  151. }
  152. /**
  153. * check if all given record are in the table
  154. * @param string $table the table name
  155. * @param array $records the list of record we should find
  156. * @param array|string $keys the list of key names of records
  157. * @param boolean $onlyThem if true, check if the table has only this records
  158. * @param string $message the error message
  159. */
  160. public function assertTableContainsRecordsByKeys($table, $records, $keys, $onlyThem = true, $message ="%s"){
  161. $db = jDb::getConnection($this->dbProfile);
  162. if (is_string ($keys))
  163. $keys = array($keys);
  164. $message = sprintf( $message, $table. " table should contains given records.");
  165. $sql = 'SELECT * FROM '.$db->encloseName($table);
  166. $rs = $db->query($sql);
  167. if(!$rs){
  168. $this->fail($message.' ( no results set)');
  169. return false;
  170. }
  171. $results = array();
  172. foreach($rs as $r){
  173. $results[]=get_object_vars($r);
  174. }
  175. $globalok=true;
  176. $resultsSaved = $results;
  177. foreach($records as $rec) {
  178. $found = false;
  179. $res = array();
  180. foreach($results as $k=>$res){
  181. $keyok = true;
  182. foreach ($keys as $keyname) {
  183. if($rec[$keyname] != $res[$keyname]) {
  184. $keyok = false;
  185. break;
  186. }
  187. }
  188. if ($keyok) {
  189. $found = true;
  190. break;
  191. }
  192. }
  193. if(!$found){
  194. $globalok = false;
  195. $this->fail($message.'. No record found : '. var_export($rec,true));
  196. }
  197. else {
  198. $sameValues = true;
  199. foreach($rec as $name=>$value){
  200. if($res[$name] != $value) {
  201. $sameValues = false;
  202. break;
  203. }
  204. }
  205. unset($results[$k]);
  206. if(!$sameValues){
  207. $globalok = false;
  208. $this->fail($message.'. Difference in a record. Actual:'. var_export($res,true). ' | Expected:'.var_export($rec,true));
  209. $this->diff(var_export($rec,true), var_export($res,true));
  210. }
  211. }
  212. }
  213. if($onlyThem && count($results) != 0){
  214. $globalok = false;
  215. $this->fail($message.'. Other unknown records exists');
  216. $this->sendMessage('Unexpected records');
  217. $this->dump($results);
  218. }
  219. if($globalok){
  220. $this->pass($message);
  221. return true;
  222. }
  223. else {
  224. return false;
  225. }
  226. }
  227. public function getLastId($fieldName, $tableName){
  228. $db = jDb::getConnection($this->dbProfil);
  229. return $db->lastIdInTable($fieldName, $tableName);
  230. }
  231. }