File Coverage

File:t/11-HTTPTiny2h2o.t
Coverage:100.0%

linestmtbrancondsubpodtimecode
1# basically how Util::H2O::h2o does it
2
1
1
1
3664
2
24
use strict;
3
1
1
1
5
1
36
use warnings;
4
5
1
1
1
348
67948
5
use Test::More q//;
6
1
1
1
419
2206
2
use Test::Exception;
7
1
1
1
154
1
50
use JSON::MaybeXS;
8
1
1
1
274
2
1277
use Util::H2O::More qw/ddd HTTPTiny2h2o o2d/;
9
10
1
73503
my $AoH = [ { four => 4, five => 5, six => 6 }, { seven => 7, eight => 8, nine => 9 }, ];
11
12
1
17
my $HTTPTiny_response1 = {
13  status  => 200,
14  content => encode_json($AoH),
15};
16
17
1
3
HTTPTiny2h2o $HTTPTiny_response1;
18
19
1
2
is_deeply o2d($HTTPTiny_response1->content), $AoH, q{Arrays of hashes encoded as JSON was decoded properly};
20
21
1
903
my $HoAoH = {
22    one   => [qw/1 2 3 4 5/],
23    two   => [qw/6 7 8 9 0/],
24    three => [ { four => 4, five => 5, six => 6 }, { seven => 7, eight => 8, nine => 9 }, ],
25    ten   => {
26        eleven    => [qw/11 12 13 14 15 16 17 18 19 20/],
27        twentyone => [
28            {
29                twentytwo => 22,
30            },
31            {
32                twentythree => 23,
33            },
34            {
35                twentyfour => 24,
36                twentyfive => 25,
37                twentysix  => 26,
38            },
39        ],
40        thirteen => 13,
41    },
42};
43
44
1
10
my $HTTPTiny_response2 = {
45  status  => 200,
46  content => encode_json($HoAoH),
47};
48
49
1
2
HTTPTiny2h2o $HTTPTiny_response2;
50
51
1
5
is $HTTPTiny_response2->content->ten->thirteen, 13, q{Accessor for deeply nested key found as expected};
52
53
1
295
is $HTTPTiny_response2->content->ten->doesntexist, undef, q{'undef' returned for non-existing key, due to internal use of 'd2o -autoundef'};
54
55
1
355
is_deeply o2d($HTTPTiny_response2->content), $HoAoH, q{Deep hash of arrays of hashes encoded as JSON was decoded properly};
56
57
1
2736
is $HTTPTiny_response2->content->doesnotexist, undef, q{handles 'content' that points to undef setting it -autoundef};
58
59# "-autothrow" should also complete normally when the JSON is valid.
60
1
350
my $autothrow_good = {
61  status  => 200,
62  content => encode_json({ answer => 42 }),
63};
64
65
1
6
HTTPTiny2h2o -autothrow, $autothrow_good;
66
67
1
3
is $autothrow_good->content->answer, 42, q{'-autothrow' decodes valid JSON and objectifies content};
68
69
1
277
my $bad_json1 = {
70  status  => 200,
71  content => 'this is definitely not JSON',
72};
73
74
1
1
11
37
dies_ok { HTTPTiny2h2o -autothrow, $bad_json1 } q{non-JSON in 'content' of the response object causes decode_json to die};
75
76
1
307
my $bad_json2 = {
77  status  => 200,
78  content => 'this is definitely not JSON',
79};
80
81
1
4
HTTPTiny2h2o $bad_json2;
82
1
5
is $bad_json2->content, q{this is definitely not JSON}, q{not using '-autothrow' on bad JSON returns original content via ->content accessor};
83
1
261
like ref $bad_json2, qr/Util::H2O/, q{ref type of response reference is Util::H2O};
84
1
258
is ref $bad_json2->content, "", q{ref type of ->content is empty string};
85
86# Exercise the remaining option/precondition short-circuit paths.
87
1
1
278
32
dies_ok { HTTPTiny2h2o() } q{HTTPTiny2h2o without a response dies};
88
1
1
257
28
dies_ok { HTTPTiny2h2o 0 } q{HTTPTiny2h2o with a false non-reference response dies};
89
1
1
254
28
dies_ok { HTTPTiny2h2o q{not-an-option} } q{HTTPTiny2h2o does not mistake an arbitrary string for '-autothrow'};
90
1
1
254
27
dies_ok { HTTPTiny2h2o [] } q{HTTPTiny2h2o rejects a non-HASH response reference};
91
92
1
260
my $bad_resp = {
93  status  => 200,
94};
95
96
1
1
6
27
dies_ok { HTTPTiny2h2o $bad_resp} q{missing 'content' HASH key in provided reference cause pre-check to die};
97
98# content is an empty
99
1
248
my $HTTPTiny_response3 = {
100  status  => 200,
101  content => undef,
102};
103
104
1
4
HTTPTiny2h2o $HTTPTiny_response3;
105
106
1
3
is $HTTPTiny_response3->content->doesnotexist, undef, q{handles 'content' that points to undef setting it -autoundef};
107
108
1
346
note "Testing JSON containers other than expected HASH - still underdeveloped area";
109# content is an empty array
110
1
544
my $HTTPTiny_response4 = {
111  status  => 200,
112  content => "[]",
113};
114
115
1
3
HTTPTiny2h2o $HTTPTiny_response4;
116
1
16
is $HTTPTiny_response4->content->get(1), undef, q{empty JSON array makes 'get' AREF vmethod return undef };
117
1
350
is $HTTPTiny_response4->content->scalar, 0, q{empty JSON array makes 'scalar' AREF vmethod return undef };
118
119
1
271
done_testing;