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

# Test User::Identity::Collection

use lib qw/. ../;
use Test::More tests => 44;

BEGIN {
   use_ok('User::Identity::Collection::Locations');
   use_ok('User::Identity');
}

my $ui   = 'User::Identity';
my $uil  = 'User::Identity::Location';
my $uic  = 'User::Identity::Collection';
my $uicl = 'User::Identity::Collection::Locations';

sub same_obj($$$)
{  my ($l, $r, $msg) = @_;
   is("$l", "$r", $msg);
}

#
# We need a user to test with
#

my $user = $ui->new('markov'
 , firstname => 'Mark', surname => 'Overmeer'
 , titles => 'drs.',    initials => 'M.A.C.J.'
 , language => 'nl-NL', charset => 'iso-8859-15'
 );

ok(defined $user,                              "Created a user");

#
# Now an location
#

my $loc = $uil->new
 ( 'home'
 , street       => 'Pad 12'
 , postal_code  => '66341 XA'
 , city         => 'Arnhem'
 , country      => 'Nederland'
 , country_code => 'nl'
 , phone        => '+18-12-2344556'
 , fax          => '+11-11-2344556'
 );

ok(defined $loc,                              "Created a location");
ok(!defined $loc->user,                       "User-less location");

#
# Now a location collection
#

my $col = $uicl->new;
ok(defined $col,                              "Created a location collection");
isa_ok($col, $uic,                            "Is a collection");
isa_ok($col, $uicl,                           "Correct collection");

cmp_ok($col->roles, '==', 0,                  "No roles yet");
cmp_ok(scalar @$col, '==', 0,                 "No overloaded roles yet");

ok(! defined $loc->parent,                    "Role has no parent yet");
same_obj($loc, $col->addRole($loc),           "Add prepared role");
cmp_ok($col->roles, '==', 1,                  "First role in collection");
same_obj($loc->parent, $col,                  "Role's parent is collection");
cmp_ok(scalar @$col, '==', 1,                 "One overloaded role");
same_obj($col->[0], $loc,                     "The role is there");
is("$col", "locations: home");

ok(!defined $loc->user,                       "User-less location");
same_obj($user->addCollection($col), $col,    "Adding collection to a user");
same_obj($col->user, $user,                   "User of collection");
same_obj($col->[0]->user, $user,              "User of collection item");


#
# find collection in ui
#

my $l = $user->collection('locations');
ok(defined $l,                                "Find locations");
isa_ok($l, $uicl);

my $l2 = $user->collection('location');
ok(defined $l,                                "Find location");
same_obj($l, $l2,                             "location==locations");

my $e = $user->collection('email');
ok(! defined $e,                              "Not available email");

#
# Fast forward location
#

my $w = $user->add(location => [ work => street => 'at home' ]);
ok(defined $w,                                "Work location created");
isa_ok($w, $uil);
same_obj($w->user, $user,                     "Knows about user");
cmp_ok(scalar $col->roles, '==', 2,           "Found pre-defined collection");
cmp_ok(@$col, '==', 2,                        "Visible in overload as well");
is("$col", "locations: home, work",           "Stringification");

#
# Find
#

my $f = $user->find(location => 'work');
ok(defined $f,                                 "Found anything");
same_obj($w, $f,                               "Found work back");

$f = $user->find(location => 'unknown');
ok(! defined $f,                               "Unknown role");

$f = $user->find(unknown => 'work');
ok(! defined $f,                               "Unknown collection");

#
# Add a whole new group at once
#

ok(! $user->find(email => 'private'));

$w = $user->add(email => [ private => address => 'markov@cpan.org' ]);
ok(defined $w,                                  "Private email created");
$col = $user->collection('email');
ok(defined $col,                                "Email collection created");
isa_ok($col, $uic);
isa_ok($col, "${uic}::Emails");

$f = $user->find(email => 'private');
ok(defined $f,                                  "Found anything");
isa_ok($f, "${ui}::Item");
isa_ok($f, "Mail::Identity");