1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
#!/usr/bin/perl -w
use strict;
use warnings;
use Test::More;
BEGIN { require "./t/utils.pl" }
our (@AvailableDrivers);
use constant TESTS_PER_DRIVER => 20;
my $total = scalar(@AvailableDrivers) * TESTS_PER_DRIVER;
plan tests => $total;
foreach my $d (@AvailableDrivers) {
SKIP: {
unless ( has_schema( 'TestApp::Address', $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::Address', $handle );
isa_ok( $ret, 'DBI::st',
"Inserted the schema. got a statement handle back" );
my $rec = TestApp::Address->new($handle);
my ($id) = $rec->Create( Name => 'foo', Counter => 3 );
ok( $id, "Created record " . $id );
ok( $rec->Load($id), "Loaded the record" );
is( $rec->Name, 'foo', "name is foo" );
is( $rec->Counter, 3, "number is 3" );
my ( $val, $msg ) = $rec->SetName('bar');
ok( $val, $msg );
is( $rec->Name, 'bar', "name is changed to bar" );
( $val, $msg ) = $rec->SetName(undef);
ok( !$val, $msg );
like( $msg, qr/Illegal value for non-nullable field Name/, 'error message' );
is( $rec->Name, 'bar', 'name is still bar' );
SKIP: {
skip 'Oracle treats the empty string as a NULL' => 2 if $d eq 'Oracle';
( $val, $msg ) = $rec->SetName('');
ok( $val, $msg );
is( $rec->Name, '', "name is changed to ''" );
}
( $val, $msg ) = $rec->SetCounter(42);
ok( $val, $msg );
is( $rec->Counter, 42, 'number is changed to 42' );
( $val, $msg ) = $rec->SetCounter(undef);
ok( !$val, $msg );
like( $msg, qr/Illegal value for non-nullable field Counter/, 'error message' );
is( $rec->Counter, 42, 'number is still 42' );
( $val, $msg ) = $rec->SetCounter('');
ok( $val, $msg );
is( $rec->Counter, 0, 'empty string implies 0 for integer field' );
cleanup_schema( 'TestApp::Address', $handle );
}
}
1;
package TestApp::Address;
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('Address');
$self->_Handle($handle);
}
sub _ClassAccessible {
{
id => { read => 1, type => 'int(11)', },
Name => { read => 1, write => 1, type => 'varchar(14)', no_nulls => 1 },
Counter => { read => 1, write => 1, type => 'int(8)', no_nulls => 1 },
};
}
sub schema_mysql {
<<EOF;
CREATE TEMPORARY TABLE Address (
id integer AUTO_INCREMENT,
Name varchar(36) NOT NULL,
Counter int(8) NOT NULL,
PRIMARY KEY (id))
EOF
}
sub schema_mariadb {
<<EOF;
CREATE TEMPORARY TABLE Address (
id integer AUTO_INCREMENT,
Name varchar(36) NOT NULL,
Counter int(8) NOT NULL,
PRIMARY KEY (id))
EOF
}
sub schema_pg {
<<EOF;
CREATE TEMPORARY TABLE Address (
id serial PRIMARY KEY,
Name varchar(36) NOT NULL,
Counter integer NOT NULL
)
EOF
}
sub schema_sqlite {
<<EOF;
CREATE TABLE Address (
id integer primary key,
Name varchar(36) NOT NULL,
Counter int(8) NOT NULL)
EOF
}
sub schema_oracle {
[
"CREATE SEQUENCE Address_seq",
"CREATE TABLE Address (
id integer CONSTRAINT Address_Key PRIMARY KEY,
Name varchar(36) NOT NULL,
Counter integer NOT NULL
)",
];
}
sub cleanup_schema_oracle {
[ "DROP SEQUENCE Address_seq", "DROP TABLE Address", ];
}
1;
|