1use strict; 2use warnings; 3 4use Test::More; 5use Test::Exception; 6use lib qw(t/lib); 7use DBICTest; 8 9my $schema = DBICTest->init_schema(); 10 11eval { require DateTime }; 12plan skip_all => "Need DateTime for inflation tests" if $@; 13 14$schema->class('CD') ->inflate_column( 'year', 15 { inflate => sub { DateTime->new( year => shift ) }, 16 deflate => sub { shift->year } } 17); 18 19my $rs = $schema->resultset('CD'); 20 21# inflation test 22my $cd = $rs->find(3); 23 24is( ref($cd->year), 'DateTime', 'year is a DateTime, ok' ); 25 26is( $cd->year->year, 1997, 'inflated year ok' ); 27 28is( $cd->year->month, 1, 'inflated month ok' ); 29 30eval { $cd->year(\'year +1'); }; 31ok(!$@, 'updated year using a scalarref'); 32$cd->update(); 33$cd->discard_changes(); 34 35is( ref($cd->year), 'DateTime', 'year is still a DateTime, ok' ); 36 37is( $cd->year->year, 1998, 'updated year, bypassing inflation' ); 38 39is( $cd->year->month, 1, 'month is still 1' ); 40 41# get_inflated_column test 42 43is( ref($cd->get_inflated_column('year')), 'DateTime', 'get_inflated_column produces a DateTime'); 44 45# deflate test 46my $now = DateTime->now; 47$cd->year( $now ); 48$cd->update; 49 50$cd = $rs->find(3); 51is( $cd->year->year, $now->year, 'deflate ok' ); 52 53# set_inflated_column test 54eval { $cd->set_inflated_column('year', $now) }; 55ok(!$@, 'set_inflated_column with DateTime object'); 56$cd->update; 57 58$cd = $rs->find(3); 59is( $cd->year->year, $now->year, 'deflate ok' ); 60 61$cd = $rs->find(3); 62my $before_year = $cd->year->year; 63eval { $cd->set_inflated_column('year', \'year + 1') }; 64ok(!$@, 'set_inflated_column to "year + 1"'); 65$cd->update; 66 67$cd->store_inflated_column('year', \'year + 1'); 68is_deeply( $cd->year, \'year + 1', 'scalarref deflate passthrough ok' ); 69 70$cd = $rs->find(3); 71is( $cd->year->year, $before_year+1, 'deflate ok' ); 72 73# store_inflated_column test 74$cd = $rs->find(3); 75eval { $cd->store_inflated_column('year', $now) }; 76ok(!$@, 'store_inflated_column with DateTime object'); 77$cd->update; 78 79is( $cd->year->year, $now->year, 'deflate ok' ); 80 81# update tests 82$cd = $rs->find(3); 83eval { $cd->update({'year' => $now}) }; 84ok(!$@, 'update using DateTime object ok'); 85is($cd->year->year, $now->year, 'deflate ok'); 86 87$cd = $rs->find(3); 88$before_year = $cd->year->year; 89eval { $cd->update({'year' => \'year + 1'}) }; 90ok(!$@, 'update using scalarref ok'); 91 92$cd = $rs->find(3); 93is($cd->year->year, $before_year + 1, 'deflate ok'); 94 95# discard_changes test 96$cd = $rs->find(3); 97# inflate the year 98$before_year = $cd->year->year; 99$cd->update({ year => \'year + 1'}); 100$cd->discard_changes; 101 102is($cd->year->year, $before_year + 1, 'discard_changes clears the inflated value'); 103 104my $copy = $cd->copy({ year => $now, title => "zemoose" }); 105 106is( $copy->year->year, $now->year, "copy" ); 107 108 109 110my $artist = $cd->artist; 111my $sval = \ '2012'; 112 113$cd = $rs->create ({ 114 artist => $artist, 115 year => $sval, 116 title => 'create with scalarref', 117}); 118 119is ($cd->year, $sval, 'scalar value retained'); 120my $cd2 = $cd->copy ({ title => 'copy with scalar in coldata' }); 121is ($cd2->year, $sval, 'copied scalar value retained'); 122 123$cd->discard_changes; 124is ($cd->year->year, 2012, 'infation upon reload'); 125 126$cd2->discard_changes; 127is ($cd2->year->year, 2012, 'infation upon reload of copy'); 128 129 130my $precount = $rs->count; 131$cd = $rs->update_or_create ({artist => $artist, title => 'nonexisting update/create test row', year => $sval }); 132is ($rs->count, $precount + 1, 'Row created'); 133 134is ($cd->year, $sval, 'scalar value retained on creating update_or_create'); 135$cd->discard_changes; 136is ($cd->year->year, 2012, 'infation upon reload'); 137 138my $sval2 = \ '2013'; 139 140$cd = $rs->update_or_create ({artist => $artist, title => 'nonexisting update/create test row', year => $sval2 }); 141is ($rs->count, $precount + 1, 'No more rows created'); 142 143is ($cd->year, $sval2, 'scalar value retained on updating update_or_create'); 144$cd->discard_changes; 145is ($cd->year->year, 2013, 'infation upon reload'); 146 147done_testing; 148