root/trunk/t/28-xmlrpc.t

Revision 5086, 21.6 kB (checked in by takayama, 8 days ago)

* Fixed for work.

  • Property svn:mime-type set to text/plain
Line 
1use strict;
2use lib 't/lib', 'extlib', 'lib', '../lib', '../extlib';
3
4BEGIN {
5    $ENV{MT_HOME} = './';
6};
7
8use MT;
9
10use Test::More qw( no_plan );
11use MIME::Base64;
12
13# To keep away from being under FastCGI
14$ENV{HTTP_HOST} = 'localhost';
15
16use MT::Test qw(:db :data);
17my $mt = MT->new() or die MT->errstr;
18isa_ok($mt, 'MT');
19
20# Adjust authored_on because result of load_iter is undetermined.
21my $entry_iter = MT::Entry->load_iter();
22while ( my $e = $entry_iter->() ) {
23    $e->authored_on( $e->authored_on + $e->id );
24    $e->save;
25}
26
27my $base_uri = '/mt-xmlrpc.cgi';
28my $username = 'Chuck D';
29my $password = 'seecret';
30
31use XMLRPC::Lite;
32my $ser   = XMLRPC::Serializer->new();
33my $deser = XMLRPC::Deserializer->new();
34
35require LWP::UserAgent::Local;
36my $ua = new LWP::UserAgent::Local({ ScriptAlias => '/' });
37
38my $logo = q{R0lGODlhlgAZANUAAP////Ly8uTk5NfX18nJyb29vbu7u62trZ6eno+Pj1iZvVKQsoCAgE6IqHx8fEmAnnFxcUV4lGtra0BwimFhYTtnf1lZWTZfdVBQUDFWaitMXz8/PydDUyA5SC0tLRswPBYlLxkZGQ8bIggPEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAHAP8ALAAAAACWABkAAAb/QAjBQCoaMQSC0QiaKJ6LzGhJIhyoVQSWQcBgi8lwIkTdEDZfkjCchHzZbC3JfF0eCOQign3wLOFJRgWDFgUkBRYJAAAUVAaLVBxPk08PU0YHAH5GFABuVAIARF8ABAkIA6VUGABeX4oJsbGuVLKZB7GfJI+NRQwACX8CsQQAAZskpbKxS4YOBRIFDooBSkYeiwBLH08cSxEKD0udwUYGAXlGEACpyEvA5ppLrLS12mlf9FghAQJkHgEGUAlUZF25ZAexGILGUBECeXoAZPoWjgqIbksECLgmEcsAARsAyKECL6I7fa/u4VvV6ss6LcXQ/LFGAtvBkl8WHjqkCFsd/34GFBkZ8eQDlgoKKixR5OqXzCMAGJAYgA6LRAwYElRjWW9pK6xY0+Vr+QaYSCwEPTzSdRXs0zRCH5H5lVUltwlfiEZY4rOIRiznyKzTZSTbogBdUWJRZJhsGsVUAALwh7ZxnSKNVa0UyirYX6FFRChYcGmJpAUD0bGSyrdjkYBWD2ClkKoeZK9gw668veRXr4HDElBwl0y225UkQGvs5AZ0kQUKLlAZAV2BUXWeMoklkWlAmACOMR8MIWpeeK/IueLjXYWm1YTpQa8LUNU5iQxPQCzB/wTvkmquGcHPAMsocpl4AmpWBHvJqZQeCQxCeB4Y7pEEH3Kg8XNWg1Q8EP9OBiDyN4k3mCzS1S+EVQERZsbR5ol5DOSWDlO5vYVFhOwRRIpxYBFnjxEPbWJfERdQYiRGRYS0EShLLmHQO4YFAB8rjdHCmGEVqvfYhO3hkxlOX3hASwhPifmFCBpU0MCRT0ixoI0QwhnnPLl9EUJuuhUhJp5yCojBdkvcCegcfUKIJwY+PqioCBdUR8kCF1yn6KSUVmrppZheKoKHbIajQWmZhirqqKReOgKnnTagX6mstupqqRd1CgWor9Zq661fICVrUrj26qutsU4S6QcfdPAErb8mq6ylaz7RABVFSrrstNQi50RR0y0gbbXcdkuCBk/shQUHInhrLrei8XoZ7rrrFmkdu/B664S48dY7LQcPkGjvvksEAQA7};
39
40my $new_entry_id;
41my @apis = (
42    {
43        api    =>'blogger.getUsersBlogs',
44        params => [ '', $username, $password ],
45        result => sub {
46            my ( $som ) = @_;
47            my $result = $som->result;
48            is( $result->[0]->{url}, 'http://narnia.na/nana/', 'url is correct' );
49            is( $result->[0]->{blogid}, 1, 'blogid is correct' );
50            is( $result->[0]->{blogName}, 'none', 'blogName is correct' );
51        }
52    },
53    {
54        api    => 'blogger.getUserInfo',
55        params => [ '', $username, $password ],
56        result => sub {
57            my ( $som ) = @_;
58            my $result = $som->result;
59            my $author = MT::Author->load({ name => 'Chuck D' });
60            is( $result->{userid}, $author->id);
61            is( $result->{firstname}, (split /\s+/, $author->name)[0]);
62            is( $result->{lastname}, (split /\s+/, $author->name)[1]);
63            is( $result->{nickname}, $author->nickname || '');
64            is( $result->{email}, $author->email || '');
65            is( $result->{url}, $author->url || '');
66        }
67    },
68    {
69        api    => 'blogger.getUsersBlogs',
70        params => [ '', 'Chuck D', 'wrong' ],
71        result => sub {
72            my ( $som ) = @_;
73            ok(!$som->result);
74            ok($som->fault);
75            is($som->faultstring, 'Invalid login');
76            is($som->faultcode, 1);
77        }
78    },
79    {
80        api    => 'blogger.getUserInfo',
81        params => [ '', 'Chuck D', 'wrong' ],
82        result => sub {
83            my ( $som ) = @_;
84            ok(!$som->result);
85            ok($som->fault);
86            is($som->faultstring, 'Invalid login');
87            is($som->faultcode, 1);
88        }
89    },
90    {
91        api    => 'blogger.getRecentPosts',
92        params => [ '', 1, $username, $password, 2 ],
93        result => sub {
94            my ( $som ) = @_;
95            my $result = $som->result;
96            is(scalar(@$result), 2);
97            my $entry  = MT::Entry->load(3);
98            my $author = MT::Author->load({ name => 'Chuck D' });
99            is($result->[0]->{userid}, $author->id);
100            is($result->[0]->{postid}, $entry->id);
101            my $ao = sprintf "%04d%02d%02dT%02d:%02d:%02d",
102                unpack 'A4A2A2A2A2A2', $entry->authored_on;
103            is($result->[0]->{dateCreated}, $ao);
104            is($result->[0]->{content}, $entry->text);
105            $entry  = MT::Entry->load(2);
106            $author = MT::Author->load({ name => 'Bob D' });
107            is($result->[1]->{userid}, $author->id);
108            is($result->[1]->{postid}, $entry->id);
109            $ao = sprintf "%04d%02d%02dT%02d:%02d:%02d",
110                unpack 'A4A2A2A2A2A2', $entry->authored_on;
111            is($result->[1]->{dateCreated}, $ao);
112            is($result->[1]->{content}, $entry->text);
113        },
114    },
115    {
116        api    => 'metaWeblog.getRecentPosts',
117        params => [ 1, $username, $password, 2 ],
118        result => sub {
119            my ( $som ) = @_;
120            my $result = $som->result;
121            is(scalar(@$result), 2);
122            my $author = MT::Author->load({ name => 'Chuck D' });
123            my $entry  = MT::Entry->load(3);
124            is($result->[0]->{userid}, $author->id);
125            is($result->[0]->{postid}, $entry->id);
126            my $ao = sprintf "%04d%02d%02dT%02d:%02d:%02d",
127                unpack 'A4A2A2A2A2A2', $entry->authored_on;
128            is($result->[0]->{dateCreated}, $ao);
129            is($result->[0]->{description}, $entry->text);
130            is($result->[0]->{title}, $entry->title);
131            is($result->[0]->{link}, $entry->permalink);
132            is($result->[0]->{permaLink}, $entry->permalink);
133            is($result->[0]->{mt_excerpt},
134                defined $entry->excerpt ? $entry->excerpt : '' );
135            is($result->[0]->{mt_text_more}, $entry->text_more);
136            is($result->[0]->{mt_allow_comments}, $entry->allow_comments);
137            is($result->[0]->{mt_allow_pings}, 0);
138            is($result->[0]->{mt_convert_breaks}, $entry->convert_breaks || '');
139            is($result->[0]->{mt_keywords}, '');
140            $author = MT::Author->load({ name => 'Bob D' });
141            $entry  = MT::Entry->load(2);
142            is($result->[1]->{userid}, $author->id);
143            is($result->[1]->{postid}, $entry->id);
144            $ao = sprintf "%04d%02d%02dT%02d:%02d:%02d",
145                unpack 'A4A2A2A2A2A2', $entry->authored_on;
146            is($result->[1]->{dateCreated}, $ao);
147            is($result->[1]->{description}, $entry->text);
148            is($result->[1]->{title}, $entry->title);
149            is($result->[1]->{link}, $entry->permalink);
150            is($result->[1]->{permaLink}, $entry->permalink);
151            is($result->[1]->{mt_excerpt},
152                defined $entry->excerpt ? $entry->excerpt : '' );
153            is($result->[1]->{mt_text_more}, $entry->text_more);
154            is($result->[1]->{mt_allow_comments}, $entry->allow_comments);
155            is($result->[1]->{mt_allow_pings}, $entry->allow_pings || '');
156            is($result->[1]->{mt_convert_breaks}, $entry->convert_breaks || '');
157            is($result->[1]->{mt_keywords}, $entry->keywords || '');
158        },
159    },
160    {
161        api    => 'mt.getRecentPostTitles',
162        params => [ 1, $username, $password, 3 ],
163        result => sub {
164            my ( $som ) = @_;
165            my $result = $som->result;
166            is(scalar(@$result), 3);
167            my @entries = MT::Entry->load({
168                blog_id => 1,
169            }, {
170                'sort' => 'authored_on',
171                'direction' => 'descend',
172                limit => 3,
173            });
174            for ( my $i = 0; $i < 3; ++$i ) {
175                is( $entries[$i]->id, $result->[$i]->{postid} );
176                is( $entries[$i]->title, $result->[$i]->{title} );
177            }
178        },
179    },
180    {
181        api    => 'blogger.editPost',
182        params => [ '', 3, $username, $password, 'Foo Bar', 0 ],
183        result => sub {
184            my ( $som ) = @_;
185            my $result = $som->result;
186            MT::Entry->driver->Disabled(1);
187            my $entry = MT::Entry->load(3);
188            MT::Entry->driver->Disabled(0);
189            is($entry->text, 'Foo Bar');
190        },
191    },
192    {
193        api    => 'metaWeblog.editPost',
194        params => [ 3, $username, $password, {
195            title => 'Title',
196            description => 'Description',
197            mt_convert_breaks => 'wiki',
198            mt_allow_comments => 1,
199            mt_allow_pings => 1,
200            mt_excerpt => 'Excerpt',
201            mt_text_more => 'Extended Entry',
202            mt_keywords => 'Keywords',
203            mt_tb_ping_urls => [ 'http://127.0.0.1/' ],
204            dateCreated => '19770922T15:30:00',
205        }, 0 ],
206        result => sub {
207            my ( $som ) = @_;
208            my $result = $som->result;
209            MT::Entry->driver->Disabled(1);
210            my $entry = MT::Entry->load(3);
211            MT::Entry->driver->Disabled(0);
212            is($entry->title, 'Title');
213            is($entry->text, 'Description');
214            is($entry->convert_breaks, 'wiki');
215            is($entry->allow_comments, 1);
216            is($entry->allow_pings, 1);
217            is($entry->excerpt, 'Excerpt');
218            is($entry->text_more, 'Extended Entry');
219            is($entry->keywords, 'Keywords');
220            is($entry->to_ping_urls, 'http://127.0.0.1/');
221            is($entry->to_ping_url_list->[0], 'http://127.0.0.1/');
222            is($entry->authored_on, '19770922153000');
223        },
224    },
225    {
226        api    => 'metaWeblog.editPost',
227        params => [ 3, $username, $password, {
228            mt_convert_breaks => '',
229            mt_allow_comments => 2,
230            mt_excerpt => '',
231            mt_text_more => '',
232        }, 0 ],
233        result => sub {
234            my ( $som ) = @_;
235            my $result = $som->result;
236        },
237    },
238    {
239        api    => 'mt.getCategoryList',
240        params => [ 1, $username, $password ],
241        result => sub {
242            my ( $som ) = @_;
243            my $result = $som->result;
244            my $cat1 = MT::Category->load(1);
245            my $cat2 = MT::Category->load(2);
246            is($result->[0]->{categoryId}, $cat1->id);
247            is($result->[0]->{categoryName}, $cat1->label);
248            is($result->[1]->{categoryId}, $cat2->id);
249            is($result->[1]->{categoryName}, $cat2->label);
250        },
251    },
252    {
253        api    => 'mt.getPostCategories',
254        params => [ 3, $username, $password ],
255        result => sub {
256            my ( $som ) = @_;
257            my $result = $som->result;
258            is(scalar @{ $som->result }, 0);
259        },
260    },
261    {
262        api    => 'mt.setPostCategories',
263        params => [ 3, $username, $password, [
264            { categoryId => 1 } ]
265        ],
266        result => sub {
267            my ( $som ) = @_;
268            my $result = $som->result;
269            MT::Entry->driver->Disabled(1);
270            my $entry = MT::Entry->load(3);
271            MT::Entry->driver->Disabled(0);
272            my $cat1 = MT::Category->load(1);
273            my $cats = $entry->categories;
274            is(scalar @$cats, 1);
275            is($cats->[0]->label, $cat1->label);
276            is($entry->category->label, $cat1->label);
277        },
278    },
279    {
280        api    => 'mt.setPostCategories',
281        params => [ 3, $username, $password, [
282            { categoryId => 1, isPrimary => 1 },
283            { categoryId => 2, isPrimary => 0 },
284        ] ],
285        pre    => sub {
286            my $r = MT->request;
287            my $oc = $r->cache('object_cache', {});
288        },
289        result => sub {
290            my ( $som ) = @_;
291            my $result = $som->result;
292            MT::Entry->driver->Disabled(1);
293            my $entry = MT::Entry->load(3);
294            MT::Entry->driver->Disabled(0);
295            my $cat1 = MT::Category->load(1);
296            my $cats = $entry->categories;
297            is(scalar @$cats, 2);
298            is($entry->category->label, $cat1->label);
299        },
300    },
301    {
302        api    => 'mt.setPostCategories',
303        params => [ 3, $username, $password, [
304            { categoryId => 1, isPrimary => 0 },
305            { categoryId => 2, isPrimary => 1 },
306        ] ],
307        pre    => sub {
308            my $r = MT->request;
309            my $oc = $r->cache('object_cache', {});
310        },
311        result => sub {
312            my ( $som ) = @_;
313            my $result = $som->result;
314            MT::Entry->driver->Disabled(1);
315            my $entry = MT::Entry->load(3);
316            MT::Entry->driver->Disabled(0);
317            my $cat2 = MT::Category->load(2);
318            my $cats = $entry->categories;
319            is(scalar @$cats, 2);
320            is($entry->category->label, $cat2->label);
321        },
322    },
323    {
324        api    => 'mt.setPostCategories',
325        params => [ 3, $username, $password, [
326        ] ],
327        pre    => sub {
328            my $r = MT->request;
329            my $oc = $r->cache('object_cache', {});
330        },
331        result => sub {
332            my ( $som ) = @_;
333            my $result = $som->result;
334            MT::Entry->driver->Disabled(1);
335            my $entry = MT::Entry->load(3);
336            MT::Entry->driver->Disabled(0);
337            my $cats = $entry->categories;
338            is(scalar @$cats, 0);
339            ok(!$entry->category);
340        },
341    },
342    {
343        api    => 'blogger.newPost',
344        params => [ '', 1, $username, $password, 'This is a new post.', 0 ],
345        result => sub {
346            my ( $som ) = @_;
347            my $result = $som->result;
348            my $entry = MT::Entry->load($result);
349            ok($entry);
350            is($entry->text, 'This is a new post.');
351            # RELEASE unless NoPublishMeansDraft
352            is($entry->status, MT::Entry::RELEASE());
353        },
354    },
355    {
356        api    => 'metaWeblog.newPost',
357        params => [ 1, $username, $password, {
358            title => 'MetaWeblog Post',
359            description => 'This is a new post via metaWeblog API.'
360        }, 1 ],
361        result => sub {
362            my ( $som ) = @_;
363            my $result = $som->result;
364            my $entry = MT::Entry->load($result);
365            $new_entry_id = $entry->id;
366            ok($entry);
367            is($entry->title, 'MetaWeblog Post');
368            is($entry->text, 'This is a new post via metaWeblog API.');
369            # RELEASE unless NoPublishMeansDraft
370            is($entry->status, MT::Entry::RELEASE());
371        },
372    },
373    {
374        api    => 'blogger.deletePost',
375        params => [ '', sub { $new_entry_id }, $username, $password, 0 ],
376        pre    => sub {
377            my ( $e1 ) = MT::Entry->load(undef,
378                { sort => 'created_on', direction => 'descend', limit => 1 }
379            );
380            is( $e1->id, $new_entry_id );
381            return $e1;
382        },
383        result => sub {
384            my ( $som, $data ) = @_;
385            my $result = $som->result;
386            MT::Entry->driver->Disabled(1);
387            my $entry = MT::Entry->load($data->id);
388            is( $entry, undef );
389            MT::Entry->driver->Disabled(0);
390        },
391    },
392    {
393        api    => 'metaWeblog.getPost',
394        params => [ 24, $username, $password ],
395        pre    => sub {
396            my ( $e2 ) = MT::Entry->load(undef,
397                { sort => 'created_on', direction => 'descend', limit => 1 }
398            );
399            is( $e2->id, 24 );
400            return $e2;
401        },
402        result => sub {
403            my ( $som ) = @_;
404            my $result = $som->result;
405            my $entry = MT::Entry->load(24);
406            ok($entry);
407            is($entry->permalink, $result->{permaLink});
408            is($entry->basename, $result->{mt_basename});
409            is($entry->text, $result->{description});
410        },
411    },
412    {
413        api    => 'metaWeblog.deletePost',
414        params => [ '', 24, $username, $password, 0 ],
415        pre    => sub {
416            my ( $e2 ) = MT::Entry->load(undef,
417                { sort => 'created_on', direction => 'descend', limit => 1 }
418            );
419            is( $e2->id, 24 );
420            return $e2;
421        },
422        result => sub {
423            my ( $som, $data ) = @_;
424            my $result = $som->result;
425            MT::Entry->driver->Disabled(1);
426            my $entry = MT::Entry->load($data->id);
427            is( $entry, undef );
428            MT::Entry->driver->Disabled(0);
429        },
430    },
431    {
432        api    => 'metaWeblog.newMediaObject',
433        params => [ 1, $username, $password, {
434            name => 'movable-type-logo.gif',
435            type => 'image/gif',
436            bits  => sub {
437                return MIME::Base64::decode_base64($logo);
438            },
439        } ],
440        result => sub {
441            my ( $som ) = @_;
442            my $result = $som->result;
443            my $url = $result->{url};
444            is( $url, 'http://narnia.na/nana/movable-type-logo.gif' );
445            my $asset = MT::Asset::Image->load(undef, { sort => 'created_on', direction => 'descend', limit => 1 });
446            ok($asset, 'asset loaded');
447            is( $asset->mime_type, 'image/gif' );
448            is( $asset->file_name, 'movable-type-logo.gif' );
449            local $/;
450            open my $fh, '<', $asset->file_path;
451            my $image = <$fh>;
452            close $fh;
453            require MIME::Base64;
454            is( $logo, MIME::Base64::encode_base64($image, '') );
455        },
456        post   => sub {
457            my $asset = MT::Asset->load(undef, { sort => 'created_on', direction => 'descend', limit => 1 });
458            $asset->remove();
459        }
460    },
461    {
462        api    => 'metaWeblog.getCategories',
463        params => [ 1, $username, $password ],
464        result => sub {
465            my ( $som ) = @_;
466            my $result = $som->result;
467            my @cats = MT::Category->load({blog_id=>1});
468            for ( my $i = 0; $i <= $#cats; ++$i ) {
469                is($cats[$i]->id, $result->[$i]->{categoryId});
470                is($cats[$i]->label, $result->[$i]->{categoryName});
471                is($cats[$i]->description, $result->[$i]->{description});
472                if ( my $parent = $cats[$i]->parent_category ) {
473                    is($parent->id, $result->[$i]->{parentId});
474                }
475                else {
476                    ok(!($result->[$i]->{parentId}));
477                }
478            }
479            is(scalar(@$result), scalar(@cats));
480        },
481    },
482    {
483        api    => 'mt.getTrackbackPings',
484        params => [ 1, $username, $password ],
485        result => sub {
486            my ( $som ) = @_;
487            my $result = $som->result;
488            my @pings = MT::TBPing->load( undef, {
489                'join' => MT::Trackback->join_on( undef, {
490                    id => \'= tbping_tb_id',
491                }, {
492                    'join' => MT::Entry->join_on( undef, {
493                        id => \'= trackback_entry_id',
494                        class => 'entry',
495                    }
496                ) }
497            ) } );
498            for ( my $i = 0; $i <= $#pings; ++$i ) {
499                is($pings[$i]->ip, $result->[$i]->{pingIP});
500                is($pings[$i]->source_url, $result->[$i]->{pingURL});
501                is($pings[$i]->title, $result->[$i]->{pingTitle});
502            }
503            is(scalar(@$result), scalar(@pings));
504        },
505    },
506    {
507        api    => 'mt.supportedTextFilters',
508        params => [ $username, $password ],
509        result => sub {
510            my ( $som ) = @_;
511            my $result = $som->result;
512            my %tf = (
513                '__default__' => 1,
514                'richtext' => 1,
515                'markdown' => 1,
516                'markdown_with_smartypants' => 1,
517                'textile_2' => 1,
518                '__sanitize__' => 1,
519            );
520            foreach my $res ( @$result ) {
521                is(1, delete( $tf{$res->{key}} ), $res->{key});
522            }
523            ok(!%tf);
524        },
525    },
526    {
527        api    => 'mt.getTagList',
528        params => [ 1, $username, $password ],
529        result => sub {
530            my ( $som ) = @_;
531            my $result = $som->result;
532            my @tags = MT::Tag->load(undef, {
533                'join' => MT::ObjectTag->join_on(undef, {
534                    tag_id => \'= tag_id',
535                    blog_id => 1
536                }, { unique => 1 })
537            });
538            for ( my $i = 0; $i <= $#tags; ++$i ) {
539                is($tags[$i]->id, $result->[$i]->{tagId});
540                is($tags[$i]->name, $result->[$i]->{tagName});
541            }
542            is(scalar(@$result), scalar(@tags));
543        },
544    },
545    #TODO Add these tests
546    #'wp.newPage', 'wp.getPages', 'wp.getPage', 'wp.editPage', 'wp.deletePage',
547    # 'mt.publishPost',
548    # newPost with mt_tags
549);
550
551my $uri = new URI();
552$uri->path($base_uri);
553my $req = new HTTP::Request(POST => $uri);
554
555foreach my $api ( @apis ) {
556
557    my $data = {};
558    $data = $api->{pre}->() if exists $api->{pre};
559    my @params;
560    foreach my $param ( @{ $api->{params} } ) {
561        if ( 'CODE' eq ref($param) ) {
562            push @params, $param->();
563        }
564        elsif ( 'HASH' eq ref($param) ) {
565            my $hash = {};
566            while ( my ( $key, $val ) = each %$param ) {
567                if ( 'CODE' eq ref($val) ) {
568                    $hash->{$key} = $val->();
569                }
570                else {
571                    $hash->{$key} = $val;
572                }
573            }
574            push @params, $hash;
575        }
576        else {
577            push @params, $param;
578        }
579    }
580    $req->content($ser->method($api->{api}, @params));
581
582    my $resp = $ua->request($req);
583#    print STDERR $resp->content;
584    my $som = $deser->deserialize($resp->content());
585    $api->{result}->($som, $data);
586    $api->{post}->() if exists $api->{post};
587}
588
5891;
590__END__
Note: See TracBrowser for help on using the browser.