File: client.t

package info (click to toggle)
libwww-mediawiki-client-perl 0.31-3
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 1,132 kB
  • sloc: perl: 1,672; makefile: 17
file content (316 lines) | stat: -rwxr-xr-x 13,924 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
#!/usr/bin/perl -w

use strict;
use Test::More tests => 102;
use Test::Differences;

use utf8;

BEGIN {
    use_ok('WWW::Mediawiki::Client', ':options');
}

# test the constructor first
my $mvs;
ok($mvs = WWW::Mediawiki::Client->new(host => 'localhost/'), 
        'Can instanciate a WWW::Mediawiki::Client object');

# load the test data
undef $/;
ok(open(IN, "<:utf8", "t/files/paris.html"), 'Can open our test HTML');
my $HtmlData = <IN>;
ok(open(IN, "<:utf8", "t/files/paris.wiki"), 'Can open our test Wiki file');
my $WikiData = <IN>;
ok(open(IN, "<:utf8", "t/files/reference.wiki"), 'Can open the reference Wiki file');
my $RefData = <IN>;
ok(open(IN, "<:utf8", "t/files/local.wiki"), 'Can open the local Wiki file');
my $LocalData = <IN>;
ok(open(IN, "<:utf8", "t/files/server.wiki"), 'Can open the server Wiki file');
my $ServerData = <IN>;
ok(open(IN, "<:utf8", "t/files/merged.wiki"), 'Can open our merged Wiki file');
my $MergedData = <IN>;
close IN;
$MergedData =~ s/^.//;
$/= "\n";
chomp ($RefData, $ServerData, $LocalData, $MergedData);

# make a test repository
my $Testdir = '/tmp/mvstest.' . time;
mkdir $Testdir
        or die "Could not make $Testdir.  Check the permissions on /tmp.";

chdir $Testdir;

# Test the filename method
is($mvs->filename_to_url('San_Francisco.wiki', 'edit'),
        'http://localhost/wiki/index.php?action=edit&title=San_Francisco',
        'Can we convert the filename to the URL?');
$mvs->space_substitute('_');
is($mvs->filename_to_url('San_Francisco.wiki', 'submit'),
        'http://localhost/wiki/index.php?action=submit&title=San_Francisco',
        'Can we convert the filename to the URL?');
eval { $mvs->filename_to_url('/this/is/an/absolute/filename.wiki') };
isa_ok($@, 'WWW::Mediawiki::Client::AbsoluteFileNameException',
        'Does filename_to_url throw an exception for absolute filenames?');
eval { $mvs->filename_to_url('foo/bar.foo') };
isa_ok($@, 'WWW::Mediawiki::Client::FileTypeException',
        'Does filename_to_url throw an exception for non .wiki files?');


# Can we harvest the Wiki data from the HTML page?
eq_or_diff($mvs->_get_wiki_text($HtmlData), $WikiData, 
        'get_wiki_text returns the correct text');

# Test the conflict detection and separation
eq_or_diff( $mvs->_merge('Paris.wiki', $RefData, $ServerData, $LocalData), 
        $MergedData,
        'does a merge of our test files produce the expected result?');

# Test loading a configuration
my $conf_file = WWW::Mediawiki::Client::CONFIG_FILE;
open OUT, ">$conf_file" or die "Could not open conf file";
print OUT q{$VAR1 = {
    host            => 'www.somewiki.org',
    output_level    => 2,
    username        => 'foo',
    password        => 'bar',
}
};
close OUT;
undef $mvs;
$mvs = WWW::Mediawiki::Client->new();
ok($mvs = $mvs->load_state, 'can run load_state');
is($mvs->password, 'bar', 'retrieved correct password');
is($mvs->username, 'foo', 'retrieved correct username');
is($mvs->host, 'www.somewiki.org', 'retrieved correct host');
#cleanup
unlink $conf_file;


