ApiControllerTest.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?php
  2. namespace Packagist\WebBundle\Tests\Controller;
  3. use Packagist\WebBundle\Entity\Package;
  4. use Packagist\WebBundle\Entity\User;
  5. use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
  6. class ApiControllerTest extends WebTestCase
  7. {
  8. public function testPackages()
  9. {
  10. $client = self::createClient();
  11. $client->request('GET', '/packages.json');
  12. $this->assertTrue(count(json_decode($client->getResponse()->getContent())) > 0);
  13. }
  14. public function testGithubFailsCorrectly()
  15. {
  16. $client = self::createClient();
  17. $client->request('GET', '/api/github');
  18. $this->assertEquals(405, $client->getResponse()->getStatusCode(), 'GET method should not be allowed for GitHub Post-Receive URL');
  19. $payload = json_encode(array('repository' => array('url' => 'git://github.com/composer/composer',)));
  20. $client->request('POST', '/api/github?username=INVALID_USER&apiToken=INVALID_TOKEN', array('payload' => $payload,));
  21. $this->assertEquals(403, $client->getResponse()->getStatusCode(), 'POST method should return 403 "Forbidden" if invalid username and API Token are sent');
  22. }
  23. /**
  24. * @dataProvider githubApiProvider
  25. */
  26. public function testGithubApi($url)
  27. {
  28. $client = self::createClient();
  29. $package = new Package;
  30. $package->setRepository($url);
  31. $user = new User;
  32. $user->addPackages($package);
  33. $repo = $this->getMockBuilder('Packagist\WebBundle\Entity\UserRepository')->disableOriginalConstructor()->getMock();
  34. $em = $this->getMockBuilder('Doctrine\ORM\EntityManager')->disableOriginalConstructor()->getMock();
  35. $updater = $this->getMockBuilder('Packagist\WebBundle\Package\Updater')->disableOriginalConstructor()->getMock();
  36. $repo->expects($this->once())
  37. ->method('findOneBy')
  38. ->with($this->equalTo(array('username' => 'test', 'apiToken' => 'token')))
  39. ->will($this->returnValue($user));
  40. static::$kernel->getContainer()->set('packagist.user_repository', $repo);
  41. static::$kernel->getContainer()->set('doctrine.orm.entity_manager', $em);
  42. static::$kernel->getContainer()->set('packagist.package_updater', $updater);
  43. $payload = json_encode(array('repository' => array('url' => 'git://github.com/composer/composer')));
  44. $client->request('POST', '/api/github?username=test&apiToken=token', array('payload' => $payload));
  45. $this->assertEquals(202, $client->getResponse()->getStatusCode());
  46. }
  47. public function githubApiProvider()
  48. {
  49. return array(
  50. array('https://github.com/composer/composer.git'),
  51. array('http://github.com/composer/composer.git'),
  52. array('http://github.com/composer/composer'),
  53. array('git@github.com:composer/composer.git'),
  54. );
  55. }
  56. /**
  57. * @depends testGithubFailsCorrectly
  58. * @dataProvider urlProvider
  59. */
  60. public function testUrlDetection($endpoint, $url, $expectedOK)
  61. {
  62. $client = self::createClient();
  63. if ($endpoint == 'bitbucket') {
  64. $canonUrl = substr($url, 0, 1);
  65. $absUrl = substr($url, 1);
  66. $payload = json_encode(array('canon_url' => $canonUrl, 'repository' => array('absolute_url' => $absUrl)));
  67. } else {
  68. $payload = json_encode(array('repository' => array('url' => $url)));
  69. }
  70. $client->request('POST', '/api/'.$endpoint.'?username=INVALID_USER&apiToken=INVALID_TOKEN', array('payload' => $payload));
  71. $status = $client->getResponse()->getStatusCode();
  72. if (!$expectedOK) {
  73. $this->assertEquals(406, $status, 'POST method should return 406 "Not Acceptable" if an unknown URL was sent');
  74. } else {
  75. $this->assertEquals(403, $status, 'POST method should return 403 "Forbidden" for a valid URL with bad credentials.');
  76. }
  77. }
  78. public function urlProvider()
  79. {
  80. return array(
  81. // valid github URLs
  82. array('github', 'github.com/user/repo', true),
  83. array('github', 'github.com/user/repo.git', true),
  84. array('github', 'http://github.com/user/repo', true),
  85. array('github', 'https://github.com/user/repo', true),
  86. array('github', 'https://github.com/user/repo.git', true),
  87. array('github', 'git://github.com/user/repo', true),
  88. array('github', 'git@github.com:user/repo.git', true),
  89. array('github', 'git@github.com:user/repo', true),
  90. // valid bitbucket URLs
  91. array('bitbucket', 'bitbucket.org/user/repo', true),
  92. array('bitbucket', 'http://bitbucket.org/user/repo', true),
  93. array('bitbucket', 'https://bitbucket.org/user/repo', true),
  94. // valid others
  95. array('update-package', 'https://ghe.example.org/user/repository', true),
  96. array('update-package', 'https://gitlab.org/user/repository', true),
  97. array('update-package', 'ssh://git@stash.xxxxx.com/uuuuu/qqqqq.git', true),
  98. array('update-package', 'ssh://git@stash.xxxxx.com:2222/uuuuu/qqqqq.git', true),
  99. // invalid URLs
  100. array('github', 'php://github.com/user/repository', false),
  101. array('github', 'javascript://github.com/user/repository', false),
  102. array('github', 'http://', false),
  103. array('github', 'https://github.com/user/', false),
  104. array('github', 'https://github.com/user', false),
  105. array('github', 'https://github.com/', false),
  106. array('github', 'https://github.com', false),
  107. array('update-package', 'ssh://git@stash.zzzzz.com/kkkkk.git', false),
  108. array('update-package', 'ssh://ghe.example.org/user/jjjjj.git', false),
  109. );
  110. }
  111. }