Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
5 / 5
CRAP
100.00% covered (success)
100.00%
1 / 1
SingleInstance
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
5 / 5
7
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 details
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 curlErrorNumber
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 curlErrorInfo
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 fetch
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2namespace Dbmi\Webservice\Quake;
3
4use Dbmi\Webservice\Quake\IdStruct as DS_QuakeId;
5
6/**
7 * Get quake details
8 */
9class SingleInstance{
10    private const templateUrl = 'https://emidius.mi.ingv.it/services/macroseismic/query?eventid=%s&format=text';
11    private const validResponseLines = 2;
12
13    private DS_QuakeId $quakeId;
14    private array $details = array();
15
16    private int $curlErrNum = 0;
17    private string $curlErrInfo = '';
18
19
20    public function __construct(DS_QuakeId $quakeId){
21        $this->quakeId = $quakeId;
22    }
23
24    public function details():array{ return $this->details; } 
25
26    public function curlErrorNumber():int{ return $this->curlErrNum; }
27    public function curlErrorInfo():string{ return $this->curlErrInfo; }
28    
29    /**
30     * Get quake epicentral details
31     *
32     * @return int     found lines
33     */
34    public function fetch():int{
35        $curlSession = curl_init();
36        curl_setopt_array($curlSession, array(
37            CURLOPT_URL         => sprintf(self::templateUrl, $this->quakeId->id()),
38            CURLOPT_HEADER         => false,
39            CURLOPT_CUSTOMREQUEST    => 'GET',
40            CURLOPT_RETURNTRANSFER    => true,
41            CURLOPT_FAILONERROR     => true
42            )
43        );
44        $downloadedData = curl_exec($curlSession);
45
46        $this->curlErrNum = curl_errno($curlSession);
47        $this->curlErrInfo = curl_error($curlSession);
48        curl_close($curlSession);
49        
50        if(CURLE_OK != $this->curlErrNum){
51            // @codeCoverageIgnoreStart
52            error_log(sprintf("[%s] [CurlErr: %d] %s", __METHOD__, $this->curlErrNum, $this->curlErrInfo));
53            return -1;
54            // @codeCoverageIgnoreEnd
55        }
56
57        $rows = preg_split("/\n/", trim($downloadedData));
58
59        if( count($rows) != self::validResponseLines ){ //header+data
60            error_log(sprintf("[%s] Invalid epicenter response, see below\n'%s'", __METHOD__, $downloadedData));
61            return -2;
62        }    
63
64        $this->details = preg_split("/\|/", $rows[1]);
65
66        return 1;
67    }
68}
69
70?>
71