root/branches/release-39/t/28-xmlrpc.t @ 2480

Revision 2480, 17.3 kB (checked in by fumiakiy, 18 months ago)

Added more xmlrpc tests.

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