]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - tests/NicknameTest.php
Misses this file to merge. I like the comments.
[quix0rs-gnu-social.git] / tests / NicknameTest.php
index 95af94098d904f7454ea0508ff0d4083fed13d69..2841398a6590686bf595befcd34e3c6a25317d48 100644 (file)
@@ -6,8 +6,8 @@ if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
-define('STATUSNET', true);
-define('LACONICA', true);
+define('GNUSOCIAL', true);
+define('STATUSNET', true);  // compatibility
 
 require_once INSTALLDIR . '/lib/common.php';
 
@@ -17,18 +17,61 @@ require_once INSTALLDIR . '/lib/common.php';
 class NicknameTest extends PHPUnit_Framework_TestCase
 {
     /**
+     * Basic test using Nickname::normalize()
+     *
      * @dataProvider provider
+     */
+    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);
+                }
+                $this->assertTrue($exception && $exception instanceof $expectedException,
+                        "invalid input '$input' expected to fail with $expectedException, " .
+                        "got $stuff");
+            } else {
+                $this->assertTrue($normalized == false,
+                        "invalid input '$input' expected to fail");
+            }
+        } else {
+            $msg = "normalized input nickname '$input' expected to normalize to '$expected', got ";
+            if ($exception) {
+                $msg .= get_class($exception) . ': ' . $exception->getMessage();
+            } else {
+                $msg .= "'$normalized'";
+            }
+            $this->assertEquals($expected, $normalized, $msg);
+        }
+    }
+
+    /**
+     * 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 testBasic($input, $expected)
+    public function testAtReply($input, $expected, $expectedException=null)
     {
-        $matches = array();
-        // First problem: this is all manual, wtf!
-        if (preg_match('/^([' . NICKNAME_FMT . ']{1,64})$/', $input, $matches)) {
-            $norm = common_canonical_nickname($matches[1]);
-            $this->assertEquals($expected, $norm, "normalized input nickname: $input -> $norm");
+        if ($expected == false) {
+            // nothing to do
         } else {
-            $this->assertEquals($expected, false, "invalid input nickname: $input");
+            $text = "@{$input} awesome! :)";
+            $matches = common_find_mentions_raw($text);
+            $this->assertEquals(1, count($matches));
+            $this->assertEquals($expected, Nickname::normalize($matches[0][0]));
         }
     }
 
@@ -36,17 +79,38 @@ class NicknameTest extends PHPUnit_Framework_TestCase
     {
         return array(
                      array('evan', 'evan'),
+
+                     // Case and underscore variants
                      array('Evan', 'evan'),
                      array('EVAN', 'evan'),
                      array('ev_an', 'evan'),
-                     array('ev.an', 'evan'),
-                     array('ev/an', false),
-                     array('ev an', false),
-                     array('ev-an', false),
-                     array('évan', false), // so far...
-                     array('Évan', false), // so far...
+                     array('E__V_an', 'evan'),
                      array('evan1', 'evan1'),
                      array('evan_1', 'evan1'),
+                     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
+                     array('eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_', false, 'NicknameTooLongException'), // the _ is too long...
+                     array('eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', false, 'NicknameTooLongException'), // 65 chars -- too long
                      );
     }
 }