wiki.pl: Port some fixes from upstream
[Orgmuse.git] / t / tags.t
blobee6e44d22e46de2ef40b3b83dfa7033930c55e30
1 # Copyright (C) 2006, 2009  Alex Schroeder <alex@gnu.org>
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 3 of the License, or
6 # (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 require 't/test.pl';
17 package OddMuse;
18 use Test::More tests => 70;
19 use utf8;
21 clear_pages();
23 add_module('tags.pl');
24 InitVariables();
26 $TagFeedIcon = 'http://www.example.org/pics/rss.png';
28 xpath_run_tests(split('\n',<<'EOT'));
29 [[tag:foo bar]]
30 //a[@class="outside tag"][@title="Tag"][@rel="tag"][text()="foo bar"][@href="http://localhost/test.pl?action=rc;rcfilteronly=tag:foo%20bar"]
31 [[tag:foo bar]]
32 //a[@class="feed tag"][@title="Feed for this tag"][@href="http://localhost/test.pl?action=rss;rcfilteronly=tag:foo%20bar"][@rel="feed"]/img[@src="http://www.example.org/pics/rss.png"]
33 EOT
35 $TagUrl = 'http://technorati.com/tag/%s';
36 $TagFeed = 'http://feeds.technorati.com/tag/%s';
38 xpath_run_tests(split('\n',<<'EOT'));
39 [[tag:foo bar]]
40 //a[@class="outside tag"][@title="Tag"][@href="http://technorati.com/tag/foo%20bar"][@rel="tag"][text()="foo bar"]
41 [[tag:foo bar]]
42 //a[@class="feed tag"][@title="Feed for this tag"][@href="http://feeds.technorati.com/tag/foo%20bar"][@rel="feed"]/img[@src="http://www.example.org/pics/rss.png"]
43 [[tag:foo bar|mu muh!]]
44 //a[@class="outside tag"][@title="Tag"][@href="http://technorati.com/tag/foo%20bar"][@rel="tag"][text()="mu muh!"]
45 EOT
47 update_page('Brilliant', 'Gameologists [[tag:podcast]] [[tag:mag]]');
48 update_page('Pödgecäst´s', 'Another [[tag:podcast]]');
49 update_page('Alex', 'Me! [[tag:Old School]]');
51 # open the DB file
52 require DB_File;
53 tie %h, "DB_File", $TagFile;
55 %tag = map {$_=>1} split($FS, UrlDecode($h{UrlEncode("_Brilliant")}));
56 ok($tag{podcast}, 'Brilliant page tagged podcast');
57 ok($tag{mag}, 'Brilliant page tagged mag');
58 %tag = map {$_=>1} split($FS, UrlDecode($h{UrlEncode("_Pödgecäst´s")}));
59 ok($tag{podcast}, 'Pödgecäst´s page tagged podcast');
60 %file = map {$_=>1} split($FS, UrlDecode($h{UrlEncode("podcast")}));
61 ok($file{Brilliant}, 'Tag podcast applies to page Brilliant');
62 ok($file{"Pödgecäst´s"}, 'Tag podcast applies to page Pödgecäst´s');
63 %file = map {$_=>1} split($FS, UrlDecode($h{UrlEncode("mag")}));
64 ok($file{Brilliant}, 'Tag mag applies to page Brilliant');
65 %file = map {$_=>1} split($FS, UrlDecode($h{UrlEncode("old_school")}));
66 ok($file{Alex}, 'Tag Old School applies to page Alex');
68 # close the DB file before making changes via the wiki!
69 untie %h;
71 update_page('Brilliant', 'Gameologists [[tag:mag]]');
73 # reopen changed file
74 tie %h, "DB_File", $TagFile;
76 %tag = map {$_=>1} split($FS, UrlDecode($h{UrlEncode("_Brilliant")}));
77 ok(!$tag{podcast}, 'Brilliant page no longer tagged podcast');
78 ok($tag{mag}, 'Brilliant page still tagged mag');
79 %file = map {$_=>1} split($FS, UrlDecode($h{UrlEncode("podcast")}));
80 ok(!$file{Brilliant}, 'Tag podcast no longer applies to page Brilliant');
81 ok($file{"Pödgecäst´s"}, 'Tag podcast still applies to page Pödgecäst´s');
83 # close the DB file before making changes via the wiki!
84 untie %h;
86 DeletePage('Brilliant');
88 # reopen changed file
89 tie %h, "DB_File", $TagFile;
91 ok(!$h{UrlEncode("_Brilliant")}, 'Brilliant page no longer exists');
92 ok(!exists($h{UrlEncode("mag")}), 'No page tagged mag exists');
94 # close the DB file before making changes via the wiki!
95 untie %h;
97 update_page('Brilliant', 'Gameologists [[tag:podcast]] [[tag:mag]]');
98 update_page('Sons', 'of Kryos [[tag:Podcast]]');
99 update_page('Alex', 'not a podcast');
100 update_page('Jeff', 'a blog [[tag:Old School]]');
102 # ordinary search finds Alex
103 $page = get_page('search=podcast raw=1');
104 test_page($page, qw(Pödgecäst´s Brilliant Sons Alex));
106 # tag search skips Alex
107 $page = get_page('search=tag:podcast raw=1');
108 test_page($page, qw(Pödgecäst´s Brilliant Sons));
109 test_page_negative($page, qw(Alex));
111 # tag search is case insensitive
112 $page = get_page('search=tag:PODCAST raw=1');
113 test_page($page, qw(Pödgecäst´s Brilliant Sons));
114 test_page_negative($page, qw(Alex));
116 # exclude tag search skips Brilliant
117 $page = get_page('search=-tag:mag raw=1');
118 test_page($page, qw(Pödgecäst´s Sons Alex));
119 test_page_negative($page, qw(Brilliant));
121 # combine include and exclude tag search to exclude both Alex and
122 # Brilliant
123 $page = get_page('search=tag:podcast%20-tag:mag raw=1');
124 test_page($page, qw(Pödgecäst´s Sons));
125 test_page_negative($page, qw(Brilliant Alex));
127 # combine ordinary search with include and exclude tag search to
128 # exclude both Alex and Brilliant
129 $page = get_page('search=kryos%20tag:podcast%20-tag:mag raw=1');
130 test_page($page, qw(Sons));
131 test_page_negative($page, qw(Pödgecäst´s Brilliant Alex));
133 # search for a tag containing spaces
134 $page = get_page('search=tag:old_school raw=1');
135 test_page($page, qw(Jeff));
136 test_page_negative($page, qw(Sons Pödgecäst´s Brilliant Alex));
138 test_page(get_page('action=reindex pwd=foo'),
139           qw(Pödgecäst´s Brilliant Sons Alex));
141 # tag search skips Alex -- repeat test after reindexing
142 $page = get_page('search=tag:podcast raw=1');
143 test_page($page, qw(Pödgecäst´s Brilliant Sons));
144 test_page_negative($page, qw(Alex));
146 add_module('near-links.pl');
148 CreateDir($NearDir);
149 WriteStringToFile("$NearDir/EmacsWiki", "AlexSchroeder\nFoo\n");
151 update_page('InterMap', " EmacsWiki http://www.emacswiki.org/cgi-bin/wiki/%s\n",
152             'required', 0, 1);
153 update_page('NearMap', " EmacsWiki"
154             . " http://www.emacswiki.org/cgi-bin/emacs?action=index;raw=1\n",
155             'required', 0, 1);
157 # make sure the near pages are not listed
158 $page = get_page('search=tag:podcast raw=1');
159 test_page_negative($page, qw(AlexSchroeder Foo));
161 # check journal pages
162 $page = update_page('Podcasts', '<journal "." search tag:podcast>');
163 test_page($page, qw(Pödgecäst´s Brilliant Sons));
164 test_page_negative($page, qw(Alex Foo));
166 # check the tag cloud
167 xpath_test(get_page('action=tagcloud'),
168            '//h1[text()="Tag Cloud"]',
169            '//a[@style="font-size: 200%;"][@href="http://localhost/wiki.pl?search=tag:podcast"][@title="3"][text()="podcast"]',
170            '//a[@style="font-size: 80%;"][@href="http://localhost/wiki.pl?search=tag:old_school"][@title="1"][text()="old school"]',
171            '//a[@style="font-size: 80%;"][@href="http://localhost/wiki.pl?search=tag:mag"][@title="1"][text()="mag"]');
173 # check interference; in order for this test to work, we need to make
174 # sure that localnames is loaded first
175 add_module('localnames.pl');
176 AppendStringToFile($ConfigFile, "\$LocalNamesCollect = 1;\n");
177 update_page('LocalNames', 'test');
178 update_page('Alex', 'is a [[tag:podcast]] after all');
179 $page = get_page('search=tag:podcast raw=1');
180 test_page($page, qw(Pödgecäst´s Brilliant Sons Alex));