]> git.mxchange.org Git - friendica.git/blob - tests/get_tags_test.php
modified: include/dbstructure.php removed uneeded break; It causes errors with...
[friendica.git] / tests / get_tags_test.php
1 <?php
2 /**
3  * This file contains the tests for get_tags and the tag handling in item.php
4  * 
5  * @package test.util
6  */
7
8 /**
9  * required, because it contains the get_tags() function
10  */
11 require_once 'include/text.php';
12 /**
13  * required, because it contains the tag handling
14  */
15 require_once 'mod/item.php';
16
17 /**
18  * A class which can be used as replacement for an app if
19  * only get_baseurl is used. 
20  * 
21  * @author Alexander Kampmann
22  * @package test.util
23  */
24 class MockApp {
25         function get_baseurl() {
26                 return "baseurl"; 
27         }
28 }; 
29
30 /**
31  * the test should not rely on a database, 
32  * so this is a replacement for the database access method q. 
33  * 
34  * It simulates the user with uid 11 has one contact, named Mike Lastname. 
35  * 
36  * @param string $sql
37  */
38 function q($sql) {
39         $result=array(array('id'=>15, 
40                         'attag'=>'', 'network'=>'dfrn', 
41                         'name'=>'Mike Lastname', 'alias'=>'Mike', 
42                         'nick'=>'Mike', 'url'=>"http://justatest.de")); 
43         
44         $args=func_get_args(); 
45
46         //last parameter is always (in this test) uid, so, it should be 11
47         if($args[count($args)-1]!=11) {
48                 return; 
49         }
50         
51         
52         if(3==count($args)) {
53                 //first call in handle_body, id only
54                 if($result[0]['id']==$args[1]) {
55                         return $result; 
56                 }
57                 //second call in handle_body, name
58                 if($result[0]['name']===$args[1]) {\r
59                         return $result;\r
60                 }
61         }
62         //third call in handle_body, nick or attag
63         if($result[0]['nick']===$args[2] || $result[0]['attag']===$args[1]) {\r
64                 return $result;\r
65         }
66 }
67
68 /**
69  * replacement for dbesc. 
70  * I don't want to test dbesc here, so
71  * I just return the input. It won't be a problem, because 
72  * the test does not use a real database. 
73  * 
74  * DON'T USE HAT FUNCTION OUTSIDE A TEST!
75  * 
76  * @param string $str
77  * @return input
78  */
79 function dbesc($str) {
80         return $str; 
81 }
82
83 /**
84  * TestCase for tag handling. 
85  * 
86  * @author alexander
87  * @package test.util
88  */
89 class GetTagsTest extends PHPUnit_Framework_TestCase {
90         /** the mock to use as app */
91         private $a; \r
92
93         /**
94          * initialize the test. That's a phpUnit function, 
95          * don't change its name.
96          */\r
97         public function setUp() {\r
98                 $this->a=new MockApp(); 
99         }
100
101         /**\r
102          * test with one Person tag\r
103          */\r
104         public function testGetTagsShortPerson() {\r
105                 $text="hi @Mike";\r
106 \r
107                 $tags=get_tags($text);\r
108
109                 $inform=''; 
110                 $str_tags='';
111                 foreach($tags as $tag) {
112                         handle_tag($this->a, $text, $inform, $str_tags, 11, $tag);
113                 }
114
115                 //correct tags found?
116                 $this->assertEquals(1, count($tags)); \r
117                 $this->assertTrue(in_array("@Mike", $tags));
118                 
119                 //correct output from handle_tag?
120                 $this->assertEquals("cid:15", $inform); 
121                 $this->assertEquals("@[url=http://justatest.de]Mike Lastname[/url]", $str_tags);
122                 $this->assertEquals("hi @[url=http://justatest.de]Mike Lastname[/url]", $text);\r
123         }
124         
125         /**\r
126          * test with one Person tag. 
127          * There's a minor spelling mistake...\r
128          */\r
129         public function testGetTagsShortPersonSpelling() {\r
130                 $text="hi @Mike.because";\r
131         \r
132                 $tags=get_tags($text);\r
133         
134                 //correct tags found?\r
135                 $this->assertEquals(1, count($tags));\r
136                 $this->assertTrue(in_array("@Mike.because", $tags));
137                 \r
138                 $inform='';\r
139                 $str_tags='';\r
140                 handle_tag($this->a, $text, $inform, $str_tags, 11, $tags[0]);\r
141         \r
142                 // (mike) - This is a tricky case.
143                 // we support mentions as in @mike@example.com - which contains a period.
144                 // This shouldn't match anything unless you have a contact named "Mike.because".
145                 // We may need another test for "@Mike. because" - which should return the contact
146                 // as we ignore trailing periods in tags. 
147  
148 //              $this->assertEquals("cid:15", $inform); 
149 //              $this->assertEquals("@[url=http://justatest.de]Mike Lastname[/url]", $str_tags);
150 //              $this->assertEquals("hi @[url=http://justatest.de]Mike Lastname[/url].because", $text);\r
151
152                 $this->assertEquals("", $inform); 
153                 $this->assertEquals("", $str_tags);
154
155         }
156         
157         /**\r
158          * test with two Person tags. 
159          * There's a minor spelling mistake...\r
160          */\r
161
162         public function testGetTagsPerson2Spelling() {\r
163                 $text="hi @Mike@campino@friendica.eu";\r
164         \r
165                 $tags=get_tags($text);\r
166
167 // This construct is not supported. Results are indeterminate                   
168 //              $this->assertEquals(2, count($tags)); \r
169 //              $this->assertTrue(in_array("@Mike", $tags));
170 //              $this->assertTrue(in_array("@campino@friendica.eu", $tags));\r
171         }\r
172
173         /**
174          * Test with one hash tag.
175          */\r
176         public function testGetTagsShortTag() {\r
177                 $text="This is a #test_case";\r
178 \r
179                 $tags=get_tags($text);\r
180
181                 $this->assertEquals(1, count($tags));\r
182                 $this->assertTrue(in_array("#test_case", $tags));\r
183         }\r
184
185         /**
186          * test with a person and a hash tag
187          */\r
188         public function testGetTagsShortTagAndPerson() {\r
189                 $text="hi @Mike This is a #test_case";\r
190 \r
191                 $tags=get_tags($text);\r
192
193                 $this->assertEquals(3, count($tags));
194                 $this->assertTrue(in_array("@Mike", $tags));
195                 $this->assertTrue(in_array("@Mike This", $tags));\r
196                 $this->assertTrue(in_array("#test_case", $tags));\r
197
198                 $inform='';
199                 $str_tags='';
200                 foreach($tags as $tag) {
201                         handle_tag($this->a, $text, $inform, $str_tags, 11, $tag);
202                 }
203                 \r
204                 $this->assertEquals("cid:15", $inform); 
205                 $this->assertEquals("@[url=http://justatest.de]Mike Lastname[/url],#[url=baseurl/search?tag=test%20case]test case[/url]", $str_tags);
206                 $this->assertEquals("hi @[url=http://justatest.de]Mike Lastname[/url] This is a #[url=baseurl/search?tag=test%20case]test case[/url]", $text); 
207                 \r
208         }\r
209
210         /**
211          * test with a person, a hash tag and some special chars.
212          */\r
213         public function testGetTagsShortTagAndPersonSpecialChars() {\r
214                 $text="hi @Mike, This is a #test_case.";\r
215 \r
216                 $tags=get_tags($text);\r
217 \r
218                 $this->assertEquals(2, count($tags));
219                 $this->assertTrue(in_array("@Mike", $tags));
220                 $this->assertTrue(in_array("#test_case", $tags));\r
221         }\r
222
223         /**
224          * Test with a person tag and text behind it.
225          */\r
226         public function testGetTagsPersonOnly() {\r
227                 $text="@Test I saw the Theme Dev group was created.";\r
228 \r
229                 $tags=get_tags($text);\r
230
231                 $this->assertEquals(2, count($tags));\r
232                 $this->assertTrue(in_array("@Test I", $tags));
233                 $this->assertTrue(in_array("@Test", $tags));\r
234         }\r
235
236         /**
237          * this test demonstrates strange behaviour by intval. 
238          * It makes the next test fail. 
239          */
240         public function testIntval() {
241                 $this->assertEquals(15, intval("15 it")); 
242         }
243         
244         /**
245          * test a tag with an id in it
246          */
247         public function testIdTag() {
248                 $text="Test with @mike+15 id tag"; 
249                 
250                 $tags=get_tags($text); 
251                 
252                 $this->assertEquals(2, count($tags)); 
253                 $this->assertTrue(in_array("@mike+15", $tags));
254                 
255                 //happens right now, but it shouldn't be necessary
256                 $this->assertTrue(in_array("@mike+15 id", $tags));
257                 
258                 $inform='';\r
259                 $str_tags='';
260                 foreach($tags as $tag) {
261                         handle_tag($this->a, $text, $inform, $str_tags, 11, $tag);
262                 }
263                 
264                 $this->assertEquals("Test with @[url=http://justatest.de]Mike Lastname[/url] id tag", $text);\r
265                 $this->assertEquals("@[url=http://justatest.de]Mike Lastname[/url]", $str_tags);\r
266                 // this test may produce two cid:15 entries - which is OK because duplicates are pruned before delivery
267                 $this->assertContains("cid:15",$inform);
268         }
269         
270         /**
271          * test with two persons and one special tag.
272          */\r
273         public function testGetTags2Persons1TagSpecialChars() {\r
274                 $text="hi @Mike, I'm just writing #test_cases, so"\r
275                 ." so @somebody@friendica.com may change #things.";\r
276 \r
277                 $tags=get_tags($text);\r
278
279                 $this->assertEquals(5, count($tags));\r
280                 $this->assertTrue(in_array("@Mike", $tags));\r
281                 $this->assertTrue(in_array("#test_cases", $tags));
282                 $this->assertTrue(in_array("@somebody@friendica.com", $tags));\r
283                 $this->assertTrue(in_array("@somebody@friendica.com may", $tags));\r
284                 $this->assertTrue(in_array("#things", $tags));\r
285         }\r
286
287         /**
288          * test with a long text.
289          */\r
290         public function testGetTags() {\r
291                 $text="hi @Mike, I'm just writing #test_cases, "\r
292                 ." so @somebody@friendica.com may change #things. Of course I "\r
293                 ."look for a lot of #pitfalls, like #tags at the end of a sentence "\r
294                 ."@comment. I hope noone forgets about @fullstops.because that might"\r
295                 ." break #things. @Mike@campino@friendica.eu is also #nice, isn't it? "\r
296                 ."Now, add a @first_last tag. ";\r
297                 \r
298                 $tags=get_tags($text);\r
299 \r
300                 $this->assertTrue(in_array("@Mike", $tags));\r
301                 $this->assertTrue(in_array("#test_cases", $tags));\r
302                 $this->assertTrue(in_array("@somebody@friendica.com", $tags));\r
303                 $this->assertTrue(in_array("#things", $tags));\r
304                 $this->assertTrue(in_array("#pitfalls", $tags));\r
305                 $this->assertTrue(in_array("#tags", $tags));\r
306                 $this->assertTrue(in_array("@comment", $tags));\r
307                 $this->assertTrue(in_array("@fullstops.because", $tags));\r
308                 $this->assertTrue(in_array("#things", $tags));\r
309                 $this->assertTrue(in_array("@Mike", $tags));\r
310                 $this->assertTrue(in_array("#nice", $tags));\r
311                 $this->assertTrue(in_array("@first_last", $tags));
312                 
313                 //right now, none of the is matched (unsupported)
314 //              $this->assertFalse(in_array("@Mike@campino@friendica.eu", $tags));\r
315 //              $this->assertTrue(in_array("@campino@friendica.eu", $tags));
316 //              $this->assertTrue(in_array("@campino@friendica.eu is", $tags));\r
317         }\r
318
319         /**
320          * test with an empty string
321          */\r
322         public function testGetTagsEmpty() {\r
323                 $tags=get_tags("");\r
324                 $this->assertEquals(0, count($tags));\r
325         }
326 }