#!/usr/bin/perl -w ######################################################################### # This tests loads an xml based API (Testobject::API) and makes sure that # the right things are set up in the repository ######################################################################### use strict; use lib 't/lib'; use Data::Dumper; # colourising the output if we want to use Term::ANSIColor qw(:constants); $Term::ANSIColor::AUTORESET = 1; use Test::More tests => 49; use Test::Exception; use Test::Differences; # this is where we keep our modules use Froody::Repository; use Test::Logger; use Scalar::Util qw(blessed); # load our test API use_ok ('Testproject::API'); { my @stuff = Testproject::API->load(); # Check we got our methods back my @methods = grep { blessed($_) && $_->isa("Froody::Method") } @stuff; my $methods = { map { $_->full_name => 1 } @methods }; # Check we got our error types back my @et = grep { blessed($_) && $_->isa("Froody::ErrorType") } @stuff; is(@et, 2, "got two error types back from the api"); my $et = { map { $_->name => 1 } @et }; is_deeply($et, { map { $_ => 1 } qw( foo.fish foo.fish.fred )},"got the right error type names") } # ignore the previous methods, and just load up Testproject::Service # that will register them for us use_ok("Testproject::Object"); my $repos = Froody::Repository->new(); Testproject::Object->register_in_repository($repos); # okay, so I removed the ability for the framework to be called on just # method names, now you need to invoke with a proper Froody::Method. This # makes sense from the way the API is now used (since nothing but the # method object should really be calling invoke,) but makes testing a bit more # painful. my $email = $repos->get_method('testproject.object.email'); my $text = $repos->get_method('testproject.object.text'); my $sum = $repos->get_method('testproject.object.sum'); my $texttest = $repos->get_method('testproject.object.texttest'); my $extra = $repos->get_method('testproject.object.extra'); my $range = $repos->get_method('testproject.object.range'); my $range2 = $repos->get_method('testproject.object.range2'); my $params = $repos->get_method('testproject.object.params'); my $get = $repos->get_method('testproject.object.get'); foreach ($email, $text, $sum, $texttest, $extra, $range, $range2, $params) { isa_ok($_, 'Froody::Method') } my $metadata = { repository => $repos, dispatcher => Froody::Dispatch->new }; { my $resp = $email->call({ email_trim => 'test@fotango.com'}, $metadata); is( $resp->status, 'ok' ); } { my $resp = $email->call({ email_trim => ' test@fotango.com '}, $metadata); is( $resp->status, 'ok' ); } { my $resp = $email->call({ email_trim => ' test @fotango.com '}, $metadata); is( $resp->status, 'fail' ); like $resp->message, qr{Error validating incoming parameters}, "bad arg"; is($resp->data->{error}[0]{-text}, 'Email not valid'); is($resp->data->{error}[0]{name}, 'email_trim'); } { my $resp = $email->call({ email => ' test@fotango.com '}, $metadata); is( $resp->status, 'fail' ); like $resp->message, qr{Error validating incoming parameters}, "bad arg"; is($resp->data->{error}[0]{-text}, 'Email not valid'); is($resp->data->{error}[0]{name}, 'email'); } dies_ok { Froody::API->load } 'need to override ::load'; lives_ok { $text->call({}, $metadata); } "we can invoke thingy.text without errors"; lives_ok { my $ret = $get->call({}); is($ret->content, 'myget reached'); } "we can invoke get without errors"; { my $result = $sum->call({ values => '10,20,30'}, $metadata)->as_terse->content; is_deeply ( $result, 60, 'multi argument handling') or diag(Dumper $result); $result = $sum->call({ values => [10,20,30] }, $metadata)->as_terse->content; is_deeply ( $result, 60, 'multi argument handling') or diag(Dumper $result); } { my $resp = $sum->call({ values => '10,20f,30'}, $metadata); like $resp->message, qr{Error validating incoming parameters}, "bad arg"; is($resp->data->{error}[0]{-text}, 'not a number'); } isa_ok( my $resp = $sum->call({ values => undef }, $metadata), "Froody::Response", "called with bad argument"); like( $resp->message, qr{Error validating incoming parameters}, "bad arg"); isa_ok( $resp = $sum->call({}, $metadata), "Froody::Response", "called with missing argument"); like( $resp->message, qr{Error validating incoming parameters}, "missing"); is_deeply($resp = $range->call({ base => 90, offset => 10 }, $metadata)->as_terse->content, { value => [ 80, 100] },"range") or diag Dumper($resp); is_deeply($resp = $range2->call({ base => 90, offset => 10 }, $metadata)->as_terse->content, { value => [ { num => 80}, { num => 100 } ] }, "range2") or diag Dumper($resp); { my $log = Test::Logger->expect(["froody.walker.terse", warn => qr/unknown key 'blah' defined/]); is_deeply($resp = $extra->call({}, $metadata)->as_terse->content, { value => []}, "wibble") or diag Dumper($resp); } is_deeply($params->call( { bob => 'baz', fred => "wobble" }, $metadata ) ->as_terse->content, 2, "remaining params passed ok"); is_deeply($params->call( { this_one => 1 }, $metadata) ->as_terse->content, 0, "can pass no params and it still works."); #### test the errortypes ##### my $default = $repos->get_errortype(''); my $fish = $repos->get_errortype('foo.fish'); my $fred = $repos->get_errortype('foo.fish.fred'); foreach ($fish, $fred, $default) { isa_ok($_, 'Froody::ErrorType') } is($fish->name, 'foo.fish', "fish name"); is($fred->name, 'foo.fish.fred', "fred name"); is($default->name, '', "default name"); eq_or_diff($fish->structure, { 'err' => { 'elts' => [ 'foo' ], 'attr' => [ 'code', 'msg' ], 'multi' => 0, 'text' => 0, }, 'err/foo' => { elts => [], attr => [], text => 1, multi=> 0 }, '' => { 'elts' => [ 'err' ], 'text' => 0, 'multi' => 0, 'attr' => [] }, }, "fish struct"); eq_or_diff($fred->structure, { 'err/bars/bar' => { 'elts' => [], 'text' => 1, 'multi' => 1, 'attr' => [] }, 'err/bars' => { 'elts' => [ 'bar' ], 'attr' => [], multi => 0, text => 0, }, 'err/foo' => { elts => [], attr => [], multi => 0, text => 1 }, 'err' => { 'elts' => [ 'bars', 'foo' ], 'attr' => [ 'code', 'msg' ], 'multi' => 0, 'text' => 0, }, '' => { 'elts' => [ 'err' ], 'text' => 0, 'multi' => 0, 'attr' => [] }, }, "fred struct"); eq_or_diff($default->structure, { 'err' => { 'elts' => [ ], 'attr' => [ 'code', 'msg' ] }, }, "default struct");