The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 57;

my $debug = $ENV{DEBUG};

BEGIN { use_ok('RDF::Sesame'); }

SKIP: {
    my $uri    = $ENV{SESAME_URI};
    my $r_name = $ENV{SESAME_REPO};
    skip 'SESAME_URI environment not set', 56  unless $uri;
    skip 'SESAME_REPO environment not set', 56 unless $r_name;

    my $conn = RDF::Sesame->connect( uri => $uri );

    die "No connection: $RDF::Sesame::errstr\n" unless defined($conn);

    # try two failing calls
    my $repo = $conn->open;
    is($repo, '', 'open() gives empty string');
    $repo = $conn->open( blahblahblah=>'foo' );
    is($repo, '', 'open(junk) gives empty string');

    # try the single scalar version
    $repo = $conn->open($r_name);
    isa_ok($repo, 'RDF::Sesame::Repository', 'repository');

    # try the named parameter version
    $repo = $conn->open(id => $r_name, query_language=>'RDQL');
    isa_ok($repo, 'RDF::Sesame::Repository', 'repository');
    $repo = $conn->open(id => $r_name);
    isa_ok($repo, 'RDF::Sesame::Repository', 'repository');

    ############## query_language ##################

    # check the default query language
    my $prev = $repo->query_language;
    is($prev, 'SeRQL', 'default query language');
    is($repo->errstr, '', '  no error message');


    # set all acceptable query languages
    foreach ( qw/RQL RDQL SeRQL/ ) {
        is($repo->query_language($_), $prev, "setting query language ($_)");
        $prev = $_;
    }
    is($repo->query_language, $prev, "check last set ($prev)");
    is($repo->errstr, '', '  no error message');

    # set a bad query language
    is($repo->query_language("WRONG"), $prev, "set bad query language");
    isnt($repo->errstr, '', '  got error message');
    diag($repo->errstr) if $debug;
    is($repo->query_language, $prev, "  language didn't set");

    ############## upload_data ##################
    # upload N-Triples without specifying format
    my $c = $repo->upload_data(
        '<http://example.com> <http://example.com/prop> "testing".'
    );
    cmp_ok($c, '==', 1, 'single N-Triple');
    is($repo->errstr, '', '  no error message');

    # use a bad format
    $c = $repo->upload_data(
        data => '',
        format => 'this is not a format',
    );
    cmp_ok($c, '==', 0, 'invalid format');
    ok($repo->errstr, '  got error message');

    # don't verify data and specify the base
    $c = $repo->upload_data(
        data=>'<http://example.com> <http://example.com/prop> "testing".',
        verify => 0,
        base => 'http://example.com/',
    );
    cmp_ok($c, '==', 1, 'with base and no verify');
    is($repo->errstr, '', '  no error message');

    # simulate server problems
    my $fake_repo = RDF::Sesame->connect(host=>'example.org:8080',timeout=>1)
                               ->open('fake');
    $c = $fake_repo->upload_data('blah');
    cmp_ok($c, '==', 0, 'non-existent server');
    ok($fake_repo->errstr, '  got error message');

    ############## upload_uri ##################

    # don't verify data and specify the base
    $c = $repo->upload_uri(
        uri=>'http://www.ndrix.com/small.rdf',
        verify => 0,
        base => 'http://example.com/',
    );
    cmp_ok($c, '==', 1, 'with base and no verify');
    is($repo->errstr, '', '  no error message');

    # simulate server problems
    $fake_repo = RDF::Sesame->connect(host=>'example.org:8080',timeout=>1)
                            ->open('fake');
    $c = $fake_repo->upload_uri('http://example.net/index.rdf');
    cmp_ok($c, '==', 0, 'non-existent server');
    ok($fake_repo->errstr, '  got error message');

    # server problems with clear
    $c = $fake_repo->clear;
    is($c, '', 'network error with clear');

    # try a large (more than 1,000 triples), local upload
    require_ok('LWP::Simple');
    $repo->clear;
    $c = $repo->upload_uri(
        uri    => 'file:t/random-large.ttl', 
        format => 'turtle'
    );
    cmp_ok($c, '==', 1234, 'uploaded local random-large.ttl');
    is($repo->errstr, '', '  no error message');

    # try a large (more than 1,000 triples), remote upload
    $repo->clear;
    $c = $repo->upload_uri(
        uri    => 'http://www.ndrix.com/random-large.ttl', 
        format => 'turtle'
    );
    cmp_ok($c, '==', 1234, 'uploaded remote random-large.ttl');
    is($repo->errstr, '', '  no error message');


    # try a real, remote upload
    $repo->clear;
    $c = $repo->upload_uri(
        uri    => 'http://www.ndrix.com/rdf-sesame.rdf', 
        format => 'rdfxml'
    );
    cmp_ok($c, '==', 48, 'uploaded remote foaf.rdf');
    is($repo->errstr, '', '  no error message');

    $c = $repo->upload_uri(
        uri    => 'http://www.ndrix.com/rdf-sesame.rdf', 
        format => 'A BAD FORMAT'
    );
    cmp_ok($c, '==', 0, 'upload with a bad type');
    isnt($repo->errstr, '', '  got error message');
    diag($repo->errstr) if $debug;

    $c = $repo->upload_uri( 'http://this is a bad URI' );
    cmp_ok($c, '==', 0, 'upload with a bad URI');
    isnt($repo->errstr, '', '  got error message');
    diag($repo->errstr) if $debug;

    $c = $repo->upload_uri( 'http://google.com/index.html' );
    cmp_ok($c, '==', 0, 'upload bad RDF from URI');
    isnt($repo->errstr, '', '  got error message');
    diag($repo->errstr) if $debug;

    $c = $repo->upload_uri(
        uri         => 'file:fooishness-testing.rdf',
        server_file => 1,
    );
    cmp_ok($c, '==', 0, 'upload bad RDF from server-side URI');
    isnt($repo->errstr, '', '  got error message');
    diag($repo->errstr) if $debug;

    $c = $repo->upload_uri( 'file:t/dc.rdf' );
    cmp_ok($c, '==', 146, 'uploading with file: scheme');
    is($repo->errstr, '', '  no error message');

    $c = $repo->upload_uri('file:error.rdf');
    cmp_ok($c, '==', 0, 'upload bad RDF from file');
    isnt($repo->errstr, '', '  got error message');
    diag($repo->errstr) if $debug;


    ############## select ##################

    my $t = $repo->select(
        query => '
            SELECT x, p, y
            FROM {x} p {y}
        ',
        language => 'SeRQL',
    );
    isa_ok($t, 'RDF::Sesame::TableResult', 'query result');
    is($repo->errstr, '', '  no error message');

    $t = $repo->select('BAD QUERY.');
    is($t, '', 'failed query');
    isnt($repo->errstr, '', '  got error message');
    diag($repo->errstr) if $debug;

    ############## remove ##################

    $c = $repo->remove('<http://purl.org/dc/elements/1.1/title>');
    cmp_ok($c, '==', 9, 'removing dc:title subjects');

    $c = $repo->remove(undef, '<http://purl.org/dc/elements/1.1/title>');
    cmp_ok($c, '==', 1, 'removing dc:title predicates');

    $c = $repo->remove(
        undef,
        undef,
        '<http://www.w3.org/1999/02/22-rdf-syntax-ns#Property>'
    );
    cmp_ok($c, '==', 14, 'removing rdfs:Property objects');

    # simulate server problems
    $fake_repo = RDF::Sesame->connect(host=>'example.org:8080',timeout=>1)
                            ->open('fake');
    $c = $fake_repo->remove;
    cmp_ok($c, '==', 0, 'remove from non-existent server');

    ############## clear ##################

    ok($repo->clear, 'clearing repository');

}