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 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544
  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\Database;
  11. use OCP\Comments\ICommentsManager;
  12. use OCP\IConfig;
  13. use OCP\Notification\IManager as INotificationManager;
  14. use OCP\Notification\INotification;
  15. /**
  16. * Class UserTest
  17. *
  18. * @group DB
  19. *
  20. * @package Test\User
  21. */
  22. class UserTest extends \Test\TestCase {
  23. public function testDisplayName() {
  24. /**
  25. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  26. */
  27. $backend = $this->createMock(\OC\User\Backend::class);
  28. $backend->expects($this->once())
  29. ->method('getDisplayName')
  30. ->with($this->equalTo('foo'))
  31. ->will($this->returnValue('Foo'));
  32. $backend->expects($this->any())
  33. ->method('implementsActions')
  34. ->with($this->equalTo(\OC\User\Backend::GET_DISPLAYNAME))
  35. ->will($this->returnValue(true));
  36. $user = new \OC\User\User('foo', $backend);
  37. $this->assertEquals('Foo', $user->getDisplayName());
  38. }
  39. /**
  40. * if the display name contain whitespaces only, we expect the uid as result
  41. */
  42. public function testDisplayNameEmpty() {
  43. /**
  44. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  45. */
  46. $backend = $this->createMock(\OC\User\Backend::class);
  47. $backend->expects($this->once())
  48. ->method('getDisplayName')
  49. ->with($this->equalTo('foo'))
  50. ->will($this->returnValue(' '));
  51. $backend->expects($this->any())
  52. ->method('implementsActions')
  53. ->with($this->equalTo(\OC\User\Backend::GET_DISPLAYNAME))
  54. ->will($this->returnValue(true));
  55. $user = new \OC\User\User('foo', $backend);
  56. $this->assertEquals('foo', $user->getDisplayName());
  57. }
  58. public function testDisplayNameNotSupported() {
  59. /**
  60. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  61. */
  62. $backend = $this->createMock(\OC\User\Backend::class);
  63. $backend->expects($this->never())
  64. ->method('getDisplayName');
  65. $backend->expects($this->any())
  66. ->method('implementsActions')
  67. ->with($this->equalTo(\OC\User\Backend::GET_DISPLAYNAME))
  68. ->will($this->returnValue(false));
  69. $user = new \OC\User\User('foo', $backend);
  70. $this->assertEquals('foo', $user->getDisplayName());
  71. }
  72. public function testSetPassword() {
  73. /**
  74. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  75. */
  76. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  77. $backend->expects($this->once())
  78. ->method('setPassword')
  79. ->with($this->equalTo('foo'), $this->equalTo('bar'));
  80. $backend->expects($this->any())
  81. ->method('implementsActions')
  82. ->will($this->returnCallback(function ($actions) {
  83. if ($actions === \OC\User\Backend::SET_PASSWORD) {
  84. return true;
  85. } else {
  86. return false;
  87. }
  88. }));
  89. $user = new \OC\User\User('foo', $backend);
  90. $this->assertTrue($user->setPassword('bar',''));
  91. }
  92. public function testSetPasswordNotSupported() {
  93. /**
  94. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  95. */
  96. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  97. $backend->expects($this->never())
  98. ->method('setPassword');
  99. $backend->expects($this->any())
  100. ->method('implementsActions')
  101. ->will($this->returnValue(false));
  102. $user = new \OC\User\User('foo', $backend);
  103. $this->assertFalse($user->setPassword('bar',''));
  104. }
  105. public function testChangeAvatarSupportedYes() {
  106. /**
  107. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  108. */
  109. $backend = $this->createMock(AvatarUserDummy::class);
  110. $backend->expects($this->once())
  111. ->method('canChangeAvatar')
  112. ->with($this->equalTo('foo'))
  113. ->will($this->returnValue(true));
  114. $backend->expects($this->any())
  115. ->method('implementsActions')
  116. ->will($this->returnCallback(function ($actions) {
  117. if ($actions === \OC\User\Backend::PROVIDE_AVATAR) {
  118. return true;
  119. } else {
  120. return false;
  121. }
  122. }));
  123. $user = new \OC\User\User('foo', $backend);
  124. $this->assertTrue($user->canChangeAvatar());
  125. }
  126. public function testChangeAvatarSupportedNo() {
  127. /**
  128. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  129. */
  130. $backend = $this->createMock(AvatarUserDummy::class);
  131. $backend->expects($this->once())
  132. ->method('canChangeAvatar')
  133. ->with($this->equalTo('foo'))
  134. ->will($this->returnValue(false));
  135. $backend->expects($this->any())
  136. ->method('implementsActions')
  137. ->will($this->returnCallback(function ($actions) {
  138. if ($actions === \OC\User\Backend::PROVIDE_AVATAR) {
  139. return true;
  140. } else {
  141. return false;
  142. }
  143. }));
  144. $user = new \OC\User\User('foo', $backend);
  145. $this->assertFalse($user->canChangeAvatar());
  146. }
  147. public function testChangeAvatarNotSupported() {
  148. /**
  149. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  150. */
  151. $backend = $this->createMock(AvatarUserDummy::class);
  152. $backend->expects($this->never())
  153. ->method('canChangeAvatar');
  154. $backend->expects($this->any())
  155. ->method('implementsActions')
  156. ->willReturn(false);
  157. $user = new \OC\User\User('foo', $backend);
  158. $this->assertTrue($user->canChangeAvatar());
  159. }
  160. public function testDelete() {
  161. /**
  162. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  163. */
  164. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  165. $backend->expects($this->once())
  166. ->method('deleteUser')
  167. ->with($this->equalTo('foo'));
  168. $user = new \OC\User\User('foo', $backend);
  169. $this->assertTrue($user->delete());
  170. }
  171. public function testGetHome() {
  172. /**
  173. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  174. */
  175. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  176. $backend->expects($this->once())
  177. ->method('getHome')
  178. ->with($this->equalTo('foo'))
  179. ->will($this->returnValue('/home/foo'));
  180. $backend->expects($this->any())
  181. ->method('implementsActions')
  182. ->will($this->returnCallback(function ($actions) {
  183. if ($actions === \OC\User\Backend::GET_HOME) {
  184. return true;
  185. } else {
  186. return false;
  187. }
  188. }));
  189. $user = new \OC\User\User('foo', $backend);
  190. $this->assertEquals('/home/foo', $user->getHome());
  191. }
  192. public function testGetBackendClassName() {
  193. $user = new \OC\User\User('foo', new \Test\Util\User\Dummy());
  194. $this->assertEquals('Dummy', $user->getBackendClassName());
  195. $user = new \OC\User\User('foo', new \OC\User\Database());
  196. $this->assertEquals('Database', $user->getBackendClassName());
  197. }
  198. public function testGetHomeNotSupported() {
  199. /**
  200. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  201. */
  202. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  203. $backend->expects($this->never())
  204. ->method('getHome');
  205. $backend->expects($this->any())
  206. ->method('implementsActions')
  207. ->will($this->returnValue(false));
  208. $allConfig = $this->getMockBuilder('\OCP\IConfig')
  209. ->disableOriginalConstructor()
  210. ->getMock();
  211. $allConfig->expects($this->any())
  212. ->method('getUserValue')
  213. ->will($this->returnValue(true));
  214. $allConfig->expects($this->any())
  215. ->method('getSystemValue')
  216. ->with($this->equalTo('datadirectory'))
  217. ->will($this->returnValue('arbitrary/path'));
  218. $user = new \OC\User\User('foo', $backend, null, $allConfig);
  219. $this->assertEquals('arbitrary/path/foo', $user->getHome());
  220. }
  221. public function testCanChangePassword() {
  222. /**
  223. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  224. */
  225. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  226. $backend->expects($this->any())
  227. ->method('implementsActions')
  228. ->will($this->returnCallback(function ($actions) {
  229. if ($actions === \OC\User\Backend::SET_PASSWORD) {
  230. return true;
  231. } else {
  232. return false;
  233. }
  234. }));
  235. $user = new \OC\User\User('foo', $backend);
  236. $this->assertTrue($user->canChangePassword());
  237. }
  238. public function testCanChangePasswordNotSupported() {
  239. /**
  240. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  241. */
  242. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  243. $backend->expects($this->any())
  244. ->method('implementsActions')
  245. ->will($this->returnValue(false));
  246. $user = new \OC\User\User('foo', $backend);
  247. $this->assertFalse($user->canChangePassword());
  248. }
  249. public function testCanChangeDisplayName() {
  250. /**
  251. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  252. */
  253. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  254. $backend->expects($this->any())
  255. ->method('implementsActions')
  256. ->will($this->returnCallback(function ($actions) {
  257. if ($actions === \OC\User\Backend::SET_DISPLAYNAME) {
  258. return true;
  259. } else {
  260. return false;
  261. }
  262. }));
  263. $user = new \OC\User\User('foo', $backend);
  264. $this->assertTrue($user->canChangeDisplayName());
  265. }
  266. public function testCanChangeDisplayNameNotSupported() {
  267. /**
  268. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  269. */
  270. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  271. $backend->expects($this->any())
  272. ->method('implementsActions')
  273. ->will($this->returnValue(false));
  274. $user = new \OC\User\User('foo', $backend);
  275. $this->assertFalse($user->canChangeDisplayName());
  276. }
  277. public function testSetDisplayNameSupported() {
  278. /**
  279. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  280. */
  281. $backend = $this->createMock(Database::class);
  282. $backend->expects($this->any())
  283. ->method('implementsActions')
  284. ->will($this->returnCallback(function ($actions) {
  285. if ($actions === \OC\User\Backend::SET_DISPLAYNAME) {
  286. return true;
  287. } else {
  288. return false;
  289. }
  290. }));
  291. $backend->expects($this->once())
  292. ->method('setDisplayName')
  293. ->with('foo','Foo')
  294. ->willReturn(true);
  295. $user = new \OC\User\User('foo', $backend);
  296. $this->assertTrue($user->setDisplayName('Foo'));
  297. $this->assertEquals('Foo',$user->getDisplayName());
  298. }
  299. /**
  300. * don't allow display names containing whitespaces only
  301. */
  302. public function testSetDisplayNameEmpty() {
  303. /**
  304. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  305. */
  306. $backend = $this->createMock(Database::class);
  307. $backend->expects($this->any())
  308. ->method('implementsActions')
  309. ->will($this->returnCallback(function ($actions) {
  310. if ($actions === \OC\User\Backend::SET_DISPLAYNAME) {
  311. return true;
  312. } else {
  313. return false;
  314. }
  315. }));
  316. $user = new \OC\User\User('foo', $backend);
  317. $this->assertFalse($user->setDisplayName(' '));
  318. $this->assertEquals('foo',$user->getDisplayName());
  319. }
  320. public function testSetDisplayNameNotSupported() {
  321. /**
  322. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  323. */
  324. $backend = $this->createMock(Database::class);
  325. $backend->expects($this->any())
  326. ->method('implementsActions')
  327. ->willReturn(false);
  328. $backend->expects($this->never())
  329. ->method('setDisplayName');
  330. $user = new \OC\User\User('foo', $backend);
  331. $this->assertFalse($user->setDisplayName('Foo'));
  332. $this->assertEquals('foo',$user->getDisplayName());
  333. }
  334. public function testSetPasswordHooks() {
  335. $hooksCalled = 0;
  336. $test = $this;
  337. /**
  338. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  339. */
  340. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  341. $backend->expects($this->once())
  342. ->method('setPassword');
  343. /**
  344. * @param \OC\User\User $user
  345. * @param string $password
  346. */
  347. $hook = function ($user, $password) use ($test, &$hooksCalled) {
  348. $hooksCalled++;
  349. $test->assertEquals('foo', $user->getUID());
  350. $test->assertEquals('bar', $password);
  351. };
  352. $emitter = new PublicEmitter();
  353. $emitter->listen('\OC\User', 'preSetPassword', $hook);
  354. $emitter->listen('\OC\User', 'postSetPassword', $hook);
  355. $backend->expects($this->any())
  356. ->method('implementsActions')
  357. ->will($this->returnCallback(function ($actions) {
  358. if ($actions === \OC\User\Backend::SET_PASSWORD) {
  359. return true;
  360. } else {
  361. return false;
  362. }
  363. }));
  364. $user = new \OC\User\User('foo', $backend, $emitter);
  365. $user->setPassword('bar','');
  366. $this->assertEquals(2, $hooksCalled);
  367. }
  368. public function dataDeleteHooks() {
  369. return [
  370. [true, 2],
  371. [false, 1],
  372. ];
  373. }
  374. /**
  375. * @dataProvider dataDeleteHooks
  376. * @param bool $result
  377. * @param int $expectedHooks
  378. */
  379. public function testDeleteHooks($result, $expectedHooks) {
  380. $hooksCalled = 0;
  381. $test = $this;
  382. /**
  383. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  384. */
  385. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  386. $backend->expects($this->once())
  387. ->method('deleteUser')
  388. ->willReturn($result);
  389. $emitter = new PublicEmitter();
  390. $user = new \OC\User\User('foo', $backend, $emitter);
  391. /**
  392. * @param \OC\User\User $user
  393. */
  394. $hook = function ($user) use ($test, &$hooksCalled) {
  395. $hooksCalled++;
  396. $test->assertEquals('foo', $user->getUID());
  397. };
  398. $emitter->listen('\OC\User', 'preDelete', $hook);
  399. $emitter->listen('\OC\User', 'postDelete', $hook);
  400. $config = $this->createMock(IConfig::class);
  401. $commentsManager = $this->createMock(ICommentsManager::class);
  402. $notificationManager = $this->createMock(INotificationManager::class);
  403. if ($result) {
  404. $config->expects($this->once())
  405. ->method('deleteAllUserValues')
  406. ->with('foo');
  407. $commentsManager->expects($this->once())
  408. ->method('deleteReferencesOfActor')
  409. ->with('users', 'foo');
  410. $commentsManager->expects($this->once())
  411. ->method('deleteReadMarksFromUser')
  412. ->with($user);
  413. $notification = $this->createMock(INotification::class);
  414. $notification->expects($this->once())
  415. ->method('setUser')
  416. ->with('foo');
  417. $notificationManager->expects($this->once())
  418. ->method('createNotification')
  419. ->willReturn($notification);
  420. $notificationManager->expects($this->once())
  421. ->method('markProcessed')
  422. ->with($notification);
  423. } else {
  424. $config->expects($this->never())
  425. ->method('deleteAllUserValues');
  426. $commentsManager->expects($this->never())
  427. ->method('deleteReferencesOfActor');
  428. $commentsManager->expects($this->never())
  429. ->method('deleteReadMarksFromUser');
  430. $notificationManager->expects($this->never())
  431. ->method('createNotification');
  432. $notificationManager->expects($this->never())
  433. ->method('markProcessed');
  434. }
  435. $this->overwriteService('NotificationManager', $notificationManager);
  436. $this->overwriteService('CommentsManager', $commentsManager);
  437. $this->overwriteService('AllConfig', $config);
  438. $this->assertSame($result, $user->delete());
  439. $this->restoreService('AllConfig');
  440. $this->restoreService('CommentsManager');
  441. $this->restoreService('NotificationManager');
  442. $this->assertEquals($expectedHooks, $hooksCalled);
  443. }
  444. public function testGetCloudId() {
  445. /**
  446. * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend
  447. */
  448. $backend = $this->createMock(\Test\Util\User\Dummy::class);
  449. $urlGenerator = $this->getMockBuilder('\OC\URLGenerator')
  450. ->setMethods(['getAbsoluteURL'])
  451. ->disableOriginalConstructor()->getMock();
  452. $urlGenerator
  453. ->expects($this->any())
  454. ->method('getAbsoluteURL')
  455. ->withAnyParameters()
  456. ->willReturn('http://localhost:8888/owncloud');
  457. $user = new \OC\User\User('foo', $backend, null, null, $urlGenerator);
  458. $this->assertEquals("foo@localhost:8888/owncloud", $user->getCloudId());
  459. }
  460. }