PageRenderTime 44ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/PHPUnit/Core/UrlHelperTest.php

https://github.com/CodeYellowBV/piwik
PHP | 232 lines | 141 code | 28 blank | 63 comment | 1 complexity | 5ed70b2304878cbc79e262f70e509e3d MD5 | raw file
Possible License(s): LGPL-3.0, JSON, MIT, GPL-3.0, LGPL-2.1, GPL-2.0, AGPL-1.0, BSD-2-Clause, BSD-3-Clause
  1. <?php
  2. use Piwik\UrlHelper;
  3. /**
  4. * Piwik - free/libre analytics platform
  5. *
  6. * @link http://piwik.org
  7. * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  8. */
  9. class Core_UrlHelperTest extends PHPUnit_Framework_TestCase
  10. {
  11. /**
  12. * Dataprovider for testIsUrl
  13. */
  14. public function getUrls()
  15. {
  16. return array(
  17. // valid urls
  18. array('http://piwik.org', true),
  19. array('http://www.piwik.org', true),
  20. array('https://piwik.org', true),
  21. array('https://piwik.org/dir/dir2/?oeajkgea7aega=&ge=a', true),
  22. array('ftp://www.pi-wik.org', true),
  23. array('news://www.pi-wik.org', true),
  24. array('https://www.tëteâ.org', true),
  25. array('http://汉语/漢語.cn', true), //chinese
  26. // invalid urls
  27. array('it doesnt look like url', false),
  28. array('/index?page=test', false),
  29. array('test.html', false),
  30. array('/\/\/\/\/\/\\\http://test.com////', false),
  31. array('jmleslangues.php', false),
  32. array('http://', false),
  33. array(' http://', false),
  34. array('testhttp://test.com', false),
  35. );
  36. }
  37. /**
  38. * @dataProvider getUrls
  39. * @group Core
  40. */
  41. public function testIsUrl($url, $isValid)
  42. {
  43. $this->assertEquals($isValid, UrlHelper::isLookLikeUrl($url));
  44. }
  45. /**
  46. * Dataprovider for testGetParameterFromQueryString
  47. */
  48. public function getQueryStrings()
  49. {
  50. return array( // querystring, parameter, expected value
  51. array('x=1', 'x', '1'),
  52. array('?x=1', 'x', '1'),
  53. array('?x=y==1', 'x', 'y==1'),
  54. array('x[]=', 'x', array('')),
  55. array('x[]=1', 'x', array('1')),
  56. array('x[]=y==1', 'x', array('y==1')),
  57. array('?x[]=1&x[]=2', 'x', array('1', '2')),
  58. array('?x%5b%5d=3&x[]=4', 'x', array('3', '4')),
  59. array('?x%5B]=5&x[%5D=6', 'x', array('5', '6')),
  60. array('toto=mama&mama=&tuytyt=teaoi&toto=mama second value', 'tuytyt', 'teaoi'),
  61. // don't unescape the value, otherwise it becomes
  62. // ?x[]=A&y=1
  63. array('?x%5B%5D=A%26y%3D1', 'x', array('A%26y%3D1')),
  64. // ?z=y&x[]=1
  65. array('?z=y%26x%5b%5d%3d1', 'x', null),
  66. // strange characters
  67. array('toto=mama&mama=&tuytyt=Поиск в Интернете Поиск страниц на русском _*()!$!£$^!£$%&toto=mama second value', 'tuytyt', 'Поиск в Интернете Поиск страниц на русском _*()!$!£$^!£$%'),
  68. // twice the parameter => returns the last value in the url
  69. array('toto=mama&mama=&tuytyt=teaoi&toto=mama second value', 'toto', 'mama second value'),
  70. // empty param
  71. array('toto=mama&mama=&tuytyt=teaoi', 'mama', ''),
  72. // missing parameter value => returns false
  73. array('x', 'x', false),
  74. array('toto=mama&mama&tuytyt=teaoi', 'mama', false),
  75. // param not found => null
  76. array('toto=mama&mama=titi', 'tot', null),
  77. // empty query string => null
  78. array('', 'test', null),
  79. );
  80. }
  81. /**
  82. * @dataProvider getQueryStrings
  83. * @group Core
  84. */
  85. public function testGetParameterFromQueryString($queryString, $parameter, $expected)
  86. {
  87. $this->assertSame($expected, UrlHelper::getParameterFromQueryString($queryString, $parameter));
  88. }
  89. /**
  90. * @group Core
  91. */
  92. public function testGetPathAndQueryFromUrl()
  93. {
  94. $this->assertEquals('test/index.php?module=CoreHome', UrlHelper::getPathAndQueryFromUrl('http://piwik.org/test/index.php?module=CoreHome'));
  95. }
  96. /**
  97. * @group Core
  98. */
  99. public function testGetArrayFromQueryString()
  100. {
  101. $expected = array(
  102. 'a' => false,
  103. 'b' => '',
  104. 'c' => '1',
  105. 'd' => array(false),
  106. 'e' => array(''),
  107. 'f' => array('a'),
  108. 'g' => array('b', 'c'),
  109. );
  110. $this->assertEquals(serialize($expected), serialize(UrlHelper::getArrayFromQueryString('a&b=&c=1&d[]&e[]=&f[]=a&g[]=b&g[]=c')));
  111. }
  112. /**
  113. * Dataprovider for testExtractSearchEngineInformationFromUrl
  114. */
  115. public function getSearchEngineUrls()
  116. {
  117. return Spyc::YAMLLoad(PIWIK_PATH_TEST_TO_ROOT .'/tests/resources/extractSearchEngineInformationFromUrlTests.yml');
  118. }
  119. /**
  120. * @dataProvider getSearchEngineUrls
  121. * @group Core
  122. */
  123. public function testExtractSearchEngineInformationFromUrl($url, $engine, $keywords)
  124. {
  125. $this->includeDataFilesForSearchEngineTest();
  126. $returnedValue = UrlHelper::extractSearchEngineInformationFromUrl($url);
  127. $exptectedValue = false;
  128. if (!empty($engine)) {
  129. $exptectedValue = array('name' => $engine, 'keywords' => $keywords);
  130. }
  131. $this->assertEquals($exptectedValue, $returnedValue);
  132. }
  133. /**
  134. * Dataprovider for testGetLossyUrl
  135. */
  136. public function getLossyUrls()
  137. {
  138. return array(
  139. array('example.com', 'example.com'),
  140. array('m.example.com', 'example.com'),
  141. array('www.example.com', 'example.com'),
  142. array('search.example.com', 'example.com'),
  143. array('example.ca', 'example.{}'),
  144. array('us.example.com', '{}.example.com'),
  145. array('www.m.example.ca', 'example.{}'),
  146. array('www.google.com.af', 'google.{}'),
  147. array('www.google.co.uk', 'google.{}'),
  148. array('images.de.ask.com', 'images.{}.ask.com'),
  149. );
  150. }
  151. /**
  152. * @dataProvider getLossyUrls
  153. * @group Core
  154. */
  155. public function testGetLossyUrl($input, $expected)
  156. {
  157. $this->assertEquals($expected, UrlHelper::getLossyUrl($input));
  158. }
  159. private function includeDataFilesForSearchEngineTest()
  160. {
  161. include "DataFiles/SearchEngines.php";
  162. include "DataFiles/Countries.php";
  163. }
  164. /**
  165. * @group Core
  166. */
  167. public function test_getHostFromUrl()
  168. {
  169. $this->assertEquals('', UrlHelper::getHostFromUrl(''));
  170. $this->assertEquals('', UrlHelper::getHostFromUrl(null));
  171. $this->assertEquals('localhost', UrlHelper::getHostFromUrl('http://localhost'));
  172. $this->assertEquals('localhost', UrlHelper::getHostFromUrl('http://localhost/path'));
  173. $this->assertEquals('localhost', UrlHelper::getHostFromUrl('localhost/path'));
  174. $this->assertEquals('sub.localhost', UrlHelper::getHostFromUrl('sub.localhost/path'));
  175. $this->assertEquals('sub.localhost', UrlHelper::getHostFromUrl('http://sub.localhost/path/?query=test'));
  176. }
  177. /**
  178. * @group Core
  179. */
  180. public function test_getQueryFromUrl_ShouldReturnEmtpyString_IfNoQuery()
  181. {
  182. $this->assertEquals('', UrlHelper::getQueryFromUrl('', array()));
  183. $this->assertEquals('', UrlHelper::getQueryFromUrl(null, array()));
  184. $this->assertEquals('', UrlHelper::getQueryFromUrl('http://localhost/path', array()));
  185. }
  186. /**
  187. * @group Core
  188. */
  189. public function test_getQueryFromUrl_ShouldReturnOnlyTheQueryPartOfTheUrl_IfNoAdditionalParamsGiven()
  190. {
  191. $this->assertEquals('foo=bar&foo2=bar2&test[]=1', UrlHelper::getQueryFromUrl('http://example.com/?foo=bar&foo2=bar2&test[]=1', array()));
  192. $this->assertEquals('foo=bar&foo2=bar2&test[]=1', UrlHelper::getQueryFromUrl('/?foo=bar&foo2=bar2&test[]=1', array()));
  193. $this->assertEquals('segment=pageTitle!@%40Hello%20World;pageTitle!@Peace%20Love%20', UrlHelper::getQueryFromUrl('/?segment=pageTitle!@%40Hello%20World;pageTitle!@Peace%20Love%20', array()));
  194. }
  195. /**
  196. * @group Core
  197. */
  198. public function test_getQueryFromUrl_ShouldAddAdditionalParams_IfGiven()
  199. {
  200. $this->assertEquals('foo=bar&foo2=bar2&test[]=1&add=foo', UrlHelper::getQueryFromUrl('http://example.com/?foo=bar&foo2=bar2&test[]=1', array('add' => 'foo')));
  201. $this->assertEquals('add=foo', UrlHelper::getQueryFromUrl('/', array('add' => 'foo')));
  202. $this->assertEquals('add[]=foo&add[]=test', UrlHelper::getQueryFromUrl('/', array('add' => array('foo', 'test'))));
  203. }
  204. }