assertTrue($result['valid']);
$this->assertEquals('a1b2c3d4e5f67890123456789012abcd', $result['user_id']);
// Invalid user IDs
$result = Validation::validateUserId('invalid_user_id');
$this->assertFalse($result['valid']);
$result = Validation::validateUserId('a1b2c3d4'); // Too short
$this->assertFalse($result['valid']);
$result = Validation::validateUserId('a1b2c3d4e5f67890123456789012abcdextra'); // Too long
$this->assertFalse($result['valid']);
$result = Validation::validateUserId('gggggggggggggggggggggggggggggggg'); // Invalid chars
$this->assertFalse($result['valid']);
}
public function testValidateNickname()
{
// Valid nicknames
$result = Validation::validateNickname('JohnDoe');
$this->assertTrue($result['valid']);
$result = Validation::validateNickname('Test User');
$this->assertTrue($result['valid']);
$result = Validation::validateNickname("O'Connor-Smith");
$this->assertTrue($result['valid']);
// Invalid nicknames
$result = Validation::validateNickname(''); // Empty
$this->assertFalse($result['valid']);
$result = Validation::validateNickname('A'); // Too short
$this->assertFalse($result['valid']);
$result = Validation::validateNickname(str_repeat('A', 21)); // Too long
$this->assertFalse($result['valid']);
$result = Validation::validateNickname('Invalid@Name'); // Invalid chars
$this->assertFalse($result['valid']);
$result = Validation::validateNickname(''); // XSS attempt
$this->assertFalse($result['valid']);
}
public function testValidateMessage()
{
// Valid messages
$result = Validation::validateMessage('Hello World!');
$this->assertTrue($result['valid']);
$result = Validation::validateMessage('This is a longer message with punctuation, numbers 123, and symbols @#$%!');
$this->assertTrue($result['valid']);
// Invalid messages
$result = Validation::validateMessage(''); // Empty
$this->assertFalse($result['valid']);
$result = Validation::validateMessage(str_repeat('A', 1001)); // Too long
$this->assertFalse($result['valid']);
$result = Validation::validateMessage(''); // XSS
$this->assertFalse($result['valid']);
}
public function testValidateMessageSend()
{
// Valid message send data
$data = [
'nickname' => 'TestUser',
'message' => 'Hello World!',
'user_agent' => 'Mozilla/5.0 (Test Browser)',
'ip_address' => '192.168.1.1'
];
$result = Validation::validateMessageSend($data);
$this->assertTrue($result['valid']);
$this->assertEquals($data['nickname'], $result['validated']['nickname']);
$this->assertEquals($data['message'], $result['validated']['message']);
// Invalid message send data
$invalidData = [
'nickname' => 'Invalid@Name',
'message' => '',
];
$result = Validation::validateMessageSend($invalidData);
$this->assertFalse($result['valid']);
$this->assertArrayHasKey('errors', $result);
}
public function testValidateHeartbeat()
{
// Valid heartbeat data
$data = [
'nickname' => 'TestUser',
'user_id' => 'a1b2c3d4e5f67890123456789012abcd',
'session_id' => 'session_123456'
];
$result = Validation::validateHeartbeat($data);
$this->assertTrue($result['valid']);
$this->assertEquals($data['nickname'], $result['validated']['nickname']);
// Invalid heartbeat data
$invalidData = [
'nickname' => str_repeat('A', 21), // Too long
'user_id' => 'invalid_id',
];
$result = Validation::validateHeartbeat($invalidData);
$this->assertFalse($result['valid']);
$this->assertArrayHasKey('errors', $result);
}
public function testValidateAdminLogin()
{
// Valid login data
$result = Validation::validateAdminLogin('admin_user', 'valid_password');
$this->assertTrue($result['valid']);
$this->assertEquals('admin_user', $result['data']['username']);
// Invalid login data
$result = Validation::validateAdminLogin('', 'password'); // Empty username
$this->assertFalse($result['valid']);
$result = Validation::validateAdminLogin('admin', ''); // Empty password
$this->assertFalse($result['valid']);
$result = Validation::validateAdminLogin('us', 'password'); // Username too short
$this->assertFalse($result['valid']);
$result = Validation::validateAdminLogin('user@domain.com', 'password'); // Invalid username format
$this->assertFalse($result['valid']);
}
public function testIsValidEmail()
{
// Valid emails
$this->assertTrue(Validation::isValidEmail('user@example.com'));
$this->assertTrue(Validation::isValidEmail('test.user+tag@example.co.uk'));
$this->assertTrue(Validation::isValidEmail('user@localhost'));
// Invalid emails
$this->assertFalse(Validation::isValidEmail('invalid-email'));
$this->assertFalse(Validation::isValidEmail('user@'));
$this->assertFalse(Validation::isValidEmail('@example.com'));
$this->assertFalse(Validation::isValidEmail('user@.com'));
}
public function testIsValidURL()
{
// Valid URLs
$this->assertTrue(Validation::isValidURL('http://example.com'));
$this->assertTrue(Validation::isValidURL('https://example.com/path?query=1'));
$this->assertTrue(Validation::isValidURL('ftp://example.com/file.txt'));
// Invalid URLs
$this->assertFalse(Validation::isValidURL('not-a-url'));
$this->assertFalse(Validation::isValidURL('javascript:alert(1)'));
$this->assertFalse(Validation::isValidURL(''));
}
public function testCleanString()
{
// Test normal cleaning
$result = Validation::cleanString(' Hello World ');
$this->assertEquals('Hello World', $result);
// Test with HTML entities
$result = Validation::cleanString('Hello & World ');
$this->assertEquals('Hello & World ', $result);
// Test with script tags (should be encoded)
$result = Validation::cleanString('Hello');
$this->assertEquals('Hello', $result);
}
public function testLengthBetween()
{
// Test valid lengths
$this->assertTrue(Validation::lengthBetween('test', 2, 10));
$this->assertTrue(Validation::lengthBetween('test', 4, 4));
// Test invalid lengths
$this->assertFalse(Validation::lengthBetween('t', 2, 10)); // Too short
$this->assertFalse(Validation::lengthBetween('this_is_a_very_long_string', 2, 10)); // Too long
}
public function testMatchesPattern()
{
// Test valid patterns
$this->assertTrue(Validation::matchesPattern('123', '/^\d+$/'));
$this->assertTrue(Validation::matchesPattern('abc123', '/^[a-zA-Z0-9]+$/'));
$this->assertTrue(Validation::matchesPattern('test@example.com', '/^[^\s@]+@[^\s@]+\.[^\s@]+$/')); // Simple email regex
// Test invalid patterns
$this->assertFalse(Validation::matchesPattern('abc', '/^\d+$/')); // Not numeric
$this->assertFalse(Validation::matchesPattern('invalid-email', '/^[^\s@]+@[^\s@]+\.[^\s@]+$/')); // Not email
}
}