1use strict; 2use warnings; 3 4use Test::More; 5use lib qw(t/lib); 6use DBICTest; 7 8my $schema = DBICTest->init_schema(); 9 10my @serializers = ( 11 { module => 'YAML.pm', 12 inflater => sub { YAML::Load (shift) }, 13 deflater => sub { die "Expecting a reference" unless (ref $_[0]); YAML::Dump (shift) }, 14 }, 15 { module => 'Storable.pm', 16 inflater => sub { Storable::thaw (shift) }, 17 deflater => sub { die "Expecting a reference" unless (ref $_[0]); Storable::nfreeze (shift) }, 18 }, 19); 20 21 22my $selected; 23foreach my $serializer (@serializers) { 24 eval { require $serializer->{module} }; 25 unless ($@) { 26 $selected = $serializer; 27 last; 28 } 29} 30 31plan (skip_all => "No suitable serializer found") unless $selected; 32 33DBICTest::Schema::Serialized->inflate_column( 'serialized', 34 { inflate => $selected->{inflater}, 35 deflate => $selected->{deflater}, 36 }, 37); 38Class::C3->reinitialize; 39 40my $struct_hash = { 41 a => 1, 42 b => [ 43 { c => 2 }, 44 ], 45 d => 3, 46}; 47 48my $struct_array = [ 49 'a', 50 { 51 b => 1, 52 c => 2, 53 }, 54 'd', 55]; 56 57my $rs = $schema->resultset('Serialized'); 58my $inflated; 59 60#======= testing hashref serialization 61 62my $object = $rs->create( { 63 serialized => '', 64} ); 65ok($object->update( { serialized => $struct_hash } ), 'hashref deflation'); 66ok($inflated = $object->serialized, 'hashref inflation'); 67is_deeply($inflated, $struct_hash, 'inflated hash matches original'); 68 69$object = $rs->create( { 70 serialized => '', 71} ); 72$object->set_inflated_column('serialized', $struct_hash); 73is_deeply($object->serialized, $struct_hash, 'inflated hash matches original'); 74 75$object = $rs->new({}); 76$object->serialized ($struct_hash); 77$object->insert; 78is_deeply ( 79 $rs->find ({id => $object->id})->serialized, 80 $struct_hash, 81 'new/insert works', 82); 83 84#====== testing arrayref serialization 85 86ok($object->update( { serialized => $struct_array } ), 'arrayref deflation'); 87ok($inflated = $object->serialized, 'arrayref inflation'); 88is_deeply($inflated, $struct_array, 'inflated array matches original'); 89 90$object = $rs->new({}); 91$object->serialized ($struct_array); 92$object->insert; 93is_deeply ( 94 $rs->find ({id => $object->id})->serialized, 95 $struct_array, 96 'new/insert works', 97); 98 99#===== make sure make_column_dirty interacts reasonably with inflation 100$object = $rs->first; 101$object->update ({serialized => { x => 'y'}}); 102 103$object->serialized->{x} = 'z'; # change state without notifying $object 104ok (!$object->get_dirty_columns, 'no dirty columns yet'); 105is_deeply ($object->serialized, { x => 'z' }, 'object data correct'); 106 107$object->make_column_dirty('serialized'); 108$object->update; 109 110is_deeply ($rs->first->serialized, { x => 'z' }, 'changes made it to the db' ); 111 112done_testing; 113