aboutsummaryrefslogtreecommitdiffstats
path: root/t/app/model/extra.t
blob: c073ae161cd95820a3bd8f8712b4e02e1e38fe0c (plain)
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();