/tests/units/classes/scripts/builder/vcs/svn.php

https://github.com/Yacodo/atoum · PHP · 411 lines · 332 code · 79 blank · 0 comment · 1 complexity · 74ef6d7b99adf6fce1a720f7080b794f MD5 · raw file

  1. <?php
  2. namespace mageekguy\atoum\tests\units\scripts\builder\vcs;
  3. use
  4. mageekguy\atoum,
  5. mageekguy\atoum\mock,
  6. mageekguy\atoum\scripts\builder\vcs
  7. ;
  8. require_once __DIR__ . '/../../../../runner.php';
  9. class svn extends atoum\test
  10. {
  11. public function beforeTestMethod($testMethod)
  12. {
  13. if (extension_loaded('svn') === false)
  14. {
  15. define('SVN_REVISION_HEAD', -1);
  16. define('PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS', 1);
  17. define('SVN_AUTH_PARAM_DEFAULT_USERNAME', 2);
  18. define('SVN_AUTH_PARAM_DEFAULT_PASSWORD', 3);
  19. }
  20. }
  21. public function testClass()
  22. {
  23. $this->assert
  24. ->testedClass->isSubclassOf('mageekguy\atoum\adapter\aggregator')
  25. ;
  26. }
  27. public function test__construct()
  28. {
  29. $svn = new vcs\svn();
  30. $this->assert
  31. ->object($svn->getAdapter())->isInstanceOf('mageekguy\atoum\adapter')
  32. ->variable($svn->getRepositoryUrl())->isNull()
  33. ;
  34. $svn = new vcs\svn($adapter = new atoum\adapter());
  35. $this->assert
  36. ->object($svn->getAdapter())->isIdenticalTo($adapter)
  37. ->variable($svn->getRepositoryUrl())->isNull()
  38. ;
  39. }
  40. public function testSetAdapter()
  41. {
  42. $adapter = new atoum\test\adapter();
  43. $adapter->extension_loaded = true;
  44. $svn = new vcs\svn($adapter);
  45. $this->assert
  46. ->object($svn->setAdapter($adapter = new atoum\adapter()))->isIdenticalTo($svn)
  47. ->object($svn->getAdapter())->isIdenticalTo($adapter)
  48. ;
  49. }
  50. public function testSetRepositoryUrl()
  51. {
  52. $adapter = new atoum\test\adapter();
  53. $adapter->extension_loaded = true;
  54. $svn = new vcs\svn($adapter);
  55. $this->assert
  56. ->object($svn->setRepositoryUrl($url = uniqid()))->isIdenticalTo($svn)
  57. ->string($svn->getRepositoryUrl())->isEqualTo($url)
  58. ->object($svn->setRepositoryUrl($url = rand(- PHP_INT_MAX, PHP_INT_MAX)))->isIdenticalTo($svn)
  59. ->string($svn->getRepositoryUrl())->isEqualTo((string) $url)
  60. ;
  61. }
  62. public function testSetRevision()
  63. {
  64. $adapter = new atoum\test\adapter();
  65. $adapter->extension_loaded = true;
  66. $svn = new vcs\svn($adapter);
  67. $this->assert
  68. ->object($svn->setRevision($revisionNumber = rand(1, PHP_INT_MAX)))->isIdenticalTo($svn)
  69. ->integer($svn->getRevision())->isEqualTo($revisionNumber)
  70. ->object($svn->setRevision($revisionNumber = uniqid()))->isIdenticalTo($svn)
  71. ->integer($svn->getRevision())->isEqualTo((int) $revisionNumber)
  72. ;
  73. }
  74. public function testSetUsername()
  75. {
  76. $adapter = new atoum\test\adapter();
  77. $adapter->extension_loaded = true;
  78. $svn = new vcs\svn($adapter);
  79. $this->assert
  80. ->object($svn->setUsername($username = uniqid()))->isIdenticalTo($svn)
  81. ->string($svn->getUsername())->isEqualTo($username)
  82. ->object($svn->setUsername($username = rand(- PHP_INT_MAX, PHP_INT_MAX)))->isIdenticalTo($svn)
  83. ->string($svn->getUsername())->isEqualTo((string) $username)
  84. ;
  85. }
  86. public function testSetPassword()
  87. {
  88. $adapter = new atoum\test\adapter();
  89. $adapter->extension_loaded = true;
  90. $svn = new vcs\svn($adapter);
  91. $this->assert
  92. ->object($svn->setPassword($password = uniqid()))->isIdenticalTo($svn)
  93. ->string($svn->getPassword())->isEqualTo($password)
  94. ->object($svn->setPassword($password = rand(- PHP_INT_MAX, PHP_INT_MAX)))->isIdenticalTo($svn)
  95. ->string($svn->getPassword())->isEqualTo((string) $password)
  96. ;
  97. }
  98. public function testGetWorkingDirectoryIterator()
  99. {
  100. $adapter = new atoum\test\adapter();
  101. $adapter->extension_loaded = true;
  102. $svn = new vcs\svn($adapter);
  103. $svn->setWorkingDirectory(__DIR__);
  104. $this->assert
  105. ->object($recursiveIteratorIterator = $svn->getWorkingDirectoryIterator())->isInstanceOf('recursiveIteratorIterator')
  106. ->object($recursiveDirectoryIterator = $recursiveIteratorIterator->getInnerIterator())->isInstanceOf('recursiveDirectoryIterator')
  107. ->string($recursiveDirectoryIterator->current()->getPathInfo()->getPathname())->isEqualTo(__DIR__)
  108. ;
  109. }
  110. public function testGetNextRevisions()
  111. {
  112. $adapter = new atoum\test\adapter();
  113. $adapter->extension_loaded = true;
  114. $svn = new vcs\svn($adapter);
  115. $adapter->svn_auth_set_parameter = function() {};
  116. $this->assert
  117. ->exception(function() use ($svn) {
  118. $svn->getNextRevisions();
  119. }
  120. )
  121. ->isInstanceOf('mageekguy\atoum\exceptions\runtime')
  122. ->hasMessage('Unable to get logs, repository url is undefined')
  123. ->adapter($adapter)
  124. ->call('svn_auth_set_parameter')->withArguments(PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS, true)->never()
  125. ->call('svn_log')->never()
  126. ;
  127. $svn->setRepositoryUrl($repositoryUrl = uniqid());
  128. $adapter->svn_auth_set_parameter = function() {};
  129. $adapter->svn_log = array();
  130. $adapter->resetCalls();
  131. $this->assert
  132. ->array($svn->getNextRevisions())->isEmpty()
  133. ->adapter($adapter)
  134. ->call('svn_auth_set_parameter')->withArguments(PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS, true)->once()
  135. ->call('svn_log')->withArguments($repositoryUrl, 1, SVN_REVISION_HEAD)->once()
  136. ;
  137. $svn->setRevision($revision = rand(1, PHP_INT_MAX));
  138. $adapter->resetCalls();
  139. $this->assert
  140. ->array($svn->getNextRevisions())->isEmpty()
  141. ->adapter($adapter)
  142. ->call('svn_auth_set_parameter')->withArguments(PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS, true)->once()
  143. ->call('svn_log')->withArguments($repositoryUrl, $revision, SVN_REVISION_HEAD)->once()
  144. ;
  145. $adapter->resetCalls();
  146. $adapter->svn_log = array(uniqid() => uniqid());
  147. $this->assert
  148. ->array($svn->getNextRevisions())->isEmpty()
  149. ->adapter($adapter)->call('svn_log')->withArguments($repositoryUrl, $revision, SVN_REVISION_HEAD)->once()
  150. ;
  151. $adapter->resetCalls();
  152. $adapter->svn_log = array(
  153. array('rev' => $revision1 = uniqid()),
  154. array('rev' => $revision2 = uniqid()),
  155. array('rev' => $revision3 = uniqid())
  156. );
  157. $this->assert
  158. ->array($svn->getNextRevisions())->isEqualTo(array($revision1, $revision2, $revision3))
  159. ->adapter($adapter)->call('svn_log')->withArguments($repositoryUrl, $revision, SVN_REVISION_HEAD)->once()
  160. ;
  161. }
  162. public function testSetExportDirectory()
  163. {
  164. $this->mockGenerator
  165. ->generate('mageekguy\atoum\scripts\builder\vcs\svn')
  166. ;
  167. $adapter = new atoum\test\adapter();
  168. $adapter->extension_loaded = true;
  169. $svn = new \mock\mageekguy\atoum\scripts\builder\vcs\svn($adapter);
  170. $this->assert
  171. ->object($svn->setWorkingDirectory($workingDirectory = uniqid()))->isIdenticalTo($svn)
  172. ->string($svn->getWorkingDirectory())->isEqualTo($workingDirectory)
  173. ->object($svn->setWorkingDirectory($workingDirectory = rand(1, PHP_INT_MAX)))->isIdenticalTo($svn)
  174. ->string($svn->getWorkingDirectory())->isIdenticalTo((string) $workingDirectory)
  175. ;
  176. }
  177. public function testExportRepository()
  178. {
  179. $this->mockGenerator
  180. ->generate('mageekguy\atoum\scripts\builder\vcs\svn')
  181. ;
  182. $adapter = new atoum\test\adapter();
  183. $adapter->extension_loaded = true;
  184. $svn = new \mock\mageekguy\atoum\scripts\builder\vcs\svn($adapter);
  185. $svn->getMockController()->cleanWorkingDirectory = $svn;
  186. $this->assert
  187. ->exception(function() use ($svn) {
  188. $svn->exportRepository(uniqid());
  189. }
  190. )
  191. ->isInstanceOf('mageekguy\atoum\exceptions\runtime')
  192. ->hasMessage('Unable to export repository, repository url is undefined')
  193. ->adapter($adapter)
  194. ->call('svn_auth_set_parameter')->withArguments(PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS, true)->never()
  195. ->call('svn_auth_set_parameter')->withArguments(SVN_AUTH_PARAM_DEFAULT_USERNAME, $svn->getUsername())->never()
  196. ->call('svn_auth_set_parameter')->withArguments(SVN_AUTH_PARAM_DEFAULT_PASSWORD, $svn->getPassword())->never()
  197. ->call('svn_checkout')->never()
  198. ;
  199. $svn
  200. ->setRepositoryUrl($repositoryUrl = uniqid())
  201. ->setWorkingDirectory($workingDirectory = __DIR__)
  202. ;
  203. $adapter->resetCalls();
  204. $adapter->svn_checkout = false;
  205. $adapter->svn_auth_set_parameter = function() {};
  206. $this->assert
  207. ->exception(function() use ($svn) {
  208. $svn->exportRepository();
  209. }
  210. )
  211. ->isInstanceOf('mageekguy\atoum\exceptions\runtime')
  212. ->hasMessage('Unable to checkout repository \'' . $repositoryUrl . '\' in directory \'' . $workingDirectory . '\'')
  213. ->adapter($adapter)
  214. ->call('svn_auth_set_parameter')->withArguments(PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS, true)->once()
  215. ->call('svn_auth_set_parameter')->withArguments(SVN_AUTH_PARAM_DEFAULT_USERNAME, $svn->getUsername())->never()
  216. ->call('svn_auth_set_parameter')->withArguments(SVN_AUTH_PARAM_DEFAULT_PASSWORD, $svn->getPassword())->never()
  217. ->call('svn_checkout')->withArguments($svn->getRepositoryUrl(), $workingDirectory, $svn->getRevision())->once()
  218. ->mock($svn)
  219. ->call('cleanWorkingDirectory')->once()
  220. ;
  221. $svn
  222. ->setUsername(uniqid())
  223. ->getMockController()->resetCalls()
  224. ;
  225. $adapter->resetCalls();
  226. $this->assert
  227. ->exception(function() use ($svn) {
  228. $svn->exportRepository();
  229. }
  230. )
  231. ->isInstanceOf('mageekguy\atoum\exceptions\runtime')
  232. ->hasMessage('Unable to checkout repository \'' . $repositoryUrl . '\' in directory \'' . $workingDirectory . '\'')
  233. ->adapter($adapter)
  234. ->call('svn_auth_set_parameter')->withArguments(PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS, true)->once()
  235. ->call('svn_auth_set_parameter')->withArguments(SVN_AUTH_PARAM_DEFAULT_USERNAME, $svn->getUsername())->once()
  236. ->call('svn_auth_set_parameter')->withArguments(SVN_AUTH_PARAM_DEFAULT_PASSWORD, $svn->getPassword())->never()
  237. ->call('svn_checkout')->withArguments($svn->getRepositoryUrl(), $workingDirectory, $svn->getRevision())->once()
  238. ->mock($svn)
  239. ->call('cleanWorkingDirectory')->once()
  240. ;
  241. $svn
  242. ->setPassword(uniqid())
  243. ->getMockController()->resetCalls()
  244. ;
  245. $adapter->resetCalls();
  246. $this->assert
  247. ->exception(function() use ($svn) {
  248. $svn->exportRepository();
  249. }
  250. )
  251. ->isInstanceOf('mageekguy\atoum\exceptions\runtime')
  252. ->hasMessage('Unable to checkout repository \'' . $repositoryUrl . '\' in directory \'' . $workingDirectory . '\'')
  253. ->adapter($adapter)
  254. ->call('svn_auth_set_parameter')->withArguments(PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS, true)->once()
  255. ->call('svn_auth_set_parameter')->withArguments(SVN_AUTH_PARAM_DEFAULT_USERNAME, $svn->getUsername())->once()
  256. ->call('svn_auth_set_parameter')->withArguments(SVN_AUTH_PARAM_DEFAULT_PASSWORD, $svn->getPassword())->once()
  257. ->call('svn_checkout')->withArguments($svn->getRepositoryUrl(), $workingDirectory, $svn->getRevision())->once()
  258. ->mock($svn)
  259. ->call('cleanWorkingDirectory')->once()
  260. ;
  261. $svn->getMockController()->resetCalls();
  262. $adapter->svn_checkout = true;
  263. $adapter->resetCalls();
  264. $this->assert
  265. ->object($svn->exportRepository())->isIdenticalTo($svn)
  266. ->adapter($adapter)
  267. ->call('svn_auth_set_parameter')->withArguments(PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS, true)->once()
  268. ->call('svn_auth_set_parameter')->withArguments(SVN_AUTH_PARAM_DEFAULT_USERNAME, $svn->getUsername())->once()
  269. ->call('svn_auth_set_parameter')->withArguments(SVN_AUTH_PARAM_DEFAULT_PASSWORD, $svn->getPassword())->once()
  270. ->call('svn_checkout')->withArguments($svn->getRepositoryUrl(), $workingDirectory, $svn->getRevision())->once()
  271. ->mock($svn)
  272. ->call('cleanWorkingDirectory')->once()
  273. ;
  274. }
  275. public function testCleanWorkingDirectory()
  276. {
  277. $adapter = new atoum\test\adapter();
  278. $adapter->extension_loaded = true;
  279. $adapter->unlink = function() {};
  280. $adapter->rmdir = function() {};
  281. $this->mockGenerator
  282. ->generate('mageekguy\atoum\scripts\builder\vcs\svn')
  283. ->generate('splFileInfo')
  284. ;
  285. $firstFile = atoum\mock\stream::get('workingDirectory/aDirectory/firstFile');
  286. $firstFile->unlink = true;
  287. $secondFile = atoum\mock\stream::get('workingDirectory/aDirectory/secondFile');
  288. $secondFile->unlink = true;
  289. $aDirectory = atoum\mock\stream::get('workingDirectory/aDirectory');
  290. $aDirectory->opendir = true;
  291. $aDirectory->readdir[1] = 'firstFile';
  292. $aDirectory->readdir[2] = 'secondFile';
  293. $aDirectory->readdir[3] = false;
  294. $emptyDirectory = atoum\mock\stream::get('workingDirectory/emptyDirectory');
  295. $emptyDirectory->opendir = true;
  296. $emptyDirectory->readdir[1] = false;
  297. $anOtherFirstFile = atoum\mock\stream::get('workingDirectory/anOtherDirectory/anOtherFirstFile');
  298. $anOtherFirstFile->unlink = true;
  299. $anOtherSecondFile = atoum\mock\stream::get('workingDirectory/anOtherDirectory/anOtherSecondFile');
  300. $anOtherSecondFile->unlink = true;
  301. $anOtherDirectory = atoum\mock\stream::get('workingDirectory/anOtherDirectory');
  302. $anOtherDirectory->opendir = true;
  303. $anOtherDirectory->readdir[1] = 'anOtherFirstFile';
  304. $anOtherDirectory->readdir[2] = 'anOtherSecondFile';
  305. $anOtherDirectory->readdir[3] = false;
  306. $aFile = atoum\mock\stream::get('workingDirectory/aFile');
  307. $aFile->unlink = true;
  308. $workingDirectory = atoum\mock\stream::get('workingDirectory');
  309. $workingDirectory->opendir = true;
  310. $workingDirectory->readdir[1] = 'aDirectory';
  311. $workingDirectory->readdir[2] = 'emptyDirectory';
  312. $workingDirectory->readdir[3] = 'anOtherDirectory';
  313. $workingDirectory->readdir[4] = 'aFile';
  314. $workingDirectory->readdir[5] = false;
  315. $svn = new \mock\mageekguy\atoum\scripts\builder\vcs\svn($adapter, $svnController = new mock\controller());
  316. $this->assert
  317. ->when(function() use ($svn) { $svn->setWorkingDirectory('atoum://workingDirectory'); })
  318. ->object($svn->cleanWorkingDirectory())->isIdenticalTo($svn)
  319. ->adapter($adapter)
  320. ->call('unlink')->withArguments('atoum://workingDirectory/aDirectory/firstFile')->once()
  321. ->call('unlink')->withArguments('atoum://workingDirectory/aDirectory/secondFile')->once()
  322. ->call('rmdir')->withArguments('atoum://workingDirectory/aDirectory')->once()
  323. ->call('rmdir')->withArguments('atoum://workingDirectory/emptyDirectory')->once()
  324. ->call('unlink')->withArguments('atoum://workingDirectory/anOtherDirectory/anOtherFirstFile')->once()
  325. ->call('unlink')->withArguments('atoum://workingDirectory/anOtherDirectory/anOtherSecondFile')->once()
  326. ->call('rmdir')->withArguments('atoum://workingDirectory/anOtherDirectory')->once()
  327. ->call('unlink')->withArguments('atoum://workingDirectory/aFile')->once()
  328. ->call('rmdir')->withArguments('atoum://workingDirectory')->never()
  329. ;
  330. }
  331. }
  332. ?>