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