#!/usr/bin/perl -w use strict; use warnings; use Test::More; use DBI; eval "use Test::mysqld 0.11"; plan skip_all => "Test::mysqld 0.11(or grator version) is need for test" if ( $@ ); my $mysqld = Test::mysqld->new( my_cnf => { 'skip-networking' => '', } ); plan skip_all => "MySQL may not be installed" if ( !defined $mysqld ); plan tests => 20; use Test::DataLoader::MySQL; my $dbh = DBI->connect($mysqld->dsn()) or die $DBI::errstr; $dbh->do("CREATE TABLE foo (id INTEGER, name VARCHAR(20))"); $dbh->do("CREATE TABLE bar (id INTEGER, name VARCHAR(20))"); $dbh->do("insert into foo set id=0,name='xxx'"); my $data = Test::DataLoader::MySQL->new($dbh); $data->add('foo', 1, { id => 1, name => 'aaa', }, ['id']); $data->add('foo', 2, { id => 2, name => 'bbb', }, ['id']); my $keys; $keys = $data->load('foo', 1);#load data #1 is($keys->{id}, 1); $keys = $data->load('foo', 2);#load data #2 is($keys->{id}, 2); is_deeply($data->do_select('foo', "id=1"), { id=>1, name=>'aaa'}); is_deeply([$data->do_select('foo', "id IN(1,2)")], [ { id=>1, name=>'aaa'}, { id=>2, name=>'bbb'},]); # test load_with_option $data->add('bar', 1, { id => 1, name => 'aaa', }, ['id']); $data->load('bar', 1, { name=>'bbb' });#load data #1 but name is altered to 'aaa'->'bbb' is_deeply($data->do_select('bar', "id=1"), { id=>1, name=>'bbb'}); # load_direct $data->load_direct('foo', { id => 3, name => 'xxx', }, ['id']); $data->load_direct('foo', { id => 4, name => 'yyy', }, ['id']); is_deeply($data->do_select('foo', "id=3"), { id=>3, name=>'xxx'}); is_deeply([$data->do_select('foo', "id IN(3,4)")], [ { id=>3, name=>'xxx'}, { id=>4, name=>'yyy'},]); # test auto_increment $dbh->do("CREATE TABLE baz (id INTEGER AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY(id))") || die $dbh->errstr; $dbh->do("insert into baz set name='xxx'"); $data->add('baz', 1, { name => 'aaa', }, ['id']); $data->add('baz', 2, { name => 'bbb', }, ['id']); $keys = $data->load('baz', 1);#load data #1 is( $keys->{id}, 2); $keys = $data->load('baz', 2);#load data #2 is( $keys->{id}, 3); is_deeply($data->do_select('baz', "id=2"), { id=>2, name=>'aaa'}); is_deeply([$data->do_select('baz', "id IN(2,3)")], [ { id=>2, name=>'aaa'}, { id=>3, name=>'bbb'},]); $keys = $data->load_direct('baz', { name => 'ccc', }, ['id']); is( $keys->{id}, 4); is_deeply($data->do_select('baz', "id=4"), { id=>4, name=>'ccc'}); # Test primary key check $data->add('foo', 100, { id => 100, name => 'aaaa', }, []); $data->add('foo', 200, { id => 200, name => 'bbbb', }); eval { $data->load('foo', 100); }; like( $@, qr/primary keys are not defined/ ); eval { $data->load('foo', 200); }; like( $@, qr/primary keys are not defined/ ); $data->set_keys('foo', ['id']);#if keys are defined... eval { $data->load('foo', 100); $data->load('foo', 200); }; is( $@, '' );#load will success eval { $data->load_direct('baz', { name => 'ddd', }, []); }; like( $@, qr/primary keys are not defined/ ); eval { $data->load_direct('baz', { name => 'eee', }); }; like( $@, qr/primary keys are not defined/ ); $data->set_keys('baz', ['id']);#if keys are defined... eval { $data->load_direct('baz', { name => 'ddd', }, []); $data->load_direct('baz', { name => 'eee', }); }; is( $@, '' );#load will success $data->clear; $data = Test::DataLoader::MySQL->new($dbh); is_deeply($data->do_select('foo', "1=1"), { id=>0, name=>'xxx'});#remain only not loaded by Test::DataLoader::MySQL $data->clear; $mysqld->stop;