use strict; use Test::More; BEGIN { eval "use DBD::SQLite"; plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 12); } INIT { use lib 't/testlib'; use Film; Film->CONSTRUCT; } sub valid_rating { my $value = shift; my $ok = grep $value eq $_, qw/U Uc PG 12 15 18/; return $ok; } Film->add_constraint('valid rating', Rating => \&valid_rating); my %info = ( Title => 'La Double Vie De Veronique', Director => 'Kryzstof Kieslowski', Rating => '18', ); { local $info{Title} = "nonsense"; local $info{Rating} = 19; eval { Film->create({%info}) }; ok $@, $@; ok !Film->retrieve($info{Title}), "No film created"; is(Film->retrieve_all, 1, "Only one film"); } ok(my $ver = Film->create({%info}), "Can create with valid rating"); is $ver->Rating, 18, "Rating 18"; ok $ver->Rating(12), "Change to 12"; ok $ver->update, "And update"; is $ver->Rating, 12, "Rating now 12"; eval { $ver->Rating(13); $ver->update; }; ok $@, $@; is $ver->Rating, 12, "Rating still 12"; ok $ver->delete, "Delete"; # this threw an infinite loop in old versions Film->add_constraint('valid director', Director => sub { 1 }); my $fred = Film->create({ Rating => '12' }); # this test is a bit problematical because we don't supply a primary key # to the create() and the table doesn't use auto_increment or a sequence. ok $fred, "Got fred";