# Test saving configuration
undef $mvs;
$mvs = WWW::Mediawiki::Client->new();
$mvs->username('fred');
$mvs->password('3117p4sS');
$mvs->host('www.someotherwiki.org');
ok($mvs->save_state, 'can run save_state');
undef $mvs;
$mvs = WWW::Mediawiki::Client->new();
$mvs = $mvs->load_state;
is($mvs->password, '3117p4sS', 'retrieved correct password');
is($mvs->username, 'fred', 'retrieved correct username');
is($mvs->host, 'www.someotherwiki.org', 'retrieved correct host');
unlink $conf_file;

# test the Wikitravel defaults with new
$mvs = WWW::Mediawiki::Client->new(host => 'wikitravel.org');
is($mvs->wiki_path, 'wiki/__LANG__/index.php', 'Wikitravel defaults: wiki_path');
is($mvs->space_substitute, '_', 'Wikitravel defaults: space_substitute');
is($mvs->pagename_to_url('San Francisco', 'submit'),
        'http://wikitravel.org/wiki/en/index.php?action=submit&title=San_Francisco',
        '... and convert the filename to the URL?');

# test the Wikipedia defaults with new
$mvs = WWW::Mediawiki::Client->new(host => 'www.wikipedia.org');
is($mvs->wiki_path, 'w/wiki.phtml', 'Wikipedia defaults: wiki_path');
is($mvs->space_substitute, '+', 'Wikipedia defaults: space_substitute');
is($mvs->pagename_to_url('San Francisco', 'submit'),
        'http://en.wikipedia.org/w/wiki.phtml?action=submit&title=San+Francisco',
        '... and convert the filename to the URL?');

# test the Wikitravel defaults with host
ok($mvs->host('wikitravel.org'), 'Can change host to wikitravel');
is($mvs->wiki_path, 'wiki/__LANG__/index.php', '... and get the right wiki_path');
is($mvs->space_substitute, '_', '... and get the right space_substitute');
is($mvs->pagename_to_url('San Francisco', 'submit'),
        'http://wikitravel.org/wiki/en/index.php?action=submit&title=San_Francisco',
        '... and convert the filename to the URL?');

# test the Wikipedia defaults with host
ok($mvs->host('www.wikipedia.org'), 'Can change host to wikipedia');
is($mvs->wiki_path, 'w/wiki.phtml', '... and get the right wiki_path');
is($mvs->space_substitute, '+', '... and get the right space_substitute');
is($mvs->pagename_to_url('San Francisco', 'submit'),
        'http://en.wikipedia.org/w/wiki.phtml?action=submit&title=San+Francisco',
        '... and convert the filename to the URL?');

# test the language code accessor
is($mvs->language_code, 'en', 'Does the default language code get set?');
ok($mvs->language_code('ru'), '... and can we change it');
is($mvs->language_code, 'ru', '... and get back the string we changed it to');

# test the space_substitute accessor
$mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org');
is($mvs->space_substitute, '_', 'Does the default space substitute get set?');
ok($mvs->space_substitute('-'), '... and can we change it');
is($mvs->space_substitute, '-', '... and get back the string we changed it to');
eval { $mvs->space_substitute('&') };
isa_ok($@, 'WWW::Mediawiki::Client::URLConstructionException',
        '... and throws an exception if you try to set it to "&"');
eval { $mvs->space_substitute('?') };
isa_ok($@, 'WWW::Mediawiki::Client::URLConstructionException',
        '... and throws an exception if you try to set it to "?"');
eval { $mvs->space_substitute('=') };
isa_ok($@, 'WWW::Mediawiki::Client::URLConstructionException',
        '... and throws an exception if you try to set it to "="');
eval { $mvs->space_substitute('\\') };
isa_ok($@, 'WWW::Mediawiki::Client::URLConstructionException',
        '... and throws an exception if you try to set it to "\\"');
eval { $mvs->space_substitute('/') };
isa_ok($@, 'WWW::Mediawiki::Client::URLConstructionException',
        '... and throws an exception if you try to set it to "/"');

