The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Test::More tests => 23;

use Test::Differences (qw( eq_or_diff ));

use App::Sky::Manager;

package ManagerTester;

use MooX qw/late/;

use Test::More;

use Test::Differences (qw( eq_or_diff ));

has 'manager' => (isa => 'App::Sky::Manager', is => 'ro');

# TEST:$c=0;
sub test_upload_results
{
    local $Test::Builder::Level = $Test::Builder::Level + 1;
    my ($self, $args, $blurb_base) = @_;

    my $results = $self->manager->get_upload_results(
        $args->{input}
    );

    # TEST:$c++
    ok ($results, "$blurb_base - Results were returned.");

    # TEST:$c++
    eq_or_diff (
        $results->upload_cmd(),
        $args->{upload_cmd},
        "$blurb_base - results->upload_cmd() is correct.",
    );

    # TEST:$c++
    eq_or_diff (
        [map { $_->as_string() } @{$results->urls()}],
        $args->{urls},
        "$blurb_base - the result URLs are correct.",
    );

    return;
}

# TEST:$test_upload_results=$c;

# TEST:$c=0;
sub test_recursive_upload_results
{
    local $Test::Builder::Level = $Test::Builder::Level + 1;
    my ($self, $args, $blurb_base) = @_;

    my $results = $self->manager->get_recursive_upload_results(
        $args->{input}
    );

    # TEST:$c++
    ok ($results, "$blurb_base - Results were returned.");

    # TEST:$c++
    eq_or_diff (
        $results->upload_cmd(),
        $args->{upload_cmd},
        "$blurb_base - results->upload_cmd() is correct.",
    );

    # TEST:$c++
    eq_or_diff (
        [map { $_->as_string() } @{$results->urls()}],
        $args->{urls},
        "$blurb_base - the result URLs are correct.",
    );

    return;
}

# TEST:$test_recursive_upload_results=$c;

package main;

{
    my $manager = App::Sky::Manager->new(
        {
            config =>
            {
                default_site => "shlomif",
                sites =>
                {
                    shlomif =>
                    {
                        base_upload_cmd => [qw(rsync -a -v --progress --inplace)],
                        dest_upload_prefix => 'hostgator:public_html/',
                        dest_upload_url_prefix => 'http://www.shlomifish.org/',
                        sections =>
                        {
                            code =>
                            {
                                basename_re => q/\.(?:pl|pm|c|py)\z/,
                                target_dir => "Files/files/code/",
                            },
                            music =>
                            {
                                basename_re => q/\.(?:mp3|ogg|wav|aac|m4a)\z/,
                                target_dir => "Files/files/music/mp3-ogg/",
                            },
                            video =>
                            {
                                basename_re => q/\.(?:webm|flv|avi|mpeg|mpg|mp4|ogv)\z/,
                                target_dir => "Files/files/video/",
                            },
                        },
                    },
                },
            },
        },
    );

    # TEST
    ok ($manager, 'Module App::Sky::Manager was created.');

    my $tester = ManagerTester->new({ manager => $manager });

    # TEST*$test_upload_results
    $tester->test_upload_results(
        {
            input =>
            {
                'filenames' => ['/home/music/Music/mp3s/Shine 4U - Carmen and Camille-B8ehY5tutHs.mp4', ],
            },
            upload_cmd =>
            [qw(rsync -a -v --progress --inplace),
            '/home/music/Music/mp3s/Shine 4U - Carmen and Camille-B8ehY5tutHs.mp4',
            'hostgator:public_html/Files/files/video/'
            ],
            urls =>
            [
                'http://www.shlomifish.org/Files/files/video/Shine%204U%20-%20Carmen%20and%20Camille-B8ehY5tutHs.mp4',
            ],
        },
        '[mp4 file]',
    );

    # TEST*$test_upload_results
    $tester->test_upload_results(
        {
            input =>
            {
                'filenames' => ['./foobar/MyModule.pm'],
            },
            upload_cmd =>
            [qw(rsync -a -v --progress --inplace),
                './foobar/MyModule.pm',
                'hostgator:public_html/Files/files/code/'
            ],
            urls =>
            [
                'http://www.shlomifish.org/Files/files/code/MyModule.pm',
            ],
        },
        'MyModule.pm',
    );

    # TEST*$test_upload_results
    $tester->test_upload_results(
        {
            input =>
            {
                'filenames' => ['/var/tmp/test-code.c'],
            },
            upload_cmd =>
            [qw(rsync -a -v --progress --inplace),
                '/var/tmp/test-code.c',
                'hostgator:public_html/Files/files/code/'
            ],
            urls =>
            [
                'http://www.shlomifish.org/Files/files/code/test-code.c',
            ],
        },
        'test-code.c',
    );

    # TEST*$test_upload_results
    $tester->test_upload_results(
        {
            input =>
            {
                'section' => 'music',
                'filenames' => ['/home/music/Music/mp3s/Shine 4U - Carmen and Camille-B8ehY5tutHs.mp4', ],
            },
            upload_cmd =>
            [qw(rsync -a -v --progress --inplace),
            '/home/music/Music/mp3s/Shine 4U - Carmen and Camille-B8ehY5tutHs.mp4',
            'hostgator:public_html/Files/files/music/mp3-ogg/',
            ],
            urls =>
            [
                'http://www.shlomifish.org/Files/files/music/mp3-ogg/Shine%204U%20-%20Carmen%20and%20Camille-B8ehY5tutHs.mp4',
            ],
        },
        '.mp4 file to music section.',
    );

    # TEST*$test_upload_results
    $tester->test_upload_results(
        {
            input =>
            {
                'target_dir' => 'secret-music/',
                'filenames' => ['/home/music/Music/mp3s/Shine 4U - Carmen and Camille-B8ehY5tutHs.mp4', ],
            },
            upload_cmd =>
            [qw(rsync -a -v --progress --inplace),
            '/home/music/Music/mp3s/Shine 4U - Carmen and Camille-B8ehY5tutHs.mp4',
            'hostgator:public_html/secret-music/',
            ],
            urls =>
            [
                'http://www.shlomifish.org/secret-music/Shine%204U%20-%20Carmen%20and%20Camille-B8ehY5tutHs.mp4',
            ],
        },
        'target_dir',
    );
}

