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

/tests/PHPUnit/Integration/Plugins/UsersManagerTest.php

https://github.com/CodeYellowBV/piwik
PHP | 905 lines | 845 code | 20 blank | 40 comment | 2 complexity | 355e9ff1b2f7892ea98380cf5a052202 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\Access;
  3. use Piwik\Plugins\SitesManager\API as APISitesManager;
  4. use Piwik\Plugins\UsersManager\API;
  5. use Piwik\Plugins\UsersManager\Model;
  6. use Piwik\Translate;
  7. /**
  8. * Piwik - free/libre analytics platform
  9. *
  10. * @link http://piwik.org
  11. * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  12. *
  13. * @group Plugins
  14. */
  15. class Plugins_UsersManagerTest extends DatabaseTestCase
  16. {
  17. /**
  18. * @var API
  19. */
  20. private $api;
  21. /**
  22. * @var Model
  23. */
  24. private $model;
  25. public function setUp()
  26. {
  27. parent::setUp();
  28. \Piwik\Plugin\Manager::getInstance()->loadPlugin('UsersManager');
  29. \Piwik\Plugin\Manager::getInstance()->installLoadedPlugins();
  30. // setup the access layer
  31. $pseudoMockAccess = new FakeAccess;
  32. FakeAccess::setIdSitesView(array(1, 2));
  33. FakeAccess::setIdSitesAdmin(array(3, 4));
  34. //finally we set the user as a Super User by default
  35. FakeAccess::$superUser = true;
  36. FakeAccess::$superUserLogin = 'superusertest';
  37. Access::setSingletonInstance($pseudoMockAccess);
  38. $this->api = API::getInstance();
  39. $this->model = new Model();
  40. }
  41. private function _flatten($sitesAccess)
  42. {
  43. $result = array();
  44. foreach ($sitesAccess as $siteAccess) {
  45. $result[$siteAccess['site']] = $siteAccess['access'];
  46. }
  47. return $result;
  48. }
  49. private function _checkUserHasNotChanged($user, $newPassword, $newEmail = null, $newAlias = null)
  50. {
  51. if (is_null($newEmail)) {
  52. $newEmail = $user['email'];
  53. }
  54. if (is_null($newAlias)) {
  55. $newAlias = $user['alias'];
  56. }
  57. $userAfter = $this->api->getUser($user["login"]);
  58. unset($userAfter['date_registered']);
  59. // we now compute what the token auth should be, it should always be a hash of the login and the current password
  60. // if the password has changed then the token_auth has changed!
  61. $user['token_auth'] = $this->api->getTokenAuth($user["login"], md5($newPassword));
  62. $user['password'] = md5($newPassword);
  63. $user['email'] = $newEmail;
  64. $user['alias'] = $newAlias;
  65. $user['superuser_access'] = 0;
  66. $this->assertEquals($user, $userAfter);
  67. }
  68. /**
  69. * bad password => exception#
  70. * @expectedException \Exception
  71. * @expectedExceptionMessage UsersManager_ExceptionInvalidPassword
  72. */
  73. public function testUpdateUserBadpasswd()
  74. {
  75. $login = "login";
  76. $user = array('login' => $login,
  77. 'password' => "geqgeagae",
  78. 'email' => "test@test.com",
  79. 'alias' => "alias");
  80. $this->api->addUser($user['login'], $user['password'], $user['email'], $user['alias']);
  81. try {
  82. $this->api->updateUser($login, "pas");
  83. } catch (Exception $expected) {
  84. $this->_checkUserHasNotChanged($user, $user['password']);
  85. throw $expected;
  86. }
  87. }
  88. /**
  89. * Dataprovider
  90. */
  91. public function getAddUserInvalidLoginData()
  92. {
  93. return array(
  94. array(12, "password", "email@email.com", "alias"), // wrong login / integer => exception
  95. array("gegag'ggea'", "password", "email@email.com", "alias"), // wrong login / too short => exception
  96. array("gegag11gge&", "password", "email@email.com", "alias"), // wrong login / too long => exception
  97. array("geg'ag11gge@", "password", "email@email.com", "alias"), // wrong login / bad characters => exception
  98. );
  99. }
  100. /**
  101. * @dataProvider getAddUserInvalidLoginData
  102. * @expectedException \Exception
  103. * @expectedExceptionMessage UsersManager_ExceptionInvalidLogin
  104. */
  105. public function testAddUserWrongLogin($userLogin, $password, $email, $alias)
  106. {
  107. $this->api->addUser($userLogin, $password, $email, $alias);
  108. }
  109. /**
  110. * @expectedException \Exception
  111. * @expectedExceptionMessage UsersManager_ExceptionLoginExists
  112. */
  113. public function testAddUserExistingLogin()
  114. {
  115. $this->api->addUser("test", "password", "email@email.com", "alias");
  116. $this->api->addUser("test", "password2", "em2ail@email.com", "al2ias");
  117. }
  118. /**
  119. * Dataprovider for wrong password tests
  120. */
  121. public function getWrongPasswordTestData()
  122. {
  123. return array(
  124. array("geggeqgeqag", "pas", "email@email.com", "alias"), // too short -> exception
  125. array("ghqgeggg", "gegageqqqqqqqgeqgqeg84897897897897g122", "email@email.com", "alias"), // too long -> exception
  126. array("geggeqgeqag", "", "email@email.com", "alias"), // empty -> exception
  127. );
  128. }
  129. /**
  130. * @dataProvider getWrongPasswordTestData
  131. * @expectedException \Exception
  132. * @expectedExceptionMessage UsersManager_ExceptionInvalidPassword
  133. */
  134. public function testAddUserWrongPassword($userLogin, $password, $email, $alias)
  135. {
  136. $this->api->addUser($userLogin, $password, $email, $alias);
  137. }
  138. /**
  139. * Dataprovider for wrong email tests
  140. */
  141. public function getWrongEmailTestData()
  142. {
  143. return array(
  144. array("geggeqgeqag", "geqgeagae", "ema'il@email.com", "alias"),
  145. array("geggeqgeqag", "geqgeagae", "@email.com", "alias"),
  146. array("geggeqgeqag", "geqgeagae", "email@.com", "alias"),
  147. array("geggeqgeqag", "geqgeagae", "email@4.", "alias"),
  148. array("geggeqgeqag", "geqgeagae", "", "alias"),
  149. );
  150. }
  151. /**
  152. * @dataProvider getWrongEmailTestData
  153. * @expectedException \Exception
  154. * @expectedExceptionMessage mail
  155. */
  156. public function testAddUserWrongEmail($userLogin, $password, $email, $alias)
  157. {
  158. $this->api->addUser($userLogin, $password, $email, $alias);
  159. }
  160. /**
  161. * empty alias => use login
  162. */
  163. public function testAddUserEmptyAlias()
  164. {
  165. $login = "geggeqgeqag";
  166. $this->api->addUser($login, "geqgeagae", "mgeagi@geq.com", "");
  167. $user = $this->api->getUser($login);
  168. $this->assertEquals($login, $user['alias']);
  169. $this->assertEquals($login, $user['login']);
  170. }
  171. /**
  172. * no alias => use login
  173. */
  174. public function testAddUserNoAliasSpecified()
  175. {
  176. $login = "geggeqg455eqag";
  177. $this->api->addUser($login, "geqgeagae", "mgeagi@geq.com");
  178. $user = $this->api->getUser($login);
  179. $this->assertEquals($login, $user['alias']);
  180. $this->assertEquals($login, $user['login']);
  181. }
  182. /**
  183. * normal test case
  184. */
  185. public function testAddUser()
  186. {
  187. $login = "geggeq55eqag";
  188. $password = "mypassword";
  189. $email = "mgeag4544i@geq.com";
  190. $alias = "her is my alias )(&|\" 'ÂŁ%*(&%+))";
  191. $time = time();
  192. $this->api->addUser($login, $password, $email, $alias);
  193. $user = $this->api->getUser($login);
  194. // check that the date registered is correct
  195. $this->assertTrue($time <= strtotime($user['date_registered']) && strtotime($user['date_registered']) <= time(),
  196. "the date_registered " . strtotime($user['date_registered']) . " is different from the time() " . time());
  197. $this->assertTrue($user['date_registered'] <= time());
  198. // check that token is 32 chars
  199. $this->assertEquals(32, strlen($user['password']));
  200. // that the password has been md5
  201. $this->assertEquals(md5($login . md5($password)), $user['token_auth']);
  202. // check that all fields are the same
  203. $this->assertEquals($login, $user['login']);
  204. $this->assertEquals(md5($password), $user['password']);
  205. $this->assertEquals($email, $user['email']);
  206. $this->assertEquals($alias, $user['alias']);
  207. }
  208. /**
  209. * @expectedException \Exception
  210. * @expectedExceptionMessage UsersManager_ExceptionDeleteDoesNotExist
  211. */
  212. public function testSeleteUserDoesntExist()
  213. {
  214. $this->api->addUser("geggeqgeqag", "geqgeagae", "test@test.com", "alias");
  215. $this->api->deleteUser("geggeqggnew");
  216. }
  217. /**
  218. * @expectedException \Exception
  219. * @expectedExceptionMessage UsersManager_ExceptionDeleteDoesNotExist
  220. */
  221. public function testDeleteUserEmptyUser()
  222. {
  223. $this->api->deleteUser("");
  224. }
  225. /**
  226. * @expectedException \Exception
  227. * @expectedExceptionMessage UsersManager_ExceptionDeleteDoesNotExist
  228. */
  229. public function testDeleteUserNullUser()
  230. {
  231. $this->api->deleteUser(null);
  232. }
  233. /**
  234. * @expectedException \Exception
  235. * @expectedExceptionMessage UsersManager_ExceptionDeleteOnlyUserWithSuperUserAccess
  236. */
  237. public function testDeleteUser_ShouldFail_InCaseTheUserIsTheOnlyRemainingSuperUser()
  238. {
  239. //add user and set some rights
  240. $this->api->addUser("regularuser", "geqgeagae1", "test1@test.com", "alias1");
  241. $this->api->addUser("superuser", "geqgeagae2", "test2@test.com", "alias2");
  242. $this->api->setSuperUserAccess('superuser', true);
  243. // delete the user
  244. $this->api->deleteUser("superuser");
  245. }
  246. /**
  247. * normal case, user deleted
  248. */
  249. public function testDeleteUser()
  250. {
  251. $this->addSites(3);
  252. //add user and set some rights
  253. $this->api->addUser("geggeqgeqag", "geqgeagae", "test@test.com", "alias");
  254. $this->api->setUserAccess("geggeqgeqag", "view", array(1, 2));
  255. $this->api->setUserAccess("geggeqgeqag", "admin", array(1, 3));
  256. // check rights are set
  257. $this->assertNotEquals(array(), $this->api->getSitesAccessFromUser("geggeqgeqag"));
  258. // delete the user
  259. $this->api->deleteUser("geggeqgeqag");
  260. // try to get it, it should raise an exception
  261. try {
  262. $this->api->getUser("geggeqgeqag");
  263. $this->fail("Exception not raised.");
  264. } catch (Exception $expected) {
  265. $this->assertRegExp("(UsersManager_ExceptionUserDoesNotExist)", $expected->getMessage());
  266. }
  267. // add the same user
  268. $this->api->addUser("geggeqgeqag", "geqgeagae", "test@test.com", "alias");
  269. //checks access have been deleted
  270. //to do so we recreate the same user login and check if the rights are still there
  271. $this->assertEquals(array(), $this->api->getSitesAccessFromUser("geggeqgeqag"));
  272. }
  273. /**
  274. * @expectedException \Exception
  275. * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
  276. */
  277. public function testGetUserNoUser()
  278. {
  279. // try to get it, it should raise an exception
  280. $this->api->getUser("geggeqgeqag");
  281. }
  282. /**
  283. * normal case
  284. */
  285. public function test_GetUser()
  286. {
  287. $login = "geggeq55eqag";
  288. $password = "mypassword";
  289. $email = "mgeag4544i@geq.com";
  290. $alias = "";
  291. $this->api->addUser($login, $password, $email, $alias);
  292. $user = $this->api->getUser($login);
  293. // check that all fields are the same
  294. $this->assertEquals($login, $user['login']);
  295. $this->assertInternalType('string', $user['password']);
  296. $this->assertInternalType('string', $user['date_registered']);
  297. $this->assertEquals($email, $user['email']);
  298. //alias shouldnt be empty even if no alias specified
  299. $this->assertGreaterThan(0, strlen($user['alias']));
  300. }
  301. /**
  302. * no user => empty array
  303. */
  304. public function testGetUsersNoUser()
  305. {
  306. $this->assertEquals($this->api->getUsers(), array());
  307. }
  308. /**
  309. * normal case
  310. * as well as selecting specific user names, comma separated
  311. */
  312. public function testGetUsers()
  313. {
  314. $this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
  315. $this->api->addUser("geggeqge632ge56a4qag", "geqgegeagae", "tesggt@tesgt.com", "alias");
  316. $this->api->addUser("geggeqgeqagqegg", "geqgeaggggae", "tesgggt@tesgt.com");
  317. $users = $this->api->getUsers();
  318. $users = $this->_removeNonTestableFieldsFromUsers($users);
  319. $user1 = array('login' => "gegg4564eqgeqag", 'password' => md5("geqgegagae"), 'alias' => "alias", 'email' => "tegst@tesgt.com", 'superuser_access' => 0);
  320. $user2 = array('login' => "geggeqge632ge56a4qag", 'password' => md5("geqgegeagae"), 'alias' => "alias", 'email' => "tesggt@tesgt.com", 'superuser_access' => 0);
  321. $user3 = array('login' => "geggeqgeqagqegg", 'password' => md5("geqgeaggggae"), 'alias' => 'geggeqgeqagqegg', 'email' => "tesgggt@tesgt.com", 'superuser_access' => 0);
  322. $expectedUsers = array($user1, $user2, $user3);
  323. $this->assertEquals($expectedUsers, $users);
  324. $this->assertEquals(array($user1), $this->_removeNonTestableFieldsFromUsers($this->api->getUsers('gegg4564eqgeqag')));
  325. $this->assertEquals(array($user1, $user2), $this->_removeNonTestableFieldsFromUsers($this->api->getUsers('gegg4564eqgeqag,geggeqge632ge56a4qag')));
  326. }
  327. protected function _removeNonTestableFieldsFromUsers($users)
  328. {
  329. foreach ($users as &$user) {
  330. unset($user['token_auth']);
  331. unset($user['date_registered']);
  332. }
  333. return $users;
  334. }
  335. /**
  336. * normal case
  337. */
  338. public function testGetUsersLogin()
  339. {
  340. $this->api->addUser('gegg4564eqgeqag', 'geqgegagae', 'tegst@tesgt.com', 'alias');
  341. $this->api->addUser("geggeqge632ge56a4qag", "geqgegeagae", "tesggt@tesgt.com", "alias");
  342. $this->api->addUser("geggeqgeqagqegg", "geqgeaggggae", "tesgggt@tesgt.com");
  343. $logins = $this->api->getUsersLogin();
  344. $this->assertEquals(array("gegg4564eqgeqag", "geggeqge632ge56a4qag", "geggeqgeqagqegg"), $logins);
  345. }
  346. /**
  347. * @expectedException \Exception
  348. * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
  349. */
  350. public function testSetUserAccessNoLogin()
  351. {
  352. $this->api->setUserAccess("nologin", "view", 1);
  353. }
  354. /**
  355. * @expectedException \Exception
  356. * @expectedExceptionMessage UsersManager_ExceptionAccessValues
  357. */
  358. public function testSetUserAccessWrongAccessSpecified()
  359. {
  360. $this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
  361. $this->api->setUserAccess("gegg4564eqgeqag", "viewnotknown", 1);
  362. }
  363. /**
  364. * @expectedException \Exception
  365. * @expectedExceptionMessage UsersManager_ExceptionAccessValues
  366. */
  367. public function testSetUserAccess_ShouldFail_SuperUserAccessIsNotAllowed()
  368. {
  369. $this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
  370. $this->api->setUserAccess("gegg4564eqgeqag", "superuser", 1);
  371. }
  372. /**
  373. * @expectedException \Exception
  374. * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
  375. */
  376. public function testSetUserAccess_ShouldFail_IfLoginIsConfigSuperUserLogin()
  377. {
  378. $this->api->setUserAccess('superusertest', 'view', 1);
  379. }
  380. /**
  381. * @expectedException \Exception
  382. * @expectedExceptionMessage UsersManager_ExceptionSuperUserAccess
  383. */
  384. public function testSetUserAccess_ShouldFail_IfLoginIsUserWithSuperUserAccess()
  385. {
  386. $this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
  387. $this->api->setSuperUserAccess('gegg4564eqgeqag', true);
  388. $this->api->setUserAccess('gegg4564eqgeqag', 'view', 1);
  389. }
  390. /**
  391. * idsites = all => apply access to all websites with admin access
  392. */
  393. public function testSetUserAccessIdsitesIsAll()
  394. {
  395. $this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
  396. FakeAccess::$superUser = false;
  397. $this->api->setUserAccess("gegg4564eqgeqag", "view", "all");
  398. FakeAccess::$superUser = true;
  399. $access = $this->api->getSitesAccessFromUser("gegg4564eqgeqag");
  400. $access = $this->_flatten($access);
  401. FakeAccess::$superUser = false;
  402. $this->assertEquals(array_keys($access), FakeAccess::getSitesIdWithAdminAccess());
  403. // we want to test the case for which we have actually set some rights
  404. // if this is not OK then change the setUp method and add some admin rights for some websites
  405. $this->assertGreaterThan(0, count(array_keys($access)));
  406. }
  407. /**
  408. * idsites = all AND user is superuser=> apply access to all websites
  409. */
  410. public function testSetUserAccessIdsitesIsAllSuperuser()
  411. {
  412. FakeAccess::$superUser = true;
  413. $idSites = $this->addSites(5);
  414. $this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
  415. $this->api->setUserAccess("gegg4564eqgeqag", "view", "all");
  416. $access = $this->api->getSitesAccessFromUser("gegg4564eqgeqag");
  417. $access = $this->_flatten($access);
  418. $this->assertEquals($idSites, array_keys($access));
  419. }
  420. /**
  421. * @expectedException \Exception
  422. */
  423. public function testSetUserAccess_ShouldNotBeAbleToSetAnyAccess_IfIdSitesIsEmpty()
  424. {
  425. $this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
  426. $this->api->setUserAccess("gegg4564eqgeqag", "view", array());
  427. }
  428. /**
  429. * normal case, access set for only one site
  430. */
  431. public function testSetUserAccessIdsitesOneSite()
  432. {
  433. $this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
  434. $idSites = $this->addSites(1);
  435. $this->api->setUserAccess("gegg4564eqgeqag", "view", $idSites);
  436. $access = $this->api->getSitesAccessFromUser("gegg4564eqgeqag");
  437. $access = $this->_flatten($access);
  438. $this->assertEquals($idSites, array_keys($access));
  439. }
  440. /**
  441. * normal case, access set for multiple sites
  442. */
  443. public function testSetUserAccessIdsitesMultipleSites()
  444. {
  445. $this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
  446. list($id1, $id2, $id3) = $this->addSites(3);
  447. $this->api->setUserAccess("gegg4564eqgeqag", "view", array($id1, $id3));
  448. $access = $this->api->getSitesAccessFromUser("gegg4564eqgeqag");
  449. $access = $this->_flatten($access);
  450. $this->assertEquals(array($id1, $id3), array_keys($access));
  451. }
  452. /**
  453. * normal case, string idSites comma separated access set for multiple sites
  454. */
  455. public function testSetUserAccessWithIdSitesIsStringCommaSeparated()
  456. {
  457. $this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
  458. list($id1, $id2, $id3) = $this->addSites(3);
  459. $this->api->setUserAccess("gegg4564eqgeqag", "view", "1,3");
  460. $access = $this->api->getSitesAccessFromUser("gegg4564eqgeqag");
  461. $access = $this->_flatten($access);
  462. $this->assertEquals(array($id1, $id3), array_keys($access));
  463. }
  464. /**
  465. * normal case, set different acccess to different websites for one user
  466. */
  467. public function testSetUserAccessMultipleCallDistinctAccessSameUser()
  468. {
  469. $this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
  470. list($id1, $id2) = $this->addSites(2);
  471. $this->api->setUserAccess("gegg4564eqgeqag", "view", array($id1));
  472. $this->api->setUserAccess("gegg4564eqgeqag", "admin", array($id2));
  473. $access = $this->api->getSitesAccessFromUser("gegg4564eqgeqag");
  474. $access = $this->_flatten($access);
  475. $this->assertEquals(array($id1 => 'view', $id2 => 'admin'), $access);
  476. }
  477. /**
  478. * normal case, set different access to different websites for multiple users
  479. */
  480. public function testSetUserAccessMultipleCallDistinctAccessMultipleUser()
  481. {
  482. $this->api->addUser("user1", "geqgegagae", "tegst@tesgt.com", "alias");
  483. $this->api->addUser("user2", "geqgegagae", "tegst2@tesgt.com", "alias");
  484. list($id1, $id2, $id3) = $this->addSites(3);
  485. $this->api->setUserAccess("user1", "view", array($id1, $id2));
  486. $this->api->setUserAccess("user2", "admin", array($id1));
  487. $this->api->setUserAccess("user2", "view", array($id3, $id2));
  488. $access1 = $this->api->getSitesAccessFromUser("user1");
  489. $access1 = $this->_flatten($access1);
  490. $access2 = $this->api->getSitesAccessFromUser("user2");
  491. $access2 = $this->_flatten($access2);
  492. $wanted1 = array($id1 => 'view', $id2 => 'view',);
  493. $wanted2 = array($id1 => 'admin', $id2 => 'view', $id3 => 'view');
  494. $this->assertEquals($wanted1, $access1);
  495. $this->assertEquals($wanted2, $access2);
  496. $access1 = $this->api->getUsersAccessFromSite($id1);
  497. $access2 = $this->api->getUsersAccessFromSite($id2);
  498. $access3 = $this->api->getUsersAccessFromSite($id3);
  499. $wanted1 = array('user1' => 'view', 'user2' => 'admin',);
  500. $wanted2 = array('user1' => 'view', 'user2' => 'view');
  501. $wanted3 = array('user2' => 'view');
  502. $this->assertEquals($wanted1, $access1);
  503. $this->assertEquals($wanted2, $access2);
  504. $this->assertEquals($wanted3, $access3);
  505. $access1 = $this->api->getUsersSitesFromAccess('view');
  506. $access2 = $this->api->getUsersSitesFromAccess('admin');
  507. $wanted1 = array('user1' => array($id1, $id2), 'user2' => array($id2, $id3));
  508. $wanted2 = array('user2' => array($id1));
  509. $this->assertEquals($wanted1, $access1);
  510. $this->assertEquals($wanted2, $access2);
  511. // Test getUsersWithSiteAccess
  512. $users = $this->api->getUsersWithSiteAccess($id1, $access = 'view');
  513. $this->assertEquals(1, count($users));
  514. $this->assertEquals('user1', $users[0]['login']);
  515. $users = $this->api->getUsersWithSiteAccess($id2, $access = 'view');
  516. $this->assertEquals(2, count($users));
  517. $users = $this->api->getUsersWithSiteAccess($id1, $access = 'admin');
  518. $this->assertEquals(1, count($users));
  519. $this->assertEquals('user2', $users[0]['login']);
  520. $users = $this->api->getUsersWithSiteAccess($id3, $access = 'admin');
  521. $this->assertEquals(0, count($users));
  522. }
  523. /**
  524. * we set access for one user for one site several times and check that it is updated
  525. */
  526. public function testSetUserAccessMultipleCallOverwriteSingleUserOneSite()
  527. {
  528. $this->api->addUser("user1", "geqgegagae", "tegst@tesgt.com", "alias");
  529. list($id1, $id2) = $this->addSites(2);
  530. $this->api->setUserAccess("user1", "view", array($id1, $id2));
  531. $this->api->setUserAccess("user1", "admin", array($id1));
  532. $access1 = $this->api->getSitesAccessFromUser("user1");
  533. $access1 = $this->_flatten($access1);
  534. $wanted1 = array($id1 => 'admin', $id2 => 'view',);
  535. $this->assertEquals($wanted1, $access1);
  536. }
  537. /**
  538. * @expectedException \Exception
  539. * @expectedExceptionMessage checkUserHasSuperUserAccess Fake exception
  540. */
  541. public function testSetSuperUserAccess_ShouldFail_IfUserHasNotSuperUserPermission()
  542. {
  543. FakeAccess::setSuperUserAccess(false);
  544. $this->api->setSuperUserAccess('nologin', false);
  545. }
  546. /**
  547. * @expectedException \Exception
  548. * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
  549. */
  550. public function testSetSuperUserAccess_ShouldFail_IfUserWithGivenLoginDoesNotExist()
  551. {
  552. $this->api->setSuperUserAccess('nologin', false);
  553. }
  554. /**
  555. * @expectedException \Exception
  556. * @expectedExceptionMessage UsersManager_ExceptionEditAnonymous
  557. */
  558. public function testSetSuperUserAccess_ShouldFail_IfUserIsAnonymous()
  559. {
  560. $this->api->setSuperUserAccess('anonymous', true);
  561. }
  562. /**
  563. * @expectedException \Exception
  564. * @expectedExceptionMessage UsersManager_ExceptionRemoveSuperUserAccessOnlySuperUser
  565. */
  566. public function testSetSuperUserAccess_ShouldFail_IfUserIsOnlyRemainingUserWithSuperUserAccess()
  567. {
  568. $this->api->addUser('login1', 'password1', 'test@example.com', false);
  569. $this->api->setSuperUserAccess('login1', true);
  570. $this->api->setSuperUserAccess('login1', false);
  571. }
  572. public function testSetSuperUserAccess_ShouldDeleteAllExistingAccessEntries()
  573. {
  574. list($id1, $id2) = $this->addSites(2);
  575. $this->api->addUser('login1', 'password1', 'test@example.com', false);
  576. $this->api->setUserAccess('login1', 'view', array($id1));
  577. $this->api->setUserAccess('login1', 'admin', array($id2));
  578. // verify user has access before setting Super User access
  579. $access = $this->_flatten($this->api->getSitesAccessFromUser('login1'));
  580. $this->assertEquals(array($id1 => 'view', $id2 => 'admin'), $access);
  581. $this->api->setSuperUserAccess('login1', true);
  582. // verify no longer any access
  583. $this->assertEquals(array(), $this->model->getSitesAccessFromUser('login1'));
  584. }
  585. public function testSetSuperUserAccess_ShouldAddAndRemoveSuperUserAccessOnlyForGivenLogin()
  586. {
  587. $this->api->addUser('login1', 'password1', 'test1@example.com', false);
  588. $this->api->addUser('login2', 'password2', 'test2@example.com', false);
  589. $this->api->addUser('login3', 'password3', 'test3@example.com', false);
  590. $this->api->setSuperUserAccess('login2', true);
  591. // test add Super User access
  592. $users = $this->api->getUsers();
  593. $this->assertEquals(0, $users[0]['superuser_access']);
  594. $this->assertEquals(1, $users[1]['superuser_access']);
  595. $this->assertEquals('login2', $users[1]['login']);
  596. $this->assertEquals(0, $users[2]['superuser_access']);
  597. // should also accept string '1' to add Super User access
  598. $this->api->setSuperUserAccess('login1', '1');
  599. // test remove Super User access
  600. $this->api->setSuperUserAccess('login2', false);
  601. $users = $this->api->getUsers();
  602. $this->assertEquals(1, $users[0]['superuser_access']);
  603. $this->assertEquals('login1', $users[0]['login']);
  604. $this->assertEquals(0, $users[1]['superuser_access']);
  605. $this->assertEquals(0, $users[2]['superuser_access']);
  606. $this->api->setSuperUserAccess('login3', true);
  607. // should also accept string '0' to remove Super User access
  608. $this->api->setSuperUserAccess('login1', '0');
  609. $users = $this->api->getUsers();
  610. $this->assertEquals(0, $users[0]['superuser_access']);
  611. $this->assertEquals(0, $users[1]['superuser_access']);
  612. $this->assertEquals('login3', $users[2]['login']);
  613. $this->assertEquals(1, $users[2]['superuser_access']);
  614. }
  615. /**
  616. * @expectedException \Exception
  617. * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
  618. */
  619. public function testGetSitesAccessFromUserWrongUser()
  620. {
  621. $this->api->getSitesAccessFromUser("user1");
  622. }
  623. /**
  624. * @expectedException \Exception
  625. */
  626. public function testGetUsersAccessFromSiteWrongIdSite()
  627. {
  628. $this->api->getUsersAccessFromSite(1);
  629. }
  630. /**
  631. * @expectedException \Exception
  632. * @expectedExceptionMessage UsersManager_ExceptionAccessValues
  633. */
  634. public function testGetUsersSitesFromAccessWrongSite()
  635. {
  636. $this->api->getUsersSitesFromAccess('unknown');
  637. }
  638. /**
  639. * @expectedException \Exception
  640. * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
  641. */
  642. public function testUpdateUserNonExistingLogin()
  643. {
  644. $this->api->updateUser("lolgin", "password");
  645. }
  646. /**
  647. * no email no alias => keep old ones
  648. */
  649. public function testUpdateUserNoEmailNoAlias()
  650. {
  651. $login = "login";
  652. $user = array('login' => $login,
  653. 'password' => "geqgeagae",
  654. 'email' => "test@test.com",
  655. 'alias' => "alias");
  656. $this->api->addUser($user['login'], $user['password'], $user['email'], $user['alias']);
  657. $this->api->updateUser($login, "passowordOK");
  658. $this->_checkUserHasNotChanged($user, "passowordOK");
  659. }
  660. /**
  661. * no email => keep old ones
  662. */
  663. public function testUpdateUserNoEmail()
  664. {
  665. $login = "login";
  666. $user = array('login' => $login,
  667. 'password' => "geqgeagae",
  668. 'email' => "test@test.com",
  669. 'alias' => "alias");
  670. $this->api->addUser($user['login'], $user['password'], $user['email'], $user['alias']);
  671. $this->api->updateUser($login, "passowordOK", null, "newalias");
  672. $this->_checkUserHasNotChanged($user, "passowordOK", null, "newalias");
  673. }
  674. /**
  675. * no alias => keep old ones
  676. */
  677. public function testUpdateUserNoAlias()
  678. {
  679. $login = "login";
  680. $user = array('login' => $login,
  681. 'password' => "geqgeagae",
  682. 'email' => "test@test.com",
  683. 'alias' => "alias");
  684. $this->api->addUser($user['login'], $user['password'], $user['email'], $user['alias']);
  685. $this->api->updateUser($login, "passowordOK", "email@geaga.com");
  686. $this->_checkUserHasNotChanged($user, "passowordOK", "email@geaga.com");
  687. }
  688. /**
  689. * check to modify as the user
  690. * @expectedException \Exception
  691. * @expectedExceptionMessage UsersManager_ExceptionLoginExists
  692. */
  693. public function testAddUserIAmTheUser()
  694. {
  695. FakeAccess::$identity = 'login';
  696. $this->testUpdateUserNoEmailNoAlias();
  697. }
  698. /**
  699. * check to modify as being another user => exception
  700. *
  701. * @expectedException \Exception
  702. */
  703. public function testUpdateUserIAmNotTheUser()
  704. {
  705. FakeAccess::$identity = 'login2';
  706. FakeAccess::$superUser = false;
  707. $this->testUpdateUserNoEmailNoAlias();
  708. }
  709. /**
  710. * normal case, reused in other tests
  711. */
  712. public function testUpdateUser()
  713. {
  714. $login = "login";
  715. $user = array('login' => $login,
  716. 'password' => "geqgeagae",
  717. 'email' => "test@test.com",
  718. 'alias' => "alias");
  719. $this->api->addUser($user['login'], $user['password'], $user['email'], $user['alias']);
  720. $this->api->updateUser($login, "passowordOK", "email@geaga.com", "NEW ALIAS");
  721. $this->_checkUserHasNotChanged($user, "passowordOK", "email@geaga.com", "NEW ALIAS");
  722. }
  723. /**
  724. * @expectedException \Exception
  725. */
  726. public function testGetUserByEmailInvalidMail()
  727. {
  728. $this->api->getUserByEmail('email@test.com');
  729. }
  730. public function testGetUserByEmail()
  731. {
  732. $user = array('login' => "login",
  733. 'password' => "geqgeagae",
  734. 'email' => "test@test.com",
  735. 'alias' => "alias");
  736. $this->api->addUser($user['login'], $user['password'], $user['email'], $user['alias']);
  737. $userByMail = $this->api->getUserByEmail($user['email']);
  738. $this->assertEquals($user['login'], $userByMail['login']);
  739. $this->assertEquals($user['email'], $userByMail['email']);
  740. $this->assertEquals($user['alias'], $userByMail['alias']);
  741. }
  742. public function testGetUserPreferenceDefault()
  743. {
  744. $this->addSites(1);
  745. $defaultReportPref = API::PREFERENCE_DEFAULT_REPORT;
  746. $defaultReportDatePref = API::PREFERENCE_DEFAULT_REPORT_DATE;
  747. $this->assertEquals(1, $this->api->getUserPreference('someUser', $defaultReportPref));
  748. $this->assertEquals('yesterday', $this->api->getUserPreference('someUser', $defaultReportDatePref));
  749. }
  750. private function addSites($numberOfSites)
  751. {
  752. $idSites = array();
  753. for ($index = 0; $index < $numberOfSites; $index++) {
  754. $name = "test" . ($index + 1);
  755. $idSites[] = APISitesManager::getInstance()->addSite($name, array("http://piwik.net", "http://piwik.com/test/"));
  756. }
  757. return $idSites;
  758. }
  759. }