The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Test::More tests => 27;
use lib 't/lib';
use Data::Dump qw( dump );
use DBICx::TestDatabase;

use_ok('MyDBIC::Schema');

ok( my $cd = MyDBIC::Schema->class('Cd'), "Cd class" );
ok( my $m2m_tracks = $cd->relationship_info('cd_tracks'),
    "get m2m info for cd_tracks" );
ok( exists $m2m_tracks->{m2m}, "cd_tracks is a m2m" );
is_deeply(
    $m2m_tracks,
    {   attrs => {
            accessor       => "multi",
            cascade_copy   => 1,
            cascade_delete => 1,
            join_type      => "LEFT",
        },
        class => "MyDBIC::Schema::CdTrackJoin",
        cond  => { "foreign.cdid" => "self.cdid" },
        m2m   => {
            class           => "MyDBIC::Schema::Cd",
            class_column    => 'cdid',
            foreign_class   => "MyDBIC::Schema::Track",
            foreign_column  => 'trackid',
            map_class       => "MyDBIC::Schema::CdTrackJoin",
            map_from        => "cd",
            map_from_column => "cdid",
            map_to          => "track",
            map_to_column   => "trackid",
            method_name     => "tracks",
            rel_name        => "cd_tracks",
        },
        source => "MyDBIC::Schema::CdTrackJoin",
    },
    "cd_tracks deep hash structure"
);

ok( my $track   = MyDBIC::Schema->class('Track'),         "Track class" );
ok( my $m2m_cds = $track->relationship_info('track_cds'), "track_cds" );
ok( exists $m2m_cds->{m2m}, "track_cds is a m2m" );
is_deeply(
    $m2m_cds,
    {   attrs => {
            accessor       => "multi",
            cascade_copy   => 1,
            cascade_delete => 1,
            join_type      => "LEFT",
        },
        class => "MyDBIC::Schema::CdTrackJoin",
        cond  => { "foreign.trackid" => "self.trackid" },
        m2m   => {
            class           => "MyDBIC::Schema::Track",
            class_column    => 'trackid',
            foreign_class   => "MyDBIC::Schema::Cd",
            foreign_column  => 'cdid',
            map_class       => "MyDBIC::Schema::CdTrackJoin",
            map_from        => "track",
            map_from_column => "trackid",
            map_to          => "cd",
            map_to_column   => "cdid",
            method_name     => "cds",
            rel_name        => "track_cds",
        },
        source => "MyDBIC::Schema::CdTrackJoin",
    },
    "track_cds deep hash structure"
);

# test some data

ok( my $schema = DBICx::TestDatabase->new('MyDBIC::Schema'),
    "create temp db" );

ok( $schema->resultset('Artist')
        ->create( { artistid => 1, name => "bruce cockburn" } ),
    "create artist 1"
);

ok( $schema->resultset('Cd')
        ->create( { cdid => 1, artist => 1, title => 'best of' } ),
    "create cd 1"
);

ok( $schema->resultset('Cd')
        ->create( { cdid => 2, artist => 1, title => 'sunwheel dance' } ),
    "create cd 2"
);

ok( $schema->resultset('Track')->create(
        {   trackid => 1,
            title   => 'dialogue with the devil'
        }
    ),
    "create track 1"
);

ok( $schema->resultset('Track')->create(
        {   trackid => 2,
            title   => 'goin down slow'
        }
    ),
    "create track 2"
);

ok( $schema->resultset('CdTrackJoin')->create( { cdid => 1, trackid => 2 } ),
    "going down slow on best of"
);
ok( $schema->resultset('CdTrackJoin')->create( { cdid => 2, trackid => 2 } ),
    "going down slow on sunwheel dance"
);
ok( $schema->resultset('CdTrackJoin')->create( { cdid => 2, trackid => 1 } ),
    "dialogue on sunwheel dance"
);

ok( my $cd1 = $schema->resultset('Cd')->find( { cdid => 1 } ), "fetch cd 1" );
is( $cd1->has_related('tracks'), 1, $cd1->title . " has 1 tracks" );
ok( my $cd2 = $schema->resultset('Cd')->find( { cdid => 2 } ), "fetch cd 2" );
is( $cd2->has_related('tracks'), 2, $cd2->title . " has 2 tracks" );

# column_is_boolean
ok( $cd1->column_is_boolean('test_boolean'), "column_is_boolean" );
ok( !$cd1->column_is_boolean('artist'),      "column_is_boolean" );

# m2m to itself must be tested in a resultsource object not class
is_deeply(
    $cd1->relationship_info('relationships'),
    {   attrs => {
            accessor       => "multi",
            cascade_copy   => 1,
            cascade_delete => 1,
            join_type      => "LEFT",
        },
        class => "MyDBIC::Schema::CdToItself",
        cond  => { "foreign.cdid_one" => "self.cdid" },
        m2m   => {
            class           => "MyDBIC::Schema::Cd",
            class_column    => "cdid",
            foreign_class   => "MyDBIC::Schema::Cd",
            foreign_column  => "cdid",
            map_class       => "MyDBIC::Schema::CdToItself",
            map_from        => "cd",
            map_from_column => "cdid_one",
            map_to          => "related",
            map_to_column   => "cdid_two",
            method_name     => "related_cds",
            rel_name        => "relationships",
        },
        source => "MyDBIC::Schema::CdToItself",
    },
    "m2m to itself"
);

# unique_value
is( $cd1->unique_value, '1', "unique_value" );
is( $cd1->artist->unique_value, 'bruce cockburn', "artist unique value" );