{
    my $manager = App::Sky::Manager->new(
        {
            config =>
            {
                default_site => "shlomif",
                sites =>
                {
                    shlomif =>
                    {
                        base_upload_cmd => [qw(rsync -a -v --progress --inplace)],
                        dest_upload_prefix => 'hostgator:public_html/',
                        dest_upload_url_prefix => 'http://www.shlomifish.org/',
                        dirs_section => 'dirs',
                        sections =>
                        {
                            code =>
                            {
                                basename_re => q/\.(?:pl|pm|c|py)\z/,
                                target_dir => "Files/files/code/",
                            },
                            dirs =>
                            {
                                basename_re => q/\.(?:MYDIR)\z/,
                                target_dir => "Files/files/dirs/",
                            },
                            music =>
                            {
                                basename_re => q/\.(?:mp3|ogg|wav|aac|m4a)\z/,
                                target_dir => "Files/files/music/mp3-ogg/",
                            },
                            video =>
                            {
                                basename_re => q/\.(?:webm|flv|avi|mpeg|mpg|mp4|ogv)\z/,
                                target_dir => "Files/files/video/",
                            },
                        },
                    },
                },
            },
        },
    );

    # TEST
    ok ($manager, 'Directories App::Sky::Manager was created.');

    my $tester = ManagerTester->new({ manager => $manager });

    # TEST*$test_recursive_upload_results
    $tester->test_recursive_upload_results(
        {
            input =>
            {
                'filenames' => ['/home/shlomif/progs/perl/cpan/App-Sky', ],
            },
            upload_cmd =>
            [qw(rsync -a -v --progress --inplace),
                '/home/shlomif/progs/perl/cpan/App-Sky',
                'hostgator:public_html/Files/files/dirs/',
            ],
            urls =>
            [
                'http://www.shlomifish.org/Files/files/dirs/App-Sky/',
            ],
        },
        'upload directory',
    );

    # TEST*$test_recursive_upload_results
    $tester->test_recursive_upload_results(
        {
            input =>
            {
                'filenames' => ['/home/shlomif/progs/perl/cpan/App-Sky/', ],
            },
            upload_cmd =>
            [qw(rsync -a -v --progress --inplace),
                '/home/shlomif/progs/perl/cpan/App-Sky',
                'hostgator:public_html/Files/files/dirs/',
            ],
            urls =>
            [
                'http://www.shlomifish.org/Files/files/dirs/App-Sky/',
            ],
        },
        'trailing slash is removed on upload directory',
    );
}