API-Docker
view release on metacpan or search on metacpan
t/lib/Test/API/Docker/Mock.pm view on Meta::CPAN
if (is_live()) {
require API::Docker;
return API::Docker->new(host => $ENV{API_DOCKER_TEST_HOST});
}
return _mock_docker(%routes);
}
sub _mock_docker {
my (%routes) = @_;
unless (grep { /version/ } keys %routes) {
$routes{'GET /version'} = load_fixture('system_version');
}
require API::Docker;
my $docker = API::Docker->new(
host => 'unix:///var/run/docker.sock',
api_version => '1.47',
);
my $mock_request = sub {
my ($self, $method, $path, %opts) = @_;
my $clean_path = $path;
$clean_path =~ s{^/v[\d.]+}{};
my $key = "$method $clean_path";
if (exists $routes{$key}) {
my $handler = $routes{$key};
if (ref $handler eq 'CODE') {
return $handler->($method, $clean_path, %opts);
}
return $handler;
}
for my $pattern (keys %routes) {
my ($route_method, $route_path) = split /\s+/, $pattern, 2;
next unless $method eq $route_method;
if ($clean_path =~ m{^$route_path$}) {
my $handler = $routes{$pattern};
if (ref $handler eq 'CODE') {
return $handler->($method, $clean_path, %opts);
}
return $handler;
}
}
croak "No mock route for: $key (available: " . join(', ', sort keys %routes) . ")";
};
my $mock_pkg = "API::Docker::Mock::" . int(rand(1_000_000));
{
no strict 'refs';
@{"${mock_pkg}::ISA"} = ('API::Docker');
*{"${mock_pkg}::_request"} = $mock_request;
}
bless $docker, $mock_pkg;
return $docker;
}
END { _run_cleanups() }
1;
( run in 0.474 second using v1.01-cache-2.11-cpan-0b5f733616e )