diff options
author | franck cuny <franck@lumberjaph.net> | 2010-06-02 11:37:19 +0200 |
---|---|---|
committer | franck cuny <franck@lumberjaph.net> | 2010-06-02 11:37:19 +0200 |
commit | f92976bd47ad9ef1c54de83876db7dcc9843aafd (patch) | |
tree | c398c0f59acbe74178b94b113270a07fa6bf5e2f | |
parent | role to handle useragent (diff) | |
download | moosex-net-api-f92976bd47ad9ef1c54de83876db7dcc9843aafd.tar.gz |
tests
-rw-r--r-- | t/01_basic.t | 102 | ||||
-rw-r--r-- | t/02_error.t | 64 | ||||
-rw-r--r-- | t/03_serialization.t | 5 | ||||
-rw-r--r-- | t/04_apimethod.t | 36 | ||||
-rw-r--r-- | t/lib/TestAPI.pm | 49 |
5 files changed, 177 insertions, 79 deletions
diff --git a/t/01_basic.t b/t/01_basic.t index e52f0e1..d21e930 100644 --- a/t/01_basic.t +++ b/t/01_basic.t @@ -1,38 +1,96 @@ use strict; use warnings; + use Test::More; use Test::Exception; + use lib ('t/lib'); -use FakeAPI; -my $obj = FakeAPI->new; -ok $obj, "... object created"; -ok $obj->meta->has_attribute('api_useragent'), - "... useragent attribute have been added"; +use TestAPI; + +ok my $api = TestAPI->new(), 'api object created'; + +for my $role (qw/UserAgent Format Authentication Serialization Request/) { + ok $api->meta->does_role('MooseX::Net::API::Role::' . $role), + 'does role ' . $role; +} + +# test fetch list of users +$api->api_useragent->add_handler( + 'request_send' => sub { + my $request = shift; + is $request->method, 'GET', 'GET request'; + my $res = HTTP::Response->new(200); + $res->content('[{"name":"eris"}]'); + $res; + } +); -ok my $method = $obj->meta->find_method_by_name('get_user'), - '... method get_user have been created'; +ok my ($content, $res) = $api->users(), 'api call success'; +is $res->code, 200, 'http code as expected'; +is_deeply $content, [{name => 'eris'}], 'got a list of users'; -ok $method->meta->has_attribute('path'), '... method bar have attribute path'; -is $method->path, '/user/$id', '... get good path value'; +# test fetch list of one user +$api->api_useragent->remove_handler('request_send'); +$api->api_useragent->add_handler( + 'request_send' => sub { + my $request = shift; + is $request->method, 'GET', 'GET request'; + is $request->uri, 'http://exemple.com/user/eris.json', + 'valid url generated'; + my $res = HTTP::Response->new(200); + $res->content('{"name":"eris"}'); + $res; + } +); -ok my @methods = $obj->meta->local_api_methods(), '... get api methods'; -is scalar @methods, 6, '... get 6 methods in our API'; +ok $content = $api->user(user_name => 'eris'), 'api call success'; +is_deeply $content, {name => 'eris'}, 'valid user content'; -ok my $users = $obj->users(), "... get users list"; -is $users->{status}, 1, "... get users"; +# test to create a user +$api->api_useragent->remove_handler('request_send'); +$api->api_useragent->add_handler( + 'request_send' => sub { + my $request = shift; + is $request->method, 'POST', 'POST request'; + is $request->content, + JSON::encode_json({name => 'eris', dob => '01/02/1900'}), + 'got valid content in POST'; + my $res = HTTP::Response->new(201); + $res->content('{"status":"ok"}'); + $res; + } +); -ok my $user = $obj->get_user( id => 1 ), "... fetch user"; -is $user->{status}, 1, "... get bruce wayne"; +($content, $res) = $api->add_user(name => 'eris', dob => '01/02/1900'); +ok $content, 'got content'; +is $res->code, 201, 'code as expected'; -ok my ($user, $http_response) = $obj->get_user(id => 1), "... fetch user"; -isa_ok $http_response, "HTTP::Response", "... got the HTTP response object"; +# test to update a user +$api->api_useragent->remove_handler('request_send'); +$api->api_useragent->add_handler( + 'request_send' => sub { + my $request = shift; + my $res = HTTP::Response->new(201); + $res->content('{"status":"ok"}'); + $res; + } +); -#dies_ok { $obj->get_user( id => 12 ) } "... can't fetch unknown user"; -#my $err = $@; -#is $err->http_code, 404, "... get 404"; +($content, $res) = $api->update_user(name => 'eris', dob => '02/01/1900'); +ok $content, 'got content after update'; +is $res->code, 201, 'code as expected'; -#my $auth_obj = FakeAPI->new(); -#my $res = $auth_obj->auth_get_user(id => 1); +# test to delete a user +$api->api_useragent->remove_handler('request_send'); +$api->api_useragent->add_handler( + 'request_send' => sub{ + my $request = shift; + my $res = HTTP::Response->new(204); + $res; + } +); +($content, $res) = $api->delete_user(name => 'eris'); +is $res->code, 204, 'code as expected'; done_testing; diff --git a/t/02_error.t b/t/02_error.t index 332538a..a97158e 100644 --- a/t/02_error.t +++ b/t/02_error.t @@ -3,65 +3,15 @@ use warnings; use Test::More; use Test::Exception; -BEGIN { - dies_ok { - { +package test::api::missing_api_base_url; +use MooseX::Net::API; - package net_api_fail; - use Moose; - use MooseX::Net::API; - net_api_declare foo => (); - } - } - "... format is missing"; - like $@, qr/format is missing in your api declaration/, - "... format is missing"; - dies_ok { - { +net_api_method user => (method => 'GET', path => '/user/'); - package net_api_fail; - use Moose; - use MooseX::Net::API; - net_api_declare foo => ( format => 'foo' ); - } - } - "... no valid format"; - like $@, qr/format is not recognised/, "... no valid format"; - dies_ok { - { +package main; - package net_api_fail; - use Moose; - use MooseX::Net::API; - net_api_declare foo => ( format => 'json' ); - } - } - "... format mode is not set"; - like $@, qr/format_mode is not set/, "... format mode is not set"; - dies_ok { - { - - package net_api_fail; - use Moose; - use MooseX::Net::API; - net_api_declare foo => ( format => 'json', format_mode => 'bar' ); - } - } - "... format mode is unvalid"; - like $@, qr/must be append or content-type/, "... format mode is unvalid"; - #dies_ok { - #{ - #package net_api_fail; - #use Moose; - #use MooseX::Net::API; - #net_api_declare foo => ( - #format => 'json', - #format_mode => 'content-type' - #); - #} - #} - #"... bad useragent"; - #warn $@; -} +ok my $t = test::api::missing_api_base_url->new; +dies_ok { $t->user } 'die with missing url'; +like $@, qr/api_base_url is missing/, 'missing api_base_url'; done_testing; diff --git a/t/03_serialization.t b/t/03_serialization.t new file mode 100644 index 0000000..333d12e --- /dev/null +++ b/t/03_serialization.t @@ -0,0 +1,5 @@ +use strict; +use warnings; +use Test::More; + +my $parser = MooseX::Net::API:: diff --git a/t/04_apimethod.t b/t/04_apimethod.t new file mode 100644 index 0000000..cac2715 --- /dev/null +++ b/t/04_apimethod.t @@ -0,0 +1,36 @@ +use strict; +use warnings; +use Test::More; +use Test::Exception; +use MooseX::Net::API::Meta::Method; + +dies_ok { + MooseX::Net::API::Meta::Method->wrap( + name => 'test_method', + package_name => 'test::api', + body => sub {1}, + ); +} +"missing some params"; + +ok my $method = MooseX::Net::API::Meta::Method->wrap( + name => 'test_method', + package_name => 'test::api', + body => sub {1}, + method => 'GET', + path => '/user/', + ), + 'method created'; + +is $method->method, 'GET', 'method is GET'; + +ok $method = MooseX::Net::API::Meta::Method->wrap( + name => 'test_method', + package_name => 'test::api', + method => 'GET', + path => '/user/', + params => [qw/name id street/], + required => [qw/name id/], +); + +done_testing; diff --git a/t/lib/TestAPI.pm b/t/lib/TestAPI.pm new file mode 100644 index 0000000..1e8bf97 --- /dev/null +++ b/t/lib/TestAPI.pm @@ -0,0 +1,49 @@ +package TestAPI; +use MooseX::Net::API; + +use HTTP::Response; + +net_api_declare fake_api => ( + api_base_url => 'http://exemple.com', + format => 'json', +); + +net_api_method users => ( + method => 'GET', + path => '/users/', + expected => [qw/200/], +); + +net_api_method user => ( + method => 'GET', + path => '/user/:user_name', + params => [qw/user_name/], + required => [qw/user_name/], + expected => [qw/200/], +); + +net_api_method add_user => ( + method => 'POST', + path => '/user/', + params => [qw/name dob/], + required => [qw/name/], + expected => [qw/201/], +); + +net_api_method update_user => ( + method => 'PUT', + path => '/user/:name', + params => [qw/name dob/], + required => [qw/name/], + expected => [qw/201/], +); + +net_api_method delete_user => ( + method => 'DELETE', + path => '/user/:name', + params => [qw/name/], + required => [qw/name/], + expected => [qw/204/], +); + +1; |