|
10 | 10 | namespace OCA\Tables\Tests\Unit\ShareReview; |
11 | 11 |
|
12 | 12 | use OCA\Tables\Db\ContextMapper; |
13 | | -use OCA\Tables\Db\ContextNavigationMapper; |
14 | | -use OCA\Tables\Db\Share; |
15 | 13 | use OCA\Tables\Db\ShareMapper; |
16 | 14 | use OCA\Tables\Db\TableMapper; |
17 | 15 | use OCA\Tables\Db\ViewMapper; |
| 16 | +use OCA\Tables\Service\ShareService; |
| 17 | +use OCP\Share\Events\ShareReviewAccessCheckEvent; |
18 | 18 | use OCA\Tables\ShareReview\ShareReviewSource; |
19 | 19 | use OCP\AppFramework\Db\DoesNotExistException; |
20 | 20 | use OCP\Constants; |
21 | 21 | use OCP\DB\Exception; |
| 22 | +use OCP\EventDispatcher\IEventDispatcher; |
22 | 23 | use OCP\IL10N; |
23 | 24 | use OCP\Share\IShare; |
24 | 25 | use PHPUnit\Framework\MockObject\MockObject; |
|
27 | 28 |
|
28 | 29 | final class ShareReviewSourceTest extends TestCase { |
29 | 30 | private MockObject $shareMapper; |
30 | | - private MockObject $contextNavigationMapper; |
31 | 31 | private MockObject $tableMapper; |
32 | 32 | private MockObject $viewMapper; |
33 | 33 | private MockObject $contextMapper; |
34 | 34 | private MockObject $l10n; |
35 | 35 | private MockObject $logger; |
| 36 | + private MockObject $shareService; |
| 37 | + private MockObject $eventDispatcher; |
36 | 38 | private ShareReviewSource $source; |
37 | 39 |
|
38 | 40 | protected function setUp(): void { |
39 | 41 | parent::setUp(); |
40 | 42 | $this->shareMapper = $this->createMock(ShareMapper::class); |
41 | | - $this->contextNavigationMapper = $this->createMock(ContextNavigationMapper::class); |
42 | 43 | $this->tableMapper = $this->createMock(TableMapper::class); |
43 | 44 | $this->viewMapper = $this->createMock(ViewMapper::class); |
44 | 45 | $this->contextMapper = $this->createMock(ContextMapper::class); |
45 | 46 | $this->l10n = $this->createMock(IL10N::class); |
46 | 47 | $this->l10n->method('t')->willReturnCallback(fn (string $text, array $params = []) => vsprintf($text, $params)); |
47 | 48 | $this->logger = $this->createMock(LoggerInterface::class); |
| 49 | + $this->shareService = $this->createMock(ShareService::class); |
| 50 | + $this->eventDispatcher = $this->createMock(IEventDispatcher::class); |
48 | 51 | $this->source = new ShareReviewSource( |
49 | 52 | $this->shareMapper, |
50 | | - $this->contextNavigationMapper, |
51 | 53 | $this->tableMapper, |
52 | 54 | $this->viewMapper, |
53 | 55 | $this->contextMapper, |
54 | 56 | $this->l10n, |
55 | 57 | $this->logger, |
| 58 | + $this->shareService, |
| 59 | + $this->eventDispatcher, |
56 | 60 | ); |
57 | 61 | } |
58 | 62 |
|
@@ -227,63 +231,70 @@ public function testGetSharesReturnsEmptyOnDbException(): void { |
227 | 231 | $this->assertSame([], $this->source->getShares()); |
228 | 232 | } |
229 | 233 |
|
230 | | - private function makeShare(int $id, string $nodeType): Share { |
231 | | - $share = new Share(); |
232 | | - $share->setId($id); |
233 | | - $share->setNodeType($nodeType); |
234 | | - return $share; |
| 234 | + public function testDeleteShareNonNumericReturnsFalse(): void { |
| 235 | + $this->eventDispatcher->expects($this->never())->method('dispatchTyped'); |
| 236 | + |
| 237 | + $this->assertFalse($this->source->deleteShare('abc')); |
235 | 238 | } |
236 | 239 |
|
237 | | - public function testDeleteShareTableSuccessSkipsContextNavCleanup(): void { |
238 | | - $share = $this->makeShare(7, 'table'); |
239 | | - $this->shareMapper->expects($this->once())->method('find')->with(7)->willReturn($share); |
240 | | - $this->shareMapper->expects($this->once())->method('delete')->with($share); |
241 | | - $this->contextNavigationMapper->expects($this->never())->method('deleteByShareId'); |
242 | | - $this->logger->expects($this->once())->method('info'); |
| 240 | + public function testDeleteShareEventNotHandledReturnsFalse(): void { |
| 241 | + $this->eventDispatcher->expects($this->once()) |
| 242 | + ->method('dispatchTyped') |
| 243 | + ->with($this->isInstanceOf(ShareReviewAccessCheckEvent::class)); |
| 244 | + $this->shareService->expects($this->never())->method('deleteForShareReview'); |
243 | 245 |
|
244 | | - $this->assertTrue($this->source->deleteShare('7')); |
| 246 | + $this->assertFalse($this->source->deleteShare('7')); |
245 | 247 | } |
246 | 248 |
|
247 | | - public function testDeleteShareContextSuccessCleansUpContextNav(): void { |
248 | | - $share = $this->makeShare(7, 'context'); |
249 | | - $this->shareMapper->expects($this->once())->method('find')->with(7)->willReturn($share); |
250 | | - $this->shareMapper->expects($this->once())->method('delete')->with($share); |
251 | | - $this->contextNavigationMapper->expects($this->once())->method('deleteByShareId')->with(7); |
252 | | - $this->logger->expects($this->once())->method('info'); |
| 249 | + public function testDeleteShareEventDeniedReturnsFalse(): void { |
| 250 | + $this->eventDispatcher->expects($this->once()) |
| 251 | + ->method('dispatchTyped') |
| 252 | + ->with($this->isInstanceOf(ShareReviewAccessCheckEvent::class)) |
| 253 | + ->willReturnCallback(function (ShareReviewAccessCheckEvent $event): void { |
| 254 | + $event->denyAccess('not a share-review operator'); |
| 255 | + }); |
| 256 | + $this->shareService->expects($this->never())->method('deleteForShareReview'); |
253 | 257 |
|
254 | | - $this->assertTrue($this->source->deleteShare('7')); |
| 258 | + $this->assertFalse($this->source->deleteShare('7')); |
255 | 259 | } |
256 | 260 |
|
257 | | - public function testDeleteShareNotFoundReturnsFalse(): void { |
258 | | - $this->shareMapper->method('find')->willThrowException(new DoesNotExistException('not found')); |
259 | | - $this->shareMapper->expects($this->never())->method('delete'); |
260 | | - $this->contextNavigationMapper->expects($this->never())->method('deleteByShareId'); |
261 | | - $this->logger->expects($this->once())->method('info'); |
262 | | - $this->logger->expects($this->once())->method('warning'); |
| 261 | + public function testDeleteShareEventGrantedReturnsTrue(): void { |
| 262 | + $this->eventDispatcher->expects($this->once()) |
| 263 | + ->method('dispatchTyped') |
| 264 | + ->with($this->isInstanceOf(ShareReviewAccessCheckEvent::class)) |
| 265 | + ->willReturnCallback(function (ShareReviewAccessCheckEvent $event): void { |
| 266 | + $event->grantAccess(); |
| 267 | + }); |
| 268 | + $this->shareService->expects($this->once())->method('deleteForShareReview')->with(7); |
263 | 269 |
|
264 | | - $this->assertFalse($this->source->deleteShare('99')); |
| 270 | + $this->assertTrue($this->source->deleteShare('7')); |
265 | 271 | } |
266 | 272 |
|
267 | | - public function testDeleteShareReturnsFalseOnDeleteException(): void { |
268 | | - $share = $this->makeShare(7, 'table'); |
269 | | - $this->shareMapper->method('find')->willReturn($share); |
270 | | - $this->shareMapper->method('delete')->willThrowException($this->createMock(Exception::class)); |
271 | | - $this->contextNavigationMapper->expects($this->never())->method('deleteByShareId'); |
272 | | - $this->logger->expects($this->once())->method('info'); |
273 | | - $this->logger->expects($this->once())->method('error'); |
| 273 | + public function testDeleteShareDoesNotExistReturnsFalse(): void { |
| 274 | + $this->eventDispatcher->expects($this->once()) |
| 275 | + ->method('dispatchTyped') |
| 276 | + ->willReturnCallback(function (ShareReviewAccessCheckEvent $event): void { |
| 277 | + $event->grantAccess(); |
| 278 | + }); |
| 279 | + $this->shareService->expects($this->once()) |
| 280 | + ->method('deleteForShareReview') |
| 281 | + ->willThrowException($this->createMock(DoesNotExistException::class)); |
274 | 282 |
|
275 | 283 | $this->assertFalse($this->source->deleteShare('7')); |
276 | 284 | } |
277 | 285 |
|
278 | | - public function testDeleteShareReturnsTrueOnContextNavigationException(): void { |
279 | | - $share = $this->makeShare(42, 'context'); |
280 | | - $this->shareMapper->method('find')->willReturn($share); |
281 | | - $this->shareMapper->method('delete'); |
282 | | - $this->contextNavigationMapper->method('deleteByShareId')->willThrowException($this->createMock(Exception::class)); |
283 | | - $this->logger->expects($this->once())->method('info'); |
| 286 | + public function testDeleteShareDbExceptionReturnsFalse(): void { |
| 287 | + $this->eventDispatcher->expects($this->once()) |
| 288 | + ->method('dispatchTyped') |
| 289 | + ->willReturnCallback(function (ShareReviewAccessCheckEvent $event): void { |
| 290 | + $event->grantAccess(); |
| 291 | + }); |
| 292 | + $this->shareService->expects($this->once()) |
| 293 | + ->method('deleteForShareReview') |
| 294 | + ->willThrowException($this->createMock(Exception::class)); |
284 | 295 | $this->logger->expects($this->once())->method('error'); |
285 | 296 |
|
286 | | - $this->assertTrue($this->source->deleteShare('42')); |
| 297 | + $this->assertFalse($this->source->deleteShare('7')); |
287 | 298 | } |
288 | 299 |
|
289 | 300 | public function testComputePermissionsAllFalse(): void { |
|
0 commit comments