123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- #!/usr/bin/env php
- <?php
- /*
- * 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';
- $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));
- echo "Collection URL is: $url\n";
- $collection = new AtomPubClient($url, $user, $pass);
- // confirm the feed has edit links ..... ?
- echo "Posting an empty message (should fail)... ";
- try {
- $noticeUrl = $collection->post('');
- die("FAILED, succeeded!\n");
- } catch (Exception $e) {
- echo "ok\n";
- }
- 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";
- }
- echo "Posting a valid XML but non-Atom message (should fail)... ";
- try {
- $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";
- }
- // 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";
- 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";
- 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
- // make sure the posts go through or not depending on the subs
- // remove subscriptions
- // test that they don't go through now
- // group memberships too
- // make sure we can't post to someone else's feed!
- // make sure we can't delete someone else's messages
- // make sure we can't create/delete someone else's subscriptions
- // make sure we can't create/delete someone else's group memberships
|