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 )