gnu-social/tests/atompub/atompub_test.php
2021-07-16 19:44:37 +01:00

175 lines
4.8 KiB
PHP
Executable File

#!/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/>.
*/
if (!defined('INSTALLDIR')) {
define('INSTALLDIR', dirname(dirname(__DIR__)));
}
$shortoptions = 'n:p:';
$longoptions = ['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', ['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