#!/usr/bin/perl -w
use strict;

# testing the update process

use CPAN::Testers::Data::Uploads;
use Test::More;

#----------------------------------------------------------------------------
# Prepare Mock Conditions

my ($nomock,$mock1);

BEGIN {
    eval "use Test::MockObject";
    $nomock = $@;

    unless($nomock) {
        $mock1 = Test::MockObject->new();
        $mock1->fake_module( 'Net::NNTP',
                    'group'     =>  \&mock_group,
                    'article'   =>  \&mock_article );
        $mock1->fake_new( 'Net::NNTP' );
        $mock1->mock( 'group',      \&mock_group );
        $mock1->mock( 'article',    \&mock_article );
    }
}

if($nomock) {
    plan skip_all => 'generate tests require Test::MockObject';
} else {
    plan tests => 12;
}

#----------------------------------------------------------------------------

my $config = 't/_DBDIR/test-config.ini';
my $idfile = 't/_DBDIR/lastid.txt';

my %articles = (
    1 => 't/nntp/31085.txt',    # already inserted (should just overwrite)
    2 => 't/nntp/13394.txt',
    3 => 't/nntp/72870.txt',
    4 => 't/nntp/34358.txt',
);

my $obj;
eval { $obj = CPAN::Testers::Data::Uploads->new( config => $config, update => 1 ) };
isa_ok($obj,'CPAN::Testers::Data::Uploads');

SKIP: {
    skip "Problem creating object", 11 unless($obj);

    my $dbh = $obj->uploads;
    ok($dbh);

    is(lastid(),0,'.. lastid is 0 from start');

    my @rows = $dbh->get_query('hash','select count(*) as count from uploads');
    is($rows[0]->{count}, 63, "row count for uploads");
    @rows = $dbh->get_query('hash','select count(*) as count from ixlatest');
    is($rows[0]->{count}, 17, "row count for ixlatest");

    $obj->process;

    is(lastid(),72870,'.. lastid is updated after process');

    @rows = $dbh->get_query('hash','select count(*) as count from uploads');
    is($rows[0]->{count}, 66, "row count for uploads");
    @rows = $dbh->get_query('hash','select count(*) as count from ixlatest');
    is($rows[0]->{count}, 18, "row count for ixlatest");
    @rows = $dbh->get_query('hash','select count(*) as count from page_requests');
    is($rows[0]->{count}, 16, "row count for page_requests");
    @rows = $dbh->get_query('hash','select * from ixlatest where dist=?','Acme-CPANAuthors-French');
    is($rows[0]->{version}, '0.07', "old index version not overwritten");
    @rows = $dbh->get_query('hash','select * from ixlatest where dist=?','Acme-CPANAuthors-Japanese');
    is($rows[0]->{version}, '0.090911', "old index version");
    @rows = $dbh->get_query('hash','select * from ixlatest where dist=?','CPAN-Testers-Data-Uploads');
    is($rows[0]->{version}, '0.12', "new index version");
}

sub lastid {
    my $lastid = 0;

    if(-f $idfile) {
        if(my $fh = IO::File->new($idfile,'r')) {
            my @lines = <$fh>;
            ($lastid) = $lines[0] =~ /(\d+)/;
            $fh->close;
        }
    }

    return $lastid;
}

sub mock_group {
    return(4,13394,72870);
}

sub mock_article {
    my ($self,$id) = @_;
    my @text;

    return \@text   unless($articles{$id});

    my $fh = IO::File->new($articles{$id}) or return \@text;
    while(<$fh>) { push @text, $_ }
    $fh->close;

    return \@text;
}
