root/branches/release-41/t/28-xmlrpc.t @ 2710

Revision 2710, 21.3 kB (checked in by bchoate, 17 months ago)

Eliminated entry id constant.

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