elementRepo = new FakeElementRepository(); $this->fileUploader = new FakeFileUploader(); } public function testUpdateTitleUpdatesOnlyTitle(): void { $element = $this->createFilledElement(); $updateTitle = new UpdateTitle($this->elementRepo); $updatedElement = $updateTitle->execute(new UpdateTitleRequest( id: $element->getId(), title: 'Updated title', )); $this->assertSame('Updated title', $updatedElement->getTitle()); $this->assertSame( $element->getDescription(), $updatedElement->getDescription(), ); $this->assertSame( $element->getRichText(), $updatedElement->getRichText(), ); } public function testUpdateTitleRejectsBlankTitle(): void { $this->createFilledElement(); $updateTitle = new UpdateTitle($this->elementRepo); $this->expectException(BadRequestException::class); $this->expectExceptionMessage('title is required'); $updateTitle->execute(new UpdateTitleRequest(id: 1, title: '')); } public function testUpdateDescriptionUpdatesOnlyDescription(): void { $element = $this->createFilledElement(); $updateDescription = new UpdateDescription($this->elementRepo); $updatedElement = $updateDescription->execute( new UpdateDescriptionRequest( id: $element->getId(), description: 'Updated description', ) ); $this->assertSame( 'Updated description', $updatedElement->getDescription(), ); $this->assertSame($element->getTitle(), $updatedElement->getTitle()); $this->assertSame( $element->getYoutubeUrl(), $updatedElement->getYoutubeUrl(), ); } public function testUpdateIconImageUrlClearsEmptyString(): void { $element = $this->createFilledElement(); $updateIconImageUrl = new UpdateIconImageUrl( $this->elementRepo, $this->fileUploader, ); $updatedElement = $updateIconImageUrl->execute( new UpdateIconImageUrlRequest( id: $element->getId(), iconImageUrl: '', ) ); $this->assertNull($updatedElement->getIconImageUrl()); $this->assertSame($element->getTitle(), $updatedElement->getTitle()); $this->assertSame([], $this->fileUploader->deletedPaths); } public function testUpdateIconImageUrlDeletesManagedFileWhenCleared(): void { $element = $this->createElementWithMedia( 'element-icons/original-icon.png', '/assets/pdfs/original.pdf', ); $updateIconImageUrl = new UpdateIconImageUrl( $this->elementRepo, $this->fileUploader, ); $updatedElement = $updateIconImageUrl->execute( new UpdateIconImageUrlRequest( id: $element->getId(), iconImageUrl: '', ) ); $this->assertNull($updatedElement->getIconImageUrl()); $this->assertSame( ['element-icons/original-icon.png'], $this->fileUploader->deletedPaths, ); } public function testUpdateRichTextUpdatesOnlyRichText(): void { $element = $this->createFilledElement(); $updateRichText = new UpdateRichText($this->elementRepo); $updatedElement = $updateRichText->execute( new UpdateRichTextRequest( id: $element->getId(), richText: '
Updated rich text
', ) ); $this->assertSame( 'Updated rich text
', $updatedElement->getRichText(), ); $this->assertSame( $element->getDescription(), $updatedElement->getDescription(), ); } public function testUpdatePdfPathClearsEmptyString(): void { $element = $this->createFilledElement(); $updatePdfPath = new UpdatePdfPath( $this->elementRepo, $this->fileUploader, ); $updatedElement = $updatePdfPath->execute( new UpdatePdfPathRequest(id: $element->getId(), pdfPath: '') ); $this->assertNull($updatedElement->getPdfPath()); $this->assertSame($element->getTitle(), $updatedElement->getTitle()); $this->assertSame([], $this->fileUploader->deletedPaths); } public function testUpdatePdfPathDeletesManagedFileWhenCleared(): void { $element = $this->createElementWithMedia( '/assets/original-icon.png', 'element-pdfs/original.pdf', ); $updatePdfPath = new UpdatePdfPath( $this->elementRepo, $this->fileUploader, ); $updatedElement = $updatePdfPath->execute( new UpdatePdfPathRequest(id: $element->getId(), pdfPath: '') ); $this->assertNull($updatedElement->getPdfPath()); $this->assertSame( ['element-pdfs/original.pdf'], $this->fileUploader->deletedPaths, ); } public function testUpdateYoutubeUrlClearsEmptyString(): void { $element = $this->createFilledElement(); $updateYoutubeUrl = new UpdateYoutubeUrl($this->elementRepo); $updatedElement = $updateYoutubeUrl->execute( new UpdateYoutubeUrlRequest( id: $element->getId(), youtubeUrl: '', ) ); $this->assertNull($updatedElement->getYoutubeUrl()); $this->assertSame($element->getTitle(), $updatedElement->getTitle()); } private function createFilledElement(): Element { return $this->createElementWithMedia( '/assets/original-icon.png', '/assets/pdfs/original.pdf', ); } private function createElementWithMedia( ?string $iconImageUrl, ?string $pdfPath, ): Element { $set = new DomainSet( id: 1, name: 'Baderech', description: 'Baderech description', iconImageUrl: '/assets/baderech-icon.png', ); return $this->elementRepo->create(new CreateElementDto( set: $set, title: 'Original title', description: 'Original description', iconImageUrl: $iconImageUrl, richText: 'Original rich text
', pdfPath: $pdfPath, youtubeUrl: 'https://www.youtube.com/watch?v=yHx-r4p6hHU', parentElement: null, )); } }