| 
									
										
										
										
											2010-11-29 11:31:33 -08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) { | 
					
						
							|  |  |  |     print "This script must be run from the command line\n"; | 
					
						
							|  |  |  |     exit(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); | 
					
						
							|  |  |  | define('STATUSNET', true); | 
					
						
							|  |  |  | define('LACONICA', true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require_once INSTALLDIR . '/lib/common.php'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Test cases for nickname validity and normalization. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class NicknameTest extends PHPUnit_Framework_TestCase | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  |      * Basic test using Nickname::normalize() | 
					
						
							| 
									
										
										
										
											2010-11-29 11:31:33 -08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  |      * @dataProvider provider | 
					
						
							| 
									
										
										
										
											2010-11-29 11:31:33 -08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  |     public function testBasic($input, $expected, $expectedException=null) | 
					
						
							| 
									
										
										
										
											2010-11-29 11:31:33 -08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  |         $exception = null; | 
					
						
							|  |  |  |         $normalized = false; | 
					
						
							|  |  |  |         try { | 
					
						
							| 
									
										
										
										
											2010-11-29 14:46:10 -08:00
										 |  |  |             $normalized = Nickname::normalize($input); | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  |         } catch (NicknameException $e) { | 
					
						
							|  |  |  |             $exception = $e; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($expected === false) { | 
					
						
							|  |  |  |             if ($expectedException) { | 
					
						
							| 
									
										
										
										
											2010-12-30 17:11:16 -08:00
										 |  |  |                 if ($exception) { | 
					
						
							|  |  |  |                     $stuff = get_class($exception) . ': ' . $exception->getMessage(); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     $stuff = var_export($exception, true); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-11-29 14:46:10 -08:00
										 |  |  |                 $this->assertTrue($exception && $exception instanceof $expectedException, | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  |                         "invalid input '$input' expected to fail with $expectedException, " . | 
					
						
							| 
									
										
										
										
											2010-12-30 17:11:16 -08:00
										 |  |  |                         "got $stuff"); | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2010-11-29 14:46:10 -08:00
										 |  |  |                 $this->assertTrue($normalized == false, | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  |                         "invalid input '$input' expected to fail"); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-11-29 11:31:33 -08:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  |             $msg = "normalized input nickname '$input' expected to normalize to '$expected', got "; | 
					
						
							|  |  |  |             if ($exception) { | 
					
						
							|  |  |  |                 $msg .= get_class($exception) . ': ' . $exception->getMessage(); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 $msg .= "'$normalized'"; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-11-29 14:46:10 -08:00
										 |  |  |             $this->assertEquals($expected, $normalized, $msg); | 
					
						
							| 
									
										
										
										
											2010-11-29 11:31:33 -08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-29 15:04:21 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Test on the regex matching used in common_find_mentions | 
					
						
							|  |  |  |      * (testing on the full notice rendering is difficult as it needs | 
					
						
							|  |  |  |      * to be able to pull from global state) | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @dataProvider provider | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function testAtReply($input, $expected, $expectedException=null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($expected == false) { | 
					
						
							|  |  |  |             // nothing to do
 | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $text = "@{$input} awesome! :)"; | 
					
						
							|  |  |  |             $matches = common_find_mentions_raw($text); | 
					
						
							|  |  |  |             $this->assertEquals(1, count($matches)); | 
					
						
							|  |  |  |             $this->assertEquals($expected, Nickname::normalize($matches[0][0])); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-29 11:31:33 -08:00
										 |  |  |     static public function provider() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return array( | 
					
						
							|  |  |  |                      array('evan', 'evan'), | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |                      // Case and underscore variants
 | 
					
						
							| 
									
										
										
										
											2010-11-29 11:31:33 -08:00
										 |  |  |                      array('Evan', 'evan'), | 
					
						
							|  |  |  |                      array('EVAN', 'evan'), | 
					
						
							|  |  |  |                      array('ev_an', 'evan'), | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  |                      array('E__V_an', 'evan'), | 
					
						
							| 
									
										
										
										
											2010-11-29 11:31:33 -08:00
										 |  |  |                      array('evan1', 'evan1'), | 
					
						
							|  |  |  |                      array('evan_1', 'evan1'), | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  |                      array('0x20', '0x20'), | 
					
						
							|  |  |  |                      array('1234', '1234'), // should this be allowed though? :)
 | 
					
						
							|  |  |  |                      array('12__34', '1234'), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                      // Some (currently) invalid chars...
 | 
					
						
							|  |  |  |                      array('^#@&^#@', false, 'NicknameInvalidException'), // all invalid :D
 | 
					
						
							|  |  |  |                      array('ev.an', false, 'NicknameInvalidException'), | 
					
						
							|  |  |  |                      array('ev/an', false, 'NicknameInvalidException'), | 
					
						
							|  |  |  |                      array('ev an', false, 'NicknameInvalidException'), | 
					
						
							|  |  |  |                      array('ev-an', false, 'NicknameInvalidException'), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                      // Non-ASCII letters; currently not allowed, in future
 | 
					
						
							|  |  |  |                      // we'll add them at least with conversion to ASCII.
 | 
					
						
							|  |  |  |                      // Not much use until we have storage of display names,
 | 
					
						
							|  |  |  |                      // though.
 | 
					
						
							|  |  |  |                      array('évan', false, 'NicknameInvalidException'), // so far...
 | 
					
						
							|  |  |  |                      array('Évan', false, 'NicknameInvalidException'), // so far...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                      // Length checks
 | 
					
						
							|  |  |  |                      array('', false, 'NicknameEmptyException'), | 
					
						
							|  |  |  |                      array('___', false, 'NicknameEmptyException'), | 
					
						
							|  |  |  |                      array('eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'), // 64 chars
 | 
					
						
							| 
									
										
										
										
											2010-12-30 17:11:16 -08:00
										 |  |  |                      array('eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_', false, 'NicknameTooLongException'), // the _ is too long...
 | 
					
						
							| 
									
										
										
										
											2010-11-29 14:15:25 -08:00
										 |  |  |                      array('eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', false, 'NicknameTooLongException'), // 65 chars -- too long
 | 
					
						
							| 
									
										
										
										
											2010-11-29 11:31:33 -08:00
										 |  |  |                      ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |