use strict; use warnings; #use Data::Dumper; $Data::Dumper::Indent = 1; use Test::More; plan skip_all => 'set ATOMPUB_TEST_LIVE to enable this test' unless $ENV{ATOMPUB_TEST_LIVE}; plan tests => 84; use Atompub; use Atompub::Client; use Atompub::DateTime qw(datetime); use HTTP::Status; use URI::Escape; #my $SERVICE = 'http://teahut.sakura.ne.jp:3000/service'; my $SERVICE = 'http://localhost:3000/service'; my $USER = 'foo'; my $PASS = 'foo'; my $client = Atompub::Client->new; isa_ok $client, 'Atompub::Client'; $client->username($USER); $client->password($PASS); if (my $proxy = $ENV{HTTP_PROXY} || $ENV{http_proxy}) { diag "using HTTP proxy: $proxy"; $client->proxy( $proxy ) if $proxy; } # Service ok !$client->getService('http://example.com/service'); # Not Found like $client->errstr, qr/not found/i; isa_ok $client->req, 'HTTP::Request'; isa_ok $client->res, 'HTTP::Response'; ok !$client->rc; is $client->res->code, RC_NOT_FOUND; ok $client->getService($SERVICE); isa_ok $client->req, 'HTTP::Request'; isa_ok $client->res, 'HTTP::Response'; isa_ok $client->rc, 'XML::Atom::Service'; ok $client->res->is_success; my $serv = $client->rc; my($entry_coll, $media_coll) = $serv->workspace->collections; isa_ok $client->info->get($entry_coll->href), 'XML::Atom::Collection'; isa_ok $client->info->get($media_coll->href), 'XML::Atom::Collection'; # Create Entry Resource my $entry = XML::Atom::Entry->new; $entry->title('Entry 1'); $entry->updated(datetime->w3c); $entry->id('tag:teahut.sakura.ne.jp,2007:1'); $entry->content('This is the 1st entry'); my $category = XML::Atom::Category->new; # Forbidden category $category->term('animal'); $category->scheme('http://example.com/dogs/big3'); $entry->category( $category ); ok !$client->createEntry($entry_coll->href, $entry, 'Entry 1'); like $client->errstr, qr/forbidden category/i; ok !$client->req; ok !$client->res; ok !$client->rc; $category = XML::Atom::Category->new; $category->term('animal'); $category->scheme('http://example.com/cats/big3'); $entry->category($category); ok $client->createEntry($entry_coll->href, $entry, 'Entry 1'); isa_ok $client->req, 'HTTP::Request'; isa_ok $client->res, 'HTTP::Response'; isa_ok $client->rc, 'XML::Atom::Entry'; is $client->req->slug, 'Entry 1'; is $client->res->code, RC_CREATED; ok my $uri = $client->res->location; $entry = $client->rc; is $entry->title, 'Entry 1'; isa_ok $client->cache->get($uri), 'Atompub::Client::Cache::Resource'; # List Entry Resources (Get Feed) ok $client->getFeed($entry_coll->href); isa_ok $client->req, 'HTTP::Request'; isa_ok $client->res, 'HTTP::Response'; isa_ok $client->rc, 'XML::Atom::Feed'; ok $client->res->is_success; # Get Entry Resource ok $client->getEntry($uri); isa_ok $client->req, 'HTTP::Request'; isa_ok $client->res, 'HTTP::Response'; isa_ok $client->rc, 'XML::Atom::Entry'; is $client->res->code, RC_NOT_MODIFIED; $entry = $client->rc; is $entry->title, 'Entry 1'; isa_ok $client->cache->get($uri), 'Atompub::Client::Cache::Resource'; # Update Entry Resource $entry->title('Entry 2'); ok $client->updateEntry($uri, $entry); isa_ok $client->req, 'HTTP::Request'; isa_ok $client->res, 'HTTP::Response'; isa_ok $client->rc, 'XML::Atom::Entry'; ok $client->res->is_success; $entry = $client->rc; is $entry->title, 'Entry 2'; isa_ok $client->cache->get($uri), 'Atompub::Client::Cache::Resource'; # Delete Entry Resource ok $client->deleteEntry($uri); isa_ok $client->req, 'HTTP::Request'; isa_ok $client->res, 'HTTP::Response'; ok !$client->rc; ok $client->res->is_success; # Create Media Resource # Unsupported media type ok !$client->createMedia($media_coll->href, 't/samples/media1.gif', 'text/plain', 'Media 1'); like $client->errstr, qr/unsupported media type/i; ok !$client->req; ok !$client->res; ok !$client->rc; ok $client->createMedia($media_coll->href, 't/samples/media1.gif', 'image/gif', 'Media 1'); isa_ok $client->req, 'HTTP::Request'; isa_ok $client->res, 'HTTP::Response'; isa_ok $client->rc, 'XML::Atom::Entry'; is $client->req->slug, 'Media 1'; is $client->res->code, RC_CREATED; ok $uri = $client->res->location; isa_ok $client->cache->get($uri), 'Atompub::Client::Cache::Resource'; # Get Media Resource ($uri) = map { $_->href } grep { $_->rel eq 'edit-media' } $client->rc->link; ok $client->getMedia($uri); isa_ok $client->req, 'HTTP::Request'; isa_ok $client->res, 'HTTP::Response'; ok $client->rc; ok $client->res->is_success; is $client->res->content_type, 'image/gif'; isa_ok $client->cache->get($uri), 'Atompub::Client::Cache::Resource'; # Update Media Resource ok $client->updateMedia($uri, 't/samples/media2.gif', 'image/gif'); isa_ok $client->req, 'HTTP::Request'; isa_ok $client->res, 'HTTP::Response'; ok $client->rc; ok $client->res->is_success; is $client->res->content_type, 'image/gif'; isa_ok $client->cache->get($uri), 'Atompub::Client::Cache::Resource'; # Delete Media Resource ok $client->deleteMedia($uri); isa_ok $client->req, 'HTTP::Request'; isa_ok $client->res, 'HTTP::Response'; ok !$client->rc; ok $client->res->is_success;