Azure-Storage-Blob-Client

 view release on metacpan or  search on metacpan

t/Azure/Storage/Blob/Client/Service/Signer.t  view on Meta::CPAN

#!/usr/bin/env perl
use v5.10;
use strict;
use warnings;

use Test::Spec::Acceptance;
use Test::MockTime 'set_fixed_time', 'restore_time';
use HTTP::Request;
use HTTP::Headers;
use HTTP::Date;
use Encode;
use Azure::Storage::Blob::Client::Service::Signer;

Feature 'calculate_signature' => sub {
  my ($request, $account_name, $account_key, $signature);
  my $now = '2019-05-06T08:23:01Z'; # Signature is time-dependent

  before all => sub { set_fixed_time($now) };
  after all => sub { restore_time() };

  Scenario 'HTTP request with no body content' => sub {
    # pre-calculated time-dependent signature
    my $expected_signature = 'mnEgYCZthLSJ0jEjTtY4u8t/Ae+lyJMVmA2RR0EU2mI=';

    Given 'an HTTP request with no body' => sub {
      my $headers = HTTP::Headers->new(
        'x-ms-version' => '2018-03-28',
        'Date'=> HTTP::Date::time2str(),
      );
      $request = HTTP::Request->new('GET', 'example.com', $headers);
    };

    And 'a Storage Account \'account_name\' & \'account_key\'' => sub {
      $account_name = 'enzimetestaccount';
      $account_key = 'supersecretstorageaccountkey==';
    };

    When 'calculating the request signature' => sub {
      my $signer = Azure::Storage::Blob::Client::Service::Signer->new();
      $signature = $signer->calculate_signature($request, $account_name, $account_key);
    };

    Then 'it should return the expected signature' => sub {
      cmp_ok($signature, 'eq', $expected_signature);
    };
  };

  Scenario 'HTTP request with body content' => sub {
    # pre-calculated time-dependent signature
    my $expected_signature = 'gyuJ97Kkk65kMFRNDXVDkbdxNLnheamLBgbikxpQJlc=';

    Given 'an HTTP request with body content' => sub {
      my $body = '42';
      my $headers = HTTP::Headers->new(
        'x-ms-version' => '2018-03-28',
        'Date'=> HTTP::Date::time2str(),
        'Content-Length' => length(Encode::encode_utf8($body)),
      );
      $request = HTTP::Request->new('POST', 'example.com', $headers, $body);
    };

    And 'a Storage Account \'account_name\' & \'account_key\'' => sub {
      $account_name = 'enzimetestaccount';
      $account_key = 'supersecretstorageaccountkey==';
    };

    When 'calculating the request signature' => sub {
      my $signer = Azure::Storage::Blob::Client::Service::Signer->new();
      $signature = $signer->calculate_signature($request, $account_name, $account_key);
    };

    Then 'it should return the expected signature' => sub {
      cmp_ok($signature, 'eq', $expected_signature);
    };
  };
};

runtests unless caller;



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