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

use strict;
use warnings;

use File::Spec;
use Test::More tests => 24;
use Test::Exception;

use lib File::Spec->curdir;
require File::Spec->catfile('t', '_test_util.pl');

my $SAMPLE_UPLOAD_FILE      = 'api-sample-upload.zip';
my $SAMPLE_UPLOAD_FILE_PATH = './blib/' . $SAMPLE_UPLOAD_FILE;

my ($ScormCloud, $skip_live_tests) = getScormCloudObject();

diag 'Live tests will be skipped' if $skip_live_tests;

can_ok($ScormCloud, 'getUploadToken');
can_ok($ScormCloud, 'getUploadProgress');
can_ok($ScormCloud, 'uploadFile');
can_ok($ScormCloud, 'listFiles');
can_ok($ScormCloud, 'deleteFiles');

SKIP:
{
    skip 'Skipping live tests', 19 if $skip_live_tests;

    my $token = $ScormCloud->getUploadToken;
    ok($token, '$ScormCloud->getUploadToken');

    my $progress;
    throws_ok { $progress = $ScormCloud->getUploadProgress() }
    qr/^Missing token/,
      '$ScormCloud->getUploadProgress caught missing token';

    $progress = $ScormCloud->getUploadProgress($token);
    isa_ok($progress, 'HASH', '$ScormCloud->getUploadProgress');
    is(scalar(keys %{$progress}), 0, '$ScormCloud->getUploadProgress is empty');

    unless (-f $SAMPLE_UPLOAD_FILE_PATH)
    {
        my $fh;
        unless (open($fh, '>', $SAMPLE_UPLOAD_FILE_PATH))
        {
            BAIL_OUT(
                  "Cannot create sample upload file: $SAMPLE_UPLOAD_FILE_PATH");
        }
        print $fh "foo\n";
        close $fh;
    }

    my $remote_name;

    throws_ok
    {
        $remote_name = $ScormCloud->uploadFile();
    }
    qr/^Missing file/, '$ScormCloud->uploadFile caught missing file';

    throws_ok
    {
        $remote_name =
          $ScormCloud->uploadFile($SAMPLE_UPLOAD_FILE_PATH, 'foobar');
    }
    qr/^Invalid API response data/,
      '$ScormCloud->uploadFile caught bogus token';

    $remote_name = $ScormCloud->uploadFile($SAMPLE_UPLOAD_FILE_PATH, $token);
    like($remote_name, qr/$SAMPLE_UPLOAD_FILE$/,
         '$ScormCloud->uploadFile remote name');

    $progress = $ScormCloud->getUploadProgress($token);
    isa_ok($progress, 'HASH', '$ScormCloud->getUploadProgress');
    foreach my $key (qw(bytes_read content_length percent_complete upload_id))
    {
        ok($progress->{$key}, "\$ScormCloud->getUploadProgress->{$key} exists");
    }

    my $list = $ScormCloud->listFiles;
    isa_ok($list, 'ARRAY', '$ScormCloud->listFiles');
    cmp_ok(@{$list}, '>=', 1, '$ScormCloud->listFiles at least one file');

    isa_ok($list->[0], 'HASH', '$ScormCloud->listFiles is a list of hashrefs');
    ok($list->[0]->{name}, '$ScormCloud->listFiles file name exists');

    my @matches = grep { /$SAMPLE_UPLOAD_FILE$/ } map { $_->{name} } @{$list};
    cmp_ok(scalar(@matches), '>=', 1,
           '$ScormCloud->listFiles at least one test file');

    throws_ok { $ScormCloud->deleteFiles() } qr/^Missing file/,
      '$ScormCloud->deleteFiles caught missing file';

    foreach my $file (@matches)
    {
        $ScormCloud->deleteFiles($file);
    }

    $list = $ScormCloud->listFiles;
    @matches = grep { /$SAMPLE_UPLOAD_FILE$/ } map { $_->{name} } @{$list};
    is(scalar(@matches), 0, '$ScormCloud->deleteFiles deleted all test files');
}