Class-Tables

 view release on metacpan or  search on metacpan

test.pl  view on Meta::CPAN

        values ('Fredegar Bolger',2);
    insert into employees (employee_name,department_id)
        values ('Meriadoc Brandybuck',2);
    insert into employees (employee_name,department_id)
        values ('Lotho Sackville-Baggins',4);
    insert into employees (employee_name,department_id)
        values ('Ted Sandyman',4);
    insert into employees (employee_name,department_id)
        values ('Will Whitfoot',4);
    insert into employees (employee_name,department_id)
        values ('Bandobras Took',1);
    insert into employees (employee_name,department_id)
        values ('Folco Boffin',1);
        
    insert into products (name,weight,price)
        values ('Southfarthing Pipeweed',10,200);
    insert into products (name,weight,price)
        values ('Prancing Pony Ale',150,300);
    insert into products (name,weight,price)
        values ('Farmer Cotton Mushrooms',200,150);
    insert into products (name,weight,price)
        values ('Green Dragon Ale',150,350);
    
    insert into purchases
        (purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
        values (2,6,6,'2002-12-10');
    insert into purchases
        (purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
        values (4,3,1,'2002-12-10');
    insert into purchases
        (purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
        values (1,2,20,'2002-12-09');
    insert into purchases
        (purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
        values (3,4,8,'2002-12-11');
    insert into purchases
        (purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
        values (1,1,1,'2002-12-13');
    insert into purchases
        (purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
        values (3,1,2,'2002-12-15');
    insert into purchases
        (purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
        values (3,3,3,'2002-12-12');
    insert into purchases
        (purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
        values (3,3,15,'2002-12-08');
    insert into purchases
        (purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
        values (2,6,11,'2002-12-08');
    insert into purchases
        (purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
        values (3,2,8,'2002-12-14')

END_OF_SQL

####################
## initialization ##
####################

my $timer = times;

use_ok('Class::Tables');

{
    package MySubclass;
    our @ISA = ('Class::Tables');
    our $hello = 0;
    sub search {
        my $x = shift;
        $hello++;
        $x->SUPER::search(@_);
    }
}

MySubclass->dbh($dbh);

# use Data::Dumper;
# print Dumper \%Class::Tables::CLASS;

#################
## subclassing ##
#################

my @classes = qw/Employees Departments Products Purchases/;

for (@classes) {
    no strict 'refs';
    is_deeply(
        \@{"$_\::ISA"},
        ['MySubclass'],
        "$_ class created w/ proper \@ISA" );
}

########################
## fetch class method ##
########################

for (@classes) {
    isa_ok(
        $_->fetch(1),
        $_,
        "$_->fetch" );
}

is( Employees->fetch(234332),
    undef,
    "fetch returns undef on failure" );

#########################
## search class method ##
#########################

is( Employees->search(id => 1)->id,
    Employees->fetch(1)->id,
    "search on id is equivalent to fetch" );

my @emps = Employees->search;

ok( scalar @emps,
    "search with no args" );

test.pl  view on Meta::CPAN

is( scalar Purchases->search(employee => 3),
    undef,
    "cascading deletes turned on" );

@p2 = Purchases->search;
is( scalar @p1 - $num,
    scalar @p2,
    "cascading deletes leave the rest" );

{
    local $Class::Tables::CASCADE = 0;

    Employees->fetch(2)->delete;
    isnt(
        scalar Purchases->search(employee => 2),
        undef,
        "cascading deletes turned off" );
}

$_->delete for Employees->search;

is( scalar Employees->search,
    undef,
    "delete all in a table" );

#######################
## undef/null values ##
#######################

{
    my $prod = Products->fetch(4);
    $prod->weight(undef);

    my $ar = $dbh->selectall_arrayref("select weight from products where id=4");
    
    ok( exists $ar->[0][0] && ! defined $ar->[0][0],
        "undef becomes NULL in database" );

}

## flyweight object goes out of scope, so next line must query the database

ok( ! defined Products->fetch(4)->weight,
    "NULL database values come back undef" );

is( scalar( () = Products->search( weight => undef ) ),
    1,
    "search method handles searching with IS NULL" );

###########################
## subclassing revisited ##
###########################

isnt(
    $MySubclass::hello,
    0,
    "subclass overrides methods" );

## done!

$timer = times - $timer;
diag "SUMMARY: $Class::Tables::SQL_QUERIES queries, ${timer}s (using $driver)";

#############
## cleanup ##
#############

END {
    if ($dbh and $dbh->{Active}) {
        $dbh->do($_) for (split /\s*;\s*/, <<'        END_OF_SQL');
            drop table /*! if exists */ departments;
            drop table /*! if exists */ employees;
            drop table /*! if exists */ products;
            drop table /*! if exists */ purchases
        END_OF_SQL

        $dbh->disconnect;
    }
}



( run in 0.600 second using v1.01-cache-2.11-cpan-e1769b4cff6 )