http = new Telegraph\HTTPTest(); $this->api = new API(); $this->api->http = $this->http; ORM::for_table('users')->raw_query('TRUNCATE users')->delete_many(); ORM::for_table('roles')->raw_query('TRUNCATE roles')->delete_many(); ORM::for_table('sites')->raw_query('TRUNCATE sites')->delete_many(); ORM::for_table('webmentions')->raw_query('TRUNCATE webmentions')->delete_many(); ORM::for_table('webmention_status')->raw_query('TRUNCATE webmention_status')->delete_many(); } private function _createExampleAccount() { $user = ORM::for_table('users')->create(); $user->url = 'http://example.com'; $user->save(); $site = ORM::for_table('sites')->create(); $site->name = 'Example'; $site->created_by = $user->id(); $site->save(); $role = ORM::for_table('roles')->create(); $role->site_id = $site->id(); $role->user_id = $user->id(); $role->role = 'owner'; $role->token = 'a'; $role->save(); } private function webmention($params) { $request = new Request($params); $response = new Response(); $response = $this->api->webmention($request, $response); $webmention = ORM::for_table('webmentions')->where(['source' => $params['source'], 'target' => $params['target']])->find_one(); $client = new IndieWeb\MentionClientTest(); $client::$dataDir = dirname(__FILE__) . '/data/'; if(!is_object($webmention)) { throw new Exception("No webmention was queued for this test"); } $callback = Telegraph\Webmention::send($webmention->id, $client, $this->http); return [$webmention, $callback]; } private static function webmentionStatus($id) { return ORM::for_table('webmention_status')->where(['webmention_id'=>$id])->order_by_desc('created_at')->find_one(); } public function testNoEndpoint() { $this->_createExampleAccount(); list($webmention, $callback) = $this->webmention([ 'token' => 'a', 'source' => 'http://source.example.com/no-endpoint', 'target' => 'http://target.example.com/no-endpoint' ]); $status = $this->webmentionStatus($webmention->id); $this->assertEquals($status->status, 'not_supported'); } public function testPingbackSuccess() { $this->_createExampleAccount(); list($webmention, $callback) = $this->webmention([ 'token' => 'a', 'source' => 'http://source.example.com/pingback-success', 'target' => 'http://target.example.com/pingback-success' ]); $status = $this->webmentionStatus($webmention->id); $this->assertEquals($status->status, 'pingback_accepted'); $webmention = ORM::for_table('webmentions')->where('id',$webmention->id)->find_one(); $this->assertEquals('http://pingback.example.com/success', $webmention->pingback_endpoint); } public function testPingbackFailed() { $this->_createExampleAccount(); list($webmention, $callback) = $this->webmention([ 'token' => 'a', 'source' => 'http://source.example.com/pingback-failed', 'target' => 'http://target.example.com/pingback-failed' ]); $status = $this->webmentionStatus($webmention->id); $this->assertEquals($status->status, 'pingback_error'); } public function testWebmentionTakesPriorityOverPingback() { $this->_createExampleAccount(); list($webmention, $callback) = $this->webmention([ 'token' => 'a', 'source' => 'http://source.example.com/webmention-and-pingback', 'target' => 'http://target.example.com/webmention-success' ]); $status = $this->webmentionStatus($webmention->id); $this->assertEquals($status->status, 'webmention_accepted'); } public function testWebmentionSucceeds() { $this->_createExampleAccount(); list($webmention, $callback) = $this->webmention([ 'token' => 'a', 'source' => 'http://source.example.com/webmention-success', 'target' => 'http://target.example.com/webmention-success' ]); $status = $this->webmentionStatus($webmention->id); $this->assertEquals($status->status, 'webmention_accepted'); $webmention = ORM::for_table('webmentions')->where('id',$webmention->id)->find_one(); $this->assertEquals('http://webmention.example.com/success', $webmention->webmention_endpoint); } public function testSavesWebmentionStatusURL() { $this->_createExampleAccount(); list($webmention, $callback) = $this->webmention([ 'token' => 'a', 'source' => 'http://source.example.com/webmention-status-url', 'target' => 'http://target.example.com/webmention-status-url' ]); $status = $this->webmentionStatus($webmention->id); $this->assertEquals($status->status, 'webmention_accepted'); $webmention = ORM::for_table('webmentions')->where('id',$webmention->id)->find_one(); $this->assertEquals('http://webmention.example.com/success-with-status', $webmention->webmention_endpoint); // Make sure the status URL returned is an absolute URL $this->assertEquals('http://webmention.example.com/webmention/1000', $webmention->webmention_status_url); } public function testWebmentionFailed() { $this->_createExampleAccount(); list($webmention, $callback) = $this->webmention([ 'token' => 'a', 'source' => 'http://source.example.com/webmention-failed', 'target' => 'http://target.example.com/webmention-failed' ]); $status = $this->webmentionStatus($webmention->id); $this->assertEquals($status->status, 'webmention_error'); $webmention = ORM::for_table('webmentions')->where('id',$webmention->id)->find_one(); $this->assertEquals('http://webmention.example.com/error', $webmention->webmention_endpoint); } public function testWebmentionStatusCallback() { $this->_createExampleAccount(); list($webmention, $callback) = $this->webmention([ 'token' => 'a', 'source' => 'http://source.example.com/webmention-success', 'target' => 'http://target.example.com/webmention-success', 'callback' => 'http://source.example.com/callback' ]); $status = $this->webmentionStatus($webmention->id); $this->assertEquals($status->status, 'webmention_accepted'); $webmention = ORM::for_table('webmentions')->where('id',$webmention->id)->find_one(); $this->assertEquals('http://webmention.example.com/success', $webmention->webmention_endpoint); $this->assertEquals('Callback was successful', trim($callback['body'])); } }