+#!/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