The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use Test::More;
use Data::Printer;

use 5.014;

if (!eval { require Socket; Socket::inet_aton('www.easypost.co') }) {
    plan skip_all => "Cannot connect to the API server";
} 

# 60 second connection timeout
$ENV{MOJO_CONNECT_TIMEOUT} = 60;

plan tests => 14;

use Net::Easypost;

my $ezpost = Net::Easypost->new( access_code => 'cueqNZUb3ldeWTNX7MU3Mel8UXtaAMUi' );
isa_ok($ezpost, 'Net::Easypost', 'object created');

my $addr = $ezpost->verify_address( {
        street1 => '388 Townsend St', 
        street2 => 'Apt 20', 
        city => 'San Francisco',
        zip => '94107',
        name => 'Zaphod'
} );

is($addr->state, 'CA', 'got right state');
is($addr->name, 'Zaphod', 'name copied');
like(sprintf($addr), qr/Zaphod\n/xms, 'address stringified');

use Net::Easypost::Address;
use Net::Easypost::Parcel;

my @rates = $ezpost->get_rates(
          to => Net::Easypost::Address->new( role => 'to', zip => '94107'),
        from => Net::Easypost::Address->new( role => 'from', zip => '94019'), 
      parcel => Net::Easypost::Parcel->new ( 
          length => 10.0, 
          width => 5.0,
          height => 8.0,
          weight => 100.0
      )
);

cmp_ok(scalar @rates, '>', 4, 'got more than 4 rates');
isa_ok($rates[0], 'Net::Easypost::Rate', 'element correctly');
like($rates[0]->carrier, qr/USPS|UPS|FedEx/, 'carrier is correct');

use Net::Easypost::Rate;

my $to = $addr->clone;
$to->role('to');
$to->name('Jon Calhoun');

my $from = Net::Easypost::Address->new(
    role => 'from',
    name => 'Jarrett Streebin',
    phone => '3237078576',
    city => 'Half Moon Bay',
    street1 => '310 Granelli Ave',
    state => 'CA',
    zip => '94019',
);

my $parcel = Net::Easypost::Parcel->new(
    length => 10.0,
    width => 5.0,
    height => 8.0,
    weight => 10.0,
);

my $rate = Net::Easypost::Rate->new(
    service => 'Priority',
);

my $label = $ezpost->buy_label($to, $from, $parcel, $rate);

is($label->has_url, 1, 'has url!');
is($label->has_image, '', 'has no image');
my $image_size = length $label->image;
is($image_size > 1000, 1, 'image is 1k or more');
is($label->has_image, 1, 'has image');
like($label->filename, qr/\.png/, 'got png again!');
like($label->tracking_code, qr/[0-9]+/, 'got correct test tracking code');
$label->save;
is(-e $label->filename, 1, 'image file exists');

unlink $label->filename;