1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
use FixMyStreet::Test;
use DateTime;
my $db = FixMyStreet::DB->storage->schema;
my $body = $db->resultset('Body')->create({ name => 'ExtraTestingBody' });
my $serial = 1;
sub get_test_contact {
my $extra = shift;
my $contact = $db->resultset('Contact')->create({
category => "Testing ${serial}",
body => $body,
email => 'test@example.com',
confirmed => 1,
deleted => 0,
editor => 'test script',
note => 'test script',
whenedited => DateTime->now(),
$extra ? ( extra => $extra ) : (),
});
$serial++;
return $contact;
}
subtest 'Old list layout transparently upgraded' => sub {
subtest 'layout' => sub {
my $contact = get_test_contact([]);
is_deeply $contact->get_extra(), { _fields => [] }, 'transparently upgraded to a hash';
};
subtest 'extra fields' => sub {
my $contact = get_test_contact([]);
is_deeply $contact->get_extra_fields(), [], 'No extra fields';
my @fields = ( { a => 1 }, { b => 2 } );
$contact->set_extra_fields(@fields);
is_deeply $contact->extra, { _fields => \@fields }, 'extra fields set...';
$contact->update;
$contact->discard_changes;
is_deeply $contact->extra, { _fields => \@fields }, '...and retrieved';
is_deeply $contact->get_extra_fields(), \@fields, 'extra fields returned';
};
subtest 'metadata' => sub {
my $contact = get_test_contact([]);
is_deeply $contact->get_extra_metadata, {}, 'No extra metadata';
$contact->set_extra_metadata('foo' => 'bar');
is $contact->get_extra_metadata('foo'), 'bar', 'extra metadata set...';
$contact->update;
$contact->discard_changes;
is $contact->get_extra_metadata('foo'), 'bar', '... and retrieved';
is_deeply $contact->get_extra_metadata, { foo => 'bar' }, 'No extra metadata';
};
};
subtest 'Default hash layout' => sub {
subtest 'layout' => sub {
my $contact = get_test_contact();
is_deeply $contact->get_extra(), {}, 'default layout is hash';
};
subtest 'extra fields' => sub {
my $contact = get_test_contact();
is_deeply $contact->get_extra_fields(), [], 'No extra fields';
my @fields = ( { a => 1 }, { b => 2 } );
$contact->set_extra_fields(@fields);
is_deeply $contact->get_extra_fields, \@fields, 'extra fields set...';
$contact->update;
$contact->discard_changes;
is_deeply $contact->get_extra_fields(), \@fields, '... and returned';
is_deeply $contact->extra, { _fields => \@fields }, '(sanity check layout)';
};
subtest 'metadata' => sub {
my $contact = get_test_contact();
is_deeply $contact->get_extra_metadata, {}, 'No extra metadata';
$contact->set_extra_metadata('foo' => 'bar');
is $contact->get_extra_metadata('foo'), 'bar', 'extra metadata set...';
$contact->update;
$contact->discard_changes;
is $contact->get_extra_metadata( 'foo'), 'bar', '... and retrieved';
is_deeply $contact->get_extra_metadata, { foo => 'bar' }, 'No extra metadata';
$contact->unset_extra_metadata('foo');
is $contact->get_extra_metadata('foo'), undef, 'extra metadata now unset';
$contact->update;
$contact->discard_changes;
is $contact->get_extra_metadata('foo'), undef, '... after retrieval';
};
};
done_testing();
|