]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - tests/atompub/atompub_test.php
Merge remote-tracking branch 'upstream/master'
[quix0rs-gnu-social.git] / tests / atompub / atompub_test.php
old mode 100644 (file)
new mode 100755 (executable)
index 047e2ce..4259c0c
+#!/usr/bin/env php
 <?php
-
-class AtomPubClient
-{
-    /**
-     *
-     * @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;
-    }
-
-    /**
-     * @param string $baseUrl to attempt feed discovery from
-     * @return AtomPubClient
-     */
-    static function discoverFromPage($baseUrl)
-    {
-        
-    }
-
-    function get()
-    {
-        
-    }
-    
-    function post($stuff, $type='application/atom+xml;type=entry')
-    {
-        // post it up!
-        // optional 'Slug' header too
-        // .. receive ..
-        if ($response->getStatus() == '201') {
-            // yay
-            // MUST have a "Location" header
-            // if it has a Content-Location header, it MUST match Location
-            //   and if it does, check the response body -- it should match what we posted, more or less.
-        } else {
-            throw new Exception("Expected HTTP 201 on POST, got " . $response->getStatus());
-        }
-    }
-
-    function put($data, $type='application/atom+xml;type=entry')
-    {
-        // PUT it up!
-        // must get a 200 back.
-        // unlike post, we don't get the location too.
-    }
+/*
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2010, StatusNet, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/../..'));
+
+$shortoptions = 'n:p:';
+$longoptions = array('nickname=', 'password=', 'dry-run');
+
+$helptext = <<<END_OF_HELP
+USAGE: atompub_test.php [options]
+
+Runs some tests on the AtomPub interface for the site. You must provide
+a user account to authenticate as; it will be used to make some test
+posts on the site.
+
+Options:
+  -n<user>  --nickname=<user>  Nickname of account to post as
+  -p<pass>  --password=<pass>  Password for account
+  --dry-run                    Skip tests that modify the site (post, delete)
+
+END_OF_HELP;
+
+require_once INSTALLDIR.'/scripts/commandline.inc.php';
+
+$user = get_option_value('n', 'nickname');
+$pass = get_option_value('p', 'password');
+
+if (!$user) {
+    die("Must set a user: --nickname=<username>\n");
+}
+if (!$pass) {
+    die("Must set a password: --password=<username>\n");
 }
 
 // discover the feed...
+// @fixme will this actually work?
+$url = common_local_url('ApiTimelineUser', array('format' => 'atom', 'id' => $user));
 
-// confirm the feed has edit links ..... ?
+echo "Collection URL is: $url\n";
 
-$pub = new AtomPubClient($url, $user, $pass);
+$collection = new AtomPubClient($url, $user, $pass);
 
-// post!
-$target = $pub->post($atom);
+// confirm the feed has edit links ..... ?
 
-// make sure it's accessible
-// fetch $target -- should give us the atom entry
-//  edit URL should match
+echo "Posting an empty message (should fail)... ";
+try {
+    $noticeUrl = $collection->post('');
+    die("FAILED, succeeded!\n");
+} catch (Exception $e) {
+    echo "ok\n";
+}
 
-// refetch the feed; make sure the new entry is in there
-//  edit URL should match
+echo "Posting an invalid XML message (should fail)... ";
+try {
+    $noticeUrl = $collection->post('<feed<entry>barf</yomomma>');
+    die("FAILED, succeeded!\n");
+} catch (Exception $e) {
+    echo "ok\n";
+}
 
-// try editing! it should fail.
+echo "Posting a valid XML but non-Atom message (should fail)... ";
 try {
-    $target2 = $pub->put($target, $atom2);
-    // FAIL! this shouldn't work.
-} catch (AtomPubPermissionDeniedException $e) {
-    // yay
+    $noticeUrl = $collection->post('<feed xmlns="http://notatom.com"><id>arf</id><entry><id>barf</id></entry></feed>');
+    die("FAILED, succeeded!\n");
+} catch (Exception $e) {
+    echo "ok\n";
 }
 
-// try deleting!
-$pub->delete();
+// post!
+$rand = mt_rand(0, 99999);
+$atom = <<<END_ATOM
+<entry xmlns="http://www.w3.org/2005/Atom">
+    <title>This is an AtomPub test post title ($rand)</title>
+    <content>This is an AtomPub test post content ($rand)</content>
+</entry>
+END_ATOM;
+
+echo "Posting a new message... ";
+$noticeUrl = $collection->post($atom);
+echo "ok, got $noticeUrl\n";
+
+echo "Fetching the new notice... ";
+$notice = new AtomPubClient($noticeUrl, $user, $pass);
+$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) {
+    die("Entry lists edit URL as $editUrl, no match!\n");
+}
+echo "OK\n";
+
+echo "Refetching the collection... ";
+$feed = $collection->get();
+echo "ok\n";
 
-// fetch $target -- it should be gone now
+echo "Confirming new entry is in the feed... ";
+$entry = AtomPubClient::getEntryInFeed($feed, $noticeUri);
+if (!$entry) {
+    die("missing!\n");
+}
+//  edit URL should match
+echo "ok\n";
 
-// fetch the feed again; the new entry should be gone again
+echo "Editing notice (should fail)... ";
+try {
+    $notice->put($target, $atom2);
+    die("ERROR: editing a notice should have failed.\n");
+} catch (Exception $e) {
+    echo "ok (failed as expected)\n";
+}
 
+echo "Deleting notice... ";
+$notice->delete();
+echo "ok\n";
 
+echo "Refetching deleted notice to confirm it's gone... ";
+try {
+    $body = $notice->get();
+    var_dump($body);
+    die("ERROR: notice should be gone now.\n");
+} catch (Exception $e) {
+    echo "ok\n";
+}
 
+echo "Refetching the collection.. ";
+$feed = $collection->get();
+echo "ok\n";
 
+echo "Confirming deleted notice is no longer in the feed... ";
+$entry = AtomPubClient::getEntryInFeed($feed, $noticeUri);
+if ($entry) {
+    die("still there!\n");
+}
+echo "ok\n";
 
 // make subscriptions
 // make some posts