Acme-Free-Advice-Unsolicited
view release on metacpan or search on metacpan
lib/Acme/Free/Advice/Unsolicited.pm view on Meta::CPAN
#
sub _http ($uri) {
state $http
//= HTTP::Tiny->new( default_headers => { Accept => 'application/json' }, agent => sprintf '%s/%.2f ', __PACKAGE__, our $VERSION );
my $res = $http->get($uri); # {success} is true even when advice is not found but we'll at least know when we have valid JSON
$res->{success} ? decode_json( $res->{content} ) : ();
}
#
sub advice ( $advice_id //= () ) {
my $res = _http( 'https://kk-advice.koyeb.app/api/advice' . ( $advice_id ? '/' . $advice_id : '' ) );
defined $res->{error} ? () : bless $res, __PACKAGE__;
}
sub all () {
my $res = _http('https://kk-advice.koyeb.app/api/advice/all');
map { bless $_, __PACKAGE__ } @{ $res // [] };
}
}
1;
__END__
=encoding utf-8
=head1 NAME
Acme::Free::Advice::Unsolicited - Solicit Unsolicited Advice from Kevin Kelly
t/00_compile.t view on Meta::CPAN
#
imported_ok qw[advice all];
#
subtest 'random advice' => sub {
is my $slip = advice(), hash {
field advice => D();
field id => D();
field source => D();
end()
}, 'advice() returns a random bit of advice';
isa_ok $slip, ['Acme::Free::Advice::Unsolicited'], 'advice is a blessed hash';
};
subtest 'specific advice' => sub {
is my $slip = advice(224), hash {
field advice => string q[You can be whatever you want, so be the person who ends meetings early.];
field id => number 224;
field source => string q[https://kk.org/thetechnium/103-bits-of-advice-i-wish-i-had-known/];
end;
}, 'advice(224) returns a known piece of wisdom';
isa_ok $slip, ['Acme::Free::Advice::Unsolicited'], 'slip is a blessed hash';
is advice(100000), U(), 'advice(100000) returns undef';
};
subtest 'gather all advice' => sub {
is my $list = [ all() ], array {
all_items hash {
field advice => D();
field id => D();
field source => D();
end;
};
etc;
}, 'all() returns a list of advice';
isa_ok $list->[0], ['Acme::Free::Advice::Unsolicited'], 'all() returns a list of blessed hashes';
};
#
done_testing;
( run in 0.810 second using v1.01-cache-2.11-cpan-de7293f3b23 )