Index: /branches/release-39/t/28-xmlrpc.t
===================================================================
--- /branches/release-39/t/28-xmlrpc.t (revision 1100)
+++ /branches/release-39/t/28-xmlrpc.t (revision 2465)
@@ -1,235 +1,335 @@
-# $Id$
-
-BEGIN { unshift @INC, 't/' }
-
-use lib 't/lib';
-use lib 'lib';
-use lib 'extlib';
-
-use Test;
+use strict;
+use lib 't/lib', 'extlib', 'lib', '../lib', '../extlib';
+
+BEGIN {
+    $ENV{MT_HOME} = './';
+};
+
+use MT;
+
+use Test::More qw( no_plan );
+
+# To keep away from being under FastCGI
+$ENV{HTTP_HOST} = 'localhost';
+
+use vars qw( $DB_DIR $T_CFG );
+my $mt = MT->new( Config => $T_CFG ) or die MT->errstr;
+isa_ok($mt, 'MT');
+
+use MT::Test qw(:db :data);
+
+my $base_uri = '/mt-xmlrpc.cgi';
+my $username = 'Chuck D';
+my $password = 'seecret';
+
 use XMLRPC::Lite;
-use MT;
-use MT::Blog;
-use MT::Author;
-use MT::Entry;
-use MT::Util qw( format_ts );
-use strict;
-
-BEGIN { plan tests => 85 }
-
-for (my $i = 0; $i < 85; $i++)
-{
-    skip(1);
+my $ser   = XMLRPC::Serializer->new();
+my $deser = XMLRPC::Deserializer->new();
+
+require LWP::UserAgent::Local;
+my $ua = new LWP::UserAgent::Local({ ScriptAlias => '/' });
+
+my @apis = (
+    {
+        api    =>'blogger.getUsersBlogs',
+        params => [ '', $username, $password ],
+        result => sub {
+            my ( $som ) = @_;
+            my $result = $som->result;
+            is( $result->[0]->{url}, 'http://narnia.na/nana/', 'url is correct' );
+            is( $result->[0]->{blogid}, 1, 'blogid is correct' );
+            is( $result->[0]->{blogName}, 'none', 'blogName is correct' );
+        }
+    },
+    {
+        api    => 'blogger.getUserInfo',
+        params => [ '', $username, $password ],
+        result => sub {
+            my ( $som ) = @_;
+            my $result = $som->result;
+            my $author = MT::Author->load({ name => 'Chuck D' });
+            is( $result->{userid}, $author->id);
+            is( $result->{firstname}, (split /\s+/, $author->name)[0]);
+            is( $result->{lastname}, (split /\s+/, $author->name)[1]);
+            is( $result->{nickname}, $author->nickname || '');
+            is( $result->{email}, $author->email || '');
+            is( $result->{url}, $author->url || '');
+        }
+    },
+    {
+        api    => 'blogger.getUsersBlogs',
+        params => [ '', 'Chuck D', 'wrong' ],
+        result => sub {
+            my ( $som ) = @_;
+            ok(!$som->result);
+            ok($som->fault);
+            is($som->faultstring, 'Invalid login');
+            is($som->faultcode, 1);
+        }
+    },
+    {
+        api    => 'blogger.getUserInfo',
+        params => [ '', 'Chuck D', 'wrong' ],
+        result => sub {
+            my ( $som ) = @_;
+            ok(!$som->result);
+            ok($som->fault);
+            is($som->faultstring, 'Invalid login');
+            is($som->faultcode, 1);
+        }
+    },
+    {
+        api    => 'blogger.getRecentPosts',
+        params => [ '', 1, $username, $password, 2 ],
+        result => sub {
+            my ( $som ) = @_;
+            my $result = $som->result;
+            is(scalar(@$result), 2);
+            my $entry  = MT::Entry->load(3);
+            my $author = MT::Author->load({ name => 'Chuck D' });
+            is($result->[0]->{userid}, $author->id);
+            is($result->[0]->{postid}, $entry->id);
+            my $ao = sprintf "%04d%02d%02dT%02d:%02d:%02d",
+                unpack 'A4A2A2A2A2A2', $entry->authored_on;
+            is($result->[0]->{dateCreated}, $ao);
+            is($result->[0]->{content}, $entry->text);
+            $entry  = MT::Entry->load(2);
+            $author = MT::Author->load({ name => 'Bob D' });
+            is($result->[1]->{userid}, $author->id);
+            is($result->[1]->{postid}, $entry->id);
+            my $ao = sprintf "%04d%02d%02dT%02d:%02d:%02d",
+                unpack 'A4A2A2A2A2A2', $entry->authored_on;
+            is($result->[1]->{dateCreated}, $ao);
+            is($result->[1]->{content}, $entry->text);
+        },
+    },
+    {
+        api    => 'metaWeblog.getRecentPosts',
+        params => [ 1, $username, $password, 2 ],
+        result => sub {
+            my ( $som ) = @_;
+            my $result = $som->result;
+            is(scalar(@$result), 2);
+            my $author = MT::Author->load({ name => 'Chuck D' });
+            my $entry  = MT::Entry->load(3);
+            is($result->[0]->{userid}, $author->id);
+            is($result->[0]->{postid}, $entry->id);
+            my $ao = sprintf "%04d%02d%02dT%02d:%02d:%02d",
+                unpack 'A4A2A2A2A2A2', $entry->authored_on;
+            is($result->[0]->{dateCreated}, $ao);
+            is($result->[0]->{description}, $entry->text);
+            is($result->[0]->{title}, $entry->title);
+            is($result->[0]->{link}, $entry->permalink);
+            is($result->[0]->{permaLink}, $entry->permalink);
+            is($result->[0]->{mt_excerpt},
+                defined $entry->excerpt ? $entry->excerpt : '' );
+            is($result->[0]->{mt_text_more}, $entry->text_more);
+            is($result->[0]->{mt_allow_comments}, $entry->allow_comments);
+            is($result->[0]->{mt_allow_pings}, 0);
+            is($result->[0]->{mt_convert_breaks}, $entry->convert_breaks || '');
+            is($result->[0]->{mt_keywords}, '');
+            $author = MT::Author->load({ name => 'Bob D' });
+            $entry  = MT::Entry->load(2);
+            is($result->[1]->{userid}, $author->id);
+            is($result->[1]->{postid}, $entry->id);
+            $ao = sprintf "%04d%02d%02dT%02d:%02d:%02d",
+                unpack 'A4A2A2A2A2A2', $entry->authored_on;
+            is($result->[1]->{dateCreated}, $ao);
+            is($result->[1]->{description}, $entry->text);
+            is($result->[1]->{title}, $entry->title);
+            is($result->[1]->{link}, $entry->permalink);
+            is($result->[1]->{permaLink}, $entry->permalink);
+            is($result->[1]->{mt_excerpt},
+                defined $entry->excerpt ? $entry->excerpt : '' );
+            is($result->[1]->{mt_text_more}, $entry->text_more);
+            is($result->[1]->{mt_allow_comments}, $entry->allow_comments);
+            is($result->[1]->{mt_allow_pings}, $entry->allow_pings || '');
+            is($result->[1]->{mt_convert_breaks}, $entry->convert_breaks || '');
+            is($result->[1]->{mt_keywords}, $entry->keywords || '');
+        },
+    },
+    {
+        api    => 'blogger.editPost',
+        params => [ '', 3, $username, $password, 'Foo Bar', 0 ],
+        result => sub {
+            my ( $som ) = @_;
+            my $result = $som->result;
+            MT::Entry->driver->Disabled(1);
+            my $entry = MT::Entry->load(3);
+            MT::Entry->driver->Disabled(0);
+            is($entry->text, 'Foo Bar');
+        },
+    },
+    {
+        api    => 'metaWeblog.editPost',
+        params => [ 3, $username, $password, {
+            title => 'Title',
+            description => 'Description',
+            mt_convert_breaks => 'wiki',
+            mt_allow_comments => 1,
+            mt_allow_pings => 1,
+            mt_excerpt => 'Excerpt',
+            mt_text_more => 'Extended Entry',
+            mt_keywords => 'Keywords',
+            mt_tb_ping_urls => [ 'http://127.0.0.1/' ],
+            dateCreated => '19770922T15:30:00',
+        }, 0 ],
+        result => sub {
+            my ( $som ) = @_;
+            my $result = $som->result;
+            MT::Entry->driver->Disabled(1);
+            my $entry = MT::Entry->load(3);
+            MT::Entry->driver->Disabled(0);
+            is($entry->title, 'Title');
+            is($entry->text, 'Description');
+            is($entry->convert_breaks, 'wiki');
+            is($entry->allow_comments, 1);
+            is($entry->allow_pings, 1);
+            is($entry->excerpt, 'Excerpt');
+            is($entry->text_more, 'Extended Entry');
+            is($entry->keywords, 'Keywords');
+            is($entry->to_ping_urls, 'http://127.0.0.1/');
+            is($entry->to_ping_url_list->[0], 'http://127.0.0.1/');
+            is($entry->authored_on, '19770922153000');
+        },
+    },
+    {
+        api    => 'metaWeblog.editPost',
+        params => [ 3, $username, $password, {
+            mt_convert_breaks => '',
+            mt_allow_comments => 2,
+            mt_excerpt => '',
+            mt_text_more => '',
+        }, 0 ],
+        result => sub {
+            my ( $som ) = @_;
+            my $result = $som->result;
+        },
+    },
+    {
+        api    => 'mt.getCategoryList',
+        params => [ 1, $username, $password ],
+        result => sub {
+            my ( $som ) = @_;
+            my $result = $som->result;
+            my $cat1 = MT::Category->load(1);
+            my $cat2 = MT::Category->load(2);
+            is($result->[0]->{categoryId}, $cat1->id);
+            is($result->[0]->{categoryName}, $cat1->label);
+            is($result->[1]->{categoryId}, $cat2->id);
+            is($result->[1]->{categoryName}, $cat2->label);
+        },
+    },
+    {
+        api    => 'mt.getPostCategories',
+        params => [ 3, $username, $password ],
+        result => sub {
+            my ( $som ) = @_;
+            my $result = $som->result;
+            is(scalar @{ $som->result }, 0);
+        },
+    },
+    {
+        api    => 'mt.setPostCategories',
+        params => [ 3, $username, $password, [
+            { categoryId => 1 } ]
+        ],
+        result => sub {
+            my ( $som ) = @_;
+            my $result = $som->result;
+            MT::Entry->driver->Disabled(1);
+            my $entry = MT::Entry->load(3);
+            MT::Entry->driver->Disabled(0);
+            my $cat1 = MT::Category->load(1);
+            my $cats = $entry->categories;
+            is(scalar @$cats, 1);
+            is($cats->[0]->label, $cat1->label);
+            is($entry->category->label, $cat1->label);
+        },
+    },
+    {
+        api    => 'mt.setPostCategories',
+        params => [ 3, $username, $password, [
+            { categoryId => 1, isPrimary => 1 },
+            { categoryId => 2, isPrimary => 0 },
+        ] ],
+        pre    => sub {
+            my $r = MT->request;
+            my $oc = $r->cache('object_cache', {});
+        },
+        result => sub {
+            my ( $som ) = @_;
+            my $result = $som->result;
+            MT::Entry->driver->Disabled(1);
+            my $entry = MT::Entry->load(3);
+            MT::Entry->driver->Disabled(0);
+            my $cat1 = MT::Category->load(1);
+            my $cats = $entry->categories;
+            is(scalar @$cats, 2);
+            is($entry->category->label, $cat1->label);
+        },
+    },
+    {
+        api    => 'mt.setPostCategories',
+        params => [ 3, $username, $password, [
+            { categoryId => 1, isPrimary => 0 },
+            { categoryId => 2, isPrimary => 1 },
+        ] ],
+        pre    => sub {
+            my $r = MT->request;
+            my $oc = $r->cache('object_cache', {});
+        },
+        result => sub {
+            my ( $som ) = @_;
+            my $result = $som->result;
+            MT::Entry->driver->Disabled(1);
+            my $entry = MT::Entry->load(3);
+            MT::Entry->driver->Disabled(0);
+            my $cat2 = MT::Category->load(2);
+            my $cats = $entry->categories;
+            is(scalar @$cats, 2);
+            is($entry->category->label, $cat2->label);
+        },
+    },
+    {
+        api    => 'mt.setPostCategories',
+        params => [ 3, $username, $password, [
+        ] ],
+        pre    => sub {
+            my $r = MT->request;
+            my $oc = $r->cache('object_cache', {});
+        },
+        result => sub {
+            my ( $som ) = @_;
+            my $result = $som->result;
+            MT::Entry->driver->Disabled(1);
+            my $entry = MT::Entry->load(3);
+            MT::Entry->driver->Disabled(0);
+            my $cats = $entry->categories;
+            is(scalar @$cats, 0);
+            ok(!$entry->category);
+        },
+    },
+    #TODO Add more XML-RPC API
+);
+
+my $uri = new URI();
+$uri->path($base_uri);
+my $req = new HTTP::Request(POST => $uri);
+
+foreach my $api ( @apis ) {
+
+    my $data = {};
+    $data = $api->{pre}->() if exists $api->{pre};
+
+    $req->content($ser->method($api->{api}, @{ $api->{params} }));
+
+    my $resp = $ua->request($req);
+#    print STDERR $resp->content;
+    my $som = $deser->deserialize($resp->content());
+    $api->{result}->($som, $data);
 }
-exit(0);
-
-use vars qw( $DB_DIR $T_CFG $BASE );
-require 'test-common.pl';
-my $mt = MT->new( Config => $T_CFG ) or die MT->errstr;
-
-my $script = "$BASE/t/mt-test-rpc.cgi";
-
-open my $fh, ">$script" or die $!;
-print $fh <<SCRIPT;
-#!/usr/bin/perl -w
-use strict;
-
-use XMLRPC::Transport::HTTP;
-use File::Spec;
-
-use lib File::Spec->catdir('$BASE', 'lib');
-
-use MT::XMLRPCServer;
-
-\$MT::XMLRPCServer::MT_DIR = File::Spec->catfile('$BASE', 't');
-
-local \$SIG{__WARN__} = sub { };
-my \$server = XMLRPC::Transport::HTTP::CGI->new;
-\$server->dispatch_to('blogger', 'metaWeblog', 'mt');
-\$server->handle;
-SCRIPT
-close $fh;
-chmod 0755, $script;
-
-# TODO: get this script 'running'
-
-my $rpc = XMLRPC::Lite->new;
-$rpc->proxy("http://localhost/mt-test-rpc.cgi");
-
-my $som;
-
-my $blog = MT::Blog->load(1);
-
-$som = $rpc->call('blogger.getUsersBlogs', '', 'Chuck D', 'bass');
-ok($som && $som->result);
-ok(scalar @{ $som->result }, 1);
-ok($som->result->[0]{url}, $blog->site_url);
-ok($som->result->[0]{blogid}, $blog->id);
-ok($som->result->[0]{blogName}, $blog->name);
-
-my $author = MT::Author->load({ name => 'Chuck D' });
-
-$som = $rpc->call('blogger.getUserInfo', '', 'Chuck D', 'bass');
-ok($som && $som->result);
-ok($som->result->{userid}, $author->id);
-ok($som->result->{firstname}, (split /\s+/, $author->name)[0]);
-ok($som->result->{lastname}, (split /\s+/, $author->name)[1]);
-ok($som->result->{nickname}, $author->nickname || '');
-ok($som->result->{email}, $author->email || '');
-ok($som->result->{url}, $author->url || '');
-
-$som = $rpc->call('blogger.getUserInfo', '', 'Chuck D', 'wrong');
-ok(!$som->result);
-ok($som->fault);
-ok($som->faultstring, 'Invalid login');
-ok($som->faultcode, 1);
-
-$som = $rpc->call('blogger.getUsersBlogs', '', 'Chuck D', 'wrong');
-ok(!$som->result);
-ok($som->fault);
-ok($som->faultstring, 'Invalid login');
-ok($som->faultcode, 1);
-
-my $entry1 = MT::Entry->load(1);
-ok($entry1);
-
-$som = $rpc->call('blogger.getRecentPosts', '', $blog->id, 'Chuck D', 'bass', 2);
-ok($som && $som->result);
-ok(scalar @{ $som->result }, 1);
-ok($som->result->[0]{userid}, $author->id);
-ok($som->result->[0]{postid}, $entry1->id);
-ok($som->result->[0]{dateCreated}, format_ts("%Y%m%dT%H:%M:%S", $entry1->created_on));
-ok($som->result->[0]{content}, $entry1->text);
-
-$som = $rpc->call('metaWeblog.getRecentPosts', $blog->id, 'Chuck D', 'bass', 2);
-ok($som && $som->result);
-ok(scalar @{ $som->result }, 1);
-ok($som->result->[0]{userid}, $author->id);
-ok($som->result->[0]{postid}, $entry1->id);
-ok($som->result->[0]{dateCreated}, format_ts("%Y%m%dT%H:%M:%S", $entry1->created_on));
-ok($som->result->[0]{description}, $entry1->text);
-ok($som->result->[0]{title}, $entry1->title);
-ok($som->result->[0]{link}, $entry1->permalink);
-ok($som->result->[0]{permaLink}, $entry1->permalink);
-ok($som->result->[0]{mt_excerpt}, $entry1->excerpt);
-ok($som->result->[0]{mt_text_more}, $entry1->text_more);
-ok($som->result->[0]{mt_allow_comments}, $entry1->allow_comments);
-ok($som->result->[0]{mt_allow_pings}, $entry1->allow_pings || 0);
-ok($som->result->[0]{mt_convert_breaks}, $entry1->convert_breaks || '');
-ok($som->result->[0]{mt_keywords}, $entry1->keywords || '');
-
-$som = $rpc->call('blogger.editPost', '', $entry1->id, 'Chuck D', 'bass', 'Foo Bar', 0);
-ok($som->result, 1);
-$entry1 = MT::Entry->load($entry1->id);
-ok($entry1->text, 'Foo Bar');
-
-$som = $rpc->call('metaWeblog.editPost', $entry1->id, 'Chuck D', 'bass', {
-    title => 'Title',
-    description => 'Description',
-    mt_convert_breaks => 'wiki',
-    mt_allow_comments => 1,
-    mt_allow_pings => 1,
-    mt_excerpt => 'Excerpt',
-    mt_text_more => 'Extended Entry',
-    mt_keywords => 'Keywords',
-    mt_tb_ping_urls => [ 'http://127.0.0.1/' ],
-    dateCreated => '19770922T15:30:00',
-}, 0);
-ok($som->result, 1);
-$entry1 = MT::Entry->load($entry1->id);
-ok($entry1->title, 'Title');
-ok($entry1->text, 'Description');
-ok($entry1->convert_breaks, 'wiki');
-ok($entry1->allow_comments, 1);
-ok($entry1->allow_pings, 1);
-ok($entry1->excerpt, 'Excerpt');
-ok($entry1->text_more, 'Extended Entry');
-ok($entry1->keywords, 'Keywords');
-ok($entry1->to_ping_urls, 'http://127.0.0.1/');
-ok($entry1->to_ping_url_list->[0], 'http://127.0.0.1/');
-ok($entry1->created_on, '19770922153000');
-
-$som = $rpc->call('metaWeblog.editPost', $entry1->id, 'Chuck D', 'bass', {
-    mt_allow_comments => 2,
-}, 0);
-ok($som->result, 1);
-
-$som = $rpc->call('metaWeblog.editPost', $entry1->id, 'Chuck D', 'bass', {
-    mt_convert_breaks => '',
-    mt_text_more => '',
-    mt_excerpt => '',
-}, 0);
-ok($som->result, 1);
-$entry1 = MT::Entry->load($entry1->id);
-ok($entry1->convert_breaks, '');
-ok($entry1->text_more, '');
-ok($entry1->excerpt, '');
-
-my $cat1 = MT::Category->load(1);
-my $cat2 = MT::Category->load(2);
-
-$som = $rpc->call('mt.getCategoryList', $blog->id, 'Chuck D', 'bass');
-ok($som && $som->result);
-ok(scalar @{ $som->result }, 2);
-ok($som->result->[0]{categoryId}, $cat1->id);
-ok($som->result->[0]{categoryName}, $cat1->label);
-ok($som->result->[1]{categoryId}, $cat2->id);
-ok($som->result->[1]{categoryName}, $cat2->label);
-
-$som = $rpc->call('mt.getPostCategories', $entry1->id, 'Chuck D', 'bass');
-ok($som && $som->result);
-ok(!scalar @{ $som->result });
-
-$mt->{cfg}->NoPlacementCache(1);
-
-$entry1->{__categories} = undef;
-$entry1->{__category} = undef;
-$som = $rpc->call('mt.setPostCategories', $entry1->id, 'Chuck D', 'bass', [
-    { categoryId => $cat1->id },
-]);
-ok($som->result, 1);
-my $cats = $entry1->categories;
-ok(scalar @$cats, 1);
-ok($cats->[0]->label, $cat1->label);
-ok($entry1->category->label, $cat1->label);
-
-$entry1->{__categories} = undef;
-$entry1->{__category} = undef;
-$som = $rpc->call('mt.setPostCategories', $entry1->id, 'Chuck D', 'bass', [
-    { categoryId => $cat1->id },
-    { categoryId => $cat2->id },
-]);
-ok($som->result, 1);
-$cats = $entry1->categories;
-ok(scalar @$cats, 2);
-ok($entry1->category->label, $cat1->label);
-
-$entry1->{__categories} = undef;
-$entry1->{__category} = undef;
-$som = $rpc->call('mt.setPostCategories', $entry1->id, 'Chuck D', 'bass', [
-    { categoryId => $cat1->id, isPrimary => 1 },
-    { categoryId => $cat2->id, isPrimary => 0 },
-]);
-ok($som->result, 1);
-$cats = $entry1->categories;
-ok(scalar @$cats, 2);
-ok($entry1->category->label, $cat1->label);
-
-$entry1->{__categories} = undef;
-$entry1->{__category} = undef;
-$som = $rpc->call('mt.setPostCategories', $entry1->id, 'Chuck D', 'bass', [
-    { categoryId => $cat1->id, isPrimary => 0 },
-    { categoryId => $cat2->id, isPrimary => 1 },
-]);
-ok($som->result, 1);
-$cats = $entry1->categories;
-ok(scalar @$cats, 2);
-ok($entry1->category->label, $cat2->label);
-
-$entry1->{__categories} = undef;
-$entry1->{__category} = undef;
-$som = $rpc->call('mt.setPostCategories', $entry1->id, 'Chuck D', 'bass', [ ]);
-ok($som->result, 1);
-$cats = $entry1->categories;
-ok(!scalar @$cats);
-ok(!$entry1->category);
+
+1;
+
+__END__
