FileVoterTest.php 24 KB

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