Play nicer with lower-level methods
[dbsrgits/DBIx-Class.git] / t / row / filter_column.t
index d036f4f..a844962 100644 (file)
@@ -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   => sub { $_[1] * 2 },
-  unfilter => sub { $_[1] / 2 },
+  filter_from_storage => sub { $from_storage_ran++; $_[1] * 2 },
+  filter_to_storage   => sub { $to_storage_ran++; $_[1] / 2 },
 });
 Class::C3->reinitialize();
 
@@ -49,4 +51,83 @@ $artist->discard_changes;
 $artist->rank(40);
 ok( !$artist->is_column_changed('rank'), 'column is not dirty after setting the same value' );
 
+MC: {
+   my $cd = $schema->resultset('CD')->create({
+      artist => { rank => 20 },
+      title => 'fun time city!',
+      year => 'forevertime',
+   });
+   ($raw_db_rank) = $schema->resultset('Artist')
+                                ->search ($cd->artist->ident_condition)
+                                  ->get_column('rank')
+                                   ->_resultset
+                                    ->cursor
+                                     ->next;
+
+   is $raw_db_rank, 10, 'artist rank gets correctly unfiltered w/ 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;