X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Frow%2Ffilter_column.t;h=a844962e680557e6b7f246384930798957ce7065;hb=cde96798a03e3e65b2bca2a3246164faab434a03;hp=6441e33e5e3e601121ae084061d3168e8c095330;hpb=d7d38bef89def12f80ec81d8baede83de6913cd5;p=dbsrgits%2FDBIx-Class.git diff --git a/t/row/filter_column.t b/t/row/filter_column.t index 6441e33..a844962 100644 --- a/t/row/filter_column.t +++ b/t/row/filter_column.t @@ -5,11 +5,13 @@ use Test::More; use lib qw(t/lib); use DBICTest; +my $from_storage_ran = 0; +my $to_storage_ran = 0; my $schema = DBICTest->init_schema(); DBICTest::Schema::Artist->load_components('FilterColumn'); DBICTest::Schema::Artist->filter_column(rank => { - filter_from_storage => sub { $_[1] * 2 }, - filter_to_storage => sub { $_[1] / 2 }, + filter_from_storage => sub { $from_storage_ran++; $_[1] * 2 }, + filter_to_storage => sub { $to_storage_ran++; $_[1] / 2 }, }); Class::C3->reinitialize(); @@ -66,4 +68,66 @@ MC: { is $cd->artist->rank, 20, 'artist rank gets correctly filtered w/ MC'; } +my $expected_from = $from_storage_ran; +my $expected_to = $to_storage_ran; + +# ensure we are creating a fresh obj +$artist = $schema->resultset('Artist')->single($artist->ident_condition); + +is $from_storage_ran, $expected_from, 'from has not run yet'; +is $to_storage_ran, $expected_to, 'to has not run yet'; + +$artist->rank; +cmp_ok ( + $artist->get_filtered_column('rank'), + '!=', + $artist->get_column('rank'), + 'filter/unfilter differ' +); +is $from_storage_ran, ++$expected_from, 'from ran once, therefor caches'; +is $to_storage_ran, $expected_to, 'to did not run'; + +$artist->rank(6); +is $from_storage_ran, $expected_from, 'from did not run'; +is $to_storage_ran, ++$expected_to, 'to ran once'; + +ok ($artist->is_column_changed ('rank'), 'Column marked as dirty'); + +$artist->rank; +is $from_storage_ran, ++$expected_from, 'from ran once'; +is $to_storage_ran, $expected_to, 'to did not run'; + +$artist->rank; +is $from_storage_ran, $expected_from, 'from did not run'; +is $to_storage_ran, $expected_to, 'to did not run'; + +$artist->update; + +$artist->set_column(rank => 3); +ok (! $artist->is_column_changed ('rank'), 'Column not marked as dirty on same set_column value'); +is ($artist->rank, '6', 'Column set properly (cache blown)'); +is $from_storage_ran, ++$expected_from, 'from ran once (set_column blew cache)'; +is $to_storage_ran, $expected_to, 'to did not run'; + +$artist->rank(6); +ok (! $artist->is_column_changed ('rank'), 'Column not marked as dirty on same accessor-set value'); +is ($artist->rank, '6', 'Column set properly'); +is $from_storage_ran, $expected_from, 'from did not run'; +is $to_storage_ran, $expected_to, 'to did not run'; + +$artist->store_column(rank => 4); +ok (! $artist->is_column_changed ('rank'), 'Column not marked as dirty on differing store_column value'); +is ($artist->rank, '6', 'Filtered column still contains old value (cache not blown)'); +is $from_storage_ran, $expected_from, 'from did not run'; +is $to_storage_ran, $expected_to, 'to did not run'; + +$artist->set_column(rank => 4); +TODO: { + local $TODO = 'There seems to be no way around that much wizardry... which is ok'; + ok ($artist->is_column_changed ('rank'), 'Column marked as dirty on out-of-sync set_column value'); +} +is ($artist->rank, '8', 'Column set properly (cache blown)'); +is $from_storage_ran, ++$expected_from, 'from ran once (set_column blew cache)'; +is $to_storage_ran, $expected_to, 'to did not run'; + done_testing;