| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  | <?php | 
					
						
							|  |  |  | // This file is part of GNU social - https://www.gnu.org/software/social
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by
 | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or
 | 
					
						
							|  |  |  | // (at your option) any later version.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social is distributed in the hope that it will be useful,
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					
						
							|  |  |  | // GNU Affero General Public License for more details.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License
 | 
					
						
							|  |  |  | // along with GNU social.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Tests\Unit; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('INSTALLDIR')) { | 
					
						
							|  |  |  |     define('INSTALLDIR', dirname(dirname(__DIR__))); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-07-25 01:29:20 +01:00
										 |  |  | if (!defined('PUBLICDIR')) { | 
					
						
							|  |  |  |     define('PUBLICDIR', INSTALLDIR . DIRECTORY_SEPARATOR . 'public'); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  | if (!defined('GNUSOCIAL')) { | 
					
						
							|  |  |  |     define('GNUSOCIAL', true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | if (!defined('STATUSNET')) { // Compatibility
 | 
					
						
							|  |  |  |     define('STATUSNET', true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use Nickname; | 
					
						
							|  |  |  | use NicknameBlacklistedException; | 
					
						
							|  |  |  | use NicknameEmptyException; | 
					
						
							|  |  |  | use NicknameException; | 
					
						
							|  |  |  | use NicknameInvalidException; | 
					
						
							|  |  |  | use NicknamePathCollisionException; | 
					
						
							|  |  |  | use NicknameTakenException; | 
					
						
							|  |  |  | use NicknameTooLongException; | 
					
						
							|  |  |  | use PHPUnit\Framework\TestCase; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-23 13:36:02 +01:00
										 |  |  | require_once INSTALLDIR . '/lib/util/common.php'; | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Test cases for nickname validity and normalization. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | final class NicknameTest extends TestCase | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Basic test using Nickname::normalize() | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @dataProvider provider | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |      * @param $input | 
					
						
							|  |  |  |      * @param $expected | 
					
						
							|  |  |  |      * @param null $expectedException | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function testBasic($input, $expected, $expectedException = null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $exception = null; | 
					
						
							|  |  |  |         $normalized = false; | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             $normalized = Nickname::normalize($input); | 
					
						
							|  |  |  |         } catch (NicknameException $e) { | 
					
						
							|  |  |  |             $exception = $e; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($expected === false) { | 
					
						
							|  |  |  |             if ($expectedException) { | 
					
						
							|  |  |  |                 if ($exception) { | 
					
						
							|  |  |  |                     $stuff = get_class($exception) . ': ' . $exception->getMessage(); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     $stuff = var_export($exception, true); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |                 static::assertTrue( | 
					
						
							| 
									
										
										
										
											2020-06-24 12:42:05 +01:00
										 |  |  |                     $exception && $exception instanceof $expectedException, | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |                     "invalid input '{$input}' expected to fail with {$expectedException}, " . | 
					
						
							|  |  |  |                     "got {$stuff}" | 
					
						
							| 
									
										
										
										
											2020-06-24 12:42:05 +01:00
										 |  |  |                 ); | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |                 static::assertTrue( | 
					
						
							| 
									
										
										
										
											2020-06-24 12:42:05 +01:00
										 |  |  |                     $normalized == false, | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |                     "invalid input '{$input}' expected to fail" | 
					
						
							| 
									
										
										
										
											2020-06-24 12:42:05 +01:00
										 |  |  |                 ); | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |             $msg = "normalized input nickname '{$input}' expected to normalize to '{$expected}', got "; | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |             if ($exception) { | 
					
						
							|  |  |  |                 $msg .= get_class($exception) . ': ' . $exception->getMessage(); | 
					
						
							|  |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |                 $msg .= "'{$normalized}'"; | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |             static::assertSame($expected, $normalized, $msg); | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01: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 | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |      * @param $input | 
					
						
							|  |  |  |      * @param $expected | 
					
						
							|  |  |  |      * @param null $expectedException | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |      * @throws NicknameBlacklistedException | 
					
						
							|  |  |  |      * @throws NicknameEmptyException | 
					
						
							|  |  |  |      * @throws NicknameException | 
					
						
							|  |  |  |      * @throws NicknameInvalidException | 
					
						
							|  |  |  |      * @throws NicknamePathCollisionException | 
					
						
							|  |  |  |      * @throws NicknameTakenException | 
					
						
							|  |  |  |      * @throws NicknameTooLongException | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function testAtReply($input, $expected, $expectedException = null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($expected == false) { | 
					
						
							|  |  |  |             // nothing to do
 | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $text = "@{$input} awesome! :)"; | 
					
						
							|  |  |  |             $matches = common_find_mentions_raw($text); | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |             static::assertCount(1, $matches); | 
					
						
							|  |  |  |             static::assertSame($expected, Nickname::normalize($matches[0][0])); | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-24 12:42:05 +01:00
										 |  |  |     public static function provider() | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |         return [ | 
					
						
							|  |  |  |             ['evan', 'evan'], | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // Case and underscore variants
 | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |             ['Evan', 'evan'], | 
					
						
							|  |  |  |             ['EVAN', 'evan'], | 
					
						
							|  |  |  |             ['ev_an', 'evan'], | 
					
						
							|  |  |  |             ['E__V_an', 'evan'], | 
					
						
							|  |  |  |             ['evan1', 'evan1'], | 
					
						
							|  |  |  |             ['evan_1', 'evan1'], | 
					
						
							|  |  |  |             ['0x20', '0x20'], | 
					
						
							|  |  |  |             ['1234', '1234'], // should this be allowed though? :)
 | 
					
						
							|  |  |  |             ['12__34', '1234'], | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // Some (currently) invalid chars...
 | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |             ['^#@&^#@', false, 'NicknameInvalidException'], // all invalid :D
 | 
					
						
							|  |  |  |             ['ev.an', false, 'NicknameInvalidException'], | 
					
						
							|  |  |  |             ['ev/an', false, 'NicknameInvalidException'], | 
					
						
							|  |  |  |             ['ev an', false, 'NicknameInvalidException'], | 
					
						
							|  |  |  |             ['ev-an', false, 'NicknameInvalidException'], | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // 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.
 | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |             ['évan', false, 'NicknameInvalidException'], // so far...
 | 
					
						
							|  |  |  |             ['Évan', false, 'NicknameInvalidException'], // so far...
 | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // Length checks
 | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |             ['', false, 'NicknameEmptyException'], | 
					
						
							|  |  |  |             ['___', false, 'NicknameEmptyException'], | 
					
						
							|  |  |  |             ['eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'], // 64 chars
 | 
					
						
							|  |  |  |             ['eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_', false, 'NicknameTooLongException'], // the _ is too long...
 | 
					
						
							|  |  |  |             ['eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', false, 'NicknameTooLongException'], // 65 chars -- too long
 | 
					
						
							|  |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | } |