forked from grumpydevelop/federator
added manual tests, WIP
This commit is contained in:
parent
d99479c188
commit
c1cf2a6be8
1 changed files with 193 additions and 0 deletions
193
php/federator/test.php
Normal file
193
php/federator/test.php
Normal file
|
@ -0,0 +1,193 @@
|
|||
<?php
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2024 Sascha Nitsch (grumpydeveloper) https://contentnation.net/@grumpydevelop
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
* @author Sascha Nitsch (grumpydeveloper)
|
||||
**/
|
||||
|
||||
namespace Federator;
|
||||
|
||||
/**
|
||||
* test functions
|
||||
*/
|
||||
class Test
|
||||
{
|
||||
/**
|
||||
* fetch outbox
|
||||
* @param string $_name user handle to fetch
|
||||
* @return void
|
||||
*/
|
||||
public static function fetchOutbox($_name)
|
||||
{
|
||||
// make webfinger request
|
||||
$r = self::webfinger($_name);
|
||||
$outbox = $r['outbox'];
|
||||
$headers = ['Accept: application/activity+json'];
|
||||
[$response, $info] = \Federator\Main::getFromRemote($outbox, $headers);
|
||||
if ($info['http_code'] != 200) {
|
||||
return;
|
||||
}
|
||||
$json = json_decode($response, true);
|
||||
if ($json === false) {
|
||||
return;
|
||||
}
|
||||
$ap = \Federator\Data\ActivityPub\Factory::newFromJson($json, $response);
|
||||
if (!($ap instanceof \Federator\Data\ActivityPub\Common\OrderedCollection)) {
|
||||
echo "unsupport reply from $outbox\n";
|
||||
return;
|
||||
}
|
||||
// first and total items should be set
|
||||
$total = $ap->getTotalItems();
|
||||
echo "total items: " . $total;
|
||||
echo " first: " . $ap->getFirst() . "\n";
|
||||
|
||||
$page = $ap->getFirst();
|
||||
$count = 0;
|
||||
|
||||
while ($count < $total) {
|
||||
echo "query $page\n";
|
||||
// query pages
|
||||
[$response, $info] = \Federator\Main::getFromRemote($page, $headers);
|
||||
if ($info['http_code'] != 200) {
|
||||
return;
|
||||
}
|
||||
// echo "'$response'\n";
|
||||
$json = json_decode($response, true);
|
||||
$ap = \Federator\Data\ActivityPub\Factory::newFromJson($json, $response);
|
||||
if (!($ap instanceof \Federator\Data\ActivityPub\Common\OrderedCollectionPage)) {
|
||||
echo "unsupport reply from $page\n";
|
||||
return;
|
||||
}
|
||||
$thisCount = $ap->getCount();
|
||||
echo "count: " . $thisCount . "\n";
|
||||
for ($i = 0; $i < $thisCount; ++$i) {
|
||||
$entry = $ap->get($i);
|
||||
if ($entry instanceof \Federator\Data\ActivityPub\Common\APObject) {
|
||||
echo $entry->getID() . " " . $entry->getPublished() . "\n";
|
||||
}
|
||||
}
|
||||
$count += $thisCount;
|
||||
$page = $ap->getNext();
|
||||
}
|
||||
//print_r($ap);
|
||||
}
|
||||
/**
|
||||
* run test
|
||||
*
|
||||
* @param int $argc number of arguments
|
||||
* @param string[] $argv arguments
|
||||
* @return void
|
||||
*/
|
||||
public static function run($argc, $argv)
|
||||
{
|
||||
date_default_timezone_set("Europe/Berlin");
|
||||
spl_autoload_register(static function (string $className) {
|
||||
include PROJECT_ROOT . '/php/' . str_replace("\\", "/", strtolower($className)) . '.php';
|
||||
});
|
||||
if ($argc < 2) {
|
||||
self::printUsage();
|
||||
}
|
||||
// pretend that we are running from web directory
|
||||
define('PROJECT_ROOT', dirname(__DIR__, 2));
|
||||
$api = new \Federator\Api();
|
||||
for ($i = 1; $i < $argc; ++$i) {
|
||||
switch ($argv[$i]) {
|
||||
case 'fetchoutbox':
|
||||
self::fetchOutbox($argv[$i + 1]);
|
||||
++$i;
|
||||
break;
|
||||
case 'upvote':
|
||||
self::upvote($api, $argv[$i + 1]);
|
||||
++$i;
|
||||
break;
|
||||
default:
|
||||
self::printUsage();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* print usage of maintenance tool
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function printUsage()
|
||||
{
|
||||
echo "usage php maintenance.php <command> <parameter> [<command> <parameter>...]\n";
|
||||
echo "command can be one of:\n";
|
||||
echo " fetchoutbox - fetch users outbox. parameter: username\n";
|
||||
echo " upvote - upvote. parameter: URL to upvote\n";
|
||||
echo " downvote - downvote. parameter: URL to downvote\n";
|
||||
echo " comment - downvote. parameter: URL to comment, text to comment\n";
|
||||
echo " Run this after you updated the program files\n";
|
||||
exit();
|
||||
}
|
||||
|
||||
/**
|
||||
* upvote given URL
|
||||
*
|
||||
* @param \Federator\Api $api api instance
|
||||
* @param string $_url URL to upvote
|
||||
* @note uses hardcoded source
|
||||
* @return void
|
||||
*/
|
||||
public static function upvote($api, $_url)
|
||||
{
|
||||
$dbh = $api->getDatabase();
|
||||
$inboxActivity = new \Federator\Data\ActivityPub\Common\Create();
|
||||
\Federator\Api\FedUsers\Inbox::postForUser(
|
||||
$dbh,
|
||||
$api->getConnector(),
|
||||
null,
|
||||
'grumpydevelop',
|
||||
$_url,
|
||||
$inboxActivity
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* do a webfinger request
|
||||
* @param string $_name name to query
|
||||
*/
|
||||
private static function webfinger($_name): mixed
|
||||
{
|
||||
// make webfinger request
|
||||
if (preg_match("/^([^@]+)@(.*)$/", $_name, $matches) != 1) {
|
||||
echo "username is malformed";
|
||||
return false;
|
||||
}
|
||||
$remoteURL = 'https://' . $matches[2] . '/.well-known/webfinger?resource=acct:' . urlencode($_name);
|
||||
$headers = ['Accept: application/activity+json'];
|
||||
[$response, $info] = \Federator\Main::getFromRemote($remoteURL, $headers);
|
||||
if ($info['http_code'] != 200) {
|
||||
return false;
|
||||
}
|
||||
$r = json_decode($response, true);
|
||||
if (isset($r['links'])) {
|
||||
foreach ($r['links'] as $link) {
|
||||
if (isset($link['rel']) && $link['rel'] === 'self') {
|
||||
$remoteURL = $link['href'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!isset($remoteURL)) {
|
||||
echo "FedUser::getUserByName Failed to find self link in webfinger for " . $_name . "\n";
|
||||
return false;
|
||||
}
|
||||
// fetch the user
|
||||
$headers = ['Accept: application/activity+json'];
|
||||
[$response, $info] = \Federator\Main::getFromRemote($remoteURL, $headers);
|
||||
if ($info['http_code'] != 200) {
|
||||
echo "FedUser::getUserByName Failed to fetch user from remoteUrl for " . $_name . "\n";
|
||||
return false;
|
||||
}
|
||||
$r = json_decode($response, true);
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Test::run($argc, $argv);
|
Loading…
Add table
Reference in a new issue