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