#!/usr/bin/perl

# Top level testing for JSAN::Client itself

use strict;
BEGIN {
    $|  = 1;
    $^W = 1;
}

use Test::More tests => 17;
use File::Spec::Functions ':ALL';
use Scalar::Util ();
use File::Remove 'remove';
use LWP::Online  'online';

BEGIN { remove( \1, 'temp' ) if -e 'temp'; }
END   { remove( \1, 'temp' ) if -e 'temp'; }

use JSAN::Transport mirror_local => 'temp';
use JSAN::Client { prune => 1 };

# Create and/or clear the test directory
my $testdir = catdir( curdir(), '07_client' );
remove \1, $testdir if -e $testdir;
ok( ! -e $testdir, "Test directory '$testdir' does not exist" );
ok( mkdir($testdir), "Create test directory '$testdir'" );
END {
    remove \1, $testdir if -e $testdir;
}

my @requires = map { catfile(@$_) } (
    [ 'Display.js'           ],
    [ 'Display',   'Swap.js' ],
    [ 'JSAN.js'              ],
    );

ok( defined &Scalar::Util::blessed, 'Scalar::Util has blessed function' );





#####################################################################
# Test constructor and accessors

my $Client = JSAN::Client->new(
    prefix  => $testdir,
    verbose => 0,
    );
isa_ok( $Client, 'JSAN::Client' );
is( $Client->prefix, $testdir, '->prefix returns the expected path'  );
is( $Client->verbose, '',      '->verbose returns false as expected' );




#####################################################################
# Bad Params to JSAN::Client

eval {
    JSAN::Client->new( 'lib' );
};
like( $@, qr/Odd number of params/, '->new with one param dies correctly' );





#####################################################################
# Install a known library

SKIP: {
    skip( "Skipping online tests", 10 ) unless online();

    is( $Client->install_library('Display.Swap'), 1,
        '->install_library for known-good library returns true' );
    foreach my $file ( @requires ) {
        my $path = catfile( $testdir, $file );
        ok( -f $path, "Library file '$file' was installed where expected" );
    }





    ######################################################################
    # Install a known library

    # Reset test dir
    File::Remove::remove \1, $testdir if -e $testdir;
    ok( ! -e $testdir, "Test directory '$testdir' does not exist" );
    ok( mkdir($testdir), "Create test directory '$testdir'" );

    # Install matching distribution
    is( $Client->install_distribution('Display.Swap'), 1,
        '->install_disribution for known-good distribution returns true' );
    foreach my $file ( @requires ) {
        my $path = catfile( $testdir, $file );
        ok( -f $path, "Library file '$file' was installed where expected" );
    }
}

exit(0);
