FileVoterTest.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. <?php
  2. namespace App\Tests\Unit\Security\Voter\Core;
  3. use App\Entity\Access\Access;
  4. use App\Entity\Core\File;
  5. use App\Entity\Organization\Organization;
  6. use App\Entity\Person\Person;
  7. use App\Enum\Core\FileTypeEnum;
  8. use App\Enum\Core\FileVisibilityEnum;
  9. use App\Security\Voter\EntityVoter\Core\FileVoter;
  10. use App\Service\Access\Utils;
  11. use App\Service\Security\InternalRequestsService;
  12. use App\Service\Security\SwitchUser;
  13. use App\Service\Utils\DatesUtils;
  14. use Doctrine\Common\Collections\ArrayCollection;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use PHPUnit\Framework\MockObject\MockObject;
  17. use PHPUnit\Framework\TestCase;
  18. use Symfony\Bundle\SecurityBundle\Security;
  19. class TestableFileVoter extends FileVoter
  20. {
  21. public function canView(object $subject): bool
  22. {
  23. return parent::canView($subject);
  24. }
  25. public function canEdit(object $subject): bool
  26. {
  27. return parent::canEdit($subject);
  28. }
  29. public function canCreate(object $subject): bool
  30. {
  31. return parent::canCreate($subject);
  32. }
  33. public function canDelete(object $subject): bool
  34. {
  35. return parent::canDelete($subject);
  36. }
  37. public function isInFileOwningGroup(File $file, Access $user): bool
  38. {
  39. return parent::isInFileOwningGroup($file, $user);
  40. }
  41. public function isInFileOwningGroupWithRole(File $file, Access $user): bool
  42. {
  43. return parent::isInFileOwningGroupWithRole($file, $user);
  44. }
  45. public function isAvailable(File $file, ?Access $user): bool
  46. {
  47. return parent::isAvailable($file, $user);
  48. }
  49. public function getUser(): ?Access
  50. {
  51. return parent::getUser();
  52. }
  53. public function isUserLoggedIn(): bool
  54. {
  55. return parent::isUserLoggedIn();
  56. }
  57. public function isValidInternalRequest(): bool
  58. {
  59. return parent::isValidInternalRequest();
  60. }
  61. }
  62. class FileVoterTest extends TestCase
  63. {
  64. protected Security|MockObject $security;
  65. protected Utils|MockObject $accessUtils;
  66. protected EntityManagerInterface|MockObject $entityManager;
  67. protected InternalRequestsService|MockObject $internalRequestsService;
  68. protected SwitchUser|MockObject $switchUserService;
  69. public function setUp(): void
  70. {
  71. $this->security = $this->getMockBuilder(Security::class)->disableOriginalConstructor()->getMock();
  72. $this->accessUtils = $this->getMockBuilder(Utils::class)->disableOriginalConstructor()->getMock();
  73. $this->internalRequestsService = $this->getMockBuilder(InternalRequestsService::class)->disableOriginalConstructor()->getMock();
  74. $this->entityManager = $this->getMockBuilder(EntityManagerInterface::class)->disableOriginalConstructor()->getMock();
  75. $this->switchUserService = $this->getMockBuilder(SwitchUser::class)->disableOriginalConstructor()->getMock();
  76. }
  77. public function tearDown(): void
  78. {
  79. DatesUtils::clearFakeDatetime();
  80. }
  81. private function makeFileVoterMockFor(string $methodName): MockObject|TestableFileVoter
  82. {
  83. return $this->getMockBuilder(TestableFileVoter::class)
  84. ->setConstructorArgs([
  85. $this->security,
  86. $this->accessUtils,
  87. $this->internalRequestsService,
  88. $this->entityManager,
  89. $this->switchUserService,
  90. ])
  91. ->setMethodsExcept([$methodName])
  92. ->getMock();
  93. }
  94. public function testCanViewPublicFile(): void
  95. {
  96. $fileVoter = $this->makeFileVoterMockFor('canView');
  97. $file = $this->getMockBuilder(File::class)->getMock();
  98. $user = $this->getMockBuilder(Access::class)->getMock();
  99. $fileVoter->method('getUser')->willReturn($user);
  100. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(true);
  101. $file->method('getVisibility')->willReturn(FileVisibilityEnum::EVERYBODY);
  102. $this->assertTrue($fileVoter->canView($file));
  103. }
  104. public function testCanViewWithValidInternalRequest(): void
  105. {
  106. $fileVoter = $this->makeFileVoterMockFor('canView');
  107. $file = $this->getMockBuilder(File::class)->getMock();
  108. $user = $this->getMockBuilder(Access::class)->getMock();
  109. $fileVoter->method('getUser')->willReturn($user);
  110. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(true);
  111. $fileVoter->method('isValidInternalRequest')->willReturn(true);
  112. $file->method('getVisibility')->willReturn(FileVisibilityEnum::NOBODY);
  113. $this->assertTrue($fileVoter->canView($file));
  114. }
  115. public function testCanViewNoUserLoggedIn(): void
  116. {
  117. $fileVoter = $this->makeFileVoterMockFor('canView');
  118. $file = $this->getMockBuilder(File::class)->getMock();
  119. $user = $this->getMockBuilder(Access::class)->getMock();
  120. $fileVoter->method('getUser')->willReturn($user);
  121. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(true);
  122. $fileVoter->method('isValidInternalRequest')->willReturn(false);
  123. $fileVoter->method('isUserLoggedIn')->willReturn(false);
  124. $file->method('getVisibility')->willReturn(FileVisibilityEnum::NOBODY);
  125. $this->assertFalse($fileVoter->canView($file));
  126. }
  127. public function testCanViewUserInFilePersons(): void
  128. {
  129. $fileVoter = $this->makeFileVoterMockFor('canView');
  130. $file = $this->getMockBuilder(File::class)->getMock();
  131. $user = $this->getMockBuilder(Access::class)->getMock();
  132. $fileVoter->method('getUser')->willReturn($user);
  133. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(true);
  134. $fileVoter->method('isValidInternalRequest')->willReturn(false);
  135. $fileVoter->method('isUserLoggedIn')->willReturn(true);
  136. $file->method('getVisibility')->willReturn(FileVisibilityEnum::NOBODY);
  137. $owner = $this->getMockBuilder(Person::class)->getMock();
  138. $userPerson = $this->getMockBuilder(Person::class)->getMock();
  139. $user->method('getPerson')->willReturn($userPerson);
  140. $file->method('getAccessPersons')->willReturn(new ArrayCollection([$userPerson]));
  141. $this->assertTrue($fileVoter->canView($file));
  142. }
  143. public function testCanViewUserIsOwner(): void
  144. {
  145. $fileVoter = $this->makeFileVoterMockFor('canView');
  146. $file = $this->getMockBuilder(File::class)->getMock();
  147. $user = $this->getMockBuilder(Access::class)->getMock();
  148. $fileVoter->method('getUser')->willReturn($user);
  149. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(true);
  150. $fileVoter->method('isValidInternalRequest')->willReturn(false);
  151. $fileVoter->method('isUserLoggedIn')->willReturn(true);
  152. $file->method('getVisibility')->willReturn(FileVisibilityEnum::NOBODY);
  153. $owner = $this->getMockBuilder(Person::class)->getMock();
  154. $user->method('getPerson')->willReturn($owner);
  155. $file->method('getAccessPersons')->willReturn(new ArrayCollection([]));
  156. $file->method('getPerson')->willReturn($owner);
  157. $this->assertTrue($fileVoter->canView($file));
  158. }
  159. public function testCanViewUserHasRoleFile(): void
  160. {
  161. $fileVoter = $this->makeFileVoterMockFor('canView');
  162. $file = $this->getMockBuilder(File::class)->getMock();
  163. $user = $this->getMockBuilder(Access::class)->getMock();
  164. $fileVoter->method('getUser')->willReturn($user);
  165. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(true);
  166. $fileVoter->method('isValidInternalRequest')->willReturn(false);
  167. $fileVoter->method('isUserLoggedIn')->willReturn(true);
  168. $file->method('getVisibility')->willReturn(FileVisibilityEnum::NOBODY);
  169. $owner = $this->getMockBuilder(Person::class)->getMock();
  170. $userPerson = $this->getMockBuilder(Person::class)->getMock();
  171. $file->method('getAccessPersons')->willReturn(new ArrayCollection([]));
  172. $this->accessUtils->method('hasRole')->with($user, 'ROLE_FILE')->willReturn(true);
  173. $fileVoter->method('isInFileOwningGroup')->with($file, $user)->willReturn(true);
  174. $this->assertTrue($fileVoter->canView($file));
  175. }
  176. public function testCanViewUserInOwningGroupWithRole(): void
  177. {
  178. $fileVoter = $this->makeFileVoterMockFor('canView');
  179. $file = $this->getMockBuilder(File::class)->getMock();
  180. $user = $this->getMockBuilder(Access::class)->getMock();
  181. $fileVoter->method('getUser')->willReturn($user);
  182. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(true);
  183. $fileVoter->method('isValidInternalRequest')->willReturn(false);
  184. $fileVoter->method('isUserLoggedIn')->willReturn(true);
  185. $file->method('getVisibility')->willReturn(FileVisibilityEnum::NOBODY);
  186. $owner = $this->getMockBuilder(Person::class)->getMock();
  187. $userPerson = $this->getMockBuilder(Person::class)->getMock();
  188. $file->method('getAccessPersons')->willReturn(new ArrayCollection([]));
  189. $this->accessUtils->method('hasRole')->with($user, 'ROLE_FILE')->willReturn(false);
  190. $fileVoter->method('isInFileOwningGroup')->with($file, $user)->willReturn(true);
  191. $fileVoter->method('isInFileOwningGroupWithRole')->with($file, $user)->willReturn(true);
  192. $this->assertTrue($fileVoter->canView($file));
  193. }
  194. public function testCanViewUserHasNotRoleFile(): void
  195. {
  196. $fileVoter = $this->makeFileVoterMockFor('canView');
  197. $file = $this->getMockBuilder(File::class)->getMock();
  198. $user = $this->getMockBuilder(Access::class)->getMock();
  199. $fileVoter->method('getUser')->willReturn($user);
  200. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(true);
  201. $fileVoter->method('isValidInternalRequest')->willReturn(false);
  202. $fileVoter->method('isUserLoggedIn')->willReturn(true);
  203. $file->method('getVisibility')->willReturn(FileVisibilityEnum::NOBODY);
  204. $owner = $this->getMockBuilder(Person::class)->getMock();
  205. $userPerson = $this->getMockBuilder(Person::class)->getMock();
  206. $file->method('getAccessPersons')->willReturn(new ArrayCollection([]));
  207. $this->accessUtils->method('hasRole')->with($user, 'ROLE_FILE')->willReturn(false);
  208. $fileVoter->method('isInFileOwningGroup')->with($file, $user)->willReturn(true);
  209. $this->assertFalse($fileVoter->canView($file));
  210. }
  211. public function testCanViewUserNotInOwningGroup(): void
  212. {
  213. $fileVoter = $this->makeFileVoterMockFor('canView');
  214. $file = $this->getMockBuilder(File::class)->getMock();
  215. $user = $this->getMockBuilder(Access::class)->getMock();
  216. $fileVoter->method('getUser')->willReturn($user);
  217. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(true);
  218. $fileVoter->method('isValidInternalRequest')->willReturn(false);
  219. $fileVoter->method('isUserLoggedIn')->willReturn(true);
  220. $file->method('getVisibility')->willReturn(FileVisibilityEnum::NOBODY);
  221. $owner = $this->getMockBuilder(Person::class)->getMock();
  222. $userPerson = $this->getMockBuilder(Person::class)->getMock();
  223. $file->method('getAccessPersons')->willReturn(new ArrayCollection([]));
  224. $this->accessUtils->method('hasRole')->with($user, 'ROLE_FILE')->willReturn(true);
  225. $fileVoter->method('isInFileOwningGroup')->with($file, $user)->willReturn(false);
  226. $this->assertFalse($fileVoter->canView($file));
  227. }
  228. public function testCanViewFileNotAvailable(): void
  229. {
  230. $fileVoter = $this->makeFileVoterMockFor('canView');
  231. $file = $this->getMockBuilder(File::class)->getMock();
  232. $user = $this->getMockBuilder(Access::class)->getMock();
  233. $fileVoter->method('getUser')->willReturn($user);
  234. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(false);
  235. $this->assertFalse($fileVoter->canView($file));
  236. }
  237. public function testCanEditNotAvailable(): void
  238. {
  239. $fileVoter = $this->makeFileVoterMockFor('canEdit');
  240. $file = $this->getMockBuilder(File::class)->getMock();
  241. $user = $this->getMockBuilder(Access::class)->getMock();
  242. $fileVoter->method('getUser')->willReturn($user);
  243. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(false);
  244. $this->assertFalse($fileVoter->canEdit($file));
  245. }
  246. public function testCanEditNoUserLoggedIn(): void
  247. {
  248. $fileVoter = $this->makeFileVoterMockFor('canEdit');
  249. $file = $this->getMockBuilder(File::class)->getMock();
  250. $fileVoter->method('getUser')->willReturn(null);
  251. $fileVoter->method('isUserLoggedIn')->willReturn(false);
  252. $fileVoter->method('isAvailable')->with($file, null)->willReturn(true);
  253. $this->assertFalse($fileVoter->canEdit($file));
  254. }
  255. public function testCanEditUserHasRoleFile(): void
  256. {
  257. $fileVoter = $this->makeFileVoterMockFor('canEdit');
  258. $file = $this->getMockBuilder(File::class)->getMock();
  259. $user = $this->getMockBuilder(Access::class)->getMock();
  260. $fileVoter->method('getUser')->willReturn($user);
  261. $fileVoter->method('isUserLoggedIn')->willReturn(true);
  262. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(true);
  263. $this->accessUtils->method('hasRole')->with($user, 'ROLE_FILE')->willReturn(true);
  264. $fileVoter->method('isInFileOwningGroup')->with($file, $user)->willReturn(true);
  265. $this->assertTrue($fileVoter->canEdit($file));
  266. }
  267. public function testCanEditUserHasRoleFileButNotInOwningGroup(): void
  268. {
  269. $fileVoter = $this->makeFileVoterMockFor('canEdit');
  270. $file = $this->getMockBuilder(File::class)->getMock();
  271. $user = $this->getMockBuilder(Access::class)->getMock();
  272. $fileVoter->method('getUser')->willReturn($user);
  273. $fileVoter->method('isUserLoggedIn')->willReturn(true);
  274. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(true);
  275. $this->accessUtils->method('hasRole')->with($user, 'ROLE_FILE')->willReturn(true);
  276. $fileVoter->method('isInFileOwningGroup')->with($file, $user)->willReturn(false);
  277. $this->assertFalse($fileVoter->canEdit($file));
  278. }
  279. public function testCanEditUserInOwningGroupButHasNotRoleFile(): void
  280. {
  281. $fileVoter = $this->makeFileVoterMockFor('canEdit');
  282. $file = $this->getMockBuilder(File::class)->getMock();
  283. $user = $this->getMockBuilder(Access::class)->getMock();
  284. $fileVoter->method('getUser')->willReturn($user);
  285. $fileVoter->method('isUserLoggedIn')->willReturn(true);
  286. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(true);
  287. $this->accessUtils->method('hasRole')->with($user, 'ROLE_FILE')->willReturn(false);
  288. $fileVoter->method('isInFileOwningGroup')->with($file, $user)->willReturn(true);
  289. $this->assertFalse($fileVoter->canEdit($file));
  290. }
  291. public function testCanEditIsOwner(): void
  292. {
  293. $fileVoter = $this->makeFileVoterMockFor('canEdit');
  294. $file = $this->getMockBuilder(File::class)->getMock();
  295. $user = $this->getMockBuilder(Access::class)->getMock();
  296. $userPerson = $this->getMockBuilder(Person::class)->getMock();
  297. $userPerson->method('getId')->willReturn(1);
  298. $user->method('getPerson')->willReturn($userPerson);
  299. $fileVoter->method('getUser')->willReturn($user);
  300. $fileVoter->method('isUserLoggedIn')->willReturn(true);
  301. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(true);
  302. $this->accessUtils->method('hasRole')->with($user, 'ROLE_FILE')->willReturn(false);
  303. $fileVoter->method('isInFileOwningGroup')->with($file, $user)->willReturn(true);
  304. $file->method('getPerson')->willReturn($userPerson);
  305. $this->assertTrue($fileVoter->canEdit($file));
  306. }
  307. public function testCanEditLoggedInButHasNotRight(): void
  308. {
  309. $fileVoter = $this->makeFileVoterMockFor('canEdit');
  310. $file = $this->getMockBuilder(File::class)->getMock();
  311. $user = $this->getMockBuilder(Access::class)->getMock();
  312. $userPerson = $this->getMockBuilder(Person::class)->getMock();
  313. $userPerson->method('getId')->willReturn(1);
  314. $user->method('getPerson')->willReturn($userPerson);
  315. $fileVoter->method('getUser')->willReturn($user);
  316. $fileVoter->method('isUserLoggedIn')->willReturn(true);
  317. $fileVoter->method('isAvailable')->with($file, $user)->willReturn(true);
  318. $this->accessUtils->method('hasRole')->with($user, 'ROLE_FILE')->willReturn(false);
  319. $fileVoter->method('isInFileOwningGroup')->with($file, $user)->willReturn(true);
  320. $owner = $this->getMockBuilder(Person::class)->getMock();
  321. $owner->method('getId')->willReturn(2);
  322. $file->method('getPerson')->willReturn($owner);
  323. $this->assertFalse($fileVoter->canEdit($file));
  324. }
  325. public function testCanCreateUserLoggedIn(): void
  326. {
  327. $fileVoter = $this->makeFileVoterMockFor('canCreate');
  328. $file = $this->getMockBuilder(File::class)->getMock();
  329. $fileVoter->method('isUserLoggedIn')->willReturn(true);
  330. $this->assertTrue($fileVoter->canCreate($file));
  331. }
  332. public function testCanCreateUserNotLoggedIn(): void
  333. {
  334. $fileVoter = $this->makeFileVoterMockFor('canCreate');
  335. $file = $this->getMockBuilder(File::class)->getMock();
  336. $fileVoter->method('isUserLoggedIn')->willReturn(false);
  337. $this->assertFalse($fileVoter->canCreate($file));
  338. }
  339. public function testCanDeleteCanEdit(): void
  340. {
  341. $fileVoter = $this->makeFileVoterMockFor('canDelete');
  342. $file = $this->getMockBuilder(File::class)->getMock();
  343. $fileVoter->method('canEdit')->with($file)->willReturn(true);
  344. $this->assertTrue($fileVoter->canDelete($file));
  345. }
  346. public function testCanDeleteCanNotEdit(): void
  347. {
  348. $fileVoter = $this->makeFileVoterMockFor('canDelete');
  349. $file = $this->getMockBuilder(File::class)->getMock();
  350. $fileVoter->method('canEdit')->with($file)->willReturn(false);
  351. $this->assertFalse($fileVoter->canDelete($file));
  352. }
  353. public function testIsInFileOwningGroupIsOrganizationOwned(): void
  354. {
  355. $fileVoter = $this->makeFileVoterMockFor('isInFileOwningGroup');
  356. $userPerson = $this->getMockBuilder(Person::class)->getMock();
  357. $userPerson->method('getId')->willReturn(2);
  358. $userOrganization = $this->getMockBuilder(Organization::class)->getMock();
  359. $userOrganization->method('getId')->willReturn(10);
  360. $user = $this->getMockBuilder(Access::class)->getMock();
  361. $user->method('getOrganization')->willReturn($userOrganization);
  362. $user->method('getPerson')->willReturn($userPerson);
  363. $fileVoter->method('getUser')->willReturn($user);
  364. $organization = $this->getMockBuilder(Organization::class)->getMock();
  365. $organization->method('getId')->willReturn(10);
  366. $person = $this->getMockBuilder(Person::class)->getMock();
  367. $person->method('getId')->willReturn(1);
  368. $file = $this->getMockBuilder(File::class)->getMock();
  369. $file->method('getOrganization')->willReturn($organization);
  370. $file->method('getPerson')->willReturn($person);
  371. $this->assertTrue($fileVoter->isInFileOwningGroup($file, $user));
  372. }
  373. public function testIsInFileOwningGroupIsPersonOwned(): void
  374. {
  375. $fileVoter = $this->makeFileVoterMockFor('isInFileOwningGroup');
  376. $userPerson = $this->getMockBuilder(Person::class)->getMock();
  377. $userPerson->method('getId')->willReturn(1);
  378. $userOrganization = $this->getMockBuilder(Organization::class)->getMock();
  379. $userOrganization->method('getId')->willReturn(20);
  380. $user = $this->getMockBuilder(Access::class)->getMock();
  381. $user->method('getOrganization')->willReturn($userOrganization);
  382. $user->method('getPerson')->willReturn($userPerson);
  383. $fileVoter->method('getUser')->willReturn($user);
  384. $organization = $this->getMockBuilder(Organization::class)->getMock();
  385. $organization->method('getId')->willReturn(10);
  386. $person = $this->getMockBuilder(Person::class)->getMock();
  387. $person->method('getId')->willReturn(1);
  388. $file = $this->getMockBuilder(File::class)->getMock();
  389. $file->method('getOrganization')->willReturn($organization);
  390. $file->method('getPerson')->willReturn($person);
  391. $this->assertTrue($fileVoter->isInFileOwningGroup($file, $user));
  392. }
  393. public function testIsInFileOwningGroupNotInGroup(): void
  394. {
  395. $fileVoter = $this->makeFileVoterMockFor('isInFileOwningGroup');
  396. $userPerson = $this->getMockBuilder(Person::class)->getMock();
  397. $userPerson->method('getId')->willReturn(2);
  398. $userOrganization = $this->getMockBuilder(Organization::class)->getMock();
  399. $userOrganization->method('getId')->willReturn(20);
  400. $user = $this->getMockBuilder(Access::class)->getMock();
  401. $user->method('getOrganization')->willReturn($userOrganization);
  402. $user->method('getPerson')->willReturn($userPerson);
  403. $fileVoter->method('getUser')->willReturn($user);
  404. $organization = $this->getMockBuilder(Organization::class)->getMock();
  405. $organization->method('getId')->willReturn(10);
  406. $person = $this->getMockBuilder(Person::class)->getMock();
  407. $person->method('getId')->willReturn(1);
  408. $file = $this->getMockBuilder(File::class)->getMock();
  409. $file->method('getOrganization')->willReturn($organization);
  410. $file->method('getPerson')->willReturn($person);
  411. $this->assertFalse($fileVoter->isInFileOwningGroup($file, $user));
  412. }
  413. public function testIsAvailablePassedAvailabilityDate(): void
  414. {
  415. $fileVoter = $this->makeFileVoterMockFor('isAvailable');
  416. $user = $this->getMockBuilder(Access::class)->getMock();
  417. $fileVoter->method('getUser')->willReturn($user);
  418. DatesUtils::setFakeDatetime('2020-01-31');
  419. $file = $this->getMockBuilder(File::class)->getMock();
  420. $file->method('getAvailabilityDate')->willReturn(new \DateTime('2020-01-01'));
  421. $this->assertTrue($fileVoter->isAvailable($file, $user));
  422. }
  423. public function testIsAvailableAnonymousAndPassedAvailabilityDate(): void
  424. {
  425. $fileVoter = $this->makeFileVoterMockFor('isAvailable');
  426. DatesUtils::setFakeDatetime('2020-01-31');
  427. $file = $this->getMockBuilder(File::class)->getMock();
  428. $file->method('getAvailabilityDate')->willReturn(new \DateTime('2020-01-01'));
  429. $this->assertTrue($fileVoter->isAvailable($file, null));
  430. }
  431. public function testIsAvailableNoAvailabilityDate(): void
  432. {
  433. $fileVoter = $this->makeFileVoterMockFor('isAvailable');
  434. $user = $this->getMockBuilder(Access::class)->getMock();
  435. $fileVoter->method('getUser')->willReturn($user);
  436. $file = $this->getMockBuilder(File::class)->getMock();
  437. $file->method('getAvailabilityDate')->willReturn(null);
  438. $this->assertTrue($fileVoter->isAvailable($file, $user));
  439. }
  440. public function testIsAvailableFutureAvailabilityDate(): void
  441. {
  442. $fileVoter = $this->makeFileVoterMockFor('isAvailable');
  443. $user = $this->getMockBuilder(Access::class)->getMock();
  444. $fileVoter->method('getUser')->willReturn($user);
  445. DatesUtils::setFakeDatetime('2020-01-01');
  446. $file = $this->getMockBuilder(File::class)->getMock();
  447. $file->method('getAvailabilityDate')->willReturn(new \DateTime('2020-01-31'));
  448. $file->method('getType')->willReturn(FileTypeEnum::UNKNOWN);
  449. $this->accessUtils->method('hasRole')->with($user, 'ROLE_BILLACCOUNTING')->willReturn(false);
  450. $this->assertFalse($fileVoter->isAvailable($file, $user));
  451. }
  452. public function testIsAvailableFutureAvailabilityDateSpecialBillingCase(): void
  453. {
  454. $fileVoter = $this->makeFileVoterMockFor('isAvailable');
  455. $user = $this->getMockBuilder(Access::class)->getMock();
  456. $fileVoter->method('getUser')->willReturn($user);
  457. DatesUtils::setFakeDatetime('2020-01-01');
  458. $file = $this->getMockBuilder(File::class)->getMock();
  459. $file->method('getAvailabilityDate')->willReturn(new \DateTime('2020-01-31'));
  460. $file->method('getType')->willReturn(FileTypeEnum::BILL);
  461. $this->accessUtils->method('hasRole')->with($user, 'ROLE_BILLACCOUNTING')->willReturn(true);
  462. $this->assertTrue($fileVoter->isAvailable($file, $user));
  463. }
  464. }