#!/usr/bin/perl -w use strict; use warnings; use Test::More; BEGIN { require "t/utils.pl" } our (@AvailableDrivers); use constant TESTS_PER_DRIVER => 63; my $total = scalar(@AvailableDrivers) * TESTS_PER_DRIVER; plan tests => $total; foreach my $d ( @AvailableDrivers ) { SKIP: { unless( has_schema( 'TestApp', $d ) ) { skip "No schema for '$d' driver", TESTS_PER_DRIVER; } unless( should_test( $d ) ) { skip "ENV is not defined for driver '$d'", TESTS_PER_DRIVER; } my $handle = get_handle( $d ); connect_handle( $handle ); isa_ok($handle->dbh, 'DBI::db', "Got handle for $d"); my $ret = init_schema( 'TestApp', $handle ); isa_ok($ret,'DBI::st', "Inserted the schema. got a statement handle back"); my $emp = TestApp::Employee->new($handle); my $e_id = $emp->Create( Name => 'RUZ' ); ok($e_id, "Got an id for the new employee: $e_id"); $emp->Load($e_id); is($emp->id, $e_id); my $phone_collection = $emp->Phones; isa_ok($phone_collection, 'TestApp::PhoneCollection'); { my $ph = $phone_collection->Next; is($ph, undef, "No phones yet"); } my $phone = TestApp::Phone->new($handle); isa_ok( $phone, 'TestApp::Phone'); my $p_id = $phone->Create( Employee => $e_id, Phone => '+7(903)264-03-51'); is($p_id, 1, "Loaded phone $p_id"); $phone->Load( $p_id ); my $obj = $phone->Employee; ok($obj, "Employee #$e_id has phone #$p_id"); isa_ok( $obj, 'TestApp::Employee'); is($obj->id, $e_id); is($obj->Name, 'RUZ'); { $phone_collection->RedoSearch; my $ph = $phone_collection->Next; isa_ok($ph, 'TestApp::Phone'); is($ph->id, $p_id, 'found first phone'); is($ph->Phone, '+7(903)264-03-51'); is($phone_collection->Next, undef); } # tests for no object mapping my $val = $phone->Phone; is( $val, '+7(903)264-03-51', 'Non-object things still work'); my $emp2 = TestApp::Employee->new($handle); isa_ok($emp2, 'TestApp::Employee'); my $e2_id = $emp2->Create( Name => 'Dave' ); ok($e2_id, "Got an id for the new employee: $e2_id"); $emp2->Load($e2_id); is($emp2->id, $e2_id); my $phone2_collection = $emp2->Phones; isa_ok($phone2_collection, 'TestApp::PhoneCollection'); { my $ph = $phone2_collection->Next; is($ph, undef, "new emp has no phones"); } { $phone_collection->RedoSearch; my $ph = $phone_collection->Next; isa_ok($ph, 'TestApp::Phone'); is($ph->id, $p_id, 'first emp still has phone'); is($ph->Phone, '+7(903)264-03-51'); is($phone_collection->Next, undef); } $phone->SetEmployee($e2_id); my $emp3 = $phone->Employee; isa_ok($emp3, 'TestApp::Employee'); is($emp3->Name, 'Dave', 'changed employees by ID'); is($emp3->id, $emp2->id); { $phone_collection->RedoSearch; is($phone_collection->Next, undef, "first emp lost phone"); } { $phone2_collection->RedoSearch; my $ph = $phone2_collection->Next; isa_ok($ph, 'TestApp::Phone'); is($ph->id, $p_id, 'new emp stole the phone'); is($ph->Phone, '+7(903)264-03-51'); is($phone2_collection->Next, undef); } $phone->SetEmployee($emp); my $emp4 = $phone->Employee; isa_ok($emp4, 'TestApp::Employee'); is($emp4->Name, 'RUZ', 'changed employees by obj'); is($emp4->id, $emp->id); { $phone2_collection->RedoSearch; is($phone2_collection->Next, undef, "second emp lost phone"); } { $phone_collection->RedoSearch; my $ph = $phone_collection->Next; isa_ok($ph, 'TestApp::Phone'); is($ph->id, $p_id, 'first emp stole the phone'); is($ph->Phone, '+7(903)264-03-51'); is($phone_collection->Next, undef); } my $phone2 = TestApp::Phone->new($handle); isa_ok( $phone2, 'TestApp::Phone'); my $p2_id = $phone2->Create( Employee => $e_id, Phone => '123456'); ok($p2_id, "Loaded phone $p2_id"); $phone2->Load( $p2_id ); { $phone_collection->RedoSearch; my $ph = $phone_collection->Next; isa_ok($ph, 'TestApp::Phone'); is($ph->id, $p_id, 'still has this phone'); is($ph->Phone, '+7(903)264-03-51'); $ph = $phone_collection->Next; isa_ok($ph, 'TestApp::Phone'); is($ph->id, $p2_id, 'now has that phone'); is($ph->Phone, '123456'); is($phone_collection->Next, undef); } # Test Create with obj as argument my $phone3 = TestApp::Phone->new($handle); isa_ok( $phone3, 'TestApp::Phone'); my $p3_id = $phone3->Create( Employee => $emp, Phone => '7890'); ok($p3_id, "Loaded phone $p3_id"); $phone3->Load( $p3_id ); { $phone_collection->RedoSearch; my $ph = $phone_collection->Next; isa_ok($ph, 'TestApp::Phone'); is($ph->id, $p_id, 'still has this phone'); is($ph->Phone, '+7(903)264-03-51'); $ph = $phone_collection->Next; isa_ok($ph, 'TestApp::Phone'); is($ph->id, $p2_id, 'still has that phone'); is($ph->Phone, '123456'); $ph = $phone_collection->Next; isa_ok($ph, 'TestApp::Phone'); is($ph->id, $p3_id, 'even has this other phone'); is($ph->Phone, '7890'); is($phone_collection->Next, undef); } cleanup_schema( 'TestApp', $handle ); }} # SKIP, foreach blocks 1; package TestApp; sub schema_sqlite { [ q{ CREATE TABLE Employees ( id integer primary key, Name varchar(36) ) }, q{ CREATE TABLE Phones ( id integer primary key, Employee integer NOT NULL, Phone varchar(18) ) } ] } sub schema_mysql { [ q{ CREATE TEMPORARY TABLE Employees ( id integer AUTO_INCREMENT primary key, Name varchar(36) ) }, q{ CREATE TEMPORARY TABLE Phones ( id integer AUTO_INCREMENT primary key, Employee integer NOT NULL, Phone varchar(18) ) } ] } sub schema_pg { [ q{ CREATE TEMPORARY TABLE Employees ( id serial PRIMARY KEY, Name varchar ) }, q{ CREATE TEMPORARY TABLE Phones ( id serial PRIMARY KEY, Employee integer references Employees(id), Phone varchar ) } ] } package TestApp::Employee; use base $ENV{SB_TEST_CACHABLE}? qw/DBIx::SearchBuilder::Record::Cachable/: qw/DBIx::SearchBuilder::Record/; sub Table { 'Employees' } sub Schema { return { Name => { TYPE => 'varchar' }, Phones => { REFERENCES => 'TestApp::PhoneCollection', KEY => 'Employee' } }; } sub _Value { my $self = shift; my $x = ($self->__Value(@_)); return $x; } 1; package TestApp::Phone; use base $ENV{SB_TEST_CACHABLE}? qw/DBIx::SearchBuilder::Record::Cachable/: qw/DBIx::SearchBuilder::Record/; sub Table { 'Phones' } sub Schema { return { Employee => { REFERENCES => 'TestApp::Employee' }, Phone => { TYPE => 'varchar' }, } } package TestApp::PhoneCollection; use base qw/DBIx::SearchBuilder/; sub Table { my $self = shift; my $tab = $self->NewItem->Table(); return $tab; } sub NewItem { my $self = shift; my $class = 'TestApp::Phone'; return $class->new( $self->_Handle ); } 1;