X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=tests%2Fatompub%2Fatompub_test.php;h=fb675c778e3c33754f7da53da80dd9c92806b973;hb=1ab4c9998aa77527dbb8c38bcd8df15062e85d38;hp=77934c64286aefde6a489ba8acf116c905ac518c;hpb=b7e3b06bb109a54f394311b4ba6bf3ab6a602c1b;p=quix0rs-gnu-social.git diff --git a/tests/atompub/atompub_test.php b/tests/atompub/atompub_test.php old mode 100644 new mode 100755 index 77934c6428..fb675c778e --- a/tests/atompub/atompub_test.php +++ b/tests/atompub/atompub_test.php @@ -39,177 +39,6 @@ END_OF_HELP; require_once INSTALLDIR.'/scripts/commandline.inc'; -class AtomPubClient -{ - public $url; - private $user, $pass; - - /** - * - * @param string $url collection feed URL - * @param string $user auth username - * @param string $pass auth password - */ - function __construct($url, $user, $pass) - { - $this->url = $url; - $this->user = $user; - $this->pass = $pass; - } - - /** - * Set up an HTTPClient with auth for our resource. - * - * @param string $method - * @return HTTPClient - */ - private function httpClient($method='GET') - { - $client = new HTTPClient($this->url); - $client->setMethod($method); - $client->setAuth($this->user, $this->pass); - return $client; - } - - function get() - { - $client = $this->httpClient('GET'); - $response = $client->send(); - if ($response->isOk()) { - return $response->getBody(); - } else { - throw new Exception("Bogus return code: " . $response->getStatus() . ': ' . $response->getBody()); - } - } - - /** - * Create a new resource by POSTing it to the collection. - * If successful, will return the URL representing the - * canonical location of the new resource. Neat! - * - * @param string $data - * @param string $type defaults to Atom entry - * @return string URL to the created resource - * - * @throws exceptions on failure - */ - function post($data, $type='application/atom+xml;type=entry') - { - $client = $this->httpClient('POST'); - $client->setHeader('Content-Type', $type); - // optional Slug header not used in this case - $client->setBody($data); - $response = $client->send(); - - if ($response->getStatus() != '201') { - throw new Exception("Expected HTTP 201 on POST, got " . $response->getStatus() . ': ' . $response->getBody()); - } - $loc = $response->getHeader('Location'); - $contentLoc = $response->getHeader('Content-Location'); - - if (empty($loc)) { - throw new Exception("AtomPub POST response missing Location header."); - } - if (!empty($contentLoc)) { - if ($loc != $contentLoc) { - throw new Exception("AtomPub POST response Location and Content-Location headers do not match."); - } - - // If Content-Location and Location match, that means the response - // body is safe to interpret as the resource itself. - if ($type == 'application/atom+xml;type=entry') { - self::validateAtomEntry($response->getBody()); - } - } - - return $loc; - } - - /** - * Note that StatusNet currently doesn't allow PUT editing on notices. - * - * @param string $data - * @param string $type defaults to Atom entry - * @return true on success - * - * @throws exceptions on failure - */ - function put($data, $type='application/atom+xml;type=entry') - { - $client = $this->httpClient('PUT'); - $client->setHeader('Content-Type', $type); - $client->setBody($data); - $response = $client->send(); - - if ($response->getStatus() != '200' && $response->getStatus() != '204') { - throw new Exception("Expected HTTP 200 or 204 on PUT, got " . $response->getStatus() . ': ' . $response->getBody()); - } - - return true; - } - - /** - * Delete the resource. - * - * @return true on success - * - * @throws exceptions on failure - */ - function delete() - { - $client = $this->httpClient('DELETE'); - $client->setBody($data); - $response = $client->send(); - - if ($response->getStatus() != '200' && $response->getStatus() != '204') { - throw new Exception("Expected HTTP 200 or 204 on DELETE, got " . $response->getStatus() . ': ' . $response->getBody()); - } - - return true; - } - - /** - * Ensure that the given string is a parseable Atom entry. - * - * @param string $str - * @return boolean - * @throws Exception on invalid input - */ - static function validateAtomEntry($str) - { - if (empty($str)) { - throw new Exception('Bad Atom entry: empty'); - } - $dom = new DOMDocument; - if (!$dom->loadXML($str)) { - throw new Exception('Bad Atom entry: XML is not well formed.'); - } - - $activity = new Activity($dom->documentRoot); - return true; - } - - static function entryEditURL($str) { - $dom = new DOMDocument; - $dom->loadXML($str); - $path = new DOMXPath($dom); - $path->registerNamespace('atom', 'http://www.w3.org/2005/Atom'); - - $links = $path->query('/atom:entry/atom:link[@rel="edit"]', $dom->documentRoot); - if ($links && $links->length) { - if ($links->length > 1) { - throw new Exception('Bad Atom entry; has multiple rel=edit links.'); - } - $link = $links->item(0); - $url = $link->getAttribute('href'); - return $url; - } else { - throw new Exception('Atom entry lists no rel=edit link.'); - } - } -} - - $user = get_option_value('n', 'nickname'); $pass = get_option_value('p', 'password'); @@ -273,6 +102,10 @@ $body = $notice->get(); AtomPubClient::validateAtomEntry($body); echo "ok\n"; +echo "Getting the notice ID URI... "; +$noticeUri = AtomPubClient::entryId($body); +echo "ok: $noticeUri\n"; + echo "Confirming new entry points to itself right... "; $editUrl = AtomPubClient::entryEditURL($body); if ($editUrl != $noticeUrl) { @@ -285,9 +118,12 @@ $feed = $collection->get(); echo "ok\n"; echo "Confirming new entry is in the feed... "; -// make sure the new entry is in there +$entry = AtomPubClient::getEntryInFeed($feed, $noticeUri); +if (!$entry) { + die("missing!\n"); +} // edit URL should match -echo "NYI\n"; +echo "ok\n"; echo "Editing notice (should fail)... "; try { @@ -315,7 +151,11 @@ $feed = $collection->get(); echo "ok\n"; echo "Confirming deleted notice is no longer in the feed... "; -echo "NYI\n"; +$entry = AtomPubClient::getEntryInFeed($feed, $noticeUri); +if ($entry) { + die("still there!\n"); +} +echo "ok\n"; // make subscriptions // make some posts