# test the username accessor
$mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org');
is($mvs->username, undef, 'Is the username undef by default?');
ok($mvs->username('joeuser'), '... and can we change it');
is($mvs->username, 'joeuser', '... and get back the string we changed it to');

# test the password accessor
$mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org');
is($mvs->password, undef, 'Is the password undef by default?');
ok($mvs->password('joeuser'), '... and can we change it');
is($mvs->password, 'joeuser', '... and get back the string we changed it to');

# test the wiki_path accessor
$mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org');
is($mvs->wiki_path, 'wiki/index.php', 'Does the default wiki path get set?');
ok($mvs->wiki_path('foo/index.php'), '... and can we change it');
is($mvs->wiki_path, 'foo/index.php', '... and get back the string we changed it to');
$mvs->wiki_path('/foo/index.php');
is($mvs->wiki_path, 'foo/index.php', '... and do leading slashes get stripped');

# test the commit_message accessor
$mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org');
is($mvs->commit_message, undef, 'Is the commit_message undef by default?');
ok($mvs->commit_message('yo'), '... and can we change it');
is($mvs->commit_message, 'yo', '... and get back the string we changed it to');

# test the watch accessor
$mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org');
is($mvs->watch, OPT_DEFAULT, 'Is the watch OPT_DEFAULT by default?');
foreach my $val (OPT_YES, OPT_NO, OPT_DEFAULT, OPT_KEEP) {
    is($mvs->watch($val), $val, '... and can we change it');
    is($mvs->watch, $val, '... and get back the value we changed it to');
}

# test the minor_edit accessor
$mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org');
is($mvs->minor_edit, OPT_DEFAULT, 'Is the minor_edit OPT_DEFAULT by default?');
foreach my $val (OPT_YES, OPT_NO, OPT_DEFAULT) {
    is($mvs->minor_edit($val), $val, '... and can we change it');
    is($mvs->minor_edit, $val, '... and get back the value we changed it to');
}

# test the status accessor (should be undef)
$mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org');
is($mvs->status, undef, 'Is the status undef by default?');
# ... and throws an error if you try to set it
eval { $mvs->status('foo') };
isa_ok($@, 'WWW::Mediawiki::Client::ReadOnlyFieldException',
        '... and throws an exception if you try to set it');

# test the escape_filenames accessor
$mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org');
is($mvs->escape_filenames, 0, 'Does the default escape_filenames get set?');
ok($mvs->escape_filenames(1), '... and can we change it');
is($mvs->escape_filenames, 1, '... and get back the string we changed it to');

# test get_local_page
open(OUT, '>:utf8', 'Paris.wiki');
print OUT $WikiData;
close OUT;
eq_or_diff($mvs->get_local_page('Paris.wiki'), $WikiData, 'Can get_local_page');
# test for WWW::Mediawiki::Client::FileAccessException
SKIP: {
    chmod 0200, 'Paris.wiki';
    skip("Can't deny access to file.  (Are you root?)", 1) if -r 'Paris.wiki';
    eval { $mvs->get_local_page('Paris.wiki') };
    isa_ok($@, 'WWW::Mediawiki::Client::FileAccessException',
	    '... and throws an exception if the file is unreadable');
}
# test for WWW::Mediawiki::Client::FileTypeException
eval { $mvs->get_local_page('foo.bar') };
isa_ok($@, 'WWW::Mediawiki::Client::FileTypeException',
        '... and throws an exception if we try reading the wrong sort of file');
# test for WWW::Mediawiki::Client::AbsoluteFileNameException 
eval { $mvs->get_local_page("$Testdir/Paris.wiki") };
isa_ok($@, 'WWW::Mediawiki::Client::AbsoluteFileNameException',
        '... and throws an exception if we try using an absolute path');

# test pagename_to_url
$mvs = WWW::Mediawiki::Client->new(host => 'www.wikifoo.org');
is($mvs->pagename_to_url('San Francisco', 'edit'),
        'http://www.wikifoo.org/wiki/index.php?action=edit&title=San_Francisco',
        'Can we convert a pagename to a URL?');
