Testing

Test Structure

tests/
+-- bootstrap.php
+-- Unit/
    +-- NonceTest.php
    +-- GateTest.php
    +-- SanitizerTest.php

WordPress Function Mocks

// tests/bootstrap.php
<?php

require_once dirname(__DIR__) . '/vendor/autoload.php';

if (!function_exists('wp_create_nonce')) {
    function wp_create_nonce($action) {
        return md5('nonce_' . $action);
    }
}

if (!function_exists('wp_verify_nonce')) {
    function wp_verify_nonce($nonce, $action) {
        return $nonce === md5('nonce_' . $action);
    }
}

if (!function_exists('current_user_can')) {
    function current_user_can($cap) {
        return $GLOBALS['test_user_caps'][$cap] ?? false;
    }
}

if (!function_exists('sanitize_text_field')) {
    function sanitize_text_field($str) {
        return trim(strip_tags($str));
    }
}

if (!function_exists('sanitize_email')) {
    function sanitize_email($email) {
        return filter_var($email, FILTER_SANITIZE_EMAIL);
    }
}

// ... other mocks

Example Tests

class SanitizerTest extends TestCase
{
    public function testSanitizesTextFields(): void
    {
        $sanitizer = new Sanitizer();

        $result = $sanitizer->text('<script>alert(1)</script>Hello');

        $this->assertStringNotContainsString('<script>', $result);
    }

    public function testSanitizesEmail(): void
    {
        $sanitizer = new Sanitizer();

        $result = $sanitizer->email('[email protected]<script>');

        $this->assertSame('[email protected]', $result);
    }
}