PHP Classes

File: tests/test_replyto_functionality.php

Recommend this page to a friend!
  Packages of Matthew Asham   Binkterm PHP   tests/test_replyto_functionality.php   Download  
File: tests/test_replyto_functionality.php
Role: Example script
Content type: text/plain
Description: Example script
Class: Binkterm PHP
Bulletin board system based on the Web
Author: By
Last change:
Date: 5 days ago
Size: 5,798 bytes
 

Contents

Class file image Download
<?php

/**
 * Test script to verify REPLYTO kludge functionality
 * This script tests that:
 * 1. REPLYTO parsing works in incoming netmail
 * 2. Reply logic uses REPLYTO address when present
 * 3. Fallback to original_author_address works when REPLYTO is missing
 */

require_once __DIR__ . '/../vendor/autoload.php';

use
BinktermPHP\Database;
use
BinktermPHP\BinkdProcessor;
use
BinktermPHP\MessageHandler;

echo
"Testing REPLYTO kludge functionality...\n\n";

// Initialize database
$db = Database::getInstance()->getPdo();

// Clean up any previous test data
echo "1. Cleaning up previous test data...\n";
$db->exec("DELETE FROM netmail WHERE subject LIKE 'TEST REPLYTO%'");

// Test 1: Verify REPLYTO parsing in BinkdProcessor
echo "2. Testing REPLYTO parsing...\n";

// Create test message with REPLYTO kludge
$testMessage = [
   
'origAddr' => '1:234/567',
   
'destAddr' => '1:123/456',
   
'fromName' => 'Test User',
   
'toName' => 'Sysop',
   
'subject' => 'TEST REPLYTO Message',
   
'dateTime' => date('d M y H:i:s'),
   
'text' => "\x01MSGID: 1:234/567 12345678\r\n\x01REPLYADDR 1:999/888\r\n\r\nThis is a test message with REPLYTO kludge.",
   
'attributes' => 1 // Private flag for netmail
];

$testPacketInfo = [
   
'origZone' => 1,
   
'destZone' => 1
];

// Simulate storing the message (same as BinkdProcessor does)
$processor = new BinkdProcessor();
$reflection = new ReflectionClass($processor);
$storeNetmailMethod = $reflection->getMethod('storeNetmail');
$storeNetmailMethod->setAccessible(true);

try {
   
$storeNetmailMethod->invoke($processor, $testMessage, $testPacketInfo);
    echo
" ? Message with REPLYTO stored successfully\n";
} catch (
Exception $e) {
    echo
" ? Failed to store message: " . $e->getMessage() . "\n";
    exit(
1);
}

// Test 2: Verify the message was stored with correct reply_address
echo "3. Verifying REPLYTO was parsed and stored...\n";

$stmt = $db->prepare("SELECT * FROM netmail WHERE subject = ? ORDER BY id DESC LIMIT 1");
$stmt->execute(['TEST REPLYTO Message']);
$storedMessage = $stmt->fetch();

if (!
$storedMessage) {
    echo
" ? Test message not found in database\n";
    exit(
1);
}

if (
$storedMessage['reply_address'] !== '1:999/888') {
    echo
" ? REPLYTO address not stored correctly. Expected: 1:999/888, Got: " . ($storedMessage['reply_address'] ?: 'NULL') . "\n";
    exit(
1);
}

echo
" ? REPLYTO address stored correctly: " . $storedMessage['reply_address'] . "\n";

// Test 3: Verify reply logic uses REPLYTO address
echo "4. Testing reply logic...\n";

$handler = new MessageHandler();
$userId = 1; // Assume user ID 1 exists

// Get the message (simulating how the web interface would)
$messageForReply = $handler->getMessage($storedMessage['id'], 'netmail', $userId);

if (!
$messageForReply) {
    echo
" ? Could not retrieve message for reply test\n";
    exit(
1);
}

// Simulate the compose page logic (from index.php)
$replyToAddress = $messageForReply['reply_address'] ?: ($messageForReply['original_author_address'] ?: $messageForReply['from_address']);

if (
$replyToAddress !== '1:999/888') {
    echo
" ? Reply logic failed. Expected: 1:999/888, Got: " . $replyToAddress . "\n";
    exit(
1);
}

echo
" ? Reply logic correctly uses REPLYTO address: " . $replyToAddress . "\n";

// Test 4: Test fallback behavior (message without REPLYTO)
echo "5. Testing fallback behavior...\n";

$testMessage2 = [
   
'origAddr' => '1:234/567',
   
'destAddr' => '1:123/456',
   
'fromName' => 'Test User 2',
   
'toName' => 'Sysop',
   
'subject' => 'TEST REPLYTO Fallback',
   
'dateTime' => date('d M y H:i:s'),
   
'text' => "\x01MSGID: 1:234/567 87654321\r\n\r\nThis is a test message WITHOUT REPLYTO kludge.",
   
'attributes' => 1 // Private flag for netmail
];

try {
   
$storeNetmailMethod->invoke($processor, $testMessage2, $testPacketInfo);
    echo
" ? Message without REPLYTO stored successfully\n";
} catch (
Exception $e) {
    echo
" ? Failed to store fallback message: " . $e->getMessage() . "\n";
    exit(
1);
}

$stmt = $db->prepare("SELECT * FROM netmail WHERE subject = ? ORDER BY id DESC LIMIT 1");
$stmt->execute(['TEST REPLYTO Fallback']);
$fallbackMessage = $stmt->fetch();

if (!
$fallbackMessage) {
    echo
" ? Fallback test message not found in database\n";
    exit(
1);
}

// Should have NULL reply_address but should have original_author_address from MSGID
if ($fallbackMessage['reply_address']) {
    echo
" ? Fallback message should not have reply_address. Got: " . $fallbackMessage['reply_address'] . "\n";
    exit(
1);
}

echo
" ? Fallback message has no REPLYTO (reply_address is NULL)\n";

// Test the reply logic for fallback
$fallbackForReply = $handler->getMessage($fallbackMessage['id'], 'netmail', $userId);
$fallbackReplyAddress = $fallbackForReply['reply_address'] ?: ($fallbackForReply['original_author_address'] ?: $fallbackForReply['from_address']);

if (
$fallbackReplyAddress !== '1:234/567') {
    echo
" ? Fallback reply logic failed. Expected: 1:234/567, Got: " . $fallbackReplyAddress . "\n";
    exit(
1);
}

echo
" ? Fallback reply logic correctly uses original_author_address: " . $fallbackReplyAddress . "\n";

// Clean up test data
echo "6. Cleaning up test data...\n";
$db->exec("DELETE FROM netmail WHERE subject LIKE 'TEST REPLYTO%'");
echo
" ? Test data cleaned up\n";

echo
"\n=== ALL TESTS PASSED ===\n";
echo
"REPLYTO kludge functionality is working correctly:\n";
echo
"- REPLYTO parsing works in incoming netmail\n";
echo
"- REPLYTO address is stored in reply_address field\n";
echo
"- Reply logic prioritizes REPLYTO over original sender\n";
echo
"- Fallback to original_author_address works when REPLYTO is missing\n";
echo
"- Fallback to from_address works when both are missing\n\n";

?>