package Mail::Action::AddressTest; use strict; use warnings; use base 'Test::Class'; use Test::More; sub module { 'Mail::Action::Address::Base' }; sub startup :Test( startup => 2 ) { my $self = shift; my $module = $self->module(); use_ok( 'Mail::Action::Address' ); use_ok( $module ); } sub setup :Test( setup => 1 ) { my $self = shift; my $module = $self->module(); $self->{address} = $module->new(); isa_ok( $self->{address}, $module ); } sub test_description :Test( 4 ) { my $self = shift; my $add = $self->{address}; can_ok( $add, 'description' ); is( $add->description(), '', 'description() should be blank unless set in constructor' ); $add->{description} = 'now set'; is( $add->description(), 'now set', '... or whatever is set in constructor' ); $add->description( 'set here' ); is( $add->description(), 'set here', '... and should be able to set description' ); } sub test_name :Test( 4 ) { my $self = shift; my $add = $self->{address}; can_ok( $add, 'name' ); is( $add->name(), undef, 'name() should be undef unless set in constructor' ); $add->{name} = 'newname'; is( $add->name(), 'newname', '... or whatever is set' ); $add->name( '!my Name$ ' ); is( $add->name(), 'myName', '... or cleaned name, if mutator' ); } sub test_process_time :Test( 8 ) { my $self = shift; my $add = $self->{address}; can_ok( $add, 'process_time' ); is( $add->process_time( 100 ), 100, 'process_time() should return raw seconds directly' ); is( $add->process_time( '1d' ), 24 * 60 * 60, '... processing days correctly' ); is( $add->process_time( '2w' ), 2 * 7 * 24 * 60 * 60, '... processing weeks correctly' ); is( $add->process_time( '4h' ), 4 * 60 * 60, '... processing hours correctly' ); is( $add->process_time( '8m' ), 8 * 60, '... processing minutes correctly' ); is( $add->process_time( '16M' ), 16 * 30 * 24 * 60 * 60, '... processing months correctly' ); is( $add->process_time( '1M2w3d4h5m' ), 30 * 24 * 60 * 60 + 2 * 7 * 24 * 60 * 60 + 3 * 24 * 60 * 60 + 4 * 60 * 60 + 5 * 60, '... even in a nice list' ); } sub test_expires :Test( 5 ) { my $self = shift; my $add = $self->{address}; my $module = $self->module(); can_ok( $add, 'expires' ); is( $add->expires(), 0, 'expires() should default to 0 unless set in constructor' ); $add = $module->new( expires => 1003 ); is( $add->expires(), 1003, 'expires() should report expiration time from constructor' ); my $expiration = time() + 100; $add->expires( 100 ); ok( $add->expires() - $expiration < 10, '... and should set expiration' ) or diag "Possible clock skew: (" . $add->expires() . ") [$expiration]\n"; my $time = time() + 7 * 24 * 60 * 60; is( $add->expires( '7d' ), $time, '... parsing days correctly' ); } package Mail::Action::Address::Base; BEGIN { $INC{'Mail/Action/Address/Base.pm'} = 1 } use Mail::Action::Address; use Class::Roles does => 'address_expires', does => 'address_named', does => 'address_described'; sub new { my ($class, %args) = @_; bless \%args, $class; } 1;