AnyEvent-Twitter-Stream

 view release on metacpan or  search on metacpan

t/streaming.t  view on Meta::CPAN

use Data::Dumper;
use JSON;
use Test::More;
use Test::TCP;
use Test::Requires qw(Plack::Builder Plack::Handler::Twiggy Try::Tiny);
use Test::Requires { 'Plack::Request' => '0.99' };

my @pattern = (
    {
        method => 'sample',
        mount  => 'stream',
        path   => '/1.1/statuses/sample.json',
        option => {},
    },
    {
        method => 'firehose',
        mount  => 'stream',
        path   => '/1.1/statuses/firehose.json',
        option => {},
    },
    {
        method => 'filter',
        mount  => 'stream',
        path   => '/1.1/statuses/filter.json',
        option => {track => 'hogehoge'},
    },
    {
        method => 'filter',
        path   => '/1.1/statuses/filter.json',
        option => {follow => '123123'},
    },
    {
        method => 'userstream',
        path   => '/1.1/user.json',
        option => {},
    },
);

foreach my $enable_chunked (0, 1) {
    test_tcp(
        client => sub {
            my $port = shift;

            local $AnyEvent::Twitter::Stream::STREAMING_SERVER  = "127.0.0.1:$port";
            local $AnyEvent::Twitter::Stream::USERSTREAM_SERVER = "127.0.0.1:$port";
            local $AnyEvent::Twitter::Stream::US_PROTOCOL       = "http";
            local $AnyEvent::Twitter::Stream::PROTOCOL          = 'http'; # real world API uses https

            foreach my $item (@pattern) {
                my $destroyed;
                my $received = 0;
                my $count_max = 5;
                my ($deleted, $event) = (0, 0);

                note("try $item->{method}");

                {
                    my $done = AE::cv;
                    my $streamer = AnyEvent::Twitter::Stream->new(
                        username => 'test',
                        password => 's3cr3t',
                        method => $item->{method},
                        timeout => 2,
                        on_tweet => sub {
                            my $tweet = shift;

                            if ($tweet->{hello}) {
                                note(Dumper $tweet);
                                is($tweet->{user}, 'test');
                                is($tweet->{path}, $item->{path});
                                is_deeply($tweet->{param}, $item->{option});

                                if (%{$item->{option}}) {
                                    is($tweet->{request_method}, 'POST');
                                } else {
                                    is($tweet->{request_method}, 'GET');
                                }
                            } else {
                                $done->send, return if $tweet->{count} > $count_max;
                            }

                            $received++;
                        },
                        on_delete => sub {
                            my ($tweet_id, $user_id) = @_;
                            $deleted++;
                            $received++;
                        },
                        on_friends => sub {
                            my $friends = shift;
                            is_deeply($friends, [qw/1 2 3/]);
                        },
                        on_event => sub {
                            $event++;
                            $done->send;
                        },
                        on_error => sub {
                            my $msg = $_[2] || $_[0];
                            fail("on_error: $msg");
                            $done->send;
                        },
                        %{$item->{option}},
                    );
                    $streamer->{_guard_for_testing} = guard { $destroyed = 1 };

                    $done->recv;
                }

                if ($item->{method} eq 'sample') {
                    is $deleted, 1, 'deleted one tweet';
                } else {
                    is $deleted, 0, 'deleted no tweet';
                }

                if ($item->{method} =~ /userstream|sitestream/) {
                    is $event, 1, 'got one event';
                } else {
                    is $event, 0, 'got no event';
                    is($received, $count_max + 1, "received");
                }



( run in 1.195 second using v1.01-cache-2.11-cpan-39bf76dae61 )