Skip to content

Commit b28fab6

Browse files
committed
Merge pull request #66 from toin0u/hotfix-loggable
Hotfix loggable with multiple results
2 parents 753c6b1 + 53a1aa7 commit b28fab6

File tree

4 files changed

+157
-30
lines changed

4 files changed

+157
-30
lines changed

Geocoder/LoggableGeocoder.php

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,17 @@ public function geocode($value)
3939
}
4040

4141
$startTime = microtime(true);
42-
$result = parent::geocode($value);
42+
$results = parent::geocode($value);
4343
$duration = (microtime(true) - $startTime) * 1000;
4444

4545
$this->logger->logRequest(
4646
sprintf("[Geocoding] %s", $value),
4747
$duration,
4848
$this->getProviderClass(),
49-
json_encode($result->toArray())
49+
$results
5050
);
5151

52-
return $result;
52+
return $results;
5353
}
5454

5555
/**
@@ -62,19 +62,14 @@ public function reverse($latitude, $longitude)
6262
}
6363

6464
$startTime = microtime(true);
65-
$result = parent::reverse($latitude, $longitude);
65+
$results = parent::reverse($latitude, $longitude);
6666
$duration = (microtime(true) - $startTime) * 1000;
6767

6868
$value = sprintf("[Reverse geocoding] latitude: %s, longitude: %s", $latitude, $longitude);
6969

70-
$this->logger->logRequest(
71-
$value,
72-
$duration,
73-
$this->getProviderClass(),
74-
json_encode($result->toArray())
75-
);
70+
$this->logger->logRequest($value, $duration, $this->getProviderClass(), $results);
7671

77-
return $result;
72+
return $results;
7873
}
7974

8075
protected function getProviderClass()

Logger/GeocoderLogger.php

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,17 @@
1717
*/
1818
class GeocoderLogger
1919
{
20+
/**
21+
* @var LoggerInterface
22+
*/
2023
protected $logger;
2124

25+
/**
26+
* @var array
27+
*/
2228
protected $requests = array();
2329

2430
/**
25-
*
2631
* @param LoggerInterface $logger
2732
*/
2833
public function __construct(LoggerInterface $logger = null)
@@ -31,28 +36,31 @@ public function __construct(LoggerInterface $logger = null)
3136
}
3237

3338
/**
34-
*
35-
* @param string $value value to geocode
36-
* @param float $duration
37-
* @param string $providerClass Geocoder provider class
38-
* @param mixed $result
39+
* @param string $value value to geocode
40+
* @param float $duration geocoding duration
41+
* @param string $providerClass Geocoder provider class name
42+
* @param \SplObjectStorage|Geocoded $results
3943
*/
40-
public function logRequest($value, $duration, $providerClass, $result)
44+
public function logRequest($value, $duration, $providerClass, $results)
4145
{
4246
if (null !== $this->logger) {
43-
$this->requests[] = array(
44-
'value' => $value,
45-
'duration' => $duration,
46-
'providerClass' => $providerClass,
47-
'result' => $result
48-
);
47+
$this->logger->info(sprintf("%s %0.2f ms (%s)", $value, $duration, $providerClass));
48+
}
4949

50-
$this->logger->info(sprintf("%s %0.2f ms (%s)",
51-
$value,
52-
$duration,
53-
$providerClass
54-
));
50+
if ($results instanceof \SplObjectStorage) {
51+
foreach ($results as $result) {
52+
$data[] = $result->toArray();
53+
}
54+
} else {
55+
$data = $results->toArray();
5556
}
57+
58+
$this->requests[] = array(
59+
'value' => $value,
60+
'duration' => $duration,
61+
'providerClass' => $providerClass,
62+
'result' => json_encode($data),
63+
);
5664
}
5765

