view = $this->makeTwigMock(); $this->mediaService = $this->createMock(MediaServiceInterface::class); $this->flash = $this->createMock(FlashServiceInterface::class); $this->sessionManager = $this->createMock(SessionManagerInterface::class); $this->controller = new MediaController( $this->view, $this->mediaService, $this->flash, $this->sessionManager, ); } public function testUploadAcceptsFileFieldNameUsedByTrumbowyg(): void { $file = $this->makeValidUploadedFile(); $this->sessionManager->method('getUserId')->willReturn(7); $this->mediaService->expects($this->once()) ->method('store') ->with($file, 7) ->willReturn('/media/from-file-field.webp'); $req = $this->makePost('/admin/media/upload')->withUploadedFiles(['file' => $file]); $res = $this->controller->upload($req, $this->makeResponse()); $this->assertStatus($res, 200); $this->assertJsonContains($res, [ 'success' => true, 'url' => '/media/from-file-field.webp', 'file' => '/media/from-file-field.webp', ]); } public function testUploadPrefersFileFieldWhenBothFileAndImageArePresent(): void { $fileField = $this->makeValidUploadedFile(); $imageField = $this->makeValidUploadedFile(); $this->sessionManager->method('getUserId')->willReturn(11); $this->mediaService->expects($this->once()) ->method('store') ->with($fileField, 11) ->willReturn('/media/preferred-file-field.webp'); $req = $this->makePost('/admin/media/upload')->withUploadedFiles([ 'file' => $fileField, 'image' => $imageField, ]); $res = $this->controller->upload($req, $this->makeResponse()); $this->assertStatus($res, 200); $this->assertJsonContains($res, [ 'success' => true, 'url' => '/media/preferred-file-field.webp', 'file' => '/media/preferred-file-field.webp', ]); } public function testUploadSuccessResponseContainsBothUrlAndFileKeys(): void { $file = $this->makeValidUploadedFile(); $this->sessionManager->method('getUserId')->willReturn(3); $this->mediaService->method('store')->willReturn('/media/dual-key.webp'); $req = $this->makePost('/admin/media/upload')->withUploadedFiles(['image' => $file]); $res = $this->controller->upload($req, $this->makeResponse()); $this->assertStatus($res, 200); $this->assertJsonContains($res, [ 'success' => true, 'url' => '/media/dual-key.webp', 'file' => '/media/dual-key.webp', ]); } /** @return UploadedFileInterface&MockObject */ private function makeValidUploadedFile(): UploadedFileInterface { $file = $this->createMock(UploadedFileInterface::class); $file->method('getError')->willReturn(UPLOAD_ERR_OK); return $file; } }