#!/usr/bin/perl # Tests support for views use strict; BEGIN { $| = 1; $^W = 1; } use Test::More tests => 81; use File::Spec::Functions ':ALL'; use t::lib::Test; # Set up again my $file = test_db(); my $dbh = create_ok( file => catfile(qw{ t 19_view.sql }), connect => [ "dbi:SQLite:$file" ], ); # Create the test package eval <<"END_PERL"; die $@ if $@; package Foo::Bar; use strict; use ORLite '$file'; 1; END_PERL # Simple null transaction to stimulate any errors Foo::Bar->begin; Foo::Bar->rollback; # Check the file name $file = rel2abs($file); is( Foo::Bar->sqlite, $file, '->sqlite ok' ); is( Foo::Bar->dsn, "dbi:SQLite:$file", '->dsn ok' ); # Check the schema version is( Foo::Bar->pragma('user_version'), 0, '->user_version ok' ); # Check metadata methods in the test table is( Foo::Bar::ViewOne->base, 'Foo::Bar', '->base ok' ); is( Foo::Bar::ViewOne->table, 'view_one', '->table ok' ); my $columns = Foo::Bar::ViewOne->table_info; is_deeply( $columns, [ { cid => 0, dflt_value => undef, name => 'col1', notnull => 0, pk => 0, type => 'integer', }, { cid => 1, dflt_value => undef, name => 'col2', notnull => 0, pk => 0, type => 'string', }, ], '->table_info ok' ); is( Foo::Bar::TableOne->count, 0, '->count(table) is zero' ); is( Foo::Bar::ViewOne->count, 0, '->count(view) is zero' ); # Populate the test table ok( Foo::Bar::TableOne->create( col1 => 1, col2 => 'foo' ), 'Created row 1', ); is( Foo::Bar::TableOne->count, 1, '->count(table) is one' ); is( Foo::Bar::ViewOne->count, 1, '->count(view) is one' ); isa_ok( Foo::Bar::TableOne->load(1), 'Foo::Bar::TableOne' ); my $new = Foo::Bar::TableOne->create( col2 => 'bar' ); isa_ok( $new, 'Foo::Bar::TableOne' ); is( $new->col1, 2, '->col1 ok' ); is( $new->col2, 'bar', '->col2 ok' ); is( $new->rowid, 2, '->rowid ok' ); ok( Foo::Bar::TableOne->create( col2 => 'bar' ), 'Created row 3', ); # Check the ->count method is( Foo::Bar::TableOne->count, 3, 'Found 3 table rows' ); is( Foo::Bar::ViewOne->count, 3, 'Found 3 view rows' ); is( Foo::Bar::TableOne->count('where col2 = ?', 'bar'), 2, 'Table condition count works' ); is( Foo::Bar::ViewOne->count('where col2 = ?', 'bar'), 2, 'View condition count works' ); sub test_ones { my $ones = shift; is( scalar(@$ones), 3, 'Got 3 objects' ); isa_ok( $ones->[0], 'Foo::Bar::ViewOne' ); is( $ones->[0]->col1, 1, '->col1 ok' ); is( $ones->[0]->col2, 'foo', '->col2 ok' ); isa_ok( $ones->[1], 'Foo::Bar::ViewOne' ); is( $ones->[1]->col1, 2, '->col1 ok' ); is( $ones->[1]->col2, 'bar', '->col2 ok' ); isa_ok( $ones->[2], 'Foo::Bar::ViewOne' ); is( $ones->[2]->col1, 3, '->col1 ok' ); is( $ones->[2]->col2, 'bar', '->col2 ok' ); } # Fetch the rows (list context) test_ones( [ Foo::Bar::ViewOne->select('order by col1') ] ); # Fetch the rows (scalar context) test_ones( scalar Foo::Bar::ViewOne->select('order by col1') ); SCOPE: { # Emulate select via iterate my $ones = []; Foo::Bar::ViewOne->iterate( 'order by col1', sub { push @$ones, $_; } ); test_ones( $ones ); # Partial fetch my $short = []; Foo::Bar::ViewOne->iterate( 'order by col1', sub { push @$short, $_; return 0; } ); is( scalar(@$short), 1, 'Found only one record' ); is_deeply( $short->[0], $ones->[0], 'Found the same first record' ); # Lower level equivalent my $short2 = []; Foo::Bar->iterate( 'select * from view_one order by col1', sub { push @$short2, $_; return 0; } ); is( scalar(@$short2), 1, 'Found only one record' ); is_deeply( $short2->[0], [ 1, 'foo' ], 'Found correct alternative' ); # Delete one of the objects via the class delete method my @delete = Foo::Bar::TableOne->select('where col2 = ?', 'bar'); $_->delete foreach @delete; is( Foo::Bar::ViewOne->count, 1, 'Confirm 2 rows were deleted' ); # Truncate so we can continue ok( Foo::Bar::TableOne->truncate, '->truncate ok' ); is( Foo::Bar::ViewOne->count, 0, 'Confirm table/view are empty' ); } # Database should now be empty SCOPE: { my @none = Foo::Bar::ViewOne->select; is_deeply( \@none, [ ], '->select ok with nothing' ); my $none = Foo::Bar::ViewOne->select; is_deeply( $none, [ ], '->select ok with nothing' ); } # Transaction testing SCOPE: { is( Foo::Bar->connected, !1, '->connected is false' ); ok( Foo::Bar->begin, '->begin' ); is( Foo::Bar->connected, 1, '->connected is true' ); isa_ok( Foo::Bar::TableOne->create, 'Foo::Bar::TableOne' ); is( Foo::Bar::ViewOne->count, 1, 'One row created' ); ok( Foo::Bar->rollback, '->rollback' ); is( Foo::Bar->connected, !1, '->connected is false' ); is( Foo::Bar::ViewOne->count, 0, 'Commit ok' ); ok( Foo::Bar->begin, '->begin' ); isa_ok( Foo::Bar::TableOne->create, 'Foo::Bar::TableOne' ); is( Foo::Bar::ViewOne->count, 1, 'One row created' ); ok( Foo::Bar->commit, '->commit' ); is( Foo::Bar::ViewOne->count, 1, 'Commit ok' ); } # Truncate SCOPE: { ok( Foo::Bar::TableOne->truncate, '->truncate ok' ); is( Foo::Bar::ViewOne->count, 0, 'Commit ok' ); } ###################################################################### # Exceptions # Load an object that does not exist SCOPE: { # There should not be any of the state-altering methods foreach ( qw{ load insert update delete truncate } ) { is( Foo::Bar::ViewOne->can($_), undef, "Method $_ does not exist" ); } }