You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

UserTest.php 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. <?php
  2. /**
  3. * Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
  4. * This file is licensed under the Affero General Public License version 3 or
  5. * later.
  6. * See the COPYING-README file.
  7. */
  8. namespace Test\User;
  9. use OC\Hooks\PublicEmitter;
  10. use OC\User\User;
  11. use OCP\Comments\ICommentsManager;
  12. use OCP\IConfig;
  13. use OCP\IUser;
  14. use OCP\Notification\IManager as INotificationManager;
  15. use OCP\Notification\INotification;
  16. use Test\TestCase;
  17. /**
  18. * Class UserTest
  19. *
  20. * @group DB
  21. *
  22. * @package Test\User
  23. */
  24. class UserTest extends TestCase {
  25. public function testDisplayName() {
  26. /**
  27. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  28. */
  29. $backend = $this->createMock(\OC\User\Backend::class);
  30. $backend->expects($this->once())
  31. ->method('getDisplayName')
  32. ->with($this->equalTo('foo'))
  33. ->will($this->returnValue('Foo'));
  34. $backend->expects($this->any())
  35. ->method('implementsActions')
  36. ->with($this->equalTo(\OC\User\Backend::GET_DISPLAYNAME))
  37. ->will($this->returnValue(true));
  38. $user = new User('foo', $backend);
  39. $this->assertEquals('Foo', $user->getDisplayName());
  40. }
  41. /**
  42. * if the display name contain whitespaces only, we expect the uid as result
  43. */
  44. public function testDisplayNameEmpty() {
  45. /**
  46. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  47. */
  48. $backend = $this->createMock(\OC\User\Backend::class);
  49. $backend->expects($this->once())
  50. ->method('getDisplayName')
  51. ->with($this->equalTo('foo'))
  52. ->will($this->returnValue(' '));
  53. $backend->expects($this->any())
  54. ->method('implementsActions')
  55. ->with($this->equalTo(\OC\User\Backend::GET_DISPLAYNAME))
  56. ->will($this->returnValue(true));
  57. $user = new User('foo', $backend);
  58. $this->assertEquals('foo', $user->getDisplayName());
  59. }
  60. public function testDisplayNameNotSupported() {
  61. /**
  62. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  63. */
  64. $backend = $this->createMock(\OC\User\Backend::class);
  65. $backend->expects($this->never())
  66. ->method('getDisplayName');
  67. $backend->expects($this->any())
  68. ->method('implementsActions')
  69. ->with($this->equalTo(\OC\User\Backend::GET_DISPLAYNAME))
  70. ->will($this->returnValue(false));
  71. $user = new User('foo', $backend);
  72. $this->assertEquals('foo', $user->getDisplayName());
  73. }
  74. public function testSetPassword() {
  75. /**
  76. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  77. */
  78. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  79. $backend->expects($this->once())
  80. ->method('setPassword')
  81. ->with($this->equalTo('foo'), $this->equalTo('bar'));
  82. $backend->expects($this->any())
  83. ->method('implementsActions')
  84. ->will($this->returnCallback(function ($actions) {
  85. if ($actions === \OC\User\Backend::SET_PASSWORD) {
  86. return true;
  87. } else {
  88. return false;
  89. }
  90. }));
  91. $user = new User('foo', $backend);
  92. $this->assertTrue($user->setPassword('bar',''));
  93. }
  94. public function testSetPasswordNotSupported() {
  95. /**
  96. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  97. */
  98. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  99. $backend->expects($this->never())
  100. ->method('setPassword');
  101. $backend->expects($this->any())
  102. ->method('implementsActions')
  103. ->will($this->returnValue(false));
  104. $user = new User('foo', $backend);
  105. $this->assertFalse($user->setPassword('bar',''));
  106. }
  107. public function testChangeAvatarSupportedYes() {
  108. /**
  109. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  110. */
  111. $backend = $this->createMock(AvatarUserDummy::class);
  112. $backend->expects($this->once())
  113. ->method('canChangeAvatar')
  114. ->with($this->equalTo('foo'))
  115. ->will($this->returnValue(true));
  116. $backend->expects($this->any())
  117. ->method('implementsActions')
  118. ->will($this->returnCallback(function ($actions) {
  119. if ($actions === \OC\User\Backend::PROVIDE_AVATAR) {
  120. return true;
  121. } else {
  122. return false;
  123. }
  124. }));
  125. $user = new User('foo', $backend);
  126. $this->assertTrue($user->canChangeAvatar());
  127. }
  128. public function testChangeAvatarSupportedNo() {
  129. /**
  130. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  131. */
  132. $backend = $this->createMock(AvatarUserDummy::class);
  133. $backend->expects($this->once())
  134. ->method('canChangeAvatar')
  135. ->with($this->equalTo('foo'))
  136. ->will($this->returnValue(false));
  137. $backend->expects($this->any())
  138. ->method('implementsActions')
  139. ->will($this->returnCallback(function ($actions) {
  140. if ($actions === \OC\User\Backend::PROVIDE_AVATAR) {
  141. return true;
  142. } else {
  143. return false;
  144. }
  145. }));
  146. $user = new User('foo', $backend);
  147. $this->assertFalse($user->canChangeAvatar());
  148. }
  149. public function testChangeAvatarNotSupported() {
  150. /**
  151. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  152. */
  153. $backend = $this->createMock(AvatarUserDummy::class);
  154. $backend->expects($this->never())
  155. ->method('canChangeAvatar');
  156. $backend->expects($this->any())
  157. ->method('implementsActions')
  158. ->willReturn(false);
  159. $user = new User('foo', $backend);
  160. $this->assertTrue($user->canChangeAvatar());
  161. }
  162. public function testDelete() {
  163. /**
  164. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  165. */
  166. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  167. $backend->expects($this->once())
  168. ->method('deleteUser')
  169. ->with($this->equalTo('foo'));
  170. $user = new User('foo', $backend);
  171. $this->assertTrue($user->delete());
  172. }
  173. public function testGetHome() {
  174. /**
  175. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  176. */
  177. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  178. $backend->expects($this->once())
  179. ->method('getHome')
  180. ->with($this->equalTo('foo'))
  181. ->will($this->returnValue('/home/foo'));
  182. $backend->expects($this->any())
  183. ->method('implementsActions')
  184. ->will($this->returnCallback(function ($actions) {
  185. if ($actions === \OC\User\Backend::GET_HOME) {
  186. return true;
  187. } else {
  188. return false;
  189. }
  190. }));
  191. $user = new User('foo', $backend);
  192. $this->assertEquals('/home/foo', $user->getHome());
  193. }
  194. public function testGetBackendClassName() {
  195. $user = new User('foo', new \Test\Util\User\Dummy());
  196. $this->assertEquals('Dummy', $user->getBackendClassName());
  197. $user = new User('foo', new \OC\User\Database());
  198. $this->assertEquals('Database', $user->getBackendClassName());
  199. }
  200. public function testGetHomeNotSupported() {
  201. /**
  202. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  203. */
  204. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  205. $backend->expects($this->never())
  206. ->method('getHome');
  207. $backend->expects($this->any())
  208. ->method('implementsActions')
  209. ->will($this->returnValue(false));
  210. $allConfig = $this->getMockBuilder('\OCP\IConfig')
  211. ->disableOriginalConstructor()
  212. ->getMock();
  213. $allConfig->expects($this->any())
  214. ->method('getUserValue')
  215. ->will($this->returnValue(true));
  216. $allConfig->expects($this->any())
  217. ->method('getSystemValue')
  218. ->with($this->equalTo('datadirectory'))
  219. ->will($this->returnValue('arbitrary/path'));
  220. $user = new User('foo', $backend, null, $allConfig);
  221. $this->assertEquals('arbitrary/path/foo', $user->getHome());
  222. }
  223. public function testCanChangePassword() {
  224. /**
  225. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  226. */
  227. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  228. $backend->expects($this->any())
  229. ->method('implementsActions')
  230. ->will($this->returnCallback(function ($actions) {
  231. if ($actions === \OC\User\Backend::SET_PASSWORD) {
  232. return true;
  233. } else {
  234. return false;
  235. }
  236. }));
  237. $user = new User('foo', $backend);
  238. $this->assertTrue($user->canChangePassword());
  239. }
  240. public function testCanChangePasswordNotSupported() {
  241. /**
  242. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  243. */
  244. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  245. $backend->expects($this->any())
  246. ->method('implementsActions')
  247. ->will($this->returnValue(false));
  248. $user = new User('foo', $backend);
  249. $this->assertFalse($user->canChangePassword());
  250. }
  251. public function testCanChangeDisplayName() {
  252. /**
  253. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  254. */
  255. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  256. $backend->expects($this->any())
  257. ->method('implementsActions')
  258. ->will($this->returnCallback(function ($actions) {
  259. if ($actions === \OC\User\Backend::SET_DISPLAYNAME) {
  260. return true;
  261. } else {
  262. return false;
  263. }
  264. }));
  265. $user = new User('foo', $backend);
  266. $this->assertTrue($user->canChangeDisplayName());
  267. }
  268. public function testCanChangeDisplayNameNotSupported() {
  269. /**
  270. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  271. */
  272. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  273. $backend->expects($this->any())
  274. ->method('implementsActions')
  275. ->will($this->returnValue(false));
  276. $user = new User('foo', $backend);
  277. $this->assertFalse($user->canChangeDisplayName());
  278. }
  279. public function testSetDisplayNameSupported() {
  280. /**
  281. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  282. */
  283. $backend = $this->createMock(\OC\User\Database::class);
  284. $backend->expects($this->any())
  285. ->method('implementsActions')
  286. ->will($this->returnCallback(function ($actions) {
  287. if ($actions === \OC\User\Backend::SET_DISPLAYNAME) {
  288. return true;
  289. } else {
  290. return false;
  291. }
  292. }));
  293. $backend->expects($this->once())
  294. ->method('setDisplayName')
  295. ->with('foo','Foo')
  296. ->willReturn(true);
  297. $user = new User('foo', $backend);
  298. $this->assertTrue($user->setDisplayName('Foo'));
  299. $this->assertEquals('Foo',$user->getDisplayName());
  300. }
  301. /**
  302. * don't allow display names containing whitespaces only
  303. */
  304. public function testSetDisplayNameEmpty() {
  305. /**
  306. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  307. */
  308. $backend = $this->createMock(\OC\User\Database::class);
  309. $backend->expects($this->any())
  310. ->method('implementsActions')
  311. ->will($this->returnCallback(function ($actions) {
  312. if ($actions === \OC\User\Backend::SET_DISPLAYNAME) {
  313. return true;
  314. } else {
  315. return false;
  316. }
  317. }));
  318. $user = new User('foo', $backend);
  319. $this->assertFalse($user->setDisplayName(' '));
  320. $this->assertEquals('foo',$user->getDisplayName());
  321. }
  322. public function testSetDisplayNameNotSupported() {
  323. /**
  324. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  325. */
  326. $backend = $this->createMock(\OC\User\Database::class);
  327. $backend->expects($this->any())
  328. ->method('implementsActions')
  329. ->willReturn(false);
  330. $backend->expects($this->never())
  331. ->method('setDisplayName');
  332. $user = new User('foo', $backend);
  333. $this->assertFalse($user->setDisplayName('Foo'));
  334. $this->assertEquals('foo',$user->getDisplayName());
  335. }
  336. public function testSetPasswordHooks() {
  337. $hooksCalled = 0;
  338. $test = $this;
  339. /**
  340. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  341. */
  342. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  343. $backend->expects($this->once())
  344. ->method('setPassword');
  345. /**
  346. * @param User $user
  347. * @param string $password
  348. */
  349. $hook = function ($user, $password) use ($test, &$hooksCalled) {
  350. $hooksCalled++;
  351. $test->assertEquals('foo', $user->getUID());
  352. $test->assertEquals('bar', $password);
  353. };
  354. $emitter = new PublicEmitter();
  355. $emitter->listen('\OC\User', 'preSetPassword', $hook);
  356. $emitter->listen('\OC\User', 'postSetPassword', $hook);
  357. $backend->expects($this->any())
  358. ->method('implementsActions')
  359. ->will($this->returnCallback(function ($actions) {
  360. if ($actions === \OC\User\Backend::SET_PASSWORD) {
  361. return true;
  362. } else {
  363. return false;
  364. }
  365. }));
  366. $user = new User('foo', $backend, $emitter);
  367. $user->setPassword('bar','');
  368. $this->assertEquals(2, $hooksCalled);
  369. }
  370. public function dataDeleteHooks() {
  371. return [
  372. [true, 2],
  373. [false, 1],
  374. ];
  375. }
  376. /**
  377. * @dataProvider dataDeleteHooks
  378. * @param bool $result
  379. * @param int $expectedHooks
  380. */
  381. public function testDeleteHooks($result, $expectedHooks) {
  382. $hooksCalled = 0;
  383. $test = $this;
  384. /**
  385. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  386. */
  387. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  388. $backend->expects($this->once())
  389. ->method('deleteUser')
  390. ->willReturn($result);
  391. $emitter = new PublicEmitter();
  392. $user = new User('foo', $backend, $emitter);
  393. /**
  394. * @param User $user
  395. */
  396. $hook = function ($user) use ($test, &$hooksCalled) {
  397. $hooksCalled++;
  398. $test->assertEquals('foo', $user->getUID());
  399. };
  400. $emitter->listen('\OC\User', 'preDelete', $hook);
  401. $emitter->listen('\OC\User', 'postDelete', $hook);
  402. $config = $this->createMock(IConfig::class);
  403. $commentsManager = $this->createMock(ICommentsManager::class);
  404. $notificationManager = $this->createMock(INotificationManager::class);
  405. if ($result) {
  406. $config->expects($this->once())
  407. ->method('deleteAllUserValues')
  408. ->with('foo');
  409. $commentsManager->expects($this->once())
  410. ->method('deleteReferencesOfActor')
  411. ->with('users', 'foo');
  412. $commentsManager->expects($this->once())
  413. ->method('deleteReadMarksFromUser')
  414. ->with($user);
  415. $notification = $this->createMock(INotification::class);
  416. $notification->expects($this->once())
  417. ->method('setUser')
  418. ->with('foo');
  419. $notificationManager->expects($this->once())
  420. ->method('createNotification')
  421. ->willReturn($notification);
  422. $notificationManager->expects($this->once())
  423. ->method('markProcessed')
  424. ->with($notification);
  425. } else {
  426. $config->expects($this->never())
  427. ->method('deleteAllUserValues');
  428. $commentsManager->expects($this->never())
  429. ->method('deleteReferencesOfActor');
  430. $commentsManager->expects($this->never())
  431. ->method('deleteReadMarksFromUser');
  432. $notificationManager->expects($this->never())
  433. ->method('createNotification');
  434. $notificationManager->expects($this->never())
  435. ->method('markProcessed');
  436. }
  437. $this->overwriteService('NotificationManager', $notificationManager);
  438. $this->overwriteService('CommentsManager', $commentsManager);
  439. $this->overwriteService('AllConfig', $config);
  440. $this->assertSame($result, $user->delete());
  441. $this->restoreService('AllConfig');
  442. $this->restoreService('CommentsManager');
  443. $this->restoreService('NotificationManager');
  444. $this->assertEquals($expectedHooks, $hooksCalled);
  445. }
  446. public function testGetCloudId() {
  447. /**
  448. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  449. */
  450. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  451. $urlGenerator = $this->getMockBuilder('\OC\URLGenerator')
  452. ->setMethods(['getAbsoluteURL'])
  453. ->disableOriginalConstructor()->getMock();
  454. $urlGenerator
  455. ->expects($this->any())
  456. ->method('getAbsoluteURL')
  457. ->withAnyParameters()
  458. ->willReturn('http://localhost:8888/owncloud');
  459. $user = new User('foo', $backend, null, null, $urlGenerator);
  460. $this->assertEquals('foo@localhost:8888/owncloud', $user->getCloudId());
  461. }
  462. public function testSetEMailAddressEmpty() {
  463. /**
  464. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  465. */
  466. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  467. $test = $this;
  468. $hooksCalled = 0;
  469. /**
  470. * @param IUser $user
  471. * @param string $feature
  472. * @param string $value
  473. */
  474. $hook = function (IUser $user, $feature, $value) use ($test, &$hooksCalled) {
  475. $hooksCalled++;
  476. $test->assertEquals('eMailAddress', $feature);
  477. $test->assertEquals('', $value);
  478. };
  479. $emitter = new PublicEmitter();
  480. $emitter->listen('\OC\User', 'changeUser', $hook);
  481. $config = $this->createMock(IConfig::class);
  482. $config->expects($this->once())
  483. ->method('deleteUserValue')
  484. ->with(
  485. 'foo',
  486. 'settings',
  487. 'email'
  488. );
  489. $user = new User('foo', $backend, $emitter, $config);
  490. $user->setEMailAddress('');
  491. }
  492. public function testSetEMailAddress() {
  493. /**
  494. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  495. */
  496. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  497. $test = $this;
  498. $hooksCalled = 0;
  499. /**
  500. * @param IUser $user
  501. * @param string $feature
  502. * @param string $value
  503. */
  504. $hook = function (IUser $user, $feature, $value) use ($test, &$hooksCalled) {
  505. $hooksCalled++;
  506. $test->assertEquals('eMailAddress', $feature);
  507. $test->assertEquals('foo@bar.com', $value);
  508. };
  509. $emitter = new PublicEmitter();
  510. $emitter->listen('\OC\User', 'changeUser', $hook);
  511. $config = $this->createMock(IConfig::class);
  512. $config->expects($this->once())
  513. ->method('setUserValue')
  514. ->with(
  515. 'foo',
  516. 'settings',
  517. 'email',
  518. 'foo@bar.com'
  519. );
  520. $user = new User('foo', $backend, $emitter, $config);
  521. $user->setEMailAddress('foo@bar.com');
  522. }
  523. public function testGetLastLogin() {
  524. /**
  525. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  526. */
  527. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  528. $config = $this->createMock(IConfig::class);
  529. $config->method('getUserValue')
  530. ->will($this->returnCallback(function ($uid, $app, $key, $default) {
  531. if ($uid === 'foo' && $app === 'login' && $key === 'lastLogin') {
  532. return 42;
  533. } else {
  534. return $default;
  535. }
  536. }));
  537. $user = new User('foo', $backend, null, $config);
  538. $this->assertSame(42, $user->getLastLogin());
  539. }
  540. public function testSetEnabled() {
  541. /**
  542. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  543. */
  544. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  545. $config = $this->createMock(IConfig::class);
  546. $config->expects($this->once())
  547. ->method('setUserValue')
  548. ->with(
  549. $this->equalTo('foo'),
  550. $this->equalTo('core'),
  551. $this->equalTo('enabled'),
  552. 'true'
  553. );
  554. $user = new User('foo', $backend, null, $config);
  555. $user->setEnabled(true);
  556. }
  557. public function testSetDisabled() {
  558. /**
  559. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  560. */
  561. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  562. $config = $this->createMock(IConfig::class);
  563. $config->expects($this->once())
  564. ->method('setUserValue')
  565. ->with(
  566. $this->equalTo('foo'),
  567. $this->equalTo('core'),
  568. $this->equalTo('enabled'),
  569. 'false'
  570. );
  571. $user = new User('foo', $backend, null, $config);
  572. $user->setEnabled(false);
  573. }
  574. public function testGetEMailAddress() {
  575. /**
  576. * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  577. */
  578. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  579. $config = $this->createMock(IConfig::class);
  580. $config->method('getUserValue')
  581. ->will($this->returnCallback(function ($uid, $app, $key, $default) {
  582. if ($uid === 'foo' && $app === 'settings' && $key === 'email') {
  583. return 'foo@bar.com';
  584. } else {
  585. return $default;
  586. }
  587. }));
  588. $user = new User('foo', $backend, null, $config);
  589. $this->assertSame('foo@bar.com', $user->getEMailAddress());
  590. }
  591. }