use strict; use warnings; use Test::More 'no_plan'; # use Test::More tests => 2; # use Test::More; # plan tests => 1; use Data::Dumper; sub d { return warn Data::Dumper->new( [@_] )->Indent(1)->Deparse(1)->Sortkeys(1) ->Terse(1)->Dump; } use vars qw($class); BEGIN { $class = 'Items'; use_ok($class) or BAIL_OUT('Cannot load module'); } my @names = qw( Doc Grumpy Happy Sneezy Bashful Sleepy Dopey ); my @items = (); # Item creators for my $name (@names) { my $item = $class->new( name => $name ); is(ref $item, $class, 'Item created.'); push @items, $item; cmp_ok($item->id, '==', scalar @items, 'ID auto-incremented.'); } # Item retrievers is($class->retrieve(1 + scalar @items), undef, 'Invalid object'); my $item = $class->retrieve(1); is(ref $item, $class, 'Item retrieved: object'); is_deeply($item, $items[0], 'Item persistence'); # Item lazy accessors is($item->id, 1, 'Accessors: id'); is($item->name, $names[0], 'Accessors: name'); is($item->foo, undef, 'Accessors: foo'); # Item mutators is($item->id(666), 1, 'Item update: ID - ignored'); is($item->name('FooBar'), 'FooBar', 'Item update: name'); # Item inflaters my $foo = eval { $item->foo->bar }; isnt($@, q{}, 'Invalid inflater'); like($item->created, qr/^\d+$/, 'Not inflated: created'); my $dt = eval { $item->created->clone }; is(ref $dt, 'DateTime', 'Inflated: created'); # let's make an inflater... $class->inflater( email => sub { my $self = shift; require Email::Address; return Email::Address->new($self->name, $self->email); }); my $email = 'foo@example.com'; is($item->email($email), $email, 'Set email'); is($item->email->address, $email, 'Inflated: email');