5866
/**

Tests/Logger/GeocoderLoggerTest.php

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
<?php
2+
3+
/**
4+
* This file is part of the BazingaGeocoderBundle package.
5+
* For the full copyright and license information, please view the LICENSE
6+
* file that was distributed with this source code.
7+
*
8+
* @license MIT License
9+
*/
10+
11+
namespace Bazinga\Bundle\GeocoderBundle\Tests\Logger;
12+
13+
use Bazinga\Bundle\GeocoderBundle\Logger\GeocoderLogger;
14+
use Geocoder\Result\Geocoded;
15+
16+
/**
17+
* @author Antoine Corcy <[email protected]>
18+
*/
19+
class GeocoderLoggerTest extends \PHPUnit_Framework_TestCase
20+
{
21+
protected $geocoderLogger;
22+
protected $result;
23+
protected $results;
24+
25+
public function setUp()
26+
{
27+
$logger = $this->getMock('Symfony\\Component\\HttpKernel\\Log\\LoggerInterface');
28+
$logger
29+
->expects($this->any())
30+
->method('info')
31+
->will($this->returnValue(null))
32+
;
33+
34+
$this->geocoderLogger = new GeocoderLogger($logger);
35+
36+
$this->result = new Geocoded;
37+
$this->result->fromArray(array(
38+
'latitude' => 1,
39+
'longitude' => 2,
40+
));
41+
42+
$this->results = new \SplObjectStorage;
43+
$this->results->attach($this->result);
44+
45+
$otherResult = new Geocoded;
46+
$otherResult->fromArray(array(
47+
'latitude' => 3,
48+
'longitude' => 4,
49+
));
50+
51+
$this->results->attach($otherResult);
52+
}
53+
54+
public function testLogSingleResult()
55+
{
56+
$this->geocoderLogger->logRequest('copenhagen', 0.123, 'FooProvider', $this->result);
57+
58+
$this->assertTrue(is_array($requests = $this->geocoderLogger->getRequests()));
59+
$this->assertCount(1, $requests);
60+
$this->assertTrue(is_array($request = $requests[0]));
61+
$this->assertSame($request['value'], 'copenhagen');
62+
$this->assertSame($request['duration'], 0.123);
63+
$this->assertSame($request['providerClass'], 'FooProvider');
64+
$this->assertSame($request['result'], '{"latitude":1,"longitude":2,"bounds":null,"streetNumber":null,"streetName":null,"zipcode":null,"city":null,"cityDistrict":null,"county":null,"countyCode":null,"region":null,"regionCode":null,"country":null,"countryCode":null,"timezone":null}');
65+
}
66+
67+
public function testLog2RequestsWithSingleResult()
68+
{
69+
$this->geocoderLogger->logRequest('copenhagen', 0.123, 'FooProvider', $this->result);
70+
$this->geocoderLogger->logRequest('paris', 0.456, 'BarProvider', $this->result);
71+
72+
$this->assertTrue(is_array($requests = $this->geocoderLogger->getRequests()));
73+
$this->assertCount(2, $requests);
74+
$this->assertTrue(is_array($request = $requests[0]));
75+
$this->assertSame($request['value'], 'copenhagen');
76+
$this->assertTrue(is_array($request = $requests[1]));
77+
$this->assertSame($request['value'], 'paris');
78+
}
79+
80+
public function testLogMultipleResults()
81+
{
82+
$this->geocoderLogger->logRequest('copenhagen', 0.123, 'FooProvider', $this->results);
83+
84+
$this->assertTrue(is_array($requests = $this->geocoderLogger->getRequests()));
85+
$this->assertCount(1, $requests);
86+
$this->assertTrue(is_array($request = $requests[0]));
87+
$this->assertSame($request['value'], 'copenhagen');
88+
$this->assertSame($request['duration'], 0.123);
89+
$this->assertSame($request['providerClass'], 'FooProvider');
90+
$this->assertSame($request['result'], '[{"latitude":1,"longitude":2,"bounds":null,"streetNumber":null,"streetName":null,"zipcode":null,"city":null,"cityDistrict":null,"county":null,"countyCode":null,"region":null,"regionCode":null,"country":null,"countryCode":null,"timezone":null},{"latitude":3,"longitude":4,"bounds":null,"streetNumber":null,"streetName":null,"zipcode":null,"city":null,"cityDistrict":null,"county":null,"countyCode":null,"region":null,"regionCode":null,"country":null,"countryCode":null,"timezone":null}]');
91+
$this->assertCount(2, json_decode($request['result']));
92+
}
93+
94+
public function testLog2RequetsWithMultipleResults()
95+
{
96+
$this->geocoderLogger->logRequest('copenhagen', 0.123, 'FooProvider', $this->results);
97+
$this->geocoderLogger->logRequest('paris', 0.456, 'BarProvider', $this->results);
98+
99+
$this->assertTrue(is_array($requests = $this->geocoderLogger->getRequests()));
100+
$this->assertCount(2, $requests);
101+
102+
$this->assertTrue(is_array($request = $requests[0]));
103+
$this->assertSame($request['value'], 'copenhagen');
104+
$this->assertCount(2, json_decode($request['result']));
105+
106+
$this->assertTrue(is_array($request = $requests[1]));
107+
$this->assertSame($request['value'], 'paris');
108+
$this->assertCount(2, json_decode($request['result']));
109+
}
110+
111+
public function testLogRequestsWithoutLogger()
112+
{
113+
$geocoderLogger = new GeocoderLogger;
114+
$geocoderLogger->logRequest('copenhagen', 0.123, 'FooProvider', $this->result);
115+
116+
$this->assertTrue(is_array($requests = $geocoderLogger->getRequests()));
117+
$this->assertCount(1, $requests);
118+
$this->assertTrue(is_array($request = $requests[0]));
119+
$this->assertSame($request['value'], 'copenhagen');
120+
$this->assertSame($request['duration'], 0.123);
121+
$this->assertSame($request['providerClass'], 'FooProvider');
122+
$this->assertSame($request['result'], '{"latitude":1,"longitude":2,"bounds":null,"streetNumber":null,"streetName":null,"zipcode":null,"city":null,"cityDistrict":null,"county":null,"countyCode":null,"region":null,"regionCode":null,"country":null,"countryCode":null,"timezone":null}');
123+
}
124+
}

Tests/bootstrap.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
if (!$loader = @require_once __DIR__ . '/../vendor/autoload.php') {
44
die("You must set up the project dependencies, run the following commands:
55
wget http://getcomposer.org/composer.phar
6-
php composer.phar install --dev
6+
php composer.phar install --dev --prefer-source
77
");
88
}
99

0 commit comments

Comments
 (0)