The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Net::Google::PicasaWeb::Test::ListAlbums;
use Test::Able;
use Test::More;

use List::Util qw( shuffle );

with qw( Net::Google::PicasaWeb::Test::Role::Online );

setup service_login => sub { shift->do_login };

sub limit_to($@) {
    my $max = shift;
    return () unless @_;

#    return @_;
    return @_ if @_ <= $max;

    my @list = shuffle(@_);
    return @list[0 .. ($max - 1)];
}

test plan => 'no_plan', happy_login_ok => sub {
    my $self = shift;
    my $service = $self->service;

    my @albums = $service->list_albums;
    
    for my $album (limit_to(3, @albums)) {
        note("ALBUM ".$album->entry_id." - ".$album->title);
        ok($album->entry_id, 'got an entry ID');
        ok($album->title, 'got a title');
        ok(defined $album->summary, 'got a summary');
        ok($album->author_name, 'got an author_name');
        ok($album->author_uri, 'got an author_uri');
        ok(((defined $album->latitude && defined $album->longitude)
            || (!(defined $album->latitude || defined $album->longitude))),
            'lat/long both defined or both not defined');
        if (defined $album->latitude) {
            ok($album->latitude >= -90, 'latitude is not too small');
            ok($album->latitude <= 90, 'latitude is not too big');
        }
        if (defined $album->longitude) {
            ok($album->longitude >= -180, 'longitude is not too small');
            ok($album->longitude <= 180, 'longitude is not too big');
        }
        ok($album->photo, 'got a photo');
        ok($album->bytes_used, 'got bytes used');
        ok($album->number_of_photos, 'got number of photos');

        my @photos = $album->list_photos;
        is($album->number_of_photos, scalar(@photos),
            'number of photos matches returned photos');
        for my $photo (limit_to(3, @photos)) {
            note("PHOTO ".$photo->entry_id." - ".$photo->title);
            ok($photo->entry_id, 'got an entry ID');
            ok($photo->title, 'got a title');
            ok(defined $photo->summary, 'got a summary');
            # ok($photo->author_name, 'got an author name');
            # ok($photo->author_uri, 'got an author URI');
            ok($photo->photo, 'got a photo');
            is($photo->album_id, $album->entry_id,
                'album ID for photo matches entry ID');
            ok($photo->width, 'got a width');
            ok($photo->height, 'got a height');
            ok($photo->size, 'got a size');

            my $media = $photo->photo;
            is($media->title, $photo->title, 'media title matches photo title');
            is($media->description, $photo->summary, 
                'media description matches photo summary');
            ok($media->content, 'got content');

            my $content = $media->content;
            is($content->media, $media, 'content media is same as parent');
            ok($content->url, 'got a content URL');
            ok($content->mime_type, 'got a content MIME type');
            ok($content->medium, 'got a content medium');
            like($content->medium, qr{^(?:image|video)$}, 
                'content medium is either an image or video');
            ok($content->width, 'got a content width');
            ok($content->height, 'got a content height');

            my $content_data = $content->fetch;
            ok($content_data, 'fetched the image data');
            is(bytes::length($content_data), $content->size,
                'image is expected byte size')
                    if $content->size;
            
            for my $thumbnail ($media->thumbnails) {
                is($media, $thumbnail->media, 'thumbnail media matches parent');
                ok($thumbnail->url, 'got a thumbnail URL');
                ok($thumbnail->width, 'got a thumbnail width');
                ok($thumbnail->height, 'got a thumbnail height');

                my $thumbnail_data = $thumbnail->fetch;
                ok($thumbnail_data, 'fetched the thumbnail image data');
            }

            my @tags = $photo->list_tags;
            for my $tag (@tags) {
                ok($tag, 'got a tag');
            }

            my @comments = $photo->list_comments;
            for my $comment (@comments) {
                ok($comment->entry_id, 'got an entry ID');
                ok($comment->title, 'got a title');
                ok($comment->content, 'got content');
                ok($comment->author_name, 'got an author name');
                ok($comment->author_uri, 'got an author URI');
            }
        }
    }
};

1;