# $Id: 02-singletonness.t,v 1.6 2008-06-24 17:33:32 cantrelld Exp $

use strict;
use warnings;

use Test::More tests => 10;
use File::Temp;
use DBI;
use Data::Dumper;

use lib qw(t/lib);

use DBIx::Class::SingletonRows::Tests::TestSchema;

my $dbname = File::Temp->new();

my $dbh = DBI->connect("dbi:SQLite:dbname=$dbname", '', '');
$dbh->do("
    CREATE TABLE hlagh (
        key1 INT,
        key2 INT,
        somedata VARCHAR(256),
        PRIMARY KEY (key1, key2)
    )
");
$dbh->do("
    INSERT INTO hlagh (key1, key2, somedata) VALUES (1, 2, 'three')
");

my $schema = DBIx::Class::SingletonRows::Tests::TestSchema->connect(
    "dbi:SQLite:dbname=$dbname"
);

{ 
    my $outer_row = ($schema->resultset('Hlagh')->search({key1 => 1, key2 => 2}))[0];
    ok($outer_row->somedata() eq 'three', "'outer' row has right data");
    {
        my $inner_row = update_and_return();
        ok($inner_row->somedata() eq 'four', "'inner' row got updated data");
        ok($outer_row->somedata() eq 'four', "and 'outer' row was magickally updated");
        ok(2 == $inner_row->_DCS_refcount(), "refcount == 2 in cache");
        ok(
            $outer_row->isa('DBIx::Class::SingletonRows::Tests::TestSchema::Hlagh'),
            "cached object pretends to be the right type"
        );
        {
            no strict;
            is_deeply(
                [@{ref($outer_row)."::ISA"}],
                [],
                "but \@ISA knows the truth"
            );
        }
        ok(
            $outer_row->can('set_inflated_columns'),
            "cached object says that it can('method')"
        );
    }
    ok(1 == $outer_row->_DCS_refcount(), "'inner' var went out of scope, refcount == 1 in cache");
    ok($outer_row->somedata() eq 'four', "'outer' row still magickally updated");
}

is_deeply(
    $DBIx::Class::SingletonRows::cache->{'DBIx::Class::SingletonRows::Tests::TestSchema::Hlagh'},
    {},
    "'outer' var now out of scope, object expired from cache"
);

sub update_and_return {
    my $row = ($schema->resultset('Hlagh')->search({key1 => 1, key2 => 2}))[0];
    $row->somedata('four');
    $row->update();
    return $row;
}
