158 lines
4.1 KiB
PHP
158 lines
4.1 KiB
PHP
|
|
<?php
|
||
|
|
/**
|
||
|
|
* Enough of WordPress to test the parts that do not need it.
|
||
|
|
*
|
||
|
|
* The classes worth testing hardest — the curve, address encoding, the signing
|
||
|
|
* envelopes, URL-to-path mapping — are the ones with no WordPress in them.
|
||
|
|
* Standing up a full WordPress test install to exercise them would make the
|
||
|
|
* suite slow enough that nobody runs it, which is the failure mode that
|
||
|
|
* matters most for cryptographic code.
|
||
|
|
*
|
||
|
|
* So this file supplies the handful of core functions those classes touch, and
|
||
|
|
* the suite runs under plain PHP in well under a second. Anything that needs
|
||
|
|
* real WordPress — the auth flow, the queue, the admin screens — is tested by
|
||
|
|
* installing the fork, which docs/testing.md describes.
|
||
|
|
*
|
||
|
|
* @package SiriusPress
|
||
|
|
*/
|
||
|
|
|
||
|
|
define( 'ABSPATH', __DIR__ . '/' );
|
||
|
|
define( 'SP_CLI', true );
|
||
|
|
|
||
|
|
// --- a tiny test runner ------------------------------------------------------
|
||
|
|
|
||
|
|
final class T {
|
||
|
|
public static $passed = 0;
|
||
|
|
public static $failed = 0;
|
||
|
|
public static $group = '';
|
||
|
|
|
||
|
|
public static function group( $name ) {
|
||
|
|
self::$group = $name;
|
||
|
|
echo "\n {$name}\n";
|
||
|
|
}
|
||
|
|
|
||
|
|
public static function ok( $condition, $what ) {
|
||
|
|
if ( $condition ) {
|
||
|
|
self::$passed++;
|
||
|
|
echo " ok {$what}\n";
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
self::$failed++;
|
||
|
|
echo " FAIL {$what}\n";
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static function is( $actual, $expected, $what ) {
|
||
|
|
if ( $actual === $expected ) {
|
||
|
|
self::$passed++;
|
||
|
|
echo " ok {$what}\n";
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
self::$failed++;
|
||
|
|
echo " FAIL {$what}\n";
|
||
|
|
echo " expected: " . self::show( $expected ) . "\n";
|
||
|
|
echo " actual: " . self::show( $actual ) . "\n";
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
private static function show( $value ) {
|
||
|
|
if ( is_bool( $value ) ) {
|
||
|
|
return $value ? 'true' : 'false';
|
||
|
|
}
|
||
|
|
if ( null === $value ) {
|
||
|
|
return 'null';
|
||
|
|
}
|
||
|
|
if ( is_array( $value ) ) {
|
||
|
|
return json_encode( $value );
|
||
|
|
}
|
||
|
|
return (string) $value;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static function summary() {
|
||
|
|
$total = self::$passed + self::$failed;
|
||
|
|
echo "\n";
|
||
|
|
if ( self::$failed > 0 ) {
|
||
|
|
echo " {$total} checks, " . self::$failed . " FAILED\n\n";
|
||
|
|
return 1;
|
||
|
|
}
|
||
|
|
echo " {$total} checks, all passed\n\n";
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// --- WordPress functions the tested classes call -----------------------------
|
||
|
|
|
||
|
|
if ( ! function_exists( 'wp_parse_url' ) ) {
|
||
|
|
function wp_parse_url( $url, $component = -1 ) {
|
||
|
|
return parse_url( $url, $component );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( ! function_exists( 'home_url' ) ) {
|
||
|
|
function home_url( $path = '' ) {
|
||
|
|
return 'https://example.test' . ( '' !== $path ? $path : '' );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( ! function_exists( 'site_url' ) ) {
|
||
|
|
function site_url( $path = '' ) {
|
||
|
|
return home_url( $path );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( ! function_exists( 'set_url_scheme' ) ) {
|
||
|
|
function set_url_scheme( $url, $scheme = null ) {
|
||
|
|
return preg_replace( '#^\w+://#', ( $scheme ? $scheme : 'https' ) . '://', (string) $url );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( ! function_exists( 'untrailingslashit' ) ) {
|
||
|
|
function untrailingslashit( $value ) {
|
||
|
|
return rtrim( (string) $value, '/\\' );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( ! function_exists( 'apply_filters' ) ) {
|
||
|
|
function apply_filters( $hook, $value ) {
|
||
|
|
return $value;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( ! function_exists( 'size_format' ) ) {
|
||
|
|
function size_format( $bytes ) {
|
||
|
|
return $bytes . ' bytes';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( ! function_exists( 'esc_html' ) ) {
|
||
|
|
function esc_html( $text ) {
|
||
|
|
return htmlspecialchars( (string) $text, ENT_QUOTES, 'UTF-8' );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( ! function_exists( '__' ) ) {
|
||
|
|
function __( $text, $domain = '' ) {
|
||
|
|
return $text;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// --- the code under test -----------------------------------------------------
|
||
|
|
|
||
|
|
$core = __DIR__ . '/../plugins/sirius-press-core/includes/';
|
||
|
|
require_once $core . 'class-sp-bn.php';
|
||
|
|
require_once $core . 'class-sp-secp256k1.php';
|
||
|
|
require_once $core . 'class-sp-cashaddr.php';
|
||
|
|
require_once $core . 'class-sp-hd.php';
|
||
|
|
require_once $core . 'class-sp-message.php';
|
||
|
|
|
||
|
|
/*
|
||
|
|
* These three reference WordPress functions only from inside their methods, so
|
||
|
|
* they load cleanly here and the suite exercises the code that actually ships
|
||
|
|
* rather than a copy of it.
|
||
|
|
*/
|
||
|
|
require_once $core . 'class-sp-gateway.php';
|
||
|
|
|
||
|
|
$export = __DIR__ . '/../plugins/sirius-press-sia-export/includes/';
|
||
|
|
require_once $export . 'class-spe-mapper.php';
|
||
|
|
require_once $export . 'class-spe-renderer.php';
|