PageRenderTime 49ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/GeocodableBehaviorWithNamespacesTest.php

https://github.com/jpetitcolas/GeocodableBehavior
PHP | 435 lines | 355 code | 66 blank | 14 comment | 1 complexity | fbdc4f2d7361d64d1bab5bcfc5271787 MD5 | raw file
  1. <?php
  2. /*
  3. * This file is part of the Propel package.
  4. * For the full copyright and license information, please view the LICENSE
  5. * file that was distributed with this source code.
  6. *
  7. * @license MIT License
  8. */
  9. use My\GeocodedObject2;
  10. use My\GeocodedObject2Peer;
  11. use My\GeocodedObject2Query;
  12. use My\GeocodedObject2NoAutoUpdate;
  13. use My\GeocodedObject2KeyProvider;
  14. use My\GeocodedObject2KeyProviderStatic;
  15. use My\GeocodedObject2KeyProviderMethod;
  16. use My\SimpleGeocodedObject2;
  17. /**
  18. * Tests for GeocodableBehavior class
  19. *
  20. * @author William Durand <william.durand1@gmail.com>
  21. */
  22. class GeocodableBehaviorWithNamespacesTest extends \PHPUnit_Framework_TestCase
  23. {
  24. public function setUp()
  25. {
  26. if (!class_exists('My\GeocodedObject2')) {
  27. $schema = <<<EOF
  28. <database name="bookstore" defaultIdMethod="native" namespace="My">
  29. <table name="simple_geocoded_object_2">
  30. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
  31. <behavior name="geocodable" />
  32. </table>
  33. <table name="geocoded_object_2">
  34. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
  35. <column name="name" type="VARCHAR" size="100" primaryString="true" />
  36. <column name="street" type="VARCHAR" size="100" primaryString="true" />
  37. <column name="city" type="VARCHAR" size="100" primaryString="true" />
  38. <column name="country" type="VARCHAR" size="100" primaryString="true" />
  39. <behavior name="geocodable">
  40. <!-- IP -->
  41. <parameter name="geocode_ip" value="true" />
  42. <!-- Address -->
  43. <parameter name="geocode_address" value="true" />
  44. <parameter name="address_columns" value="street, city, country" />
  45. <!-- Geocoder -->
  46. <parameter name="geocoder_api_key" value="YOUR_API_KEY" />
  47. </behavior>
  48. </table>
  49. <table name="geocoded_object_2_no_autoupdate">
  50. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
  51. <column name="name" type="VARCHAR" size="100" primaryString="true" />
  52. <column name="street" type="VARCHAR" size="100" primaryString="true" />
  53. <column name="city" type="VARCHAR" size="100" primaryString="true" />
  54. <column name="country" type="VARCHAR" size="100" primaryString="true" />
  55. <behavior name="geocodable">
  56. <parameter name="auto_update" value="false" />
  57. <!-- IP -->
  58. <parameter name="geocode_ip" value="true" />
  59. <!-- Address -->
  60. <parameter name="geocode_address" value="true" />
  61. <parameter name="address_columns" value="street, city, country" />
  62. <!-- Geocoder -->
  63. <parameter name="geocoder_api_key" value="YOUR_API_KEY" />
  64. </behavior>
  65. </table>
  66. <table name="geocoded_object_2_key_provider">
  67. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
  68. <column name="name" type="VARCHAR" size="100" primaryString="true" />
  69. <column name="street" type="VARCHAR" size="100" primaryString="true" />
  70. <column name="city" type="VARCHAR" size="100" primaryString="true" />
  71. <column name="country" type="VARCHAR" size="100" primaryString="true" />
  72. <behavior name="geocodable">
  73. <!-- IP -->
  74. <parameter name="geocode_ip" value="true" />
  75. <!-- Address -->
  76. <parameter name="geocode_address" value="true" />
  77. <parameter name="address_columns" value="street, city, country" />
  78. <!-- Geocoder -->
  79. <parameter name="geocoder_api_key_provider" value="GeoApikeyProvider" />
  80. </behavior>
  81. </table>
  82. <table name="geocoded_object_2_key_provider_static">
  83. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
  84. <column name="name" type="VARCHAR" size="100" primaryString="true" />
  85. <column name="street" type="VARCHAR" size="100" primaryString="true" />
  86. <column name="city" type="VARCHAR" size="100" primaryString="true" />
  87. <column name="country" type="VARCHAR" size="100" primaryString="true" />
  88. <behavior name="geocodable">
  89. <!-- IP -->
  90. <parameter name="geocode_ip" value="true" />
  91. <!-- Address -->
  92. <parameter name="geocode_address" value="true" />
  93. <parameter name="address_columns" value="street, city, country" />
  94. <!-- Geocoder -->
  95. <parameter name="geocoder_api_key_provider" value="GeoApikeyProvider::getKey()" />
  96. </behavior>
  97. </table>
  98. <table name="geocoded_object_2_key_provider_method">
  99. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
  100. <column name="name" type="VARCHAR" size="100" primaryString="true" />
  101. <column name="street" type="VARCHAR" size="100" primaryString="true" />
  102. <column name="city" type="VARCHAR" size="100" primaryString="true" />
  103. <column name="country" type="VARCHAR" size="100" primaryString="true" />
  104. <behavior name="geocodable">
  105. <!-- IP -->
  106. <parameter name="geocode_ip" value="true" />
  107. <!-- Address -->
  108. <parameter name="geocode_address" value="true" />
  109. <parameter name="address_columns" value="street, city, country" />
  110. <!-- Geocoder -->
  111. <parameter name="geocoder_api_key_provider" value="GeoApikeyProvider->getApiKeyMethod()" />
  112. </behavior>
  113. </table>
  114. </database>
  115. EOF;
  116. $builder = new PropelQuickBuilder();
  117. $config = $builder->getConfig();
  118. $config->setBuildProperty('behavior.geocodable.class', '../src/GeocodableBehavior');
  119. $builder->setConfig($config);
  120. $builder->setSchema($schema);
  121. $con = $builder->build();
  122. $con->sqliteCreateFunction('ACOS', 'acos', 1);
  123. $con->sqliteCreateFunction('COS', 'cos', 1);
  124. $con->sqliteCreateFunction('RADIANS', 'deg2rad', 1);
  125. $con->sqliteCreateFunction('SIN', 'sin', 1);
  126. }
  127. }
  128. public function testObjectMethods()
  129. {
  130. $this->assertTrue(method_exists('My\GeocodedObject2', 'getLatitude'));
  131. $this->assertTrue(method_exists('My\GeocodedObject2', 'getLongitude'));
  132. $this->assertTrue(method_exists('My\GeocodedObject2', 'geocode'));
  133. $this->assertTrue(method_exists('My\GeocodedObject2', 'isGeocoded'));
  134. $this->assertTrue(method_exists('My\GeocodedObject2', 'isGeocodingNecessary'));
  135. $this->assertTrue(method_exists('My\GeocodedObject2', 'getDistanceTo'));
  136. $this->assertTrue(method_exists('My\GeocodedObject2', 'getCoordinates'));
  137. $this->assertTrue(method_exists('My\GeocodedObject2', 'setCoordinates'));
  138. }
  139. public function testQueryMethods()
  140. {
  141. $this->assertTrue(method_exists('My\GeocodedObject2Query', 'filterByDistanceFrom'));
  142. $this->assertTrue(method_exists('My\GeocodedObject2Query', 'filterNear'));
  143. }
  144. public function testPeerConstants()
  145. {
  146. $this->assertTrue(defined('My\GeocodedObject2Peer::KILOMETERS_UNIT'));
  147. $this->assertTrue(defined('My\GeocodedObject2Peer::MILES_UNIT'));
  148. $this->assertTrue(defined('My\GeocodedObject2Peer::NAUTICAL_MILES_UNIT'));
  149. }
  150. public function testGetDistanceToInKilometers()
  151. {
  152. $geo1 = new GeocodedObject2();
  153. $geo1->setLatitude(45.795463);
  154. $geo1->setLongitude(3.163237);
  155. $geo2 = new GeocodedObject2();
  156. $geo2->setLatitude(45.77722154971201);
  157. $geo2->setLongitude(3.086986541748047);
  158. $dist = round($geo1->getDistanceTo($geo2), 2);
  159. $this->assertEquals(6.25, $dist);
  160. }
  161. public function testGetDistanceToInMiles()
  162. {
  163. $geo1 = new GeocodedObject2();
  164. $geo1->setLatitude(45.795463);
  165. $geo1->setLongitude(3.163237);
  166. $geo2 = new GeocodedObject2();
  167. $geo2->setLatitude(45.77722154971201);
  168. $geo2->setLongitude(3.086986541748047);
  169. $dist = round($geo1->getDistanceTo($geo2, GeocodedObject2Peer::MILES_UNIT), 2);
  170. $this->assertEquals(3.88, $dist);
  171. }
  172. public function testGetDistanceToInNauticalMiles()
  173. {
  174. $geo1 = new GeocodedObject2();
  175. $geo1->setLatitude(45.795463);
  176. $geo1->setLongitude(3.163237);
  177. $geo2 = new GeocodedObject2();
  178. $geo2->setLatitude(45.77722154971201);
  179. $geo2->setLongitude(3.086986541748047);
  180. $dist = round($geo1->getDistanceTo($geo2, GeocodedObject2Peer::NAUTICAL_MILES_UNIT), 2);
  181. $this->assertEquals(3.37, $dist);
  182. }
  183. public function testSetCoordinates()
  184. {
  185. $geo = new GeocodedObject2();
  186. $geo->setCoordinates(1, 2);
  187. $this->assertEquals(1, $geo->getLatitude());
  188. $this->assertEquals(2, $geo->getLongitude());
  189. }
  190. public function testGetCoordinates()
  191. {
  192. $obj = new GeocodedObject2();
  193. $obj->setCoordinates(1, 2);
  194. $this->assertEquals(array('latitude' => 1, 'longitude' => 2), $obj->getCoordinates());
  195. }
  196. public function testIsGeocoded()
  197. {
  198. $obj = new GeocodedObject2();
  199. $this->assertFalse($obj->isGeocoded());
  200. $obj->setCoordinates(1, 2);
  201. $this->assertTrue($obj->isGeocoded());
  202. }
  203. public function testFilterByDistanceFromReturnsNoObjects()
  204. {
  205. GeocodedObject2Peer::doDeleteAll();
  206. $geo1 = new GeocodedObject2();
  207. $geo1->setName('Aulnat Area');
  208. $geo1->setCity('Aulnat');
  209. $geo1->setCountry('France');
  210. $geo1->save();
  211. $geo2 = new GeocodedObject2();
  212. $geo2->setName('Lyon Area');
  213. $geo2->setCity('Lyon');
  214. $geo2->setCountry('France');
  215. $geo2->save();
  216. $objects = GeocodedObject2Query::create()
  217. ->filterByDistanceFrom($geo1->getLatitude(), $geo1->getLongitude(), 5)
  218. ->find()
  219. ;
  220. $this->assertEquals(1, count($objects));
  221. }
  222. public function testFilterByDistanceFromReturnsObjects()
  223. {
  224. GeocodedObject2Peer::doDeleteAll();
  225. $geo1 = new GeocodedObject2();
  226. $geo1->setName('Aulnat Area');
  227. $geo1->setCity('Aulnat');
  228. $geo1->setCountry('France');
  229. $geo1->save();
  230. $geo2 = new GeocodedObject2();
  231. $geo2->setName('Lyon Area');
  232. $geo2->setCity('Lyon');
  233. $geo2->setCountry('France');
  234. $geo2->save();
  235. $geo3 = new GeocodedObject2();
  236. $geo3->setName('Lempdes Area');
  237. $geo3->setCity('Lempdes');
  238. $geo3->setCountry('France');
  239. $geo3->save();
  240. $objects = GeocodedObject2Query::create()
  241. ->filterByDistanceFrom($geo1->getLatitude(), $geo1->getLongitude(), 20)
  242. ->find()
  243. ;
  244. $this->assertEquals(2, count($objects));
  245. }
  246. public function testGeocodeIp()
  247. {
  248. $geo = new GeocodedObject2();
  249. $geo->setIpAddress('74.200.247.59');
  250. $geo->save();
  251. $this->assertEquals(33.036711, $geo->getLatitude());
  252. $this->assertEquals(-96.813541, $geo->getLongitude());
  253. }
  254. public function testGeocodeAddress()
  255. {
  256. $geo = new GeocodedObject2();
  257. $geo->setStreet('10 avenue Gambetta');
  258. $geo->setCity('Paris');
  259. $geo->setCountry('France');
  260. $geo->save();
  261. $this->assertEquals(48.863217, $geo->getLatitude());
  262. $this->assertEquals(2.388821, $geo->getLongitude());
  263. }
  264. public function testGeocodeAddressWithUpdate()
  265. {
  266. $geo = new GeocodedObject2();
  267. $geo->setStreet('10 avenue Gambetta');
  268. $geo->setCity('Paris');
  269. $geo->setCountry('France');
  270. $geo->save();
  271. $this->assertEquals(48.863217, $geo->getLatitude());
  272. $this->assertEquals(2.388821, $geo->getLongitude());
  273. $geo->setStreet('1 avenue LĂŠon Maniez');
  274. $geo->save();
  275. $this->assertEquals(48.85693, $geo->getLatitude());
  276. $this->assertEquals(2.3412, $geo->getLongitude());
  277. }
  278. public function testGeocodeAddressForceCoordinates()
  279. {
  280. $geo = new GeocodedObject2();
  281. $geo->setStreet('10 avenue Gambetta');
  282. $geo->setCity('Paris');
  283. $geo->setCountry('France');
  284. $geo->save();
  285. $this->assertEquals(48.863217, $geo->getLatitude());
  286. $this->assertEquals(2.388821, $geo->getLongitude());
  287. // If we force the values, we should bypass the geocoding process
  288. $geo->setLatitude(48.85693);
  289. $geo->setLongitude(2.3412);
  290. $geo->save();
  291. $this->assertEquals(48.85693, $geo->getLatitude());
  292. $this->assertEquals(2.3412, $geo->getLongitude());
  293. }
  294. public function testNoFieldUpdate()
  295. {
  296. $geo = new GeocodedObject2();
  297. $geo->setStreet('10 avenue Gambetta');
  298. $geo->setCity('Paris');
  299. $geo->setCountry('France');
  300. $geo->setLatitude(48.123456);
  301. $geo->setLongitude(2.3412);
  302. $geo->save();
  303. $this->assertEquals(48.123456, $geo->getLatitude());
  304. $this->assertEquals(2.3412, $geo->getLongitude());
  305. // If fields are unchanged, we should bypass the geocoding process
  306. $geo->setLongitude(2.123456);
  307. $geo->save();
  308. $this->assertEquals(48.123456, $geo->getLatitude());
  309. $this->assertEquals(2.123456, $geo->getLongitude());
  310. }
  311. public function testNoAutoUpdate()
  312. {
  313. $geo = new GeocodedObject2NoAutoUpdate();
  314. $geo->setStreet('10 avenue Gambetta');
  315. $geo->setCity('Paris');
  316. $geo->setCountry('France');
  317. $geo->save();
  318. $this->assertEquals(null, $geo->getLatitude());
  319. $this->assertEquals(null, $geo->getLongitude());
  320. }
  321. public function testKeyProvider()
  322. {
  323. $geo = new GeocodedObject2KeyProvider();
  324. $geo->setStreet('10 avenue Gambetta');
  325. $geo->setCity('Paris');
  326. $geo->setCountry('France');
  327. $geo->save();
  328. $this->assertEquals(48.863217, $geo->getLatitude());
  329. $this->assertEquals(2.388821, $geo->getLongitude());
  330. }
  331. public function testKeyProviderStatic()
  332. {
  333. $geo = new GeocodedObject2KeyProviderStatic();
  334. $geo->setStreet('10 avenue Gambetta');
  335. $geo->setCity('Paris');
  336. $geo->setCountry('France');
  337. $geo->save();
  338. $this->assertEquals(48.863217, $geo->getLatitude());
  339. $this->assertEquals(2.388821, $geo->getLongitude());
  340. }
  341. public function testKeyProviderMethod()
  342. {
  343. $geo = new GeocodedObject2KeyProviderMethod();
  344. $geo->setStreet('10 avenue Gambetta');
  345. $geo->setCity('Paris');
  346. $geo->setCountry('France');
  347. $geo->save();
  348. $this->assertEquals(48.863217, $geo->getLatitude());
  349. $this->assertEquals(2.388821, $geo->getLongitude());
  350. }
  351. public function testGeocode()
  352. {
  353. $geo = new GeocodedObject2();
  354. $this->assertNull($geo->geocode(), 'The method returns null as there is nothing to geocode');
  355. $this->assertFalse($geo->isModified());
  356. $geo->setCity('Paris');
  357. $result = $geo->geocode();
  358. $this->assertTrue($geo->isModified());
  359. $this->assertInstanceOf('Geocoder\Result\ResultInterface', $result);
  360. $this->assertEquals('Paris', $result->getCity());
  361. $this->assertEquals('France', $result->getCountry());
  362. }
  363. public function testGeocodeIsEffectLessIfGeocodingDisabled()
  364. {
  365. $geo = new SimpleGeocodedObject2();
  366. $geo->geocode();
  367. $this->assertFalse($geo->isModified());
  368. }
  369. }