The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use warnings;
use strict;
use Try::Tiny;
use Scalar::Util qw/blessed/;
use Test::More;
use JSON::MaybeXS qw/encode_json/;
use lib qw(t/lib);

eval 'use TestUA';
plan skip_all => 'LWP::UserAgent 5.819 required' if $@;

plan tests => 8;

use_ok 'Net::Twitter';

my $nt = Net::Twitter->new(ssl => 0, traits => [qw/API::REST API::Search RateLimit InflateObjects/]);

my $datetime_parser = do {
    no warnings 'once';
    $Net::Twitter::Role::API::REST::DATETIME_PARSER;
};

my $dt = DateTime->now;
$dt->subtract(minutes => 6);

my $t = TestUA->new(1, $nt->ua);
$t->response->content(encode_json([
    {
        text => 'Hello, twittersphere!',
        id => 1234,
        created_at => $datetime_parser->format_datetime($dt),
    },
    {
        text => 'Too old',
        id => 5678,
        created_at => $datetime_parser->format_datetime($dt - DateTime::Duration->new(days => 2)),
    },
]));

my $r = $nt->friends_timeline;
ok ref $r eq 'ARRAY', 'got an ArrayRef';
cmp_ok @$r, '==', 2,  'got 2 statuses';

$r = $nt->friends_timeline({ since => $dt - DateTime::Duration->new(days => 1) });
cmp_ok @$r, '==', 1,  'filtered with DateTime';

$r = $nt->friends_timeline({ since => time - 3600*25 });
cmp_ok @$r, '==', 1,  'filtered with epoch';

$r = $nt->friends_timeline({ since => $datetime_parser->format_datetime(
            $dt - DateTime::Duration->new(hours => 25)) });
cmp_ok @$r, '==', 1,  'filtered with string in Twitter timestamp format';

my $test = 'dies on invalid since';
try {
    $r = $nt->friends_timeline({ since => 'not a date' });
    fail $test;
}
catch { pass $test };

$nt = Net::Twitter->new(ssl => 0, traits => [qw/API::Search API::REST/]);
$nt->ua->add_handler(request_send => sub {
        my $res = HTTP::Response->new(200);
        $res->content('{"test":"done"}');
        return $res;
});

$test = 'YYYY-MM-DD';
try {
    $r = $nt->search({ q => 'perl', since => '2009-10-05' });
    pass $test;
}
catch {
    fail "$test: $_";
};