FileVoterTest.php 24 KB

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