Amazon-S3-Thin

 view release on metacpan or  search on metacpan

xt/91_functional.t  view on Meta::CPAN

use strict;
use warnings;
use Test::More;
use Config::Tiny;

use Amazon::S3::Thin;

if (!$ENV{EXTENDED_TESTING}) {
    plan skip_all => 'Skip functional test because it would call S3 APIs and charge real money. $ENV{EXTENDED_TESTING} is not set.';
}

my $debug = 1;
my $use_https = 1;

my $config_file = $ENV{HOME} . '/.aws/credentials';
my $profile = 's3thin';
my $bucket = $ENV{TEST_S3THIN_BUCKET} || 'dqneo-private-test';

my $crd = Config::Tiny->read($config_file)->{$profile};

sub test_with_existing_bucket {
    my $crd = shift;
    my $arg = shift;
    diag('Testing with existing resources.');

    # This region is that of the bucket used in this test,
    # because in signature v4 we must know the region of a bucket before accessing it.
    my $region = 'ap-northeast-1';

    my %opt = (
        aws_access_key_id => $crd->{aws_access_key_id},
        aws_secret_access_key => $crd->{aws_secret_access_key},
        secure => $use_https,
        signature_version => $arg->{signature_version},
        region => $region,
#        use_path_style => $arg->{use_path_style},
        debug => $debug,
    );

    my $s3client = Amazon::S3::Thin->new(\%opt);
    ok $s3client, 'new';

    # These bucket and key suppose to exists beforehand.
    my $key = 'hello.txt';

    my $response;

    diag('get an existing object in an existing bucket');
    $response = $s3client->get_object($bucket, $key);
    is $response->code , 200;
    is $response->content, "hello world\n";

    diag('list object in an existing bucket');
    $response = $s3client->list_objects($bucket);
    is $response->code , 200;
    like $response->content, qr/hello.txt/;
}

sub test_with_new_bucket {
    my $crd = shift;
    my $arg = shift;
    diag(' region ' . $arg->{region});
    my %opt = (
        aws_access_key_id => $crd->{aws_access_key_id},
        aws_secret_access_key => $crd->{aws_secret_access_key},
        secure => $use_https,
        signature_version => $arg->{signature_version},
        region => $arg->{region},
#        use_path_style => $arg->{use_path_style},
        debug => $debug,
    );
    my $s3client = Amazon::S3::Thin->new(\%opt);
    my $bucket = 's3thin-' . $arg->{region} . $arg->{signature_version}  . time();
    my $response;
    $response = $s3client->put_bucket($bucket);
    is $response->code , 200 , 'create new bucket';

    my $key = 'hobbit.txt';
    my $content = "In a hole in the ground there lived a hobbit.\n";
    $response = $s3client->put_object($bucket, $key, $content);
    is $response->code , 200, 'create new object';
    
    $response = $s3client->list_objects($bucket);
    is $response->code , 200, 'list created objects';
    like $response->content, qr/$key/;

    $response = $s3client->get_object($bucket, $key);
    is $response->code , 200, 'get created object';
    is $response->content, $content;

    $response = $s3client->delete_object($bucket, $key);
    is $response->code , 204 , 'delete created object';
    
    $response = $s3client->delete_bucket($bucket);
    is $response->code , 204, 'delete created bucket';
}

test_with_existing_bucket($crd, {signature_version => 4});
test_with_existing_bucket($crd, {signature_version => 2});

diag('Testing with new resources.');
my @regions = ('ap-northeast-1', 'us-west-1', 'eu-west-1', 'us-east-1');
for my $region (@regions) {
    test_with_new_bucket($crd, {signature_version => 4, region =>$region});
    test_with_new_bucket($crd, {signature_version => 2, region =>$region});
}

done_testing;



( run in 0.691 second using v1.01-cache-2.11-cpan-39bf76dae61 )