The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Test::Media;

use Test::Exception;
use Test::Roo::Role;

test 'media tests' => sub {

    my $self = shift;

    my $ret;

    my $schema = $self->ic6s_schema;

    my %product_data = (
        sku               => 'G000X',
        name              => 'Six Tulips',
        short_description => 'What says I love you',
        description       => 'Surprise',
        price             => '19.95',
        uri               => 'six-tulips',
        weight            => '4',
        canonical_sku     => undef,
    );

    my @media = (
        {
            file      => 'product/image.jpg',
            uri       => 'image.jpg',
            mime_type => 'image/jpeg',
        },
        {
            file      => 'product/image2.jpg',
            uri       => 'image2.jpg',
            mime_type => 'image/jpeg',
        },
        {
            file      => 'product/image3.jpg',
            uri       => 'image3.jpg',
            mime_type => 'image/jpeg',
        }
    );

    # create the image types
    $schema->resultset('MediaType')->create( { type => 'video' } )
      ->add_to_media_displays(
        {
            type => 'video',
            name => 'video',
            path => '/video/',
            size => ''
        }
      );

    my $imagetype =
      $schema->resultset('MediaType')->create( { type => 'image' } );

    foreach my $display (qw/image_cart image_detail image_thumb/) {
        $imagetype->add_to_media_displays(
            {
                type => $display,
                name => $display,
                path => "/images/$display",
                size => "testsize",
            }
        );
    }

    my $product = $self->products->first;

    foreach my $media_hashref (@media) {
        my $m = $product->add_to_media(
            { %$media_hashref, media_type => { type => 'image' }, } );
    }

    # another product with 1 media

    my $second = $self->products->next;

    $second->add_to_media(
        { %{ $media[0] }, media_type => { type => 'image' } } );

    my @second_media = $second->media;

    ok( @second_media == 1, $second->sku . " has only one media " );

    my @first_media = $product->media;

    ok( @first_media == 3, $product->sku . "has 3 media" );

    foreach my $m ( @first_media, @second_media ) {
        is $m->media_type->type, 'image', $m->uri . " is an image";
        is $m->type, 'image', "Shortcut works";
        my %to_find = (
            image_cart   => 1,
            image_detail => 1,
            image_thumb  => 1,
        );
        foreach my $display ( $m->media_type->media_displays ) {
            my $display_type = $display->type;
            delete $to_find{$display_type};
        }
        ok !%to_find, "All the display type found";
        my @displays = $m->displays;
        foreach my $d (@displays) {
            unlike $d->type, qr/video/,    $d->type . ' is not a video';
            like $d->path,   qr!/images/!, "found the path " . $d->path;
        }
    }

    # add a product with a video

    $second->add_to_media(
        {
            file       => 'product/video.mp4',
            uri        => 'video.mp4',
            mime_type  => 'video/mp4',
            media_type => {
                type => 'video',
            },
        }
    );

    @second_media = $second->media;

    ok( @second_media == 2, $second->sku . " now has two media " )
      or diag scalar(@second_media);

    lives_ok( sub { $ret = $second->media_by_type('fruit') },
        "media_by_type 'fruit'" );
    is( $ret, undef, "returned undef" );

    my @videos = $second->media_by_type('video');

    ok( @videos == 1, "Found 1 video" );

    is $videos[0]->type, 'video',     "found the video";
    is $videos[0]->uri,  'video.mp4', "found the uri";

    is_deeply $videos[0]->display_uris, { 'video' => '/video/video.mp4', },
      "Found the display uris";

    is $videos[0]->display_uri('video'), '/video/video.mp4', "found the uri";

    my @images = $second->media_by_type('image');

    ok( @images == 1, "Found 1 image" );
    my $img = shift(@images);

    is $img->type, 'image',     "found the image";
    is $img->uri,  'image.jpg', "found the uri";

    my $uris = $img->display_uris;

    is_deeply $img->display_uris,
      {
        'image_detail' => '/images/image_detail/image.jpg',
        'image_cart'   => '/images/image_cart/image.jpg',
        'image_thumb'  => '/images/image_thumb/image.jpg'
      },
      "Found the display uris";

    is $img->display_uri('image_detail'), '/images/image_detail/image.jpg',
      "Found the image detail uri";

    is $img->display_uri('video'), undef, "No video found for the image";

    $product->add_to_media(
        {
            file       => 'product/video.mp4',
            uri        => 'video.mp4',
            mime_type  => 'video/mp4',
            media_type => {
                type => 'video',
            },
        }
    );

    my ($video1) = $product->media_by_type('video');

    my ($video2) = $second->media_by_type('video');

    ok( $video1->media_id, "Found the media id" );
    ok( $video2->media_id, "Found the media id" );

    ok( $video1->media_id == $video2->media_id,
        "media id match when adding the same media to other products" );

    # cleanup
    $self->clear_products;
};

1;