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