App-MtAws
view release on metacpan or search on metacpan
t/unit/cmd_sync.t view on Meta::CPAN
describe "detect=mtime-and-treehash" => sub {
it "should return 'treehash' when mtime differs" => sub {
test_should_upload('mtime-and-treehash', 1, 0, App::MtAws::Command::Sync::SHOULD_TREEHASH());
};
it "should return FALSE when mtime same" => sub {
test_should_upload('mtime-and-treehash', 0, 0, App::MtAws::Command::Sync::SHOULD_NOACTION());
};
};
describe "detect=mtime-or-treehash" => sub {
it "should return 'create' when mtime differs" => sub {
test_should_upload('mtime-or-treehash', 1, 0, App::MtAws::Command::Sync::SHOULD_CREATE());
};
it "should return 'treehash' when mtime same" => sub {
test_should_upload('mtime-or-treehash', 0, 0, App::MtAws::Command::Sync::SHOULD_TREEHASH());
};
};
describe "detect=always-positive" => sub {
it "should return 'create' always" => sub {
test_should_upload('always-positive', undef, undef, App::MtAws::Command::Sync::SHOULD_CREATE());
};
};
describe "detect=size-only" => sub {
it "should return 'create' if size differs" => sub {
test_should_upload('size-only', undef, 1, App::MtAws::Command::Sync::SHOULD_CREATE());
};
it "should return 'no action' if size same" => sub {
test_should_upload('size-only', undef, 0, App::MtAws::Command::Sync::SHOULD_NOACTION());
};
};
describe "detect is unknown" => sub {
my $file = {mtime => 123, size => 42};
App::MtAws::Command::Sync->expects("file_size")->returns(42)->once;
ok ! defined eval { App::MtAws::Command::Sync::should_upload({detect => 'xyz'}, $file, 'file1'); 1; };
ok $@ =~ /Invalid detect option in should_upload/;
}
};
describe "next_modified" => sub {
my $options;
before each => sub {
$options = { partsize => 2};
};
sub expect_should_upload
{
my ($options, $j, $file, $toreturn) = @_;
App::MtAws::Command::Sync->expects("should_upload")->returns(sub {
my ($opt, $f, $absfilename) = @_;
cmp_deeply $opt, $options;
cmp_deeply $f, $file;
is $absfilename, $j->absfilename($file->{relfilename});
return $toreturn;
})->once;
}
sub verify_create_job
{
my ($options, $j, $file, $rec) = @_;
ok $rec->isa('App::MtAws::QueueJob::Upload');
is $rec->{partsize}, $options->{partsize}*1024*1024;
is $rec->{relfilename}, $file->{relfilename};
is $rec->{filename}, $j->absfilename($file->{relfilename});
ok $rec->{delete_after_upload};
is $rec->{archive_id}, $file->{archive_id};
}
sub verify_treehash_job
{
my ($options, $j, $file, $rec) = @_;
ok $rec->isa('App::MtAws::QueueJob::VerifyAndUpload');
is $rec->{filename}, $j->absfilename($file->{relfilename});
is $rec->{relfilename}, $file->{relfilename};
ok $rec->{delete_after_upload};
is $rec->{archive_id}, $file->{archive_id};
is $rec->{treehash}, $file->{treehash};
is $rec->{partsize}, $options->{partsize}*1024*1024;
}
it "should work with zero files" => sub {
$j->{listing}{existing} = [];
ok !defined App::MtAws::Command::Sync::next_modified($options, $j);
};
it "should work when should_upload returns SHOULD_CREATE" => sub {
my $file = {relfilename => 'file1', archive_id => 'zz1'};
$j->{listing}{existing} = [$file];
$j->_add_filename($file);
expect_should_upload($options, $j, $file, App::MtAws::Command::Sync::SHOULD_CREATE());
my $rec = App::MtAws::Command::Sync::next_modified($options, $j);
verify_create_job($options, $j, $file, $rec);
is scalar @{ $j->{listing}{existing} }, 0;
ok !defined (App::MtAws::Command::Sync::next_modified($options, $j));
};
it "should work with two files" => sub {
my $file1 = {relfilename => 'file1', archive_id => 'zz1'};
my $file2 = {relfilename => 'file2', archive_id => 'zz2'};
$j->{listing}{existing} = [$file1, $file2];
$j->_add_filename($file1);
$j->_add_filename($file2);
expect_should_upload($options, $j, $file1, App::MtAws::Command::Sync::SHOULD_CREATE());
my $rec = App::MtAws::Command::Sync::next_modified($options, $j);
verify_create_job($options, $j, $file1, $rec);
is scalar @{ $j->{listing}{existing} }, 1;
expect_should_upload($options, $j, $file2, App::MtAws::Command::Sync::SHOULD_CREATE());
$rec = App::MtAws::Command::Sync::next_modified($options, $j);
verify_create_job($options, $j, $file2, $rec);
};
it "should work with latest version of file" => sub {
my $file = {relfilename => 'file1', size => 123};
$j->{listing}{existing} = [$file];
$j->_add_filename({relfilename => 'file1', archive_id => 'zz1', size => 123, time => 42, mtime => 111, , treehash => 'abc0'});
$j->_add_filename(my $r = {relfilename => 'file1', archive_id => 'zz2', size => 123, time => 42, mtime => 113, treehash => 'abc'});
$j->_add_filename({relfilename => 'file1', archive_id => 'zz3', size => 123, time => 42, mtime => 112, , treehash => 'abc2'});
expect_should_upload($options, $j, $r, App::MtAws::Command::Sync::SHOULD_TREEHASH());
my $rec = App::MtAws::Command::Sync::next_modified($options, $j);
verify_treehash_job($options, $j, $r, $rec);
is scalar @{ $j->{listing}{existing} }, 0;
};
it "should call latest() to get latest version of file" => sub {
my $file = {relfilename => 'file1', size => 123};
$j->{listing}{existing} = [$file];
$j->_add_filename({relfilename => 'file1', archive_id => 'zz1', size => 123, time => 42, mtime => 111, , treehash => 'abc0'});
$j->_add_filename(my $r = {relfilename => 'file1', archive_id => 'zz2', size => 123, time => 42, mtime => 113, treehash => 'abc'});
$j->_add_filename({relfilename => 'file1', archive_id => 'zz3', size => 123, time => 42, mtime => 112, , treehash => 'abc2'});
expect_should_upload($options, $j, $r, App::MtAws::Command::Sync::SHOULD_TREEHASH());
App::MtAws::Journal->expects("latest")->returns(sub{ is $_[1], "file1"; $r})->once;
App::MtAws::Command::Sync::next_modified($options, $j);
};
it "should work when should_upload returns SHOULD_TREEHASH" => sub {
my $file = {relfilename => 'file1', archive_id => 'zz1', treehash => 'abcdef'};
$j->{listing}{existing} = [$file];
$j->_add_filename($file);
expect_should_upload($options, $j, $file, App::MtAws::Command::Sync::SHOULD_TREEHASH());
my $rec = App::MtAws::Command::Sync::next_modified($options, $j);
verify_treehash_job($options, $j, $file, $rec);
is scalar @{ $j->{listing}{existing} }, 0;
ok !defined (App::MtAws::Command::Sync::next_modified($options, $j));
};
it "should skip to next file when should_upload returns SHOULD_NOACTION" => sub {
for (1..10) {
my $file = {relfilename => "file$_", archive_id => "zz$_"};
push @{ $j->{listing}{existing} }, $file;
$j->_add_filename($file);
}
my $file;
App::MtAws::Command::Sync->expects("should_upload")->returns(sub {
my ($opt, $f, $absfilename) = @_;
$file = $f;
return $f->{relfilename} eq 'file7' ? App::MtAws::Command::Sync::SHOULD_CREATE() : App::MtAws::Command::Sync::SHOULD_NOACTION();
})->exactly(10);
my $rec = App::MtAws::Command::Sync::next_modified($options, $j);
verify_create_job($options, $j, $file, $rec);
is scalar @{ $j->{listing}{existing} }, 3;
ok !defined App::MtAws::Command::Sync::next_modified($options, $j);
};
it "should confess when should_upload returns something else" => sub {
my $file = {relfilename => 'file1', archive_id => 'zz1'};
$j->{listing}{existing} = [$file];
$j->_add_filename($file);
expect_should_upload($options, $j, $file, 7656348);
ok !defined eval{ App::MtAws::Command::Sync::next_modified($options, $j); 1};
ok $@ =~ /Unknown value returned by should_upload/;
};
};
};
describe "next_new" => sub {
my $options;
before each => sub {
$options = { partsize => 2};
};
it "should work with one file" => sub {
$j->{listing}{new} = [{relfilename => 'file1'}];
my $rec = App::MtAws::Command::Sync::next_new($options, $j);
ok $rec->isa('App::MtAws::QueueJob::Upload');
is $rec->{partsize}, $options->{partsize}*1024*1024;
is $rec->{relfilename}, 'file1';
is $rec->{filename}, $j->absfilename('file1');
ok !$rec->{delete_after_upload};
is scalar @{ $j->{listing}{new} }, 0;
ok !defined (App::MtAws::Command::Sync::next_new($options, $j));
};
it "should work with two files" => sub {
$j->{listing}{new} = [{relfilename => 'file1'}, {relfilename => 'file2'}];
my $rec = App::MtAws::Command::Sync::next_new($options, $j);
ok $rec->isa('App::MtAws::QueueJob::Upload');
is $rec->{relfilename}, 'file1';
is scalar @{ $j->{listing}{new} }, 1;
$rec = App::MtAws::Command::Sync::next_new($options, $j);
is $rec->{relfilename}, 'file2';
};
it "should work with zero files" => sub {
$j->{listing}{new} = [];
ok ! defined( App::MtAws::Command::Sync::next_new($options, $j) );
};
};
describe "next_missing" => sub {
my $options;
before each => sub {
$options = { };
};
it "should work with one file" => sub {
my $r = {relfilename => 'file1', archive_id => 'somearchive'};
$j->{listing}{missing} = [{relfilename => $r->{relfilename}}];
$j->_add_filename($r);
my $rec = App::MtAws::Command::Sync::next_missing($options, $j);
ok $rec->isa('App::MtAws::QueueJob::Delete');
is $rec->{archive_id}, 'somearchive';
( run in 0.901 second using v1.01-cache-2.11-cpan-13bb782fe5a )