PageRenderTime 48ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/PHPUnit/Integration/Plugins/SitesManagerTest.php

https://github.com/CodeYellowBV/piwik
PHP | 997 lines | 618 code | 147 blank | 232 comment | 4 complexity | 72336550d3129642803bde662cafd9a2 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. /**
  3. * Piwik - free/libre analytics platform
  4. *
  5. * @link http://piwik.org
  6. * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  7. */
  8. use Piwik\Access;
  9. use Piwik\Plugins\SitesManager\API;
  10. use Piwik\Plugins\UsersManager\API as APIUsersManager;
  11. use Piwik\Site;
  12. /**
  13. * Class Plugins_SitesManagerTest
  14. *
  15. * @group Plugins
  16. */
  17. class Plugins_SitesManagerTest extends DatabaseTestCase
  18. {
  19. public function setUp()
  20. {
  21. parent::setUp();
  22. // setup the access layer
  23. $pseudoMockAccess = new FakeAccess;
  24. FakeAccess::$superUser = true;
  25. Access::setSingletonInstance($pseudoMockAccess);
  26. }
  27. /**
  28. * empty name -> exception
  29. *
  30. * @group Plugins
  31. */
  32. public function testAddSiteEmptyName()
  33. {
  34. try {
  35. API::getInstance()->addSite("", array("http://piwik.net"));
  36. } catch (Exception $e) {
  37. return;
  38. }
  39. $this->fail('Expected exception not raised');
  40. }
  41. /**
  42. * DataProvider for testAddSiteWrongUrls
  43. */
  44. public function getInvalidUrlData()
  45. {
  46. return array(
  47. array(array()), // no urls
  48. array(array("")),
  49. array(""),
  50. array("httpww://piwik.net"),
  51. array("httpww://piwik.net/gqg~#"),
  52. );
  53. }
  54. /**
  55. * wrong urls -> exception
  56. *
  57. * @dataProvider getInvalidUrlData
  58. * @group Plugins
  59. */
  60. public function testAddSiteWrongUrls($url)
  61. {
  62. try {
  63. API::getInstance()->addSite("name", $url);
  64. } catch (Exception $e) {
  65. return;
  66. }
  67. $this->fail('Expected exception not raised');
  68. }
  69. /**
  70. * Test with valid IPs
  71. *
  72. * @group Plugins
  73. */
  74. public function testAddSiteExcludedIpsAndtimezoneAndCurrencyAndExcludedQueryParametersValid()
  75. {
  76. $ips = '1.2.3.4,1.1.1.*,1.2.*.*,1.*.*.*';
  77. $timezone = 'Europe/Paris';
  78. $currency = 'EUR';
  79. $excludedQueryParameters = 'p1,P2, P33333';
  80. $expectedExcludedQueryParameters = 'p1,P2,P33333';
  81. $excludedUserAgents = " p1,P2, \nP3333 ";
  82. $expectedExcludedUserAgents = "p1,P2,P3333";
  83. $expectedWebsiteType = 'mobile-\'app';
  84. $keepUrlFragment = 1;
  85. $idsite = API::getInstance()->addSite("name", "http://piwik.net/", $ecommerce = 1,
  86. $siteSearch = 1, $searchKeywordParameters = 'search,param', $searchCategoryParameters = 'cat,category',
  87. $ips, $excludedQueryParameters, $timezone, $currency, $group = null, $startDate = null, $excludedUserAgents,
  88. $keepUrlFragment, $expectedWebsiteType);
  89. $siteInfo = API::getInstance()->getSiteFromId($idsite);
  90. $this->assertEquals($ips, $siteInfo['excluded_ips']);
  91. $this->assertEquals($timezone, $siteInfo['timezone']);
  92. $this->assertEquals($currency, $siteInfo['currency']);
  93. $this->assertEquals($ecommerce, $siteInfo['ecommerce']);
  94. $this->assertTrue(Site::isEcommerceEnabledFor($idsite));
  95. $this->assertEquals($siteSearch, $siteInfo['sitesearch']);
  96. $this->assertTrue(Site::isSiteSearchEnabledFor($idsite));
  97. $this->assertEquals($expectedWebsiteType, $siteInfo['type']);
  98. $this->assertEquals($expectedWebsiteType, Site::getTypeFor($idsite));
  99. $this->assertEquals($searchKeywordParameters, $siteInfo['sitesearch_keyword_parameters']);
  100. $this->assertEquals($searchCategoryParameters, $siteInfo['sitesearch_category_parameters']);
  101. $this->assertEquals($expectedExcludedQueryParameters, $siteInfo['excluded_parameters']);
  102. $this->assertEquals($expectedExcludedUserAgents, $siteInfo['excluded_user_agents']);
  103. }
  104. /**
  105. * dataProvider for testAddSiteExcludedIpsNotValid
  106. */
  107. public function getInvalidIPsData()
  108. {
  109. return array(
  110. array('35817587341'),
  111. array('ieagieha'),
  112. array('1.2.3'),
  113. array('*.1.1.1'),
  114. array('*.*.1.1'),
  115. array('*.*.*.1'),
  116. array('1.1.1.1.1'),
  117. );
  118. }
  119. /**
  120. * Test with invalid IPs
  121. *
  122. * @dataProvider getInvalidIPsData
  123. * @group Plugins
  124. */
  125. public function testAddSiteExcludedIpsNotValid($ip)
  126. {
  127. try {
  128. API::getInstance()->addSite("name", "http://piwik.net/", $ecommerce = 0,
  129. $siteSearch = 1, $searchKeywordParameters = null, $searchCategoryParameters = null, $ip);
  130. } catch (Exception $e) {
  131. return;
  132. }
  133. $this->fail('Expected exception not raised');
  134. }
  135. /**
  136. * one url -> one main_url and nothing inserted as alias urls
  137. *
  138. * @group Plugins
  139. */
  140. public function testAddSiteOneUrl()
  141. {
  142. $url = "http://piwik.net/";
  143. $urlOK = "http://piwik.net";
  144. $idsite = API::getInstance()->addSite("name", $url);
  145. $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
  146. $siteInfo = API::getInstance()->getSiteFromId($idsite);
  147. $this->assertEquals($urlOK, $siteInfo['main_url']);
  148. $this->assertEquals(date('Y-m-d'), date('Y-m-d', strtotime($siteInfo['ts_created'])));
  149. $siteUrls = API::getInstance()->getSiteUrlsFromId($idsite);
  150. $this->assertEquals(1, count($siteUrls));
  151. }
  152. /**
  153. * several urls -> one main_url and others as alias urls
  154. *
  155. * @group Plugins
  156. */
  157. public function testAddSiteSeveralUrls()
  158. {
  159. $urls = array("http://piwik.net/", "http://piwik.com", "https://piwik.net/test/");
  160. $urlsOK = array("http://piwik.net", "http://piwik.com", "https://piwik.net/test");
  161. $idsite = API::getInstance()->addSite("super website", $urls);
  162. $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
  163. $siteInfo = API::getInstance()->getSiteFromId($idsite);
  164. $this->assertEquals($urlsOK[0], $siteInfo['main_url']);
  165. $siteUrls = API::getInstance()->getSiteUrlsFromId($idsite);
  166. $this->assertEquals($urlsOK, $siteUrls);
  167. }
  168. /**
  169. * strange name
  170. *
  171. * @group Plugins
  172. */
  173. public function testAddSiteStrangeName()
  174. {
  175. $name = "supertest(); ~@@()''!£\$'%%^'!£ போ";
  176. $idsite = API::getInstance()->addSite($name, "http://piwik.net");
  177. $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
  178. $siteInfo = API::getInstance()->getSiteFromId($idsite);
  179. $this->assertEquals($name, $siteInfo['name']);
  180. }
  181. /**
  182. * adds a site
  183. * use by several other unit tests
  184. */
  185. protected function _addSite()
  186. {
  187. $name = "website ";
  188. $idsite = API::getInstance()->addSite($name, array("http://piwik.net", "http://piwik.com/test/"));
  189. $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
  190. $siteInfo = API::getInstance()->getSiteFromId($idsite);
  191. $this->assertEquals($name, $siteInfo['name']);
  192. $this->assertEquals("http://piwik.net", $siteInfo['main_url']);
  193. $siteUrls = API::getInstance()->getSiteUrlsFromId($idsite);
  194. $this->assertEquals(array("http://piwik.net", "http://piwik.com/test"), $siteUrls);
  195. return $idsite;
  196. }
  197. /**
  198. * no duplicate -> all the urls are saved
  199. *
  200. * @group Plugins
  201. */
  202. public function testAddSiteUrlsnoDuplicate()
  203. {
  204. $idsite = $this->_addSite();
  205. $siteUrlsBefore = API::getInstance()->getSiteUrlsFromId($idsite);
  206. $toAdd = array("http://piwik1.net",
  207. "http://piwik2.net",
  208. "http://piwik3.net/test/",
  209. "http://localhost/test",
  210. "http://localho5.st/test",
  211. "http://l42578gqege.f4",
  212. "http://super.com/test/test/atqata675675/te"
  213. );
  214. $toAddValid = array("http://piwik1.net",
  215. "http://piwik2.net",
  216. "http://piwik3.net/test",
  217. "http://localhost/test",
  218. "http://localho5.st/test",
  219. "http://l42578gqege.f4",
  220. "http://super.com/test/test/atqata675675/te");
  221. $insertedUrls = API::getInstance()->addSiteAliasUrls($idsite, $toAdd);
  222. $this->assertEquals(count($toAdd), $insertedUrls);
  223. $siteUrlsAfter = API::getInstance()->getSiteUrlsFromId($idsite);
  224. $shouldHave = array_merge($siteUrlsBefore, $toAddValid);
  225. sort($shouldHave);
  226. sort($siteUrlsAfter);
  227. $this->assertEquals($shouldHave, $siteUrlsAfter);
  228. }
  229. /**
  230. * duplicate -> don't save the already existing URLs
  231. *
  232. * @group Plugins
  233. */
  234. public function testAddSiteUrlsDuplicate()
  235. {
  236. $idsite = $this->_addSite();
  237. $siteUrlsBefore = API::getInstance()->getSiteUrlsFromId($idsite);
  238. $toAdd = array_merge($siteUrlsBefore, array("http://piwik1.net", "http://piwik2.net"));
  239. $insertedUrls = API::getInstance()->addSiteAliasUrls($idsite, $toAdd);
  240. $this->assertEquals(count($toAdd) - count($siteUrlsBefore), $insertedUrls);
  241. $siteUrlsAfter = API::getInstance()->getSiteUrlsFromId($idsite);
  242. $shouldHave = $toAdd;
  243. sort($shouldHave);
  244. sort($siteUrlsAfter);
  245. $this->assertEquals($shouldHave, $siteUrlsAfter);
  246. }
  247. /**
  248. * case empty array => nothing happens
  249. *
  250. * @group Plugins
  251. */
  252. public function testAddSiteUrlsNoUrlsToAdd1()
  253. {
  254. $idsite = $this->_addSite();
  255. $siteUrlsBefore = API::getInstance()->getSiteUrlsFromId($idsite);
  256. $toAdd = array();
  257. $insertedUrls = API::getInstance()->addSiteAliasUrls($idsite, $toAdd);
  258. $this->assertEquals(count($toAdd), $insertedUrls);
  259. $siteUrlsAfter = API::getInstance()->getSiteUrlsFromId($idsite);
  260. $shouldHave = $siteUrlsBefore;
  261. sort($shouldHave);
  262. sort($siteUrlsAfter);
  263. $this->assertEquals($shouldHave, $siteUrlsAfter);
  264. }
  265. /**
  266. * case array only duplicate => nothing happens
  267. *
  268. * @group Plugins
  269. */
  270. public function testAddSiteUrlsNoUrlsToAdd2()
  271. {
  272. $idsite = $this->_addSite();
  273. $siteUrlsBefore = API::getInstance()->getSiteUrlsFromId($idsite);
  274. $toAdd = $siteUrlsBefore;
  275. $insertedUrls = API::getInstance()->addSiteAliasUrls($idsite, $toAdd);
  276. $this->assertEquals(0, $insertedUrls);
  277. $siteUrlsAfter = API::getInstance()->getSiteUrlsFromId($idsite);
  278. $shouldHave = $siteUrlsBefore;
  279. sort($shouldHave);
  280. sort($siteUrlsAfter);
  281. $this->assertEquals($shouldHave, $siteUrlsAfter);
  282. }
  283. /**
  284. * wrong format urls => exception
  285. *
  286. * @group Plugins
  287. */
  288. public function testAddSiteUrlsWrongUrlsFormat3()
  289. {
  290. try {
  291. $idsite = $this->_addSite();
  292. $toAdd = array("http:mpigeq");
  293. $insertedUrls = API::getInstance()->addSiteAliasUrls($idsite, $toAdd);
  294. } catch (Exception $e) {
  295. return;
  296. }
  297. $this->fail('Expected exception not raised');
  298. }
  299. /**
  300. * wrong idsite => no exception because simply no access to this resource
  301. *
  302. * @group Plugins
  303. */
  304. public function testAddSiteUrlsWrongIdSite1()
  305. {
  306. try {
  307. $toAdd = array("http://pigeq.com/test");
  308. $insertedUrls = API::getInstance()->addSiteAliasUrls(-1, $toAdd);
  309. } catch (Exception $e) {
  310. return;
  311. }
  312. $this->fail('Expected exception not raised');
  313. }
  314. /**
  315. * wrong idsite => exception
  316. *
  317. * @group Plugins
  318. */
  319. public function testAddSiteUrlsWrongIdSite2()
  320. {
  321. try {
  322. $toAdd = array("http://pigeq.com/test");
  323. $insertedUrls = API::getInstance()->addSiteAliasUrls(155, $toAdd);
  324. } catch (Exception $e) {
  325. return;
  326. }
  327. $this->fail('Expected exception not raised');
  328. }
  329. /**
  330. * no Id -> empty array
  331. *
  332. * @group Plugins
  333. */
  334. public function testGetAllSitesIdNoId()
  335. {
  336. $ids = API::getInstance()->getAllSitesId();
  337. $this->assertEquals(array(), $ids);
  338. }
  339. /**
  340. * several Id -> normal array
  341. *
  342. * @group Plugins
  343. */
  344. public function testGetAllSitesIdSeveralId()
  345. {
  346. $name = "tetq";
  347. $idsites = array(
  348. API::getInstance()->addSite($name, array("http://piwik.net", "http://piwik.com/test/")),
  349. API::getInstance()->addSite($name, array("http://piwik.net", "http://piwik.com/test/")),
  350. API::getInstance()->addSite($name, array("http://piwik.net", "http://piwik.com/test/")),
  351. API::getInstance()->addSite($name, array("http://piwik.net", "http://piwik.com/test/")),
  352. API::getInstance()->addSite($name, array("http://piwik.net", "http://piwik.com/test/")),
  353. );
  354. $ids = API::getInstance()->getAllSitesId();
  355. $this->assertEquals($idsites, $ids);
  356. }
  357. /**
  358. * wrong id => exception
  359. *
  360. * @group Plugins
  361. */
  362. public function testGetSiteFromIdWrongId1()
  363. {
  364. try {
  365. $siteInfo = API::getInstance()->getSiteFromId(0);
  366. } catch (Exception $e) {
  367. return;
  368. }
  369. $this->fail('Expected exception not raised');
  370. }
  371. /**
  372. * wrong id => exception
  373. *
  374. * @group Plugins
  375. */
  376. public function testGetSiteFromIdWrongId2()
  377. {
  378. try {
  379. $siteInfo = API::getInstance()->getSiteFromId("x1");
  380. } catch (Exception $e) {
  381. return;
  382. }
  383. $this->fail('Expected exception not raised');
  384. }
  385. /**
  386. * wrong id : no access => exception
  387. *
  388. * @group Plugins
  389. */
  390. public function testGetSiteFromIdWrongId3()
  391. {
  392. $idsite = API::getInstance()->addSite("site", array("http://piwik.net", "http://piwik.com/test/"));
  393. $this->assertEquals(1, $idsite);
  394. // set noaccess to site 1
  395. FakeAccess::setIdSitesView(array(2));
  396. FakeAccess::setIdSitesAdmin(array());
  397. try {
  398. $siteInfo = API::getInstance()->getSiteFromId(1);
  399. } catch (Exception $e) {
  400. return;
  401. }
  402. $this->fail('Expected exception not raised');
  403. }
  404. /**
  405. * normal case
  406. *
  407. * @group Plugins
  408. */
  409. public function testGetSiteFromIdNormalId()
  410. {
  411. $name = "website ''";
  412. $idsite = API::getInstance()->addSite($name, array("http://piwik.net", "http://piwik.com/test/"));
  413. $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
  414. $siteInfo = API::getInstance()->getSiteFromId($idsite);
  415. $this->assertEquals($name, $siteInfo['name']);
  416. $this->assertEquals("http://piwik.net", $siteInfo['main_url']);
  417. }
  418. /**
  419. * there is no admin site available -> array()
  420. *
  421. * @group Plugins
  422. */
  423. public function testGetSitesWithAdminAccessNoResult()
  424. {
  425. FakeAccess::setIdSitesAdmin(array());
  426. $sites = API::getInstance()->getSitesWithAdminAccess();
  427. $this->assertEquals(array(), $sites);
  428. }
  429. /**
  430. * normal case, admin and view and noaccess website => return only admin
  431. *
  432. * @group Plugins
  433. */
  434. public function testGetSitesWithAdminAccess()
  435. {
  436. $idsite = API::getInstance()->addSite("site1", array("http://piwik.net", "http://piwik.com/test/"));
  437. $idsite = API::getInstance()->addSite("site2", array("http://piwik.com/test/"));
  438. $idsite = API::getInstance()->addSite("site3", array("http://piwik.org"));
  439. $resultWanted = array(
  440. 0 => array("idsite" => 1, "name" => "site1", "main_url" => "http://piwik.net", "ecommerce" => 0, "excluded_ips" => "", 'sitesearch' => 1, 'sitesearch_keyword_parameters' => '', 'sitesearch_category_parameters' => '', 'excluded_parameters' => '', 'excluded_user_agents' => '', 'timezone' => 'UTC', 'currency' => 'USD', 'group' => '', 'keep_url_fragment' => 0, 'type' => 'website'),
  441. 1 => array("idsite" => 3, "name" => "site3", "main_url" => "http://piwik.org", "ecommerce" => 0, "excluded_ips" => "", 'sitesearch' => 1, 'sitesearch_keyword_parameters' => '', 'sitesearch_category_parameters' => '', 'excluded_parameters' => '', 'excluded_user_agents' => '', 'timezone' => 'UTC', 'currency' => 'USD', 'group' => '', 'keep_url_fragment' => 0, 'type' => 'website'),
  442. );
  443. FakeAccess::setIdSitesAdmin(array(1, 3));
  444. $sites = API::getInstance()->getSitesWithAdminAccess();
  445. // we dont test the ts_created
  446. unset($sites[0]['ts_created']);
  447. unset($sites[1]['ts_created']);
  448. $this->assertEquals($resultWanted, $sites);
  449. }
  450. /**
  451. * there is no admin site available -> array()
  452. *
  453. * @group Plugins
  454. */
  455. public function testGetSitesWithViewAccessNoResult()
  456. {
  457. FakeAccess::setIdSitesView(array());
  458. FakeAccess::setIdSitesAdmin(array());
  459. $sites = API::getInstance()->getSitesWithViewAccess();
  460. $this->assertEquals(array(), $sites);
  461. }
  462. /**
  463. * normal case, admin and view and noaccess website => return only admin
  464. *
  465. * @group Plugins
  466. */
  467. public function testGetSitesWithViewAccess()
  468. {
  469. $idsite = API::getInstance()->addSite("site1", array("http://piwik.net", "http://piwik.com/test/"));
  470. $idsite = API::getInstance()->addSite("site2", array("http://piwik.com/test/"));
  471. $idsite = API::getInstance()->addSite("site3", array("http://piwik.org"));
  472. $resultWanted = array(
  473. 0 => array("idsite" => 1, "name" => "site1", "main_url" => "http://piwik.net", "ecommerce" => 0, 'sitesearch' => 1, 'sitesearch_keyword_parameters' => '', 'sitesearch_category_parameters' => '', "excluded_ips" => "", 'excluded_parameters' => '', 'excluded_user_agents' => '', 'timezone' => 'UTC', 'currency' => 'USD', 'group' => '', 'keep_url_fragment' => 0, 'type' => 'website'),
  474. 1 => array("idsite" => 3, "name" => "site3", "main_url" => "http://piwik.org", "ecommerce" => 0, 'sitesearch' => 1, 'sitesearch_keyword_parameters' => '', 'sitesearch_category_parameters' => '', "excluded_ips" => "", 'excluded_parameters' => '', 'excluded_user_agents' => '', 'timezone' => 'UTC', 'currency' => 'USD', 'group' => '', 'keep_url_fragment' => 0, 'type' => 'website'),
  475. );
  476. FakeAccess::setIdSitesView(array(1, 3));
  477. FakeAccess::setIdSitesAdmin(array());
  478. $sites = API::getInstance()->getSitesWithViewAccess();
  479. // we dont test the ts_created
  480. unset($sites[0]['ts_created']);
  481. unset($sites[1]['ts_created']);
  482. $this->assertEquals($resultWanted, $sites);
  483. }
  484. /**
  485. * there is no admin site available -> array()
  486. *
  487. * @group Plugins
  488. */
  489. public function testGetSitesWithAtLeastViewAccessNoResult()
  490. {
  491. FakeAccess::setIdSitesView(array());
  492. FakeAccess::setIdSitesAdmin(array());
  493. $sites = API::getInstance()->getSitesWithAtLeastViewAccess();
  494. $this->assertEquals(array(), $sites);
  495. }
  496. /**
  497. * normal case, admin and view and noaccess website => return only admin
  498. *
  499. * @group Plugins
  500. */
  501. public function testGetSitesWithAtLeastViewAccess()
  502. {
  503. $idsite = API::getInstance()->addSite("site1", array("http://piwik.net", "http://piwik.com/test/"), $ecommerce = 1);
  504. $idsite = API::getInstance()->addSite("site2", array("http://piwik.com/test/"));
  505. $idsite = API::getInstance()->addSite("site3", array("http://piwik.org"));
  506. $resultWanted = array(
  507. 0 => array("idsite" => 1, "name" => "site1", "main_url" => "http://piwik.net", "ecommerce" => 1, "excluded_ips" => "", 'sitesearch' => 1, 'sitesearch_keyword_parameters' => '', 'sitesearch_category_parameters' => '', 'excluded_parameters' => '', 'excluded_user_agents' => '', 'timezone' => 'UTC', 'currency' => 'USD', 'group' => '', 'keep_url_fragment' => 0, 'type' => 'website'),
  508. 1 => array("idsite" => 3, "name" => "site3", "main_url" => "http://piwik.org", "ecommerce" => 0, "excluded_ips" => "", 'sitesearch' => 1, 'sitesearch_keyword_parameters' => '', 'sitesearch_category_parameters' => '', 'excluded_parameters' => '', 'excluded_user_agents' => '', 'timezone' => 'UTC', 'currency' => 'USD', 'group' => '', 'keep_url_fragment' => 0, 'type' => 'website'),
  509. );
  510. FakeAccess::setIdSitesView(array(1, 3));
  511. FakeAccess::setIdSitesAdmin(array());
  512. $sites = API::getInstance()->getSitesWithAtLeastViewAccess();
  513. // we dont test the ts_created
  514. unset($sites[0]['ts_created']);
  515. unset($sites[1]['ts_created']);
  516. $this->assertEquals($resultWanted, $sites);
  517. }
  518. /**
  519. * no urls for this site => array()
  520. *
  521. * @group Plugins
  522. */
  523. public function testGetSiteUrlsFromIdNoUrls()
  524. {
  525. $idsite = API::getInstance()->addSite("site1", array("http://piwik.net"));
  526. $urls = API::getInstance()->getSiteUrlsFromId($idsite);
  527. $this->assertEquals(array("http://piwik.net"), $urls);
  528. }
  529. /**
  530. * normal case
  531. *
  532. * @group Plugins
  533. */
  534. public function testGetSiteUrlsFromIdManyUrls()
  535. {
  536. $site = array("http://piwik.net",
  537. "http://piwik.org",
  538. "http://piwik.org",
  539. "http://piwik.com");
  540. sort($site);
  541. $idsite = API::getInstance()->addSite("site1", $site);
  542. $siteWanted = array("http://piwik.net",
  543. "http://piwik.org",
  544. "http://piwik.com");
  545. sort($siteWanted);
  546. $urls = API::getInstance()->getSiteUrlsFromId($idsite);
  547. $this->assertEquals($siteWanted, $urls);
  548. }
  549. /**
  550. * wrongId => exception
  551. *
  552. * @group Plugins
  553. */
  554. public function testGetSiteUrlsFromIdWrongId()
  555. {
  556. try {
  557. FakeAccess::setIdSitesView(array(3));
  558. FakeAccess::setIdSitesAdmin(array());
  559. API::getInstance()->getSiteUrlsFromId(1);
  560. } catch (Exception $e) {
  561. return;
  562. }
  563. $this->fail('Expected exception not raised');
  564. }
  565. /**
  566. * one url => no change to alias urls
  567. *
  568. * @group Plugins
  569. */
  570. public function testUpdateSiteOneUrl()
  571. {
  572. $urls = array("http://piwiknew.com",
  573. "http://piwiknew.net",
  574. "http://piwiknew.org",
  575. "http://piwiknew.fr");
  576. $idsite = API::getInstance()->addSite("site1", $urls);
  577. $newMainUrl = "http://main.url";
  578. // Also test that the group was set to empty, and is searchable
  579. $websites = API::getInstance()->getSitesFromGroup('');
  580. $this->assertEquals(1, count($websites));
  581. // the Update doesn't change the group field
  582. API::getInstance()->updateSite($idsite, "test toto@{}", $newMainUrl);
  583. $websites = API::getInstance()->getSitesFromGroup('');
  584. $this->assertEquals(1, count($websites));
  585. // Updating the group to something
  586. $group = 'something';
  587. API::getInstance()->updateSite($idsite, "test toto@{}", $newMainUrl, $ecommerce = 0, $ss = true, $ss_kwd = null, $ss_cat = '', $ips = null, $parametersExclude = null, $timezone = null, $currency = null, $group);
  588. $websites = API::getInstance()->getSitesFromGroup($group);
  589. $this->assertEquals(1, count($websites));
  590. $this->assertEquals(date('Y-m-d'), date('Y-m-d', strtotime($websites[0]['ts_created'])));
  591. // Updating the group to nothing
  592. $group = '';
  593. $type = 'mobileAppTest';
  594. API::getInstance()->updateSite($idsite, "test toto@{}", $newMainUrl, $ecommerce = 0, $ss = false, $ss_kwd = '', $ss_cat = null, $ips = null, $parametersExclude = null, $timezone = null, $currency = null, $group, $startDate = '2010-01-01', $excludedUserAgent = null, $keepUrlFragment = 1, $type);
  595. $websites = API::getInstance()->getSitesFromGroup($group);
  596. $this->assertEquals(1, count($websites));
  597. $this->assertEquals('2010-01-01', date('Y-m-d', strtotime($websites[0]['ts_created'])));
  598. // Test setting the website type
  599. $this->assertEquals($type, Site::getTypeFor($idsite));
  600. // Check Alias URLs contain only main url
  601. $allUrls = API::getInstance()->getSiteUrlsFromId($idsite);
  602. $this->assertEquals($newMainUrl, $allUrls[0]);
  603. $aliasUrls = array_slice($allUrls, 1);
  604. $this->assertEquals(array(), $aliasUrls);
  605. }
  606. /**
  607. * strange name and NO URL => name ok, main_url not updated
  608. *
  609. * @group Plugins
  610. */
  611. public function testUpdateSiteStrangeNameNoUrl()
  612. {
  613. $idsite = API::getInstance()->addSite("site1", "http://main.url");
  614. $newName = "test toto@{'786'}";
  615. API::getInstance()->updateSite($idsite, $newName);
  616. $site = API::getInstance()->getSiteFromId($idsite);
  617. $this->assertEquals($newName, $site['name']);
  618. // url didn't change because parameter url NULL in updateSite
  619. $this->assertEquals("http://main.url", $site['main_url']);
  620. }
  621. /**
  622. * several urls => both main and alias are updated
  623. * also test the update of group field
  624. *
  625. * @group Plugins
  626. */
  627. public function testUpdateSiteSeveralUrlsAndGroup()
  628. {
  629. $urls = array("http://piwiknew.com",
  630. "http://piwiknew.net",
  631. "http://piwiknew.org",
  632. "http://piwiknew.fr");
  633. $group = 'GROUP Before';
  634. $idsite = API::getInstance()->addSite("site1", $urls, $ecommerce = 1,
  635. $siteSearch = 1, $searchKeywordParameters = null, $searchCategoryParameters = null,
  636. $excludedIps = null, $excludedQueryParameters = null, $timezone = null, $currency = null, $group, $startDate = '2011-01-01');
  637. $websites = API::getInstance()->getSitesFromGroup($group);
  638. $this->assertEquals(1, count($websites));
  639. $newurls = array("http://piwiknew2.com",
  640. "http://piwiknew2.net",
  641. "http://piwiknew2.org",
  642. "http://piwiknew2.fr");
  643. $groupAfter = ' GROUP After';
  644. API::getInstance()->updateSite($idsite, "test toto@{}", $newurls, $ecommerce = 0,
  645. $siteSearch = 1, $searchKeywordParameters = null, $searchCategoryParameters = null,
  646. $excludedIps = null, $excludedQueryParameters = null, $timezone = null, $currency = null, $groupAfter);
  647. // no result for the group before update
  648. $websites = API::getInstance()->getSitesFromGroup($group);
  649. $this->assertEquals(0, count($websites));
  650. // Testing that the group was updated properly (and testing that the group value is trimmed before inserted/searched)
  651. $websites = API::getInstance()->getSitesFromGroup($groupAfter . ' ');
  652. $this->assertEquals(1, count($websites));
  653. $this->assertEquals('2011-01-01', date('Y-m-d', strtotime($websites[0]['ts_created'])));
  654. // Test fetch website groups
  655. $expectedGroups = array(trim($groupAfter));
  656. $fetched = API::getInstance()->getSitesGroups();
  657. $this->assertEquals($expectedGroups, $fetched);
  658. $allUrls = API::getInstance()->getSiteUrlsFromId($idsite);
  659. sort($allUrls);
  660. sort($newurls);
  661. $this->assertEquals($newurls, $allUrls);
  662. }
  663. /**
  664. * @group Plugins
  665. */
  666. public function testGetSitesGroups()
  667. {
  668. $groups = array('group1', ' group1 ', '', 'group2');
  669. $expectedGroups = array('group1', '', 'group2');
  670. foreach ($groups as $group) {
  671. API::getInstance()->addSite("test toto@{}", 'http://example.org', $ecommerce = 1, $siteSearch = null, $searchKeywordParameters = null, $searchCategoryParameters = null, $excludedIps = null, $excludedQueryParameters = null, $timezone = null, $currency = null, $group);
  672. }
  673. $this->assertEquals($expectedGroups, API::getInstance()->getSitesGroups());
  674. }
  675. public function getInvalidTimezoneData()
  676. {
  677. return array(
  678. array('UTC+15'),
  679. array('Paris'),
  680. );
  681. }
  682. /**
  683. *
  684. * @dataProvider getInvalidTimezoneData
  685. * @group Plugins
  686. */
  687. public function testAddSitesInvalidTimezone($timezone)
  688. {
  689. try {
  690. $idsite = API::getInstance()->addSite("site1", array('http://example.org'), $ecommerce = 0,
  691. $siteSearch = 1, $searchKeywordParameters = null, $searchCategoryParameters = null, $ip = '', $params = '', $timezone);
  692. } catch (Exception $e) {
  693. return;
  694. }
  695. $this->fail('Expected exception not raised');
  696. }
  697. /**
  698. * @group Plugins
  699. */
  700. public function testAddSitesInvalidCurrency()
  701. {
  702. try {
  703. $invalidCurrency = '€';
  704. $idsite = API::getInstance()->addSite("site1", array('http://example.org'), $ecommerce = 0,
  705. $siteSearch = 1, $searchKeywordParameters = null, $searchCategoryParameters = null, '', 'UTC', $invalidCurrency);
  706. } catch (Exception $e) {
  707. return;
  708. }
  709. $this->fail('Expected exception not raised');
  710. }
  711. /**
  712. * @group Plugins
  713. */
  714. public function testSetDefaultTimezoneAndCurrencyAndExcludedQueryParametersAndExcludedIps()
  715. {
  716. // test that they return default values
  717. $defaultTimezone = API::getInstance()->getDefaultTimezone();
  718. $this->assertEquals('UTC', $defaultTimezone);
  719. $defaultCurrency = API::getInstance()->getDefaultCurrency();
  720. $this->assertEquals('USD', $defaultCurrency);
  721. $excludedIps = API::getInstance()->getExcludedIpsGlobal();
  722. $this->assertEquals('', $excludedIps);
  723. $excludedQueryParameters = API::getInstance()->getExcludedQueryParametersGlobal();
  724. $this->assertEquals('', $excludedQueryParameters);
  725. // test that when not specified, defaults are set as expected
  726. $idsite = API::getInstance()->addSite("site1", array('http://example.org'));
  727. $site = new Site($idsite);
  728. $this->assertEquals('UTC', $site->getTimezone());
  729. $this->assertEquals('USD', $site->getCurrency());
  730. $this->assertEquals('', $site->getExcludedQueryParameters());
  731. $this->assertEquals('', $site->getExcludedIps());
  732. $this->assertEquals(false, $site->isEcommerceEnabled());
  733. // set the global timezone and get it
  734. $newDefaultTimezone = 'UTC+5.5';
  735. API::getInstance()->setDefaultTimezone($newDefaultTimezone);
  736. $defaultTimezone = API::getInstance()->getDefaultTimezone();
  737. $this->assertEquals($newDefaultTimezone, $defaultTimezone);
  738. // set the default currency and get it
  739. $newDefaultCurrency = 'EUR';
  740. API::getInstance()->setDefaultCurrency($newDefaultCurrency);
  741. $defaultCurrency = API::getInstance()->getDefaultCurrency();
  742. $this->assertEquals($newDefaultCurrency, $defaultCurrency);
  743. // set the global IPs to exclude and get it
  744. $newGlobalExcludedIps = '1.1.1.*,1.1.*.*,150.1.1.1';
  745. API::getInstance()->setGlobalExcludedIps($newGlobalExcludedIps);
  746. $globalExcludedIps = API::getInstance()->getExcludedIpsGlobal();
  747. $this->assertEquals($newGlobalExcludedIps, $globalExcludedIps);
  748. // set the global URL query params to exclude and get it
  749. $newGlobalExcludedQueryParameters = 'PHPSESSID,blabla, TesT';
  750. // removed the space
  751. $expectedGlobalExcludedQueryParameters = 'PHPSESSID,blabla,TesT';
  752. API::getInstance()->setGlobalExcludedQueryParameters($newGlobalExcludedQueryParameters);
  753. $globalExcludedQueryParameters = API::getInstance()->getExcludedQueryParametersGlobal();
  754. $this->assertEquals($expectedGlobalExcludedQueryParameters, $globalExcludedQueryParameters);
  755. // create a website and check that default currency and default timezone are set
  756. // however, excluded IPs and excluded query Params are not returned
  757. $idsite = API::getInstance()->addSite("site1", array('http://example.org'), $ecommerce = 0,
  758. $siteSearch = 0, $searchKeywordParameters = 'test1,test2', $searchCategoryParameters = 'test2,test1',
  759. '', '', $newDefaultTimezone);
  760. $site = new Site($idsite);
  761. $this->assertEquals($newDefaultTimezone, $site->getTimezone());
  762. $this->assertEquals(date('Y-m-d'), $site->getCreationDate()->toString());
  763. $this->assertEquals($newDefaultCurrency, $site->getCurrency());
  764. $this->assertEquals('', $site->getExcludedIps());
  765. $this->assertEquals('', $site->getExcludedQueryParameters());
  766. $this->assertEquals('test1,test2', $site->getSearchKeywordParameters());
  767. $this->assertEquals('test2,test1', $site->getSearchCategoryParameters());
  768. $this->assertFalse($site->isSiteSearchEnabled());
  769. $this->assertFalse(Site::isSiteSearchEnabledFor($idsite));
  770. $this->assertFalse($site->isEcommerceEnabled());
  771. $this->assertFalse(Site::isEcommerceEnabledFor($idsite));
  772. }
  773. /**
  774. * @group Plugins
  775. */
  776. public function testGetSitesIdFromSiteUrlSuperUser()
  777. {
  778. $idsite = API::getInstance()->addSite("site1", array("http://piwik.net", "http://piwik.com"));
  779. $idsite = API::getInstance()->addSite("site2", array("http://piwik.com", "http://piwik.net"));
  780. $idsite = API::getInstance()->addSite("site3", array("http://piwik.com", "http://piwik.org"));
  781. $idsites = API::getInstance()->getSitesIdFromSiteUrl('http://piwik.org');
  782. $this->assertTrue(count($idsites) == 1);
  783. $idsites = API::getInstance()->getSitesIdFromSiteUrl('http://www.piwik.org');
  784. $this->assertTrue(count($idsites) == 1);
  785. $idsites = API::getInstance()->getSitesIdFromSiteUrl('http://piwik.net');
  786. $this->assertTrue(count($idsites) == 2);
  787. $idsites = API::getInstance()->getSitesIdFromSiteUrl('http://piwik.com');
  788. $this->assertTrue(count($idsites) == 3);
  789. }
  790. /**
  791. * @group Plugins
  792. */
  793. public function testGetSitesIdFromSiteUrlUser()
  794. {
  795. $idsite = API::getInstance()->addSite("site1", array("http://www.piwik.net", "http://piwik.com"));
  796. $idsite = API::getInstance()->addSite("site2", array("http://piwik.com", "http://piwik.net"));
  797. $idsite = API::getInstance()->addSite("site3", array("http://piwik.com", "http://piwik.org"));
  798. $saveAccess = Access::getInstance();
  799. APIUsersManager::getInstance()->addUser("user1", "geqgegagae", "tegst@tesgt.com", "alias");
  800. APIUsersManager::getInstance()->setUserAccess("user1", "view", array(1));
  801. APIUsersManager::getInstance()->addUser("user2", "geqgegagae", "tegst2@tesgt.com", "alias");
  802. APIUsersManager::getInstance()->setUserAccess("user2", "view", array(1));
  803. APIUsersManager::getInstance()->setUserAccess("user2", "admin", array(3));
  804. APIUsersManager::getInstance()->addUser("user3", "geqgegagae", "tegst3@tesgt.com", "alias");
  805. APIUsersManager::getInstance()->setUserAccess("user3", "view", array(1, 2));
  806. APIUsersManager::getInstance()->setUserAccess("user3", "admin", array(3));
  807. $pseudoMockAccess = new FakeAccess;
  808. FakeAccess::$superUser = false;
  809. FakeAccess::$identity = 'user1';
  810. FakeAccess::setIdSitesView(array(1));
  811. FakeAccess::setIdSitesAdmin(array());
  812. Access::setSingletonInstance($pseudoMockAccess);
  813. $idsites = API::getInstance()->getSitesIdFromSiteUrl('http://piwik.com');
  814. $this->assertEquals(1, count($idsites));
  815. // testing URL normalization
  816. $idsites = API::getInstance()->getSitesIdFromSiteUrl('http://www.piwik.com');
  817. $this->assertEquals(1, count($idsites));
  818. $idsites = API::getInstance()->getSitesIdFromSiteUrl('http://piwik.net');
  819. $this->assertEquals(1, count($idsites));
  820. $pseudoMockAccess = new FakeAccess;
  821. FakeAccess::$superUser = false;
  822. FakeAccess::$identity = 'user2';
  823. FakeAccess::setIdSitesView(array(1));
  824. FakeAccess::setIdSitesAdmin(array(3));
  825. Access::setSingletonInstance($pseudoMockAccess);
  826. $idsites = API::getInstance()->getSitesIdFromSiteUrl('http://piwik.com');
  827. $this->assertEquals(2, count($idsites));
  828. $pseudoMockAccess = new FakeAccess;
  829. FakeAccess::$superUser = false;
  830. FakeAccess::$identity = 'user3';
  831. FakeAccess::setIdSitesView(array(1, 2));
  832. FakeAccess::setIdSitesAdmin(array(3));
  833. Access::setSingletonInstance($pseudoMockAccess);
  834. $idsites = API::getInstance()->getSitesIdFromSiteUrl('http://piwik.com');
  835. $this->assertEquals(3, count($idsites));
  836. Access::setSingletonInstance($saveAccess);
  837. }
  838. /**
  839. * @group Plugins
  840. */
  841. public function testGetSitesFromTimezones()
  842. {
  843. $idsite1 = API::getInstance()->addSite("site3", array("http://piwik.org"), null, $siteSearch = 1, $searchKeywordParameters = null, $searchCategoryParameters = null, null, null, 'UTC');
  844. $idsite2 = API::getInstance()->addSite("site3", array("http://piwik.org"), null, $siteSearch = 1, $searchKeywordParameters = null, $searchCategoryParameters = null, null, null, 'Pacific/Auckland');
  845. $idsite3 = API::getInstance()->addSite("site3", array("http://piwik.org"), null, $siteSearch = 1, $searchKeywordParameters = null, $searchCategoryParameters = null, null, null, 'Pacific/Auckland');
  846. $idsite4 = API::getInstance()->addSite("site3", array("http://piwik.org"), null, $siteSearch = 1, $searchKeywordParameters = null, $searchCategoryParameters = null, null, null, 'UTC+10');
  847. $result = API::getInstance()->getSitesIdFromTimezones(array('UTC+10', 'Pacific/Auckland'));
  848. $this->assertEquals(array($idsite2, $idsite3, $idsite4), $result);
  849. }
  850. }