]> git.mxchange.org Git - friendica.git/blobdiff - tests/get_tags_test.php
Merge branch 'master' of github.com:annando/friendica
[friendica.git] / tests / get_tags_test.php
index a458f0fbc59cb5d2eb8b28332372198a390a016f..79dcb36a7f4c1800b6e84b89fbe73eb63712795a 100644 (file)
 <?php
 /**
+ * This file contains the tests for get_tags and the tag handling in item.php
+ * 
  * @package test.util
  */
 
-require_once 'include/template_processor.php';\r
+/**
+ * required, because it contains the get_tags() function
+ */
 require_once 'include/text.php';
+/**
+ * required, because it contains the tag handling
+ */
 require_once 'mod/item.php';
 
+/**
+ * A class which can be used as replacement for an app if
+ * only get_baseurl is used. 
+ * 
+ * @author Alexander Kampmann
+ * @package test.util
+ */
+class MockApp {
+       function get_baseurl() {
+               return "baseurl"; 
+       }
+}; 
+
+/**
+ * the test should not rely on a database, 
+ * so this is a replacement for the database access method q. 
+ * 
+ * It simulates the user with uid 11 has one contact, named Mike Lastname. 
+ * 
+ * @param string $sql
+ */
 function q($sql) {
-       return array(array('id'=>15, 'network'=>'stat', 'alias'=>'Mike', 'nick'=>'Mike', 'url'=>"http://justatest.de"));
+       $result=array(array('id'=>15, 
+                       'attag'=>'', 'network'=>'dfrn', 
+                       'name'=>'Mike Lastname', 'alias'=>'Mike', 
+                       'nick'=>'Mike', 'url'=>"http://justatest.de")); 
+       
+       $args=func_get_args(); 
 
+       //last parameter is always (in this test) uid, so, it should be 11
+       if($args[count($args)-1]!=11) {
+               return; 
+       }
+       
+       
+       if(3==count($args)) {
+               //first call in handle_body, id only
+               if($result[0]['id']==$args[1]) {
+                       return $result; 
+               }
+               //second call in handle_body, name
+               if($result[0]['name']===$args[1]) {
+                       return $result;
+               }
+       }
+       //third call in handle_body, nick or attag
+       if($result[0]['nick']===$args[2] || $result[0]['attag']===$args[1]) {
+               return $result;
+       }
 }
+
+/**
+ * replacement for dbesc. 
+ * I don't want to test dbesc here, so
+ * I just return the input. It won't be a problem, because 
+ * the test does not use a real database. 
+ * 
+ * DON'T USE HAT FUNCTION OUTSIDE A TEST!
+ * 
+ * @param string $str
+ * @return input
+ */
 function dbesc($str) {
-       echo $str; 
+       return $str; 
 }
 
