PageRenderTime 48ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/tests/ZfcUserTest/Mapper/UserTest.php

https://gitlab.com/my-application.bjoernbartels.earth/ZfcUser
PHP | 367 lines | 254 code | 62 blank | 51 comment | 9 complexity | 6f4db16eb4194e3f0761509d10e11347 MD5 | raw file
  1. <?php
  2. namespace ZfcUserTest\Mapper;
  3. use ZfcUser\Mapper\User as Mapper;
  4. use ZfcUser\Entity\User as Entity;
  5. use Zend\Db\ResultSet\HydratingResultSet;
  6. use Zend\Db\Adapter\Adapter;
  7. use ZfcUser\Mapper\UserHydrator;
  8. class UserTest extends \PHPUnit_Framework_TestCase
  9. {
  10. /** @var \ZfcUser\Mapper\User */
  11. protected $mapper;
  12. /** @var \Zend\Db\Adapter\Adapter */
  13. protected $mockedDbAdapter;
  14. /** @var \Zend\Db\Adapter\Adapter */
  15. protected $realAdapter = array();
  16. /** @var \Zend\Db\Sql\Select */
  17. protected $mockedSelect;
  18. /** @var \Zend\Db\ResultSet\HydratingResultSet */
  19. protected $mockedResultSet;
  20. /** @var \Zend\Db\Sql\Sql */
  21. protected $mockedDbSql;
  22. /** @var \Zend\Db\Adapter\Driver\DriverInterface */
  23. protected $mockedDbAdapterDriver;
  24. /** @var \Zend\Db\Adapter\Platform\PlatformInterface */
  25. protected $mockedDbAdapterPlatform;
  26. public function setUp()
  27. {
  28. $mapper = new Mapper;
  29. $mapper->setEntityPrototype(new Entity());
  30. $mapper->setHydrator(new UserHydrator());
  31. $this->mapper = $mapper;
  32. $this->setUpMockedAdapter();
  33. $this->mockedSelect = $this->getMock('\Zend\Db\Sql\Select', array('where'));
  34. $this->mockedResultSet = $this->getMock('\Zend\Db\ResultSet\HydratingResultSet');
  35. $this->setUpAdapter('mysql');
  36. // $this->setUpAdapter('pgsql');
  37. $this->setUpAdapter('sqlite');
  38. }
  39. /**
  40. *
  41. */
  42. public function setUpAdapter($driver)
  43. {
  44. $upCase = strtoupper($driver);
  45. if (!defined(sprintf('DB_%s_DSN', $upCase)) ||
  46. !defined(sprintf('DB_%s_USERNAME', $upCase)) ||
  47. !defined(sprintf('DB_%s_PASSWORD', $upCase)) ||
  48. !defined(sprintf('DB_%s_SCHEMA', $upCase))
  49. ) {
  50. return false;
  51. }
  52. try {
  53. $connection = array(
  54. 'driver'=>sprintf('Pdo_%s', ucfirst($driver)),
  55. 'dsn'=>constant(sprintf('DB_%s_DSN', $upCase))
  56. );
  57. if (constant(sprintf('DB_%s_USERNAME', $upCase)) !== "") {
  58. $connection['username'] = constant(sprintf('DB_%s_USERNAME', $upCase));
  59. $connection['password'] = constant(sprintf('DB_%s_PASSWORD', $upCase));
  60. }
  61. $adapter = new Adapter($connection);
  62. $this->setUpSqlDatabase($adapter, constant(sprintf('DB_%s_SCHEMA', $upCase)));
  63. $this->realAdapter[$driver] = $adapter;
  64. } catch (\Exception $e) {
  65. $this->realAdapter[$driver] = false;
  66. }
  67. }
  68. public function setUpSqlDatabase($adapter, $schemaPath)
  69. {
  70. $queryStack= array('DROP TABLE IF EXISTS user');
  71. $queryStack = array_merge($queryStack, explode(';', file_get_contents($schemaPath)));
  72. $queryStack = array_merge($queryStack, explode(';', file_get_contents(__DIR__ . '/_files/user.sql')));
  73. foreach ($queryStack as $query) {
  74. if (!preg_match('/\S+/', $query)) {
  75. continue;
  76. }
  77. $adapter->query($query, $adapter::QUERY_MODE_EXECUTE);
  78. }
  79. }
  80. /**
  81. *
  82. */
  83. public function setUpMockedAdapter()
  84. {
  85. $this->mockedDbAdapterDriver = $this->getMock('Zend\Db\Adapter\Driver\DriverInterface');
  86. $this->mockedDbAdapterPlatform = $this->getMock('\Zend\Db\Adapter\Platform\PlatformInterface', array());
  87. $this->mockedDbAdapterStatement= $this->getMock('\Zend\Db\Adapter\Driver\StatementInterface', array());
  88. $this->mockedDbAdapterPlatform->expects($this->any())
  89. ->method('getName')
  90. ->will($this->returnValue('null'));
  91. $this->mockedDbAdapter = $this->getMockBuilder('\Zend\Db\Adapter\Adapter')
  92. ->setConstructorArgs(array(
  93. $this->mockedDbAdapterDriver,
  94. $this->mockedDbAdapterPlatform
  95. ))
  96. ->getMock(array('getPlatform'));
  97. $this->mockedDbAdapter->expects($this->any())
  98. ->method('getPlatform')
  99. ->will($this->returnValue($this->mockedDbAdapterPlatform));
  100. $this->mockedDbSql = $this->getMockBuilder('\Zend\Db\Sql\Sql')
  101. ->setConstructorArgs(array($this->mockedDbAdapter))
  102. ->setMethods(array('prepareStatementForSqlObject'))
  103. ->getMock();
  104. $this->mockedDbSql->expects($this->any())
  105. ->method('prepareStatementForSqlObject')
  106. ->will($this->returnValue($this->mockedDbAdapterStatement));
  107. $this->mockedDbSqlPlatform = $this->getMockBuilder('\Zend\Db\Sql\Platform\Platform')
  108. ->setConstructorArgs(array($this->mockedDbAdapter))
  109. ->getMock();
  110. }
  111. /**
  112. *
  113. * @param arra $eventListenerArray
  114. * @return array
  115. */
  116. public function setUpMockMapperInsert($mapperMethods)
  117. {
  118. $this->mapper = $this->getMock(get_class($this->mapper), $mapperMethods);
  119. foreach ($mapperMethods as $method) {
  120. switch ($method) {
  121. case 'getSelect':
  122. $this->mapper->expects($this->once())
  123. ->method('getSelect')
  124. ->will($this->returnValue($this->mockedSelect));
  125. break;
  126. case 'initialize':
  127. $this->mapper->expects($this->once())
  128. ->method('initialize')
  129. ->will($this->returnValue(true));
  130. break;
  131. }
  132. }
  133. }
  134. /**
  135. *
  136. * @param arra $eventListenerArray
  137. * @return array
  138. */
  139. public function &setUpMockedMapper($eventListenerArray, array $mapperMethods = array())
  140. {
  141. $returnMockedParams = array();
  142. $mapperMethods = count($mapperMethods)
  143. ? array_merge($mapperMethods, array('getSelect', 'select'))
  144. : array('getSelect','select');
  145. $this->setUpMockMapperInsert($mapperMethods);
  146. $this->mapper->expects($this->once())
  147. ->method('select')
  148. ->will($this->returnValue($this->mockedResultSet));
  149. $mockedSelect = $this->mockedSelect;
  150. $this->mockedSelect->expects($this->once())
  151. ->method('where')
  152. ->will($this->returnCallback(function () use (&$returnMockedParams, $mockedSelect) {
  153. $returnMockedParams['whereArgs'] = func_get_args();
  154. return $mockedSelect;
  155. }));
  156. foreach ($eventListenerArray as $eventKey => $eventListener) {
  157. $this->mapper->getEventManager()->attach($eventKey, $eventListener);
  158. }
  159. $this->mapper->setDbAdapter($this->mockedDbAdapter);
  160. $this->mapper->setEntityPrototype(new Entity());
  161. return $returnMockedParams;
  162. }
  163. /**
  164. * @dataProvider providerTestFindBy
  165. * @param string $methode
  166. * @param array $args
  167. * @param array $expectedParams
  168. */
  169. public function testFindBy($methode, $args, $expectedParams, $eventListener, $entityEqual)
  170. {
  171. $mockedParams =& $this->setUpMockedMapper($eventListener);
  172. $this->mockedResultSet->expects($this->once())
  173. ->method('current')
  174. ->will($this->returnValue($entityEqual));
  175. $return = call_user_func_array(array($this->mapper, $methode), $args);
  176. foreach ($expectedParams as $paramKey => $paramValue) {
  177. $this->assertArrayHasKey($paramKey, $mockedParams);
  178. $this->assertEquals($paramValue, $mockedParams[$paramKey]);
  179. }
  180. $this->assertEquals($entityEqual, $return);
  181. }
  182. /**
  183. * @todo Integration test for UserMapper
  184. * @dataProvider providerTestFindBy
  185. */
  186. public function testIntegrationFindBy($methode, $args, $expectedParams, $eventListener, $entityEqual)
  187. {
  188. /* @var $entityEqual Entity */
  189. /* @var $dbAdapter Adapter */
  190. foreach ($this->realAdapter as $dbAdapter) {
  191. if ($dbAdapter == false) {
  192. continue;
  193. }
  194. $this->mapper->setDbAdapter($dbAdapter);
  195. $return = call_user_func_array(array($this->mapper, $methode), $args);
  196. $this->assertInternalType('object', $return);
  197. $this->assertInstanceOf('ZfcUser\Entity\User', $return);
  198. $this->assertEquals($entityEqual, $return);
  199. }
  200. if (!isset($return)) {
  201. $this->markTestSkipped("Without real database we dont can test findByEmail / findByUsername / findById");
  202. }
  203. }
  204. public function testGetTableName()
  205. {
  206. $this->assertEquals('user', $this->mapper->getTableName());
  207. }
  208. public function testSetTableName()
  209. {
  210. $this->mapper->setTableName('ZfcUser');
  211. $this->assertEquals('ZfcUser', $this->mapper->getTableName());
  212. }
  213. public function testInsertUpdateDelete()
  214. {
  215. $baseEntity = new Entity();
  216. $baseEntity->setEmail('zfc-user-foo@zend-framework.org');
  217. $baseEntity->setUsername('zfc-user-foo');
  218. $baseEntity->setPassword('zfc-user-foo');
  219. /* @var $entityEqual Entity */
  220. /* @var $dbAdapter Adapter */
  221. foreach ($this->realAdapter as $diver => $dbAdapter) {
  222. if ($dbAdapter === false) {
  223. continue;
  224. }
  225. $this->mapper->setDbAdapter($dbAdapter);
  226. // insert
  227. $entity = clone $baseEntity;
  228. $result = $this->mapper->insert($entity);
  229. $this->assertNotNull($entity->getId());
  230. $this->assertGreaterThanOrEqual(1, $entity->getId());
  231. $entityEqual = $this->mapper->findById($entity->getId());
  232. $this->assertEquals($entity, $entityEqual);
  233. // update
  234. $entity->setUsername($entity->getUsername() . '-' . $diver);
  235. $entity->setEmail($entity->getUsername() . '@github.com');
  236. $result = $this->mapper->update($entity);
  237. $entityEqual = $this->mapper->findById($entity->getId());
  238. $this->assertNotEquals($baseEntity->getUsername(), $entityEqual->getUsername());
  239. $this->assertNotEquals($baseEntity->getEmail(), $entityEqual->getEmail());
  240. $this->assertEquals($entity->getUsername(), $entityEqual->getUsername());
  241. $this->assertEquals($entity->getEmail(), $entityEqual->getEmail());
  242. /**
  243. *
  244. * @todo delete is currently protected
  245. // delete
  246. $result = $this->mapper->delete($entity->getId());
  247. $this->assertNotEquals($baseEntity->getEmail(), $entityEqual->getEmail());
  248. $this->assertEquals($entity->getEmail(), $entityEqual->getEmail());
  249. */
  250. }
  251. if (!isset($result)) {
  252. $this->markTestSkipped("Without real database we dont can test insert, update and delete");
  253. }
  254. }
  255. public function providerTestFindBy()
  256. {
  257. $user = new Entity();
  258. $user->setEmail('zfc-user@github.com');
  259. $user->setUsername('zfc-user');
  260. $user->setDisplayName('Zfc-User');
  261. $user->setId('1');
  262. $user->setState(1);
  263. $user->setPassword('zfc-user');
  264. return array(
  265. array(
  266. 'findByEmail',
  267. array($user->getEmail()),
  268. array(
  269. 'whereArgs'=>array(
  270. array('email'=>$user->getEmail()),
  271. 'AND'
  272. )
  273. ),
  274. array(),
  275. $user
  276. ),
  277. array(
  278. 'findByUsername',
  279. array($user->getUsername()),
  280. array(
  281. 'whereArgs'=>array(
  282. array('username'=>$user->getUsername()),
  283. 'AND'
  284. )
  285. ),
  286. array(),
  287. $user
  288. ),
  289. array(
  290. 'findById',
  291. array($user->getId()),
  292. array(
  293. 'whereArgs'=>array(
  294. array('user_id'=>$user->getId()),
  295. 'AND'
  296. )
  297. ),
  298. array(),
  299. $user
  300. ),
  301. );
  302. }
  303. }