# Test by creating a small local svn repos, committing some stuff into it...
use strict;
use warnings;
use Test::More;
use FindBin qw( $Bin );
use lib ("$Bin/lib", "$Bin/../lib");
use TestLib;
use Catalyst::Model::SVN;
use Test::More;
use Test::Exception;
$|++;
my $TESTS = 60;
my ($testlib, $repos_uri);
eval {
$testlib = TestLib->new();
$repos_uri = $testlib->create_svn_repos();
};
plan skip_all => $@ if $@;
# Ok, setup done - we are good to go.
plan tests => $TESTS;
print "Starting real testing:\n";
throws_ok { Catalyst::Model::SVN->new() } qr/repository/, 'Throws with no config';
lives_ok {
Catalyst::Model::SVN->config(
repository => $repos_uri,
);
} 'Setting repos config';
my $m;
lives_ok { $m = Catalyst::Model::SVN->new(); } 'Can construct';
{
my $r = $m->revision;
is($r, 5, 'Repository revision is 5 (5 commits)');
}
# Try a really simple ls in both scalar and list contexts..
my (@l, $l);
# Paths only.
lives_ok {$l = $m->ls('/', 5)} 'ls (scalar) path only with explicit revision, no exception';
lives_ok {@l = $m->ls()} 'ls (list + default args) path only , no exception';
my $l2 = \@l;
ok(scalar(@l) == 2, 'Have 2 top level items in ls path only');
is_deeply($l, $l2, 'Scalar and list context ls compare the same path only');
#URIs
my $l3;
lives_ok {$l3 = $m->ls($repos_uri, 2)} 'ls (scalar) uri with explicit revision, no exception';
ok(scalar(@$l3) == 2, 'Have 2 top level items in ls uri');
is_deeply($l3, $l, 'Scalar and list context ls compare the same uri');
throws_ok {$m->ls('/bfgjghjfh', 2)} qr/File not found/, 'File which doesn not exist ls throws';
throws_ok {$m->ls($repos_uri . 'etgjhbhjjb', 2)} qr/File not found/, 'File which doesn not exist ls throws';
my $f = $l->[0];
# Tests for a single file f (from ls)
isa_ok($f, 'Catalyst::Model::SVN::Item', 'ls returns an array of Catalyst::Model::SVN::Item objects');
is($f->name, 'f1', 'Name of file as expected');
my $uri = $f->uri;
ok($f->uri, 'uri method returns something (' . $uri . ')');
ok($f->is_file, 'f is file');
ok(!$f->is_directory, 'f is not directory');
{
my ($c1, $c2) = ($f->contents, $f->contents);
ok(length $c1, 'File has contents (1)');
ok(length $c2, 'File has contents (2)');
is($c1, $c2, 'Contents two times is the same');
is($c1, " File 1, rev 1\n ", 'Contents as expected');
};
ok(!defined($f->author), 'Author is undef');
ok($f->size, 'Size has value');
ok($f->time, "Time has value");
isa_ok($f->time, 'DateTime', 'Is a DateTime object');
my $r = $f->revision();
ok($r, 'Revision has value');
ok($r =~ /^\d+$/, 'Revision number is decimal');
ok($r < 10, "Less than 10 revisions on item ($r)");
lives_ok {
ok(length($f->log), 'item has log');
} 'log no exception';
lives_ok {
is($f->propget('svn:mime-type'), 'text/plain', 'propget works (defined prop)');
ok(!defined($f->propget('svn:foobar')), 'propget works (undefined prop)');
} 'propget no exception';
# Test path and uri methods (and that they all work the same on various URI formats)
is($f->path, '/f1', 'Path is /f1');
is($f->uri, 'svn://localhost/f1', ' URI is svn://localhost/f1');
foreach my $method (qw(path uri)) {
no strict 'refs';
my ($a1, $a2, $a3) = (grep { defined $_ && $_->$method } ($f, $l2->[0], $l3->[0]) );
ok($a1, "$method works");
is($a2, $a1, "$method on ls (list + path) is same as ls (scalar + path)");
is($a3, $a2, "$method on ls (scalar + path) is same as ls (scalar + uri)")
}
# Try to get a file with cat, using both uri and local paths.
# URI
{
my $f;
lives_ok {$f = $m->cat($repos_uri . 'f1', 'HEAD')} 'cat top level file with whole URI';
ok($f, 'cat method fetches f1 back (full uri)');
};
#Paths only.
{
my $f;
lives_ok {$f = $m->cat('/f1', 'HEAD')} 'cat top level file with just path';
ok($f, 'cat method fetched f1 back (just path)');
is($f, " File 1, rev 1\n ", 'Contents as expected');
};
# Try propget and propget_hr methods on a known path.
{
my $p;
lives_ok {$p = $m->properties_hr('/f1') } 'properties_hr on model direct lives';
my $mime;
lives_ok {$mime = $m->propget('/f1', 'svn:mime-type')} 'propget on model direct lives';
is(ref($p), 'HASH', 'properties_hr returns hashref');
is($mime, 'text/plain', 'mime type from propget as expected');
my $expected = {
'svn:mime-type' => $mime,
'svn:entry:committed-rev' => '3',
'svn:entry:committed-date' => $p->{'svn:entry:committed-date'},
'svn:entry:uuid' => $p->{'svn:entry:uuid'},
};
is_deeply($p, $expected, 'properties_hr returns expected hashref');
}
# Tests for the directory returned (/)
my $d = $l->[1]; # Get back /subdir (2nd item in list)
isa_ok($d, 'Catalyst::Model::SVN::Item', 'ls returns list of Catalyst::Model::SVN::Item objects');
is($d->name, 'subdir', 'Name of top level directory as expected');
#print STDERR "\n\n" . $d->is_file . "\n\n";
ok(!$d->is_file, 'd is not file');
ok($d->is_directory, 'd is directory');
ok(!defined($d->contents()), 'Directory contents undef');
# test resolve_copy on moved file, older revision
lives_ok {
ok($m->cat($repos_uri .'subdir/f2.moved', 3), 'resolve_copy in cat');
my $olddir = $m->ls('subdir/', 3);
my $oldfile = (grep { $_->name =~ /s3/ } @$olddir)[0];
my $l = $oldfile->log;
my $n = $oldfile->name;
ok($l, 'resolve_copy in log');
} 'resolve_copy testing';
# FIXME - check coverage for resolve_copy testing.
# $testlib goes out of scope, and automatically cleans up.