-class GetTagsTest extends PHPUnit_Framework_TestCase {\r
-\r
-       public function setUp() {\r
-               set_include_path(\r
-                               get_include_path() . PATH_SEPARATOR\r
-                               . 'include' . PATH_SEPARATOR\r
-                               . 'library' . PATH_SEPARATOR\r
-                               . 'library/phpsec' . PATH_SEPARATOR\r
-                               . '.' );\r
-       }
-
-       /**\r
-        * test with one Person tag\r
-        */\r
-       public function testGetTagsShortPerson() {\r
-               $text="hi @Mike";\r
-\r
-               $tags=get_tags($text);\r
+/**
+ * TestCase for tag handling. 
+ * 
+ * @author alexander
+ * @package test.util
+ */
+class GetTagsTest extends PHPUnit_Framework_TestCase {
+       /** the mock to use as app */
+       private $a; 
+
+       /**
+        * initialize the test. That's a phpUnit function, 
+        * don't change its name.
+        */
+       public function setUp() {
+               $this->a=new MockApp(); 
+       }
+
+       /**
+        * test with one Person tag
+        */
+       public function testGetTagsShortPerson() {
+               $text="hi @Mike";
+
+               $tags=get_tags($text);
 
                $inform=''; 
                $str_tags='';
-               handle_body($text, $inform, $str_tags, 11, $tags[0]);
-\r
-               $this->assertEquals("@Mike", $tags[0]);
-               $this->assertEquals($text, "hi @[url=http://justatest.de]Mike[/url]");\r
-       }\r
+               foreach($tags as $tag) {
+                       handle_tag($this->a, $text, $inform, $str_tags, 11, $tag);
+               }
+
+               //correct tags found?
+               $this->assertEquals(1, count($tags)); 
+               $this->assertTrue(in_array("@Mike", $tags));
+               
+               //correct output from handle_tag?
+               $this->assertEquals("cid:15", $inform); 
+               $this->assertEquals("@[url=http://justatest.de]Mike Lastname[/url]", $str_tags);
+               $this->assertEquals("hi @[url=http://justatest.de]Mike Lastname[/url]", $text);
+       }
+       
+       /**
+        * test with one Person tag. 
+        * There's a minor spelling mistake...
+        */
+       public function testGetTagsShortPersonSpelling() {
+               $text="hi @Mike.because";
+       
+               $tags=get_tags($text);
+       
+               //correct tags found?
+               $this->assertEquals(1, count($tags));
+               $this->assertTrue(in_array("@Mike.because", $tags));
+               
+               $inform='';
+               $str_tags='';
+               handle_tag($this->a, $text, $inform, $str_tags, 11, $tags[0]);
+       
+               // (mike) - This is a tricky case.
+               // we support mentions as in @mike@example.com - which contains a period.
+               // This shouldn't match anything unless you have a contact named "Mike.because".
+               // We may need another test for "@Mike. because" - which should return the contact
+               // as we ignore trailing periods in tags. 
+//             $this->assertEquals("cid:15", $inform); 
+//             $this->assertEquals("@[url=http://justatest.de]Mike Lastname[/url]", $str_tags);
+//             $this->assertEquals("hi @[url=http://justatest.de]Mike Lastname[/url].because", $text);
+
+               $this->assertEquals("", $inform); 
+               $this->assertEquals("", $str_tags);
+
+       }
+       
+       /**
+        * test with two Person tags. 
+        * There's a minor spelling mistake...
+        */
+
+       public function testGetTagsPerson2Spelling() {
+               $text="hi @Mike@campino@friendica.eu";
+       
+               $tags=get_tags($text);
+
+// This construct is not supported. Results are indeterminate                  
+//             $this->assertEquals(2, count($tags)); 
+//             $this->assertTrue(in_array("@Mike", $tags));
+//             $this->assertTrue(in_array("@campino@friendica.eu", $tags));
+       }
 
        /**
         * Test with one hash tag.
-        */\r
-       public function testGetTagsShortTag() {\r
-               $text="This is a #test_case";\r
-\r
-               $tags=get_tags($text);\r
-\r
-               $this->assertEquals("#test_case", $tags[0]);\r
-       }\r
+        */
+       public function testGetTagsShortTag() {
+               $text="This is a #test_case";
+
+               $tags=get_tags($text);
+
+               $this->assertEquals(1, count($tags));
+               $this->assertTrue(in_array("#test_case", $tags));
+       }
 
        /**
         * test with a person and a hash tag
-        */\r
-       public function testGetTagsShortTagAndPerson() {\r
-               $text="hi @Mike This is a #test_case";\r
-\r
-               $tags=get_tags($text);\r
-
-               $inform='';\r
-               $str_tags='';\r
-               handle_body($text, $inform, $str_tags, 11, $tags[0]);
+        */
+       public function testGetTagsShortTagAndPerson() {
+               $text="hi @Mike This is a #test_case";
+
+               $tags=get_tags($text);
+
+               $this->assertEquals(3, count($tags));
+               $this->assertTrue(in_array("@Mike", $tags));
+               $this->assertTrue(in_array("@Mike This", $tags));
+               $this->assertTrue(in_array("#test_case", $tags));
+
+               $inform='';
+               $str_tags='';
+               foreach($tags as $tag) {
+                       handle_tag($this->a, $text, $inform, $str_tags, 11, $tag);
+               }
+               
+               $this->assertEquals("cid:15", $inform); 
+               $this->assertEquals("@[url=http://justatest.de]Mike Lastname[/url],#[url=baseurl/search?tag=test%20case]test case[/url]", $str_tags);
+               $this->assertEquals("hi @[url=http://justatest.de]Mike Lastname[/url] This is a #[url=baseurl/search?tag=test%20case]test case[/url]", $text); 
                
-               $this->assertEquals("hi @[url=http://justatest.de]Mike[/url] This is a #test_case", $text); \r
-               $this->assertEquals("@Mike", $tags[0]);\r
-               $this->assertEquals("#test_case", $tags[1]);\r
-       }\r
+       }
 
        /**
         * test with a person, a hash tag and some special chars.
-        */\r
-       public function testGetTagsShortTagAndPersonSpecialChars() {\r
-               $text="hi @Mike, This is a #test_case.";\r
-\r
-               $tags=get_tags($text);\r
-\r
-               $this->assertEquals("@Mike", $tags[0]);\r
-               $this->assertEquals("#test_case", $tags[1]);\r
-       }\r
+        */
+       public function testGetTagsShortTagAndPersonSpecialChars() {
+               $text="hi @Mike, This is a #test_case.";
+
+               $tags=get_tags($text);
+
+               $this->assertEquals(2, count($tags));
+               $this->assertTrue(in_array("@Mike", $tags));
+               $this->assertTrue(in_array("#test_case", $tags));
+       }
 
        /**
         * Test with a person tag and text behind it.
-        */\r
-       public function testGetTagsPersonOnly() {\r
-               $text="@Test I saw the Theme Dev group was created.";\r
-\r
-               $tags=get_tags($text);\r
-\r
-               $this->assertEquals("@Test", $tags[0]);\r
-       }\r
+        */
+       public function testGetTagsPersonOnly() {
+               $text="@Test I saw the Theme Dev group was created.";
+
+               $tags=get_tags($text);
+
+               $this->assertEquals(2, count($tags));
+               $this->assertTrue(in_array("@Test I", $tags));
+               $this->assertTrue(in_array("@Test", $tags));
+       }
 
+       /**
+        * this test demonstrates strange behaviour by intval. 
+        * It makes the next test fail. 
+        */
+       public function testIntval() {
+               $this->assertEquals(15, intval("15 it")); 
+       }
+       
+       /**
+        * test a tag with an id in it
+        */
+       public function testIdTag() {
+               $text="Test with @mike+15 id tag"; 
+               
+               $tags=get_tags($text); 
+               
+               $this->assertEquals(2, count($tags)); 
+               $this->assertTrue(in_array("@mike+15", $tags));
+               
+               //happens right now, but it shouldn't be necessary
+               $this->assertTrue(in_array("@mike+15 id", $tags));
+               
+               $inform='';
+               $str_tags='';
+               foreach($tags as $tag) {
+                       handle_tag($this->a, $text, $inform, $str_tags, 11, $tag);
+               }
+               
+               $this->assertEquals("Test with @[url=http://justatest.de]Mike Lastname[/url] id tag", $text);
+               $this->assertEquals("@[url=http://justatest.de]Mike Lastname[/url]", $str_tags);
+               // this test may produce two cid:15 entries - which is OK because duplicates are pruned before delivery
+               $this->assertContains("cid:15",$inform);
+       }
+       
        /**
         * test with two persons and one special tag.
-        */\r
-       public function testGetTags2Persons1TagSpecialChars() {\r
-               $text="hi @Mike, I'm just writing #test_cases, so"\r
-               ." so @somebody@friendica.com may change #things.";\r
-\r
-               $tags=get_tags($text);\r
-\r
-               $this->assertEquals("@Mike", $tags[0]);\r
-               $this->assertEquals("#test_cases", $tags[1]);\r
-               $this->assertEquals("@somebody@friendica.com", $tags[2]);\r
-               $this->assertEquals("#things", $tags[3]);\r
-       }\r
+        */
+       public function testGetTags2Persons1TagSpecialChars() {
+               $text="hi @Mike, I'm just writing #test_cases, so"
+               ." so @somebody@friendica.com may change #things.";
+
+               $tags=get_tags($text);
+
+               $this->assertEquals(5, count($tags));
+               $this->assertTrue(in_array("@Mike", $tags));
+               $this->assertTrue(in_array("#test_cases", $tags));
+               $this->assertTrue(in_array("@somebody@friendica.com", $tags));
+               $this->assertTrue(in_array("@somebody@friendica.com may", $tags));
+               $this->assertTrue(in_array("#things", $tags));
+       }
 
        /**
         * test with a long text.
-        */\r
-       public function testGetTags() {\r
-               $text="hi @Mike, I'm just writing #test_cases, "\r
-               ." so @somebody@friendica.com may change #things. Of course I "\r
-               ."look for a lot of #pitfalls, like #tags at the end of a sentence "\r
-               ."@comment. I hope noone forgets about @fullstops.because that might"\r
-               ." break #things. @Mike@campino@friendica.eu is also #nice, isn't it? "\r
-               ."Now, add a @first_last tag. ";\r
-               //TODO check whether this are all variants (no, auto-stuff is missing).\r
-\r
-               $tags=get_tags($text);\r
-\r
-               $this->assertEquals("@Mike", $tags[0]);\r
-               $this->assertEquals("#test_cases", $tags[1]);\r
-               $this->assertEquals("@somebody@friendica.com", $tags[2]);\r
-               $this->assertEquals("#things", $tags[3]);\r
-               $this->assertEquals("#pitfalls", $tags[4]);\r
-               $this->assertEquals("#tags", $tags[5]);\r
-               $this->assertEquals("@comment", $tags[6]);\r
-               $this->assertEquals("@fullstops", $tags[7]);\r
-               $this->assertEquals("#things", $tags[8]);\r
-               $this->assertEquals("@Mike", $tags[9]);\r
-               $this->assertEquals("@campino@friendica.eu", $tags[10]);\r
-               $this->assertEquals("#nice", $tags[11]);\r
-               $this->assertEquals("@first_last", $tags[12]);\r
-       }\r
+        */
+       public function testGetTags() {
+               $text="hi @Mike, I'm just writing #test_cases, "
+               ." so @somebody@friendica.com may change #things. Of course I "
+               ."look for a lot of #pitfalls, like #tags at the end of a sentence "
+               ."@comment. I hope noone forgets about @fullstops.because that might"
+               ." break #things. @Mike@campino@friendica.eu is also #nice, isn't it? "
+               ."Now, add a @first_last tag. ";
+               
+               $tags=get_tags($text);
+
+               $this->assertTrue(in_array("@Mike", $tags));
+               $this->assertTrue(in_array("#test_cases", $tags));
+               $this->assertTrue(in_array("@somebody@friendica.com", $tags));
+               $this->assertTrue(in_array("#things", $tags));
+               $this->assertTrue(in_array("#pitfalls", $tags));
+               $this->assertTrue(in_array("#tags", $tags));
+               $this->assertTrue(in_array("@comment", $tags));
+               $this->assertTrue(in_array("@fullstops.because", $tags));
+               $this->assertTrue(in_array("#things", $tags));
+               $this->assertTrue(in_array("@Mike", $tags));
+               $this->assertTrue(in_array("#nice", $tags));
+               $this->assertTrue(in_array("@first_last", $tags));
+               
+               //right now, none of the is matched (unsupported)
+//             $this->assertFalse(in_array("@Mike@campino@friendica.eu", $tags));
+//             $this->assertTrue(in_array("@campino@friendica.eu", $tags));
+//             $this->assertTrue(in_array("@campino@friendica.eu is", $tags));
+       }
 
        /**
         * test with an empty string
-        */\r
-       public function testGetTagsEmpty() {\r
-               $tags=get_tags("");\r
-               $this->assertEquals(0, count($tags));\r
+        */
+       public function testGetTagsEmpty() {
+               $tags=get_tags("");
+               $this->assertEquals(0, count($tags));
        }
-}
\ No newline at end of file
+}