App-dozo
view release on metacpan or search on metacpan
xt/author/docker_dozo.t view on Meta::CPAN
use v5.14;
use warnings;
use utf8;
use Test::More;
use File::Spec;
use File::Temp qw(tempdir);
my $dozo = File::Spec->rel2abs('script/dozo');
# Use empty temp dir to avoid reading any .dozorc (HOME, git top, cwd)
my $empty_home = tempdir(CLEANUP => 1);
$ENV{HOME} = $empty_home;
chdir $empty_home or die "Cannot chdir to $empty_home: $!";
# Docker-dependent tests
SKIP: {
my $docker_available = system('docker info >/dev/null 2>&1') == 0;
skip 'Docker not available', 4 unless $docker_available;
subtest 'run simple command' => sub {
my $out = `$dozo -I alpine:latest -B echo hello 2>&1`;
like($out, qr/hello/, 'can run echo command in container');
};
subtest 'command with options' => sub {
my $out = `$dozo -I alpine:latest -B ls -la / 2>&1`;
like($out, qr/root/, 'ls -la works (command options passed correctly)');
};
subtest 'environment variable' => sub {
my $out = `$dozo -I alpine:latest -B -E TEST_VAR=hello sh -c 'echo \$TEST_VAR' 2>&1`;
like($out, qr/hello/, 'environment variable is passed');
};
subtest 'unmount option' => sub {
my $out = `$dozo -I alpine:latest -B -U pwd 2>&1`;
like($out, qr{^/$}m, '-U unmount option works (working dir is /)');
};
subtest 'live container' => sub {
my $image = 'alpine:latest';
my $container = 'dozo-test-live';
# Clean up any existing container
`$dozo -I $image -N $container -K 2>&1`;
# Create live container with sleep to keep it running (detached)
`docker run -d --name $container $image sleep 60 2>&1`;
# Run command in existing running container
my $out = `$dozo -I $image -N $container -L -B echo world 2>&1`;
unlike($out, qr/create live container/, 'uses existing container');
like($out, qr/world/, 'command runs via exec in running container');
# Stop container and verify restart
`docker stop $container 2>&1`;
$out = `$dozo -I $image -N $container -L -B echo restarted 2>&1`;
like($out, qr/restarting exited container $container/, 'restarts stopped container');
# Kill and recreate
$out = `$dozo -I $image -N $container -KL -B echo recreated 2>&1`;
like($out, qr/removed|create live container/, 'kills and recreates');
like($out, qr/recreated/, 'command runs in new container');
# Clean up
`$dozo -I $image -N $container -K 2>&1`;
};
subtest 'dryrun mode' => sub {
my $image = 'alpine:latest';
my $container = 'dozo-test-dryrun';
# Clean up
`$dozo -I $image -N $container -K 2>&1`;
# Dryrun without existing container
my $out = `$dozo -I $image -N $container -Ln -B echo test 2>&1`;
like($out, qr/create live container/, 'dryrun shows create message');
like($out, qr/^docker run\b/m, 'dryrun shows docker run command');
unlike($out, qr/^test$/m, 'command not actually executed');
# Create container for next tests
`$dozo -I $image -N $container -L -B true 2>&1`;
# Dryrun with existing running container
$out = `$dozo -I $image -N $container -Ln -B echo test 2>&1`;
like($out, qr/^docker exec\b/m, 'dryrun shows docker exec command');
# Stop container and test dryrun
`docker stop $container 2>&1`;
$out = `$dozo -I $image -N $container -Ln -B echo test 2>&1`;
like($out, qr/restarting exited container/, 'dryrun shows restart message');
like($out, qr/^docker exec\b/m, 'dryrun shows docker exec after start');
# Clean up
`$dozo -I $image -N $container -K 2>&1`;
};
}
done_testing;
( run in 0.768 second using v1.01-cache-2.11-cpan-39bf76dae61 )