#!/usr/bin/perl -w use strict; use warnings; use Test::More; BEGIN { require "t/utils.pl" } our (@AvailableDrivers); use constant TESTS_PER_DRIVER => 11; 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'); 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 ide for the new emplyee"); my $phone = TestApp::Phone->new($handle); isa_ok( $phone, 'TestApp::Phone', "it's atestapp::phone"); my $p_id = $phone->Create( Employee => $e_id, Phone => '+7(903)264-03-51'); # XXX: test fails if next string is commented is($p_id, 1, "Loaded record $p_id"); $phone->Load( $p_id ); my $obj = $phone->EmployeeObj($handle); ok($obj, "Employee #$e_id has phone #$p_id"); isa_ok( $obj, 'TestApp::Employee'); is($obj->id, $e_id); is($obj->Name, 'RUZ'); # tests for no object mapping my ($state, $msg) = $phone->ValueObj($handle); ok(!$state, "State is false"); is( $msg, 'No object mapping for field', 'Error message is correct'); 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 ) } ] } sub schema_oracle { [ "CREATE SEQUENCE Employees_seq", "CREATE TABLE Employees ( id integer CONSTRAINT Employees_Key PRIMARY KEY, Name varchar(36) )", "CREATE SEQUENCE Phones_seq", "CREATE TABLE Phones ( id integer CONSTRAINT Phones_Key PRIMARY KEY, Employee integer NOT NULL, Phone varchar(18) )", ] } sub cleanup_schema_oracle { [ "DROP SEQUENCE Employees_seq", "DROP TABLE Employees", "DROP SEQUENCE Phones_seq", "DROP TABLE Phones", ] } package TestApp::Employee; use base $ENV{SB_TEST_CACHABLE}? qw/DBIx::SearchBuilder::Record::Cachable/: qw/DBIx::SearchBuilder::Record/; use vars qw/$VERSION/; $VERSION=0.01; sub _Init { my $self = shift; my $handle = shift; $self->Table('Employees'); $self->_Handle($handle); } sub _ClassAccessible { { id => {read => 1, type => 'int(11)'}, Name => {read => 1, write => 1, type => 'varchar(18)'}, } } 1; package TestApp::Phone; use vars qw/$VERSION/; $VERSION=0.01; use base $ENV{SB_TEST_CACHABLE}? qw/DBIx::SearchBuilder::Record::Cachable/: qw/DBIx::SearchBuilder::Record/; sub _Init { my $self = shift; my $handle = shift; $self->Table('Phones'); $self->_Handle($handle); } sub _ClassAccessible { { id => {read => 1, type => 'int(11)'}, Employee => {read => 1, write => 1, type => 'int(11)', object => 'TestApp::Employee' }, Value => {read => 1, write => 1, type => 'varchar(18)'}, } } 1;