#  ... with __LANG__ token in path
ok($mvs->wiki_path('wiki/__LANG__/wiki.phtml'), 
        '... and can add __LANG__ to wiki_path');
is($mvs->pagename_to_url('San Francisco', 'edit'),
        'http://www.wikifoo.org/wiki/en/wiki.phtml?action=edit&title=San_Francisco',
        '... which gives us the right URL');
# ... with __LANG__ token in base url
ok($mvs->host('__LANG__.wikifoo.org'),
        '... and can add __LANG__ to host');
is($mvs->pagename_to_url('San Francisco', 'edit'),
        'http://en.wikifoo.org/wiki/en/wiki.phtml?action=edit&title=San_Francisco',
        '... which gives us the right URL');

# test filename_to_pagename
is($mvs->filename_to_pagename('San_Francisco.wiki'), 'San Francisco',
        'filename_to_pagename can convert a filename to a pagename.');
is($mvs->filename_to_pagename('Salt_Lake_City.wiki'), 'Salt Lake City',
        '... if it has more than one "_".');
eval { $mvs->filename_to_pagename('foo.bar') };
isa_ok($@, 'WWW::Mediawiki::Client::FileTypeException',
        '... and throws an exception if we try the wrong sort of file');
eval { $mvs->filename_to_pagename("$Testdir/Paris.wiki") };
isa_ok($@, 'WWW::Mediawiki::Client::AbsoluteFileNameException',
        '... and throws an exception if we try using an absolute path');

# test pagename_to_filename
is($mvs->pagename_to_filename('San Francisco'), 'San_Francisco.wiki',
        'pagename_to_filename can convert a page name into a filename');
is($mvs->pagename_to_filename('User:Mark/Maps'), 'User:Mark/Maps.wiki',
        '... even the sub-page of a User page.');

$mvs->escape_filenames(0);
is($mvs->pagename_to_filename('Нижний Новгород'), 'Нижний_Новгород.wiki',
        'pagename_to_filename with Unicode');
is($mvs->filename_to_pagename('Нижний_Новгород.wiki'), 'Нижний Новгород',
        'filename_to_pagename with Unicode');

$mvs->escape_filenames(1);
is($mvs->pagename_to_filename('Нижний Новгород'), '%D0%9D%D0%B8%D0%B6%D0%BD%D0%B8%D0%B9_%D0%9D%D0%BE%D0%B2%D0%B3%D0%BE%D1%80%D0%BE%D0%B4.wiki',
        'pagename_to_filename with Unicode escaping');
is($mvs->filename_to_pagename('%D0%9D%D0%B8%D0%B6%D0%BD%D0%B8%D0%B9_%D0%9D%D0%BE%D0%B2%D0%B3%D0%BE%D1%80%D0%BE%D0%B4.wiki'), 'Нижний Новгород',
        'filename_to_pagename with Unicode escaping');

# test url_to_filename
$mvs->space_substitute('+');
is($mvs->url_to_filename('http://www.wikifoo.org/wiki/en/wiki.phtml?action=edit&title=San+Francisco'),
        'San_Francisco.wiki',
        'url_to_filename can convert a URL to a filename.');
$mvs->space_substitute('_');
is($mvs->url_to_filename('http://www.wikifoo.org/wiki/en/wiki.phtml?action=edit&title=San_Francisco'),
        'San_Francisco.wiki',
        '... with underscores too.');

# test list_wiki_files
open(OUT, '>:utf8', 'foo.wiki');
print OUT 'foo';
close OUT;
mkdir 'foo';
open(OUT, '>:utf8', 'foo/bar.wiki');
print OUT 'bar';
close OUT;
my @expect = qw(Paris.wiki foo.wiki foo/bar.wiki);
my @got = $mvs->list_wiki_files; 
eq_array(\@got, \@expect,
        'list_wiki_files returns a recursive list of wiki files.');

1;

__END__

# vim:syntax=perl: