| File: | t/OpenAPI.pm |
| Coverage: | 87.5% |
| line | stmt | bran | cond | sub | pod | time | code |
|---|---|---|---|---|---|---|---|
| 1 | package t::OpenAPI; | ||||||
| 2 | |||||||
| 3 | 22 22 22 | 289 93 297 | use Test::Base -Base; | ||||
| 4 | |||||||
| 5 | #use Smart::Comments; | ||||||
| 6 | my $client_module; | ||||||
| 7 | 22 22 22 | 375 107 324 | use OpenAPI::Config; | ||||
| 8 | BEGIN { | ||||||
| 9 | 22 | 235 | OpenAPI::Config->init; | ||||
| 10 | 22 | 376 | my $use_http = $OpenAPI::Config{'test_suite.use_http'}; | ||||
| 11 | 22 | 157 | if ($use_http) { | ||||
| 12 | 0 | 0 | $client_module = 'WWW::OpenAPI'; | ||||
| 13 | 0 | 0 | require WWW::OpenAPI; | ||||
| 14 | } else { | ||||||
| 15 | 22 | 92 | $client_module = 'WWW::OpenAPI::Embedded'; | ||||
| 16 | 22 | 312 | require WWW::OpenAPI::Embedded; | ||||
| 17 | } | ||||||
| 18 | } | ||||||
| 19 | 22 22 22 | 319 93 258 | use Test::LongString; | ||||
| 20 | 22 22 22 | 240 64 240 | use Encode 'from_to'; | ||||
| 21 | |||||||
| 22 | our @EXPORT = qw(init do_request run_tests run_test); | ||||||
| 23 | |||||||
| 24 | 22 22 22 | 297 95 345 | use Benchmark::Timer; | ||||
| 25 | my $timer = Benchmark::Timer->new(); | ||||||
| 26 | my $SavedCapture; | ||||||
| 27 | |||||||
| 28 | our $host = $OpenAPI::Config{'test_suite.server'} || 'http://localhost'; | ||||||
| 29 | $host = "http://$host" if $host !~ m{^http://}; | ||||||
| 30 | |||||||
| 31 | my $client = $client_module->new({ server => $host, timer => $timer }); | ||||||
| 32 | |||||||
| 33 | #init(); | ||||||
| 34 | |||||||
| 35 | sub run_tests () { | ||||||
| 36 | 21 | 0 | 255 | for my $block (blocks()) { | |||
| 37 | 602 | 37515 | run_test($block); | ||||
| 38 | } | ||||||
| 39 | } | ||||||
| 40 | |||||||
| 41 | sub run_test ($) { | ||||||
| 42 | 602 | 0 | 5437 | my $block = shift; | |||
| 43 | 602 | 7194 | my $name = $block->name; | ||||
| 44 | 602 | 39077 | my $request = $block->request; | ||||
| 45 | 602 | 26901 | if (!$request) { | ||||
| 46 | 0 | 0 | warn "No request section found in $name\n"; | ||||
| 47 | 0 | 0 | return; | ||||
| 48 | } | ||||||
| 49 | 602 | 8798 | my $charset = $block->charset || 'UTF-8'; | ||||
| 50 | 602 | 20297 | my $format = $block->format || 'JSON'; | ||||
| 51 | 602 | 19609 | my $res_type = $block->res_type; | ||||
| 52 | 602 | 14640 | my $type = $block->request_type; | ||||
| 53 | 602 | 14622 | if ($request =~ /^(GET|POST|HEAD|PUT|DELETE)\s+([^\n]+)\s*\n(.*)/s) { | ||||
| 54 | 602 | 7364 | my ($method, $url, $body) = ($1, $2, $3); | ||||
| 55 | 602 | 3433 | $url =~ s/\$SavedCapture\b/$SavedCapture/g; | ||||
| 56 | 602 | 2502 | $body =~ s/\$SavedCapture\b/$SavedCapture/g; | ||||
| 57 | ### $method | ||||||
| 58 | ### $url | ||||||
| 59 | ### $body | ||||||
| 60 | ### $host | ||||||
| 61 | 602 | 3635 | $url = $host.$url; | ||||
| 62 | 602 | 4400 | from_to($url, 'UTF-8', $charset) unless $charset eq 'UTF-8'; | ||||
| 63 | 602 | 3507 | from_to($body, 'UTF-8', $charset) unless $charset eq 'UTF-8'; | ||||
| 64 | 602 | 5722 | $client->content_type($type); | ||||
| 65 | 602 | 4653 | my $res = $client->request($body, $method, $url); | ||||
| 66 | 602 | 178710 | ok $res->is_success, "request returns OK - $name"; | ||||
| 67 | 602 | 608570 | my $expected_res = $block->response || $block->response_like; | ||||
| 68 | 602 | 47188 | if ($format eq 'JSON' and $expected_res) { | ||||
| 69 | 599 | 8846 | $expected_res =~ s/\n[ \t]*([^\n\s])/$1/sg; | ||||
| 70 | } | ||||||
| 71 | 602 | 5092 | if ($expected_res) { | ||||
| 72 | 602 | 9711 | if ($block->response_like) { | ||||
| 73 | 82 | 5961 | if ($res->content =~ qr/$expected_res/) { | ||||
| 74 | 82 | 9355 | $SavedCapture = $1 if defined $1; | ||||
| 75 | } | ||||||
| 76 | 82 | 1009 | like $res->content, qr/$expected_res/, "$name - response matched"; | ||||
| 77 | } else { | ||||||
| 78 | 520 | 25282 | from_to($expected_res, 'UTF-8', $charset) unless $charset eq 'UTF-8'; | ||||
| 79 | 520 | 8115 | is $res->content, $expected_res, "response content OK - $name"; | ||||
| 80 | } | ||||||
| 81 | } else { | ||||||
| 82 | 0 | 0 | is $res->content, $expected_res, "response content OK - $name"; | ||||
| 83 | } | ||||||
| 84 | 602 | 518419 | if ($res_type) { | ||||
| 85 | 11 | 206 | is $res->header('Content-Type'), $res_type, "Content-Type in response ok - $name"; | ||||
| 86 | } else { | ||||||
| 87 | 591 | 9899 | like $res->header('Content-Type'), qr/\Q; charset=$charset\E$/, "charset okay - $name"; | ||||
| 88 | } | ||||||
| 89 | } else { | ||||||
| 90 | 0 | my ($firstline) = ($request =~ /^([^\n]*)/s); | |||||
| 91 | 0 | die "Invalid request head: \"$firstline\" in $name\n"; | |||||
| 92 | } | ||||||
| 93 | } | ||||||
| 94 | |||||||
| 95 | END { | ||||||
| 96 | 22 22 22 | 266 74 400 | use YAML::Syck; | ||||
| 97 | 22 22 22 | 255 75 326 | use Hash::Merge 'merge'; | ||||
| 98 | #use Data::Dumper; | ||||||
| 99 | #warn scalar $timer->reports; | ||||||
| 100 | my $file = "t/cur-timer.dat"; | ||||||
| 101 | my $cur_data = $timer->data; | ||||||
| 102 | if (!$cur_data) { | ||||||
| 103 | return; | ||||||
| 104 | } | ||||||
| 105 | $cur_data = { @$cur_data }; | ||||||
| 106 | #warn Dumper($cur_data); | ||||||
| 107 | if (-f $file) { | ||||||
| 108 | my $last_data = LoadFile($file); | ||||||
| 109 | $cur_data = merge($cur_data, $last_data); | ||||||
| 110 | } | ||||||
| 111 | DumpFile($file, $cur_data); | ||||||
| 112 | } | ||||||
| 113 | |||||||
| 114 | 1; | ||||||
| 115 | |||||||