Amazon-S3-Lite

 view release on metacpan or  search on metacpan

t/01-s3-lite.t  view on Meta::CPAN

#!/usr/bin/env perl

use strict;
use warnings;

use Test::More;
use File::Temp qw(tempfile);
use Data::Dumper;
use Digest::MD5 qw(md5_hex);
use MIME::Base64 qw(encode_base64);
use Digest::MD5 qw(md5);
use JSON::PP;

use Amazon::S3::Lite;
use Amazon::S3::Lite::Logger;
use Amazon::S3::Lite::Credentials;

########################################################################
# Helpers
########################################################################

my $LOCALSTACK = 'http://localhost:4566';

sub localstack_available {
  # Require explicit opt-in to avoid hitting unrelated services on port 4566
  return 0 if !$ENV{TEST_LOCALSTACK};

  require HTTP::Tiny;

  my $res = eval { HTTP::Tiny->new( timeout => 2 )->get("$LOCALSTACK/_localstack/health"); };

  return 0 if $@ || !$res;

  # Verify it's actually LocalStack by checking the response body
  return 0 if $res->{status} != 200;
  my $status = JSON::PP->new->decode( $res->{content} );

  return $status->{services}{s3} =~ /^(?:available|running)$/xsm;
}

sub new_s3 {
  return Amazon::S3::Lite->new(
    { region                => 'us-east-1',
      aws_access_key_id     => 'test',
      aws_secret_access_key => 'test',
      @_,
    }
  );
}

sub new_localstack_s3 {
  return new_s3(
    host   => 'localhost:4566',
    secure => 0,
  );
}

# Returns a mock _request sub that captures calls and returns a canned response
sub mock_request {
  my (%args)   = @_;
  my $status   = $args{status}  // 200;
  my $content  = $args{content} // '';
  my $headers  = $args{headers} // {};
  my $captured = $args{capture};

  return sub {
    my ( $self, $method, $url, $req_headers, $body, $extra, $region ) = @_;
    if ($captured) {



( run in 0.534 second using v1.01-cache-2.11-cpan-80ec619307d )