You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

270 lines
12 KiB

  1. <?php
  2. use Symfony\Component\HttpFoundation\Request;
  3. use Symfony\Component\HttpFoundation\Response;
  4. class APITest extends PHPUnit_Framework_TestCase {
  5. private $client;
  6. public function setUp() {
  7. $this->client = new API();
  8. $this->client->http = new Telegraph\HTTPTest();
  9. ORM::for_table('users')->raw_query('TRUNCATE users')->delete_many();
  10. ORM::for_table('roles')->raw_query('TRUNCATE roles')->delete_many();
  11. ORM::for_table('sites')->raw_query('TRUNCATE sites')->delete_many();
  12. ORM::for_table('webmentions')->raw_query('TRUNCATE webmentions')->delete_many();
  13. ORM::for_table('webmention_status')->raw_query('TRUNCATE webmention_status')->delete_many();
  14. }
  15. private function webmention($params) {
  16. $request = new Request($params);
  17. $response = new Response();
  18. return $this->client->webmention($request, $response);
  19. }
  20. private function superfeedr_tracker($params, $args) {
  21. $request = new Request($params);
  22. $response = new Response();
  23. return $this->client->superfeedr_tracker($request, $response, $args);
  24. }
  25. private function status($code) {
  26. $request = new Request();
  27. $response = new Response();
  28. return $this->client->webmention_status($request, $response, ['code'=>$code]);
  29. }
  30. private function _createExampleAccount() {
  31. $user = ORM::for_table('users')->create();
  32. $user->url = 'http://example.com';
  33. $user->save();
  34. $site = ORM::for_table('sites')->create();
  35. $site->name = 'Example';
  36. $site->url = 'http://example.com';
  37. $site->created_by = $user->id();
  38. $site->save();
  39. $role = ORM::for_table('roles')->create();
  40. $role->site_id = $site->id();
  41. $role->user_id = $user->id();
  42. $role->role = 'owner';
  43. $role->token = 'a';
  44. $role->save();
  45. }
  46. private function _assertQueued($source, $target, $status_url) {
  47. preg_match('/\/webmention\/(.+)/', $status_url, $match);
  48. $this->assertNotNull($match);
  49. # Verify it queued the mention in the database
  50. $d = ORM::for_table('webmentions')->where(['source' => $source, 'target' => $target])->find_one();
  51. $this->assertNotFalse($d);
  52. $this->assertEquals($match[1], $d->token);
  53. # Check the status endpoint to make sure it says it's still queued
  54. $response = $this->status($d->token);
  55. $this->assertEquals(200, $response->getStatusCode());
  56. $data = json_decode($response->getContent());
  57. $this->assertEquals('queued', $data->status);
  58. }
  59. private function _assertNotQueued($source, $target) {
  60. # Verify it did not queue a mention in the database
  61. $d = ORM::for_table('webmentions')->where(['source' => $source, 'target' => $target])->find_one();
  62. $this->assertFalse($d);
  63. }
  64. public function testAuthentication() {
  65. $response = $this->webmention([]);
  66. $this->assertEquals(401, $response->getStatusCode());
  67. $data = json_decode($response->getContent());
  68. $this->assertEquals('authentication_required', $data->error);
  69. $this->_createExampleAccount();
  70. $response = $this->webmention(['token'=>'x','source'=>'http://source.example','target'=>'http://target.example']);
  71. $this->assertEquals(401, $response->getStatusCode());
  72. $data = json_decode($response->getContent());
  73. $this->assertEquals('invalid_token', $data->error);
  74. $response = $this->webmention(['token'=>'a']);
  75. $this->assertEquals(400, $response->getStatusCode());
  76. $data = json_decode($response->getContent());
  77. $this->assertEquals('missing_parameters', $data->error);
  78. }
  79. public function testMissingParameters() {
  80. $this->_createExampleAccount();
  81. $response = $this->webmention(['token'=>'a']);
  82. $this->assertEquals(400, $response->getStatusCode());
  83. $data = json_decode($response->getContent());
  84. $this->assertEquals('missing_parameters', $data->error);
  85. $response = $this->webmention(['token'=>'a','source'=>'foo']);
  86. $this->assertEquals(400, $response->getStatusCode());
  87. $data = json_decode($response->getContent());
  88. $this->assertEquals('missing_parameters', $data->error);
  89. $response = $this->webmention(['token'=>'a','target'=>'foo']);
  90. $this->assertEquals(400, $response->getStatusCode());
  91. $data = json_decode($response->getContent());
  92. $this->assertEquals('missing_parameters', $data->error);
  93. $response = $this->webmention(['token'=>'a','target_domain'=>'foo']);
  94. $this->assertEquals(400, $response->getStatusCode());
  95. $data = json_decode($response->getContent());
  96. $this->assertEquals('missing_parameters', $data->error);
  97. }
  98. public function testTargetAndTargetDomain() {
  99. $this->_createExampleAccount();
  100. $response = $this->webmention(['token'=>'a','source'=>'foo','target'=>'foo','target_domain'=>'foo']);
  101. $this->assertEquals(400, $response->getStatusCode());
  102. $data = json_decode($response->getContent());
  103. $this->assertEquals('invalid_parameter', $data->error);
  104. }
  105. public function testInvalidURLs() {
  106. $this->_createExampleAccount();
  107. foreach ([['token'=>'a','source'=>'notaurl','target'=>'alsonotaurl'],
  108. ['token'=>'a','source'=>'http://source.example','target'=>'alsonotaurl'],
  109. ['token'=>'a','source'=>'notaurl','target'=>'http://target.example'],
  110. ['token'=>'a','source'=>'http://source.example','target'=>'mailto:user@example.com'],
  111. ['token'=>'a','source'=>'http://source.example','target'=>'http://target.example','callback'=>'notaurl']
  112. ] as $params) {
  113. $response = $this->webmention($params);
  114. $this->assertEquals(400, $response->getStatusCode());
  115. $data = json_decode($response->getContent());
  116. $this->assertEquals('invalid_parameter', $data->error);
  117. }
  118. }
  119. public function testNoLinkToSource() {
  120. $this->_createExampleAccount();
  121. $response = $this->webmention(['token'=>'a','source'=>'http://source.example.com/nolink','target'=>'http://target.example.com']);
  122. $this->assertEquals(400, $response->getStatusCode());
  123. $data = json_decode($response->getContent());
  124. $this->assertEquals('no_link_found', $data->error);
  125. $response = $this->webmention(['token'=>'a','source'=>'http://source.example.com/nothtml','target'=>'http://target.example.com']);
  126. $this->assertEquals(400, $response->getStatusCode());
  127. $data = json_decode($response->getContent());
  128. $this->assertEquals('no_link_found', $data->error);
  129. }
  130. public function testHandlesMalformedHTMLWithLink() {
  131. $this->_createExampleAccount();
  132. $response = $this->webmention(['token'=>'a','source'=>'http://source.example.com/invalidhtml','target'=>'http://target.example.com']);
  133. $this->assertEquals(201, $response->getStatusCode());
  134. $data = json_decode($response->getContent());
  135. $this->assertEquals(false, property_exists($data, 'error'));
  136. }
  137. public function testTargetQueuesWebmention() {
  138. $this->_createExampleAccount();
  139. $response = $this->webmention(['token'=>'a','source'=>'http://source.example.com/basictest','target'=>'http://target.example.com']);
  140. $this->assertEquals(201, $response->getStatusCode());
  141. $data = json_decode($response->getContent());
  142. $this->assertEquals(false, property_exists($data, 'error'));
  143. $this->assertEquals('queued', $data->status);
  144. $this->_assertQueued('http://source.example.com/basictest', 'http://target.example.com', $data->location);
  145. }
  146. public function testTargetQueuesOnlyTargetWebmention() {
  147. $this->_createExampleAccount();
  148. $response = $this->webmention(['token'=>'a','source'=>'http://source.example.com/multipletest','target'=>'http://target.example.com']);
  149. $this->assertEquals(201, $response->getStatusCode());
  150. $data = json_decode($response->getContent());
  151. $this->assertEquals(false, property_exists($data, 'error'));
  152. $this->assertEquals('queued', $data->status);
  153. $this->_assertQueued('http://source.example.com/multipletest', 'http://target.example.com', $data->location);
  154. $this->_assertNotQueued('http://source.example.com/multipletest', '/relativelink');
  155. }
  156. public function testTargetDomainQueuesOneWebmention() {
  157. $this->_createExampleAccount();
  158. $response = $this->webmention(['token'=>'a','source'=>'http://source.example.com/basictest','target_domain'=>'target.example.com']);
  159. $body = $response->getContent();
  160. $this->assertEquals(201, $response->getStatusCode(), $body);
  161. $data = json_decode($body);
  162. $this->assertEquals(false, property_exists($data, 'error'), $body);
  163. $this->assertEquals('queued', $data->status, $body);
  164. $this->assertEquals(true, property_exists($data, 'location'), $body);
  165. $this->assertEquals(1, count($data->location), $body);
  166. $this->_assertQueued('http://source.example.com/basictest', 'http://target.example.com', $data->location[0]);
  167. }
  168. public function testTargetDomainQueuesMultipleWebmentions() {
  169. $this->_createExampleAccount();
  170. $response = $this->webmention(['token'=>'a','source'=>'http://source.example.com/basictest','target_domain'=>'example.com']);
  171. $body = $response->getContent();
  172. $this->assertEquals(201, $response->getStatusCode(), $body);
  173. $data = json_decode($body);
  174. $this->assertEquals(false, property_exists($data, 'error'), $body);
  175. $this->assertEquals('queued', $data->status, $body);
  176. $this->assertEquals(2, count($data->location), $body);
  177. $this->_assertQueued('http://source.example.com/basictest', 'http://target.example.com', $data->location[0]);
  178. $this->_assertQueued('http://source.example.com/basictest', 'http://target2.example.com', $data->location[1]);
  179. }
  180. public function testTargetDomainQueuesOnlyWebmentionsFromTargetDomain() {
  181. $this->_createExampleAccount();
  182. $response = $this->webmention(['token'=>'a','source'=>'http://source.example.com/multipletest','target_domain'=>'example.com']);
  183. $body = $response->getContent();
  184. $this->assertEquals(201, $response->getStatusCode(), $body);
  185. $data = json_decode($body);
  186. $this->assertEquals(false, property_exists($data, 'error'), $body);
  187. $this->assertEquals('queued', $data->status, $body);
  188. $this->assertEquals(2, count($data->location), $body);
  189. $this->_assertQueued('http://source.example.com/multipletest', 'http://target.example.com', $data->location[0]);
  190. $this->_assertQueued('http://source.example.com/multipletest', 'http://target2.example.com', $data->location[1]);
  191. $this->_assertNotQueued('http://source.example.com/multipletest', 'http://target.example.org');
  192. $this->_assertNotQueued('http://source.example.com/multipletest', '/relativelink');
  193. $this->_assertNotQueued('http://source.example.com/multipletest', 'http://source.example.com/relativelink');
  194. }
  195. public function testTargetDomainSubdomainCheck() {
  196. $this->_createExampleAccount();
  197. $response = $this->webmention(['token'=>'a','source'=>'http://source.example.com/multipletest','target_domain'=>'ample.com']);
  198. $body = $response->getContent();
  199. $this->assertEquals(400, $response->getStatusCode());
  200. $data = json_decode($response->getContent());
  201. $this->assertEquals('no_link_found', $data->error);
  202. }
  203. public function testStatusNotFound() {
  204. $this->_createExampleAccount();
  205. $response = $this->status('foo');
  206. $this->assertEquals(404, $response->getStatusCode());
  207. $data = json_decode($response->getContent());
  208. $this->assertEquals('not_found', $data->status);
  209. }
  210. public function testSuperfeedrTracker() {
  211. $this->_createExampleAccount();
  212. $payload = [
  213. 'items' => [[
  214. 'permalinkUrl' => 'http://source.example.com/basictest'
  215. ]]
  216. ];
  217. $response = $this->superfeedr_tracker($payload, ['token'=>'a']);
  218. $this->assertEquals(201, $response->getStatusCode());
  219. $data = json_decode($response->getContent());
  220. $this->assertEquals('queued', $data->status);
  221. }
  222. }