From 0d5783ba9c772a1444bd16d1d31b0040d543c02b Mon Sep 17 00:00:00 2001 From: Yisroel Baum Date: Sun, 14 Jun 2026 23:05:45 +0300 Subject: [PATCH] test element file routing --- backend/tests/Feature/DemoSeedDataTest.php | 15 +- .../tests/Feature/ElementsEndpointTest.php | 457 ++++++++++++------ backend/tests/Feature/SetsEndpointTest.php | 3 +- .../Controllers/ElementControllerTest.php | 118 +++-- backend/tests/Unit/Element/ElementTest.php | 24 +- .../Element/UseCases/CreateElementTest.php | 68 ++- .../Unit/Element/UseCases/GetElementTest.php | 5 +- .../UseCases/UpdateElementFieldsTest.php | 57 ++- .../Element/UseCases/UpdateElementTest.php | 302 +++++++++--- .../Element/UseCases/UpdateIconImageTest.php | 43 +- .../Element/UseCases/UpdateLongPdfTest.php | 95 ++++ ...datePdfTest.php => UpdateShortPdfTest.php} | 78 +-- .../cypress/e2e/admin-element.cy.ts | 59 ++- frontend/rabbi_gerzi/cypress/e2e/media.cy.ts | 15 +- 14 files changed, 951 insertions(+), 388 deletions(-) create mode 100644 backend/tests/Unit/Element/UseCases/UpdateLongPdfTest.php rename backend/tests/Unit/Element/UseCases/{UpdatePdfTest.php => UpdateShortPdfTest.php} (65%) diff --git a/backend/tests/Feature/DemoSeedDataTest.php b/backend/tests/Feature/DemoSeedDataTest.php index b802b2b..4e96193 100644 --- a/backend/tests/Feature/DemoSeedDataTest.php +++ b/backend/tests/Feature/DemoSeedDataTest.php @@ -43,7 +43,8 @@ class DemoSeedDataTest extends TestCase Storage::disk('public')->assertExists( 'element-icons/baderech-haavodah-icon.png', ); - $this->assertNull($rootElement->getPdfPath()); + $this->assertNull($rootElement->getShortPdfPath()); + $this->assertNull($rootElement->getLongPdfPath()); $this->assertNull($rootElement->getYoutubeUrl()); $this->assertCount(6, $childElements); $this->assertSame( @@ -96,10 +97,13 @@ class DemoSeedDataTest extends TestCase $childElements[0]->getRichText(), ); $this->assertSame( - 'element-pdfs/baderech.pdf', - $childElements[0]->getPdfPath(), + 'element-pdfs/short/baderech.pdf', + $childElements[0]->getShortPdfPath(), + ); + $this->assertNull($childElements[0]->getLongPdfPath()); + Storage::disk('public')->assertExists( + 'element-pdfs/short/baderech.pdf', ); - Storage::disk('public')->assertExists('element-pdfs/baderech.pdf'); $introductionChildElements = $elementRepository->findByParentElement( $childElements[0], @@ -114,7 +118,8 @@ class DemoSeedDataTest extends TestCase $this->assertSame('', $introductionAudioElement->getDescription()); $this->assertNull($introductionAudioElement->getIconImageUrl()); $this->assertSame('', $introductionAudioElement->getRichText()); - $this->assertNull($introductionAudioElement->getPdfPath()); + $this->assertNull($introductionAudioElement->getShortPdfPath()); + $this->assertNull($introductionAudioElement->getLongPdfPath()); $this->assertSame( 'https://www.youtube.com/watch?v=yHx-r4p6hHU&t=1s', $introductionAudioElement->getYoutubeUrl(), diff --git a/backend/tests/Feature/ElementsEndpointTest.php b/backend/tests/Feature/ElementsEndpointTest.php index 48292ce..2c11199 100644 --- a/backend/tests/Feature/ElementsEndpointTest.php +++ b/backend/tests/Feature/ElementsEndpointTest.php @@ -5,8 +5,10 @@ namespace Tests\Feature; use App\Auth\CreateSessionDto; use App\Auth\SessionRepository; use App\Element\CreateElementDto; +use App\Element\Element; use App\Element\ElementRepository; use App\Set\CreateSetDto; +use App\Set\Set; use App\Set\SetRepository; use App\Shared\ValueObject\EmailAddress; use App\User\CreateUserDto; @@ -28,41 +30,43 @@ class ElementsEndpointTest extends TestCase . 'yHx-r4p6hHU&t=1s'; $setRepository = app(SetRepository::class); $elementRepository = app(ElementRepository::class); - $set = $setRepository->create(new CreateSetDto( - name: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: '/assets/baderech-haavodah-icon.png', - )); - $element = $elementRepository->create(new CreateElementDto( - set: $set, - title: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: '/assets/baderech-haavodah-icon.png', - richText: '

A structured path for growth

', - pdfPath: '/assets/pdfs/baderech.pdf', - youtubeUrl: $sampleYoutubeUrl, - parentElement: null, - )); - $firstChildElement = $elementRepository->create(new CreateElementDto( - set: $set, - title: 'Avodah Foundations', - description: 'Foundations for steady avodah', - iconImageUrl: null, - richText: '

Foundations rich text

', - pdfPath: '/assets/pdfs/foundations.pdf', - youtubeUrl: null, - parentElement: $element, - )); - $secondChildElement = $elementRepository->create(new CreateElementDto( - set: $set, - title: 'Daily Practice', - description: 'Daily practices for growth', - iconImageUrl: null, - richText: '

Daily practice rich text

', - pdfPath: null, - youtubeUrl: null, - parentElement: $element, - )); + $set = $this->createSet($setRepository); + $element = $this->createElement( + $elementRepository, + $set, + 'Baderech HaAvodah', + 'A structured path for growth', + '/assets/baderech-haavodah-icon.png', + '

A structured path for growth

', + '/assets/pdfs/baderech.pdf', + '/assets/pdfs/baderech-long.pdf', + $sampleYoutubeUrl, + null, + ); + $firstChildElement = $this->createElement( + $elementRepository, + $set, + 'Avodah Foundations', + 'Foundations for steady avodah', + null, + '

Foundations rich text

', + '/assets/pdfs/foundations.pdf', + null, + null, + $element, + ); + $secondChildElement = $this->createElement( + $elementRepository, + $set, + 'Daily Practice', + 'Daily practices for growth', + null, + '

Daily practice rich text

', + null, + null, + null, + $element, + ); $response = $this->getJson("/api/elements/{$element->getId()}"); @@ -86,6 +90,8 @@ class ElementsEndpointTest extends TestCase 'description' => 'A structured path for growth', 'iconImageUrl' => '/assets/baderech-haavodah-icon.png', 'richText' => '

A structured path for growth

', + 'shortPdfPath' => '/assets/pdfs/baderech.pdf', + 'longPdfPath' => '/assets/pdfs/baderech-long.pdf', 'pdfPath' => '/assets/pdfs/baderech.pdf', 'youtubeUrl' => $sampleYoutubeUrl, ], @@ -106,21 +112,19 @@ class ElementsEndpointTest extends TestCase { $setRepository = app(SetRepository::class); $elementRepository = app(ElementRepository::class); - $set = $setRepository->create(new CreateSetDto( - name: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: '/assets/baderech-haavodah-icon.png', - )); - $element = $elementRepository->create(new CreateElementDto( - set: $set, - title: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: '/assets/baderech-haavodah-icon.png', - richText: '

A structured path for growth

', - pdfPath: '/assets/pdfs/baderech.pdf', - youtubeUrl: null, - parentElement: null, - )); + $set = $this->createSet($setRepository); + $element = $this->createElement( + $elementRepository, + $set, + 'Baderech HaAvodah', + 'A structured path for growth', + '/assets/baderech-haavodah-icon.png', + '

A structured path for growth

', + '/assets/pdfs/baderech.pdf', + null, + null, + null, + ); $response = $this->postJson('/api/element/update', [ 'elementId' => $element->getId(), @@ -128,7 +132,8 @@ class ElementsEndpointTest extends TestCase 'description' => 'Updated description', 'iconImageUrl' => '/assets/updated-icon.png', 'richText' => '

Updated rich text

', - 'pdfPath' => '/assets/pdfs/updated.pdf', + 'shortPdfPath' => '/assets/pdfs/updated.pdf', + 'longPdfPath' => '/assets/pdfs/updated-long.pdf', 'youtubeUrl' => 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', ]); @@ -144,21 +149,19 @@ class ElementsEndpointTest extends TestCase . 'dQw4w9WgXcQ'; $setRepository = app(SetRepository::class); $elementRepository = app(ElementRepository::class); - $set = $setRepository->create(new CreateSetDto( - name: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: '/assets/baderech-haavodah-icon.png', - )); - $element = $elementRepository->create(new CreateElementDto( - set: $set, - title: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: '/assets/baderech-haavodah-icon.png', - richText: '

A structured path for growth

', - pdfPath: '/assets/pdfs/baderech.pdf', - youtubeUrl: null, - parentElement: null, - )); + $set = $this->createSet($setRepository); + $element = $this->createElement( + $elementRepository, + $set, + 'Baderech HaAvodah', + 'A structured path for growth', + '/assets/baderech-haavodah-icon.png', + '

A structured path for growth

', + '/assets/pdfs/baderech.pdf', + null, + null, + null, + ); $this->createSession('valid-token'); $response = $this->withCredentials() @@ -169,7 +172,8 @@ class ElementsEndpointTest extends TestCase 'description' => 'Updated description', 'iconImageUrl' => '/assets/updated-icon.png', 'richText' => '

Updated rich text

', - 'pdfPath' => '/assets/pdfs/updated.pdf', + 'shortPdfPath' => '/assets/pdfs/updated.pdf', + 'longPdfPath' => '/assets/pdfs/updated-long.pdf', 'youtubeUrl' => $sampleYoutubeUrl, ]); @@ -181,6 +185,8 @@ class ElementsEndpointTest extends TestCase 'description' => 'Updated description', 'iconImageUrl' => '/assets/updated-icon.png', 'richText' => '

Updated rich text

', + 'shortPdfPath' => '/assets/pdfs/updated.pdf', + 'longPdfPath' => '/assets/pdfs/updated-long.pdf', 'pdfPath' => '/assets/pdfs/updated.pdf', 'youtubeUrl' => $sampleYoutubeUrl, ], @@ -191,6 +197,52 @@ class ElementsEndpointTest extends TestCase '

Updated rich text

', $updatedElement->getRichText(), ); + $this->assertSame( + '/assets/pdfs/updated-long.pdf', + $updatedElement->getLongPdfPath(), + ); + } + + public function testAuthenticatedUpdateAcceptsLegacyPdfPath(): void + { + $setRepository = app(SetRepository::class); + $elementRepository = app(ElementRepository::class); + $set = $this->createSet($setRepository); + $element = $this->createElement( + $elementRepository, + $set, + 'Baderech HaAvodah', + 'A structured path for growth', + null, + '

A structured path for growth

', + '/assets/pdfs/baderech.pdf', + '/assets/pdfs/baderech-long.pdf', + null, + null, + ); + $this->createSession('valid-token'); + + $response = $this->withCredentials() + ->withUnencryptedCookie('auth_token', 'valid-token') + ->postJson('/api/element/update', [ + 'elementId' => $element->getId(), + 'pdfPath' => '/assets/pdfs/legacy-updated.pdf', + ]); + + $response->assertOk(); + $body = $response->json(); + $this->assertSame( + '/assets/pdfs/legacy-updated.pdf', + $body['element']['shortPdfPath'], + ); + $this->assertSame( + '/assets/pdfs/legacy-updated.pdf', + $body['element']['pdfPath'], + ); + $this->assertSame( + '/assets/pdfs/baderech-long.pdf', + $body['element']['longPdfPath'], + ); } public function testAuthenticatedUpdateClearsUploadedMedia(): void @@ -201,26 +253,28 @@ class ElementsEndpointTest extends TestCase 'icon bytes', ); Storage::disk('public')->put( - 'element-pdfs/original.pdf', - 'pdf bytes', + 'element-pdfs/short/original.pdf', + 'short pdf bytes', + ); + Storage::disk('public')->put( + 'element-pdfs/long/original-long.pdf', + 'long pdf bytes', ); $setRepository = app(SetRepository::class); $elementRepository = app(ElementRepository::class); - $set = $setRepository->create(new CreateSetDto( - name: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: '/assets/baderech-haavodah-icon.png', - )); - $element = $elementRepository->create(new CreateElementDto( - set: $set, - title: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: 'element-icons/original-icon.png', - richText: '

A structured path for growth

', - pdfPath: 'element-pdfs/original.pdf', - youtubeUrl: null, - parentElement: null, - )); + $set = $this->createSet($setRepository); + $element = $this->createElement( + $elementRepository, + $set, + 'Baderech HaAvodah', + 'A structured path for growth', + 'element-icons/original-icon.png', + '

A structured path for growth

', + 'element-pdfs/short/original.pdf', + 'element-pdfs/long/original-long.pdf', + null, + null, + ); $this->createSession('valid-token'); $response = $this->withCredentials() @@ -229,21 +283,28 @@ class ElementsEndpointTest extends TestCase 'elementId' => $element->getId(), 'iconImageUrl' => '', 'pdfPath' => '', + 'longPdfPath' => '', ]); $response->assertOk(); $body = $response->json(); $this->assertNull($body['element']['iconImageUrl']); + $this->assertNull($body['element']['shortPdfPath']); + $this->assertNull($body['element']['longPdfPath']); $this->assertNull($body['element']['pdfPath']); $updatedElement = $elementRepository->find($element->getId()); $this->assertNotNull($updatedElement); $this->assertNull($updatedElement->getIconImageUrl()); - $this->assertNull($updatedElement->getPdfPath()); + $this->assertNull($updatedElement->getShortPdfPath()); + $this->assertNull($updatedElement->getLongPdfPath()); Storage::disk('public')->assertMissing( 'element-icons/original-icon.png', ); Storage::disk('public')->assertMissing( - 'element-pdfs/original.pdf', + 'element-pdfs/short/original.pdf', + ); + Storage::disk('public')->assertMissing( + 'element-pdfs/long/original-long.pdf', ); } @@ -251,27 +312,26 @@ class ElementsEndpointTest extends TestCase { $setRepository = app(SetRepository::class); $elementRepository = app(ElementRepository::class); - $set = $setRepository->create(new CreateSetDto( - name: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: '/assets/baderech-haavodah-icon.png', - )); - $element = $elementRepository->create(new CreateElementDto( - set: $set, - title: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: null, - richText: '

A structured path for growth

', - pdfPath: null, - youtubeUrl: null, - parentElement: null, - )); + $set = $this->createSet($setRepository); + $element = $this->createElement( + $elementRepository, + $set, + 'Baderech HaAvodah', + 'A structured path for growth', + null, + '

A structured path for growth

', + null, + null, + null, + null, + ); $response = $this->post( '/api/element/update', [ 'elementId' => (string) $element->getId(), - 'iconImage' => $this->iconImageUpload(), + 'fileType' => 'iconImage', + 'file' => $this->iconImageUpload(), ], ); @@ -286,21 +346,19 @@ class ElementsEndpointTest extends TestCase Storage::fake('public'); $setRepository = app(SetRepository::class); $elementRepository = app(ElementRepository::class); - $set = $setRepository->create(new CreateSetDto( - name: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: '/assets/baderech-haavodah-icon.png', - )); - $element = $elementRepository->create(new CreateElementDto( - set: $set, - title: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: null, - richText: '

A structured path for growth

', - pdfPath: null, - youtubeUrl: null, - parentElement: null, - )); + $set = $this->createSet($setRepository); + $element = $this->createElement( + $elementRepository, + $set, + 'Baderech HaAvodah', + 'A structured path for growth', + null, + '

A structured path for growth

', + null, + null, + null, + null, + ); $this->createSession('valid-token'); $response = $this->withCredentials() @@ -309,7 +367,8 @@ class ElementsEndpointTest extends TestCase '/api/element/update', [ 'elementId' => (string) $element->getId(), - 'iconImage' => $this->iconImageUpload(), + 'fileType' => 'iconImage', + 'file' => $this->iconImageUpload(), ], ); @@ -331,31 +390,30 @@ class ElementsEndpointTest extends TestCase Storage::disk('public')->assertExists($updatedIconImageUrl); } - public function testPdfUploadRequiresAuthentication(): void + public function testShortPdfUploadRequiresAuthentication(): void { $setRepository = app(SetRepository::class); $elementRepository = app(ElementRepository::class); - $set = $setRepository->create(new CreateSetDto( - name: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: '/assets/baderech-haavodah-icon.png', - )); - $element = $elementRepository->create(new CreateElementDto( - set: $set, - title: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: null, - richText: '

A structured path for growth

', - pdfPath: null, - youtubeUrl: null, - parentElement: null, - )); + $set = $this->createSet($setRepository); + $element = $this->createElement( + $elementRepository, + $set, + 'Baderech HaAvodah', + 'A structured path for growth', + null, + '

A structured path for growth

', + null, + null, + null, + null, + ); $response = $this->post( '/api/element/update', [ 'elementId' => (string) $element->getId(), - 'pdf' => $this->pdfUpload(), + 'fileType' => 'shortPdf', + 'file' => $this->pdfUpload(), ], ); @@ -365,26 +423,24 @@ class ElementsEndpointTest extends TestCase ]); } - public function testAuthenticatedPdfUploadReturnsElementPayload(): void + public function testAuthenticatedShortPdfUploadReturnsElementPayload(): void { Storage::fake('public'); $setRepository = app(SetRepository::class); $elementRepository = app(ElementRepository::class); - $set = $setRepository->create(new CreateSetDto( - name: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: '/assets/baderech-haavodah-icon.png', - )); - $element = $elementRepository->create(new CreateElementDto( - set: $set, - title: 'Baderech HaAvodah', - description: 'A structured path for growth', - iconImageUrl: null, - richText: '

A structured path for growth

', - pdfPath: null, - youtubeUrl: null, - parentElement: null, - )); + $set = $this->createSet($setRepository); + $element = $this->createElement( + $elementRepository, + $set, + 'Baderech HaAvodah', + 'A structured path for growth', + null, + '

A structured path for growth

', + null, + null, + null, + null, + ); $this->createSession('valid-token'); $response = $this->withCredentials() @@ -393,7 +449,8 @@ class ElementsEndpointTest extends TestCase '/api/element/update', [ 'elementId' => (string) $element->getId(), - 'pdf' => $this->pdfUpload(), + 'fileType' => 'shortPdf', + 'file' => $this->pdfUpload(), ], ); @@ -401,17 +458,107 @@ class ElementsEndpointTest extends TestCase $body = $response->json(); $this->assertSame($element->getId(), $body['element']['id']); $this->assertStringContainsString( - '/storage/element-pdfs/', + '/storage/element-pdfs/short/', + $body['element']['shortPdfPath'], + ); + $this->assertSame( + $body['element']['shortPdfPath'], $body['element']['pdfPath'], ); $updatedElement = $elementRepository->find($element->getId()); $this->assertNotNull($updatedElement); - $updatedPdfPath = $updatedElement->getPdfPath(); + $updatedPdfPath = $updatedElement->getShortPdfPath(); $this->assertIsString($updatedPdfPath); - $this->assertStringStartsWith('element-pdfs/', $updatedPdfPath); + $this->assertStringStartsWith( + 'element-pdfs/short/', + $updatedPdfPath, + ); Storage::disk('public')->assertExists($updatedPdfPath); } + public function testAuthenticatedLongPdfUploadReturnsElementPayload(): void + { + Storage::fake('public'); + $setRepository = app(SetRepository::class); + $elementRepository = app(ElementRepository::class); + $set = $this->createSet($setRepository); + $element = $this->createElement( + $elementRepository, + $set, + 'Baderech HaAvodah', + 'A structured path for growth', + null, + '

A structured path for growth

', + null, + null, + null, + null, + ); + $this->createSession('valid-token'); + + $response = $this->withCredentials() + ->withUnencryptedCookie('auth_token', 'valid-token') + ->post( + '/api/element/update', + [ + 'elementId' => (string) $element->getId(), + 'fileType' => 'longPdf', + 'file' => $this->pdfUpload(), + ], + ); + + $response->assertOk(); + $body = $response->json(); + $this->assertSame($element->getId(), $body['element']['id']); + $this->assertStringContainsString( + '/storage/element-pdfs/long/', + $body['element']['longPdfPath'], + ); + $updatedElement = $elementRepository->find($element->getId()); + $this->assertNotNull($updatedElement); + $updatedPdfPath = $updatedElement->getLongPdfPath(); + $this->assertIsString($updatedPdfPath); + $this->assertStringStartsWith( + 'element-pdfs/long/', + $updatedPdfPath, + ); + Storage::disk('public')->assertExists($updatedPdfPath); + } + + private function createSet(SetRepository $setRepository): Set + { + return $setRepository->create(new CreateSetDto( + name: 'Baderech HaAvodah', + description: 'A structured path for growth', + iconImageUrl: '/assets/baderech-haavodah-icon.png', + )); + } + + private function createElement( + ElementRepository $elementRepository, + Set $set, + string $title, + string $description, + ?string $iconImageUrl, + string $richText, + ?string $shortPdfPath, + ?string $longPdfPath, + ?string $youtubeUrl, + ?Element $parentElement, + ): Element { + return $elementRepository->create(new CreateElementDto( + set: $set, + title: $title, + description: $description, + iconImageUrl: $iconImageUrl, + richText: $richText, + shortPdfPath: $shortPdfPath, + longPdfPath: $longPdfPath, + youtubeUrl: $youtubeUrl, + parentElement: $parentElement, + )); + } + private function createSession(string $token): void { $userRepository = app(UserRepository::class); diff --git a/backend/tests/Feature/SetsEndpointTest.php b/backend/tests/Feature/SetsEndpointTest.php index c7c67c4..2f8264b 100644 --- a/backend/tests/Feature/SetsEndpointTest.php +++ b/backend/tests/Feature/SetsEndpointTest.php @@ -34,7 +34,8 @@ class SetsEndpointTest extends TestCase description: $baderechSet->getDescription(), iconImageUrl: null, richText: '', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, parentElement: null, ) diff --git a/backend/tests/Unit/Controllers/ElementControllerTest.php b/backend/tests/Unit/Controllers/ElementControllerTest.php index 5416d92..69ec667 100644 --- a/backend/tests/Unit/Controllers/ElementControllerTest.php +++ b/backend/tests/Unit/Controllers/ElementControllerTest.php @@ -10,9 +10,11 @@ use App\Element\UseCases\UpdateElement\UpdateDescription; use App\Element\UseCases\UpdateElement\UpdateElement; use App\Element\UseCases\UpdateElement\UpdateIconImage; use App\Element\UseCases\UpdateElement\UpdateIconImageUrl; -use App\Element\UseCases\UpdateElement\UpdatePdf; -use App\Element\UseCases\UpdateElement\UpdatePdfPath; +use App\Element\UseCases\UpdateElement\UpdateLongPdf; +use App\Element\UseCases\UpdateElement\UpdateLongPdfPath; use App\Element\UseCases\UpdateElement\UpdateRichText; +use App\Element\UseCases\UpdateElement\UpdateShortPdf; +use App\Element\UseCases\UpdateElement\UpdateShortPdfPath; use App\Element\UseCases\UpdateElement\UpdateTitle; use App\Element\UseCases\UpdateElement\UpdateYoutubeUrl; use App\Set\Set as DomainSet; @@ -40,13 +42,18 @@ class ElementControllerTest extends TestCase new UpdateDescription($this->elementRepo), new UpdateIconImageUrl($this->elementRepo, $this->fileUploader), new UpdateRichText($this->elementRepo), - new UpdatePdfPath($this->elementRepo, $this->fileUploader), + new UpdateShortPdfPath($this->elementRepo, $this->fileUploader), + new UpdateLongPdfPath($this->elementRepo, $this->fileUploader), new UpdateYoutubeUrl($this->elementRepo), new UpdateIconImage( $this->elementRepo, $this->fileUploader, ), - new UpdatePdf( + new UpdateShortPdf( + $this->elementRepo, + $this->fileUploader, + ), + new UpdateLongPdf( $this->elementRepo, $this->fileUploader, ), @@ -69,6 +76,7 @@ class ElementControllerTest extends TestCase '/assets/baderech-icon.png', '

A structured path for growth

', '/assets/pdfs/baderech.pdf', + '/assets/pdfs/baderech-long.pdf', 'https://www.youtube.com/watch?v=yHx-r4p6hHU&t=1s', null, ); @@ -80,6 +88,7 @@ class ElementControllerTest extends TestCase '

Foundations rich text

', '/assets/pdfs/foundations.pdf', null, + null, $element, ); $secondChildElement = $this->createElement( @@ -90,6 +99,7 @@ class ElementControllerTest extends TestCase '

Daily practice rich text

', null, null, + null, $element, ); @@ -111,6 +121,14 @@ class ElementControllerTest extends TestCase '/assets/baderech-icon.png', $body['element']['iconImageUrl'], ); + $this->assertSame( + '/assets/pdfs/baderech.pdf', + $body['element']['shortPdfPath'], + ); + $this->assertSame( + '/assets/pdfs/baderech-long.pdf', + $body['element']['longPdfPath'], + ); $this->assertSame( '/assets/pdfs/baderech.pdf', $body['element']['pdfPath'], @@ -158,21 +176,13 @@ class ElementControllerTest extends TestCase public function testUpdateWithIconImageReturnsElementPayload(): void { $set = $this->createSet(1, 'Baderech'); - $element = $this->createElement( - $set, - 'Baderech HaAvodah', - 'A structured path for growth', - null, - '

A structured path for growth

', - null, - null, - null, - ); + $element = $this->createEmptyElement($set); $fixturePath = __DIR__ . '/../../fixtures/icon.png'; $request = new Request([], [ 'elementId' => (string) $element->getId(), + 'fileType' => 'iconImage', ], [], [], [ - 'iconImage' => new UploadedFile( + 'file' => new UploadedFile( $fixturePath, 'icon.png', 'image/png', @@ -196,24 +206,16 @@ class ElementControllerTest extends TestCase ); } - public function testUpdateWithPdfReturnsElementPayload(): void + public function testUpdateWithShortPdfReturnsElementPayload(): void { $set = $this->createSet(1, 'Baderech'); - $element = $this->createElement( - $set, - 'Baderech HaAvodah', - 'A structured path for growth', - null, - '

A structured path for growth

', - null, - null, - null, - ); + $element = $this->createEmptyElement($set); $fixturePath = __DIR__ . '/../../fixtures/baderech.pdf'; $request = new Request([], [ 'elementId' => (string) $element->getId(), + 'fileType' => 'shortPdf', ], [], [], [ - 'pdf' => new UploadedFile( + 'file' => new UploadedFile( $fixturePath, 'baderech.pdf', 'application/pdf', @@ -228,11 +230,48 @@ class ElementControllerTest extends TestCase $body = json_decode($response->getContent(), true); $this->assertSame($element->getId(), $body['element']['id']); $this->assertSame( - 'https://test.local/storage/element-pdfs/fake-baderech.pdf', + 'https://test.local/storage/element-pdfs/short/fake-baderech.pdf', + $body['element']['shortPdfPath'], + ); + $this->assertSame( + $body['element']['shortPdfPath'], $body['element']['pdfPath'], ); $this->assertSame( - 'element-pdfs', + 'element-pdfs/short', + $this->fileUploader->uploads[0]['folder'], + ); + } + + public function testUpdateWithLongPdfReturnsElementPayload(): void + { + $set = $this->createSet(1, 'Baderech'); + $element = $this->createEmptyElement($set); + $fixturePath = __DIR__ . '/../../fixtures/baderech.pdf'; + $request = new Request([], [ + 'elementId' => (string) $element->getId(), + 'fileType' => 'longPdf', + ], [], [], [ + 'file' => new UploadedFile( + $fixturePath, + 'baderech.pdf', + 'application/pdf', + null, + true, + ), + ], ['REQUEST_METHOD' => 'POST']); + + $response = $this->controller->update($request); + + $this->assertEquals(200, $response->getStatusCode()); + $body = json_decode($response->getContent(), true); + $this->assertSame($element->getId(), $body['element']['id']); + $this->assertSame( + 'https://test.local/storage/element-pdfs/long/fake-baderech.pdf', + $body['element']['longPdfPath'], + ); + $this->assertSame( + 'element-pdfs/long', $this->fileUploader->uploads[0]['folder'], ); } @@ -247,13 +286,29 @@ class ElementControllerTest extends TestCase ); } + private function createEmptyElement(DomainSet $set): Element + { + return $this->createElement( + $set, + 'Baderech HaAvodah', + 'A structured path for growth', + null, + '

A structured path for growth

', + null, + null, + null, + null, + ); + } + private function createElement( DomainSet $set, string $title, string $description, ?string $iconImageUrl, string $richText, - ?string $pdfPath, + ?string $shortPdfPath, + ?string $longPdfPath, ?string $youtubeUrl, ?Element $parentElement, ): Element { @@ -263,7 +318,8 @@ class ElementControllerTest extends TestCase description: $description, iconImageUrl: $iconImageUrl, richText: $richText, - pdfPath: $pdfPath, + shortPdfPath: $shortPdfPath, + longPdfPath: $longPdfPath, youtubeUrl: $youtubeUrl, parentElement: $parentElement, )); diff --git a/backend/tests/Unit/Element/ElementTest.php b/backend/tests/Unit/Element/ElementTest.php index 89e9c84..b57eaa5 100644 --- a/backend/tests/Unit/Element/ElementTest.php +++ b/backend/tests/Unit/Element/ElementTest.php @@ -22,7 +22,8 @@ class ElementTest extends TestCase description: 'Root description', iconImageUrl: null, richText: '

Root rich text

', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, set: $set, parentElement: null, @@ -33,7 +34,8 @@ class ElementTest extends TestCase description: 'Child description', iconImageUrl: '/assets/child-icon.svg', richText: '

Child rich text

', - pdfPath: '/assets/pdfs/child.pdf', + shortPdfPath: '/assets/pdfs/child.pdf', + longPdfPath: '/assets/pdfs/child-long.pdf', youtubeUrl: 'https://www.youtube.com/watch?v=yHx-r4p6hHU&t=1s', set: $set, parentElement: $rootElement, @@ -55,7 +57,11 @@ class ElementTest extends TestCase ); $this->assertSame( '/assets/pdfs/child.pdf', - $childElement->getPdfPath(), + $childElement->getShortPdfPath(), + ); + $this->assertSame( + '/assets/pdfs/child-long.pdf', + $childElement->getLongPdfPath(), ); $this->assertSame( 'https://www.youtube.com/watch?v=yHx-r4p6hHU&t=1s', @@ -64,7 +70,8 @@ class ElementTest extends TestCase $this->assertSame($set, $childElement->getSet()); $this->assertSame($rootElement, $childElement->getParentElement()); $this->assertNull($rootElement->getIconImageUrl()); - $this->assertNull($rootElement->getPdfPath()); + $this->assertNull($rootElement->getShortPdfPath()); + $this->assertNull($rootElement->getLongPdfPath()); $this->assertNull($rootElement->getYoutubeUrl()); $this->assertNull($rootElement->getParentElement()); } @@ -83,7 +90,8 @@ class ElementTest extends TestCase description: 'Original description', iconImageUrl: '/assets/original.svg', richText: '

Original

', - pdfPath: '/assets/pdfs/original.pdf', + shortPdfPath: '/assets/pdfs/original.pdf', + longPdfPath: '/assets/pdfs/original-long.pdf', youtubeUrl: 'https://www.youtube.com/watch?v=yHx-r4p6hHU', set: $set, parentElement: null, @@ -93,14 +101,16 @@ class ElementTest extends TestCase $element->setDescription('Updated description'); $element->setIconImageUrl(null); $element->setRichText('

Updated

'); - $element->setPdfPath(null); + $element->setShortPdfPath(null); + $element->setLongPdfPath(null); $element->setYoutubeUrl(null); $this->assertSame('Updated', $element->getTitle()); $this->assertSame('Updated description', $element->getDescription()); $this->assertNull($element->getIconImageUrl()); $this->assertSame('

Updated

', $element->getRichText()); - $this->assertNull($element->getPdfPath()); + $this->assertNull($element->getShortPdfPath()); + $this->assertNull($element->getLongPdfPath()); $this->assertNull($element->getYoutubeUrl()); } } diff --git a/backend/tests/Unit/Element/UseCases/CreateElementTest.php b/backend/tests/Unit/Element/UseCases/CreateElementTest.php index 09ad0d8..d13234b 100644 --- a/backend/tests/Unit/Element/UseCases/CreateElementTest.php +++ b/backend/tests/Unit/Element/UseCases/CreateElementTest.php @@ -50,7 +50,8 @@ class CreateElementTest extends TestCase description: 'Root description', iconImageUrl: '/assets/root-icon.svg', richText: '

Root rich text

', - pdfPath: '/assets/pdfs/root.pdf', + shortPdfPath: '/assets/pdfs/root.pdf', + longPdfPath: '/assets/pdfs/root-long.pdf', youtubeUrl: 'https://www.youtube.com/watch?v=yHx-r4p6hHU&t=1s', parentElementId: null, )); @@ -63,7 +64,14 @@ class CreateElementTest extends TestCase $element->getIconImageUrl(), ); $this->assertSame('

Root rich text

', $element->getRichText()); - $this->assertSame('/assets/pdfs/root.pdf', $element->getPdfPath()); + $this->assertSame( + '/assets/pdfs/root.pdf', + $element->getShortPdfPath(), + ); + $this->assertSame( + '/assets/pdfs/root-long.pdf', + $element->getLongPdfPath(), + ); $this->assertSame( 'https://www.youtube.com/watch?v=yHx-r4p6hHU&t=1s', $element->getYoutubeUrl(), @@ -82,7 +90,8 @@ class CreateElementTest extends TestCase description: 'Root description', iconImageUrl: null, richText: '

Root rich text

', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, parentElementId: null, ) @@ -95,7 +104,8 @@ class CreateElementTest extends TestCase description: 'Child description', iconImageUrl: '/assets/child-icon.svg', richText: '

Child rich text

', - pdfPath: '/assets/pdfs/child.pdf', + shortPdfPath: '/assets/pdfs/child.pdf', + longPdfPath: '/assets/pdfs/child-long.pdf', youtubeUrl: 'https://youtu.be/yHx-r4p6hHU', parentElementId: $rootElement->getId(), ) @@ -116,7 +126,11 @@ class CreateElementTest extends TestCase ); $this->assertSame( '/assets/pdfs/child.pdf', - $childElement->getPdfPath(), + $childElement->getShortPdfPath(), + ); + $this->assertSame( + '/assets/pdfs/child-long.pdf', + $childElement->getLongPdfPath(), ); $this->assertSame( 'https://youtu.be/yHx-r4p6hHU', @@ -138,7 +152,8 @@ class CreateElementTest extends TestCase description: null, iconImageUrl: null, richText: null, - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, parentElementId: null, )); @@ -146,7 +161,8 @@ class CreateElementTest extends TestCase $this->assertSame('', $element->getDescription()); $this->assertNull($element->getIconImageUrl()); $this->assertSame('', $element->getRichText()); - $this->assertNull($element->getPdfPath()); + $this->assertNull($element->getShortPdfPath()); + $this->assertNull($element->getLongPdfPath()); $this->assertNull($element->getYoutubeUrl()); } @@ -160,7 +176,8 @@ class CreateElementTest extends TestCase description: 'Root description', iconImageUrl: '', richText: '

Root rich text

', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, parentElementId: null, )); @@ -168,7 +185,7 @@ class CreateElementTest extends TestCase $this->assertNull($element->getIconImageUrl()); } - public function testCreatesElementWithNullPdfPathWhenBlank(): void + public function testCreatesElementWithNullPdfPathsWhenBlank(): void { $set = $this->createSet('Daily learning'); @@ -178,12 +195,14 @@ class CreateElementTest extends TestCase description: 'Root description', iconImageUrl: null, richText: '

Root rich text

', - pdfPath: '', + shortPdfPath: '', + longPdfPath: '', youtubeUrl: null, parentElementId: null, )); - $this->assertNull($element->getPdfPath()); + $this->assertNull($element->getShortPdfPath()); + $this->assertNull($element->getLongPdfPath()); } public function testCreatesElementWithNullYoutubeUrlWhenBlank(): void @@ -196,7 +215,8 @@ class CreateElementTest extends TestCase description: 'Root description', iconImageUrl: null, richText: '

Root rich text

', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: '', parentElementId: null, )); @@ -215,7 +235,8 @@ class CreateElementTest extends TestCase description: 'Root description', iconImageUrl: null, richText: '

Root rich text

', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, parentElementId: null, )); @@ -232,7 +253,8 @@ class CreateElementTest extends TestCase description: 'Root description', iconImageUrl: null, richText: '

Root rich text

', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, parentElementId: null, )); @@ -249,7 +271,8 @@ class CreateElementTest extends TestCase description: 'Root description', iconImageUrl: null, richText: '

Root rich text

', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, parentElementId: null, )); @@ -270,7 +293,8 @@ class CreateElementTest extends TestCase description: 'Child description', iconImageUrl: null, richText: '

Child rich text

', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, parentElementId: 99, )); @@ -285,7 +309,8 @@ class CreateElementTest extends TestCase description: 'Root description', iconImageUrl: null, richText: '

Root rich text

', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, parentElementId: null, )); @@ -301,7 +326,8 @@ class CreateElementTest extends TestCase description: 'Another root description', iconImageUrl: null, richText: '

Another root rich text

', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, parentElementId: null, )); @@ -318,7 +344,8 @@ class CreateElementTest extends TestCase description: 'Parent root description', iconImageUrl: null, richText: '

Parent root rich text

', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, parentElementId: null, ) @@ -335,7 +362,8 @@ class CreateElementTest extends TestCase description: 'Invalid child description', iconImageUrl: null, richText: '

Invalid child rich text

', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, parentElementId: $parentElement->getId(), )); diff --git a/backend/tests/Unit/Element/UseCases/GetElementTest.php b/backend/tests/Unit/Element/UseCases/GetElementTest.php index ff066de..ad2e0d9 100644 --- a/backend/tests/Unit/Element/UseCases/GetElementTest.php +++ b/backend/tests/Unit/Element/UseCases/GetElementTest.php @@ -60,7 +60,7 @@ class GetElementTest extends TestCase ); $this->assertSame( '/assets/pdfs/baderech.pdf', - $foundElement->getPdfPath(), + $foundElement->getShortPdfPath(), ); $this->assertSame( 'https://www.youtube.com/watch?v=yHx-r4p6hHU&t=1s', @@ -201,7 +201,8 @@ class GetElementTest extends TestCase description: $description, iconImageUrl: $iconImageUrl, richText: $richText, - pdfPath: $pdfPath, + shortPdfPath: $pdfPath, + longPdfPath: null, youtubeUrl: $youtubeUrl, parentElement: $parentElement, )); diff --git a/backend/tests/Unit/Element/UseCases/UpdateElementFieldsTest.php b/backend/tests/Unit/Element/UseCases/UpdateElementFieldsTest.php index ca39700..1d83906 100644 --- a/backend/tests/Unit/Element/UseCases/UpdateElementFieldsTest.php +++ b/backend/tests/Unit/Element/UseCases/UpdateElementFieldsTest.php @@ -8,8 +8,10 @@ use App\Element\UseCases\UpdateElement\UpdateDescription; use App\Element\UseCases\UpdateElement\UpdateDescriptionRequest; use App\Element\UseCases\UpdateElement\UpdateIconImageUrl; use App\Element\UseCases\UpdateElement\UpdateIconImageUrlRequest; -use App\Element\UseCases\UpdateElement\UpdatePdfPath; -use App\Element\UseCases\UpdateElement\UpdatePdfPathRequest; +use App\Element\UseCases\UpdateElement\UpdateLongPdfPath; +use App\Element\UseCases\UpdateElement\UpdateLongPdfPathRequest; +use App\Element\UseCases\UpdateElement\UpdateShortPdfPath; +use App\Element\UseCases\UpdateElement\UpdateShortPdfPathRequest; use App\Element\UseCases\UpdateElement\UpdateRichText; use App\Element\UseCases\UpdateElement\UpdateRichTextRequest; use App\Element\UseCases\UpdateElement\UpdateTitle; @@ -134,19 +136,26 @@ class UpdateElementFieldsTest extends TestCase ); } - public function testUpdatePdfPathClearsEmptyString(): void + public function testUpdateShortPdfPathClearsEmptyString(): void { $element = $this->createFilledElement(); - $updatePdfPath = new UpdatePdfPath( + $updateShortPdfPath = new UpdateShortPdfPath( $this->elementRepo, $this->fileUploader, ); - $updatedElement = $updatePdfPath->execute( - new UpdatePdfPathRequest(id: $element->getId(), pdfPath: '') + $updatedElement = $updateShortPdfPath->execute( + new UpdateShortPdfPathRequest( + id: $element->getId(), + shortPdfPath: '', + ) ); - $this->assertNull($updatedElement->getPdfPath()); + $this->assertNull($updatedElement->getShortPdfPath()); + $this->assertSame( + '/assets/pdfs/original-long.pdf', + $updatedElement->getLongPdfPath(), + ); $this->assertSame($element->getTitle(), $updatedElement->getTitle()); $this->assertSame( ['/assets/pdfs/original.pdf'], @@ -154,6 +163,33 @@ class UpdateElementFieldsTest extends TestCase ); } + public function testUpdateLongPdfPathClearsEmptyString(): void + { + $element = $this->createFilledElement(); + $updateLongPdfPath = new UpdateLongPdfPath( + $this->elementRepo, + $this->fileUploader, + ); + + $updatedElement = $updateLongPdfPath->execute( + new UpdateLongPdfPathRequest( + id: $element->getId(), + longPdfPath: '', + ) + ); + + $this->assertSame( + '/assets/pdfs/original.pdf', + $updatedElement->getShortPdfPath(), + ); + $this->assertNull($updatedElement->getLongPdfPath()); + $this->assertSame($element->getTitle(), $updatedElement->getTitle()); + $this->assertSame( + ['/assets/pdfs/original-long.pdf'], + $this->fileUploader->deletedPaths, + ); + } + public function testUpdateYoutubeUrlClearsEmptyString(): void { $element = $this->createFilledElement(); @@ -175,12 +211,14 @@ class UpdateElementFieldsTest extends TestCase return $this->createElementWithMedia( '/assets/original-icon.png', '/assets/pdfs/original.pdf', + '/assets/pdfs/original-long.pdf', ); } private function createElementWithMedia( ?string $iconImageUrl, - ?string $pdfPath, + ?string $shortPdfPath, + ?string $longPdfPath, ): Element { $set = new DomainSet( id: 1, @@ -195,7 +233,8 @@ class UpdateElementFieldsTest extends TestCase description: 'Original description', iconImageUrl: $iconImageUrl, richText: '

Original rich text

', - pdfPath: $pdfPath, + shortPdfPath: $shortPdfPath, + longPdfPath: $longPdfPath, youtubeUrl: 'https://www.youtube.com/watch?v=yHx-r4p6hHU', parentElement: null, )); diff --git a/backend/tests/Unit/Element/UseCases/UpdateElementTest.php b/backend/tests/Unit/Element/UseCases/UpdateElementTest.php index 8d823e3..cea63d1 100644 --- a/backend/tests/Unit/Element/UseCases/UpdateElementTest.php +++ b/backend/tests/Unit/Element/UseCases/UpdateElementTest.php @@ -9,9 +9,11 @@ use App\Element\UseCases\UpdateElement\UpdateElement; use App\Element\UseCases\UpdateElement\UpdateElementRequest; use App\Element\UseCases\UpdateElement\UpdateIconImage; use App\Element\UseCases\UpdateElement\UpdateIconImageUrl; -use App\Element\UseCases\UpdateElement\UpdatePdfPath; -use App\Element\UseCases\UpdateElement\UpdatePdf; +use App\Element\UseCases\UpdateElement\UpdateLongPdf; +use App\Element\UseCases\UpdateElement\UpdateLongPdfPath; use App\Element\UseCases\UpdateElement\UpdateRichText; +use App\Element\UseCases\UpdateElement\UpdateShortPdf; +use App\Element\UseCases\UpdateElement\UpdateShortPdfPath; use App\Element\UseCases\UpdateElement\UpdateTitle; use App\Element\UseCases\UpdateElement\UpdateYoutubeUrl; use App\Exceptions\BadRequestException; @@ -38,13 +40,18 @@ class UpdateElementTest extends TestCase new UpdateDescription($this->elementRepo), new UpdateIconImageUrl($this->elementRepo, $this->fileUploader), new UpdateRichText($this->elementRepo), - new UpdatePdfPath($this->elementRepo, $this->fileUploader), + new UpdateShortPdfPath($this->elementRepo, $this->fileUploader), + new UpdateLongPdfPath($this->elementRepo, $this->fileUploader), new UpdateYoutubeUrl($this->elementRepo), new UpdateIconImage( $this->elementRepo, $this->fileUploader, ), - new UpdatePdf( + new UpdateShortPdf( + $this->elementRepo, + $this->fileUploader, + ), + new UpdateLongPdf( $this->elementRepo, $this->fileUploader, ), @@ -62,6 +69,7 @@ class UpdateElementTest extends TestCase '/assets/original-icon.png', '

Original rich text

', '/assets/pdfs/original.pdf', + '/assets/pdfs/original-long.pdf', 'https://www.youtube.com/watch?v=yHx-r4p6hHU&t=1s', null, ); @@ -73,16 +81,15 @@ class UpdateElementTest extends TestCase description: 'Updated description', iconImageUrl: '/assets/updated-icon.png', richText: '

Updated rich text

', - pdfPath: '/assets/pdfs/updated.pdf', + shortPdfPath: '/assets/pdfs/updated.pdf', + longPdfPath: '/assets/pdfs/updated-long.pdf', + pdfPath: null, youtubeUrl: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', - iconImageContents: null, - iconImageOriginalName: null, - iconImageMimeType: null, - iconImageSizeBytes: null, - pdfContents: null, - pdfOriginalName: null, - pdfMimeType: null, - pdfSizeBytes: null, + fileType: null, + fileContents: null, + fileOriginalName: null, + fileMimeType: null, + fileSizeBytes: null, ) ); @@ -102,7 +109,11 @@ class UpdateElementTest extends TestCase ); $this->assertSame( '/assets/pdfs/updated.pdf', - $updatedElement->getPdfPath(), + $updatedElement->getShortPdfPath(), + ); + $this->assertSame( + '/assets/pdfs/updated-long.pdf', + $updatedElement->getLongPdfPath(), ); $this->assertSame( 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', @@ -114,6 +125,50 @@ class UpdateElementTest extends TestCase $this->assertSame('Updated title', $persistedElement->getTitle()); } + public function testLegacyPdfPathUpdatesShortPdfPath(): void + { + $set = $this->createSet(1, 'Baderech'); + $element = $this->createElement( + $set, + 'Original title', + 'Original description', + null, + '

Original rich text

', + '/assets/pdfs/original.pdf', + '/assets/pdfs/original-long.pdf', + null, + null, + ); + + $updatedElement = $this->updateElement->execute( + new UpdateElementRequest( + id: $element->getId(), + title: null, + description: null, + iconImageUrl: null, + richText: null, + shortPdfPath: null, + longPdfPath: null, + pdfPath: '/assets/pdfs/legacy-updated.pdf', + youtubeUrl: null, + fileType: null, + fileContents: null, + fileOriginalName: null, + fileMimeType: null, + fileSizeBytes: null, + ) + ); + + $this->assertSame( + '/assets/pdfs/legacy-updated.pdf', + $updatedElement->getShortPdfPath(), + ); + $this->assertSame( + '/assets/pdfs/original-long.pdf', + $updatedElement->getLongPdfPath(), + ); + } + public function testConvertsEmptyNullableFieldsToNull(): void { $set = $this->createSet(1, 'Baderech'); @@ -124,6 +179,7 @@ class UpdateElementTest extends TestCase '/assets/original-icon.png', '

Original rich text

', '/assets/pdfs/original.pdf', + '/assets/pdfs/original-long.pdf', 'https://www.youtube.com/watch?v=yHx-r4p6hHU&t=1s', null, ); @@ -135,21 +191,21 @@ class UpdateElementTest extends TestCase description: 'Updated description', iconImageUrl: '', richText: '

Updated rich text

', - pdfPath: '', + shortPdfPath: '', + longPdfPath: '', + pdfPath: null, youtubeUrl: '', - iconImageContents: null, - iconImageOriginalName: null, - iconImageMimeType: null, - iconImageSizeBytes: null, - pdfContents: null, - pdfOriginalName: null, - pdfMimeType: null, - pdfSizeBytes: null, + fileType: null, + fileContents: null, + fileOriginalName: null, + fileMimeType: null, + fileSizeBytes: null, ) ); $this->assertNull($updatedElement->getIconImageUrl()); - $this->assertNull($updatedElement->getPdfPath()); + $this->assertNull($updatedElement->getShortPdfPath()); + $this->assertNull($updatedElement->getLongPdfPath()); $this->assertNull($updatedElement->getYoutubeUrl()); } @@ -163,6 +219,7 @@ class UpdateElementTest extends TestCase '/assets/original-icon.png', '

Original rich text

', '/assets/pdfs/original.pdf', + '/assets/pdfs/original-long.pdf', 'https://www.youtube.com/watch?v=yHx-r4p6hHU&t=1s', null, ); @@ -174,16 +231,15 @@ class UpdateElementTest extends TestCase description: null, iconImageUrl: null, richText: null, + shortPdfPath: null, + longPdfPath: null, pdfPath: null, youtubeUrl: null, - iconImageContents: null, - iconImageOriginalName: null, - iconImageMimeType: null, - iconImageSizeBytes: null, - pdfContents: null, - pdfOriginalName: null, - pdfMimeType: null, - pdfSizeBytes: null, + fileType: null, + fileContents: null, + fileOriginalName: null, + fileMimeType: null, + fileSizeBytes: null, ) ); @@ -202,7 +258,11 @@ class UpdateElementTest extends TestCase ); $this->assertSame( '/assets/pdfs/original.pdf', - $updatedElement->getPdfPath(), + $updatedElement->getShortPdfPath(), + ); + $this->assertSame( + '/assets/pdfs/original-long.pdf', + $updatedElement->getLongPdfPath(), ); $this->assertSame( 'https://www.youtube.com/watch?v=yHx-r4p6hHU&t=1s', @@ -210,7 +270,7 @@ class UpdateElementTest extends TestCase ); } - public function testUpdatesUploadedFiles(): void + public function testRoutesUploadedFilesByFileType(): void { $set = $this->createSet(1, 'Baderech'); $element = $this->createElement( @@ -222,8 +282,41 @@ class UpdateElementTest extends TestCase null, null, null, + null, ); + $this->updateElement->execute(new UpdateElementRequest( + id: $element->getId(), + title: null, + description: null, + iconImageUrl: null, + richText: null, + shortPdfPath: null, + longPdfPath: null, + pdfPath: null, + youtubeUrl: null, + fileType: 'iconImage', + fileContents: 'binary-image-bytes', + fileOriginalName: 'icon.png', + fileMimeType: 'image/png', + fileSizeBytes: 1024, + )); + $this->updateElement->execute(new UpdateElementRequest( + id: $element->getId(), + title: null, + description: null, + iconImageUrl: null, + richText: null, + shortPdfPath: null, + longPdfPath: null, + pdfPath: null, + youtubeUrl: null, + fileType: 'shortPdf', + fileContents: 'binary-short-pdf-bytes', + fileOriginalName: 'baderech.pdf', + fileMimeType: 'application/pdf', + fileSizeBytes: 1024, + )); $updatedElement = $this->updateElement->execute( new UpdateElementRequest( id: $element->getId(), @@ -231,16 +324,15 @@ class UpdateElementTest extends TestCase description: null, iconImageUrl: null, richText: null, + shortPdfPath: null, + longPdfPath: null, pdfPath: null, youtubeUrl: null, - iconImageContents: 'binary-image-bytes', - iconImageOriginalName: 'icon.png', - iconImageMimeType: 'image/png', - iconImageSizeBytes: 1024, - pdfContents: 'binary-pdf-bytes', - pdfOriginalName: 'baderech.pdf', - pdfMimeType: 'application/pdf', - pdfSizeBytes: 1024, + fileType: 'longPdf', + fileContents: 'binary-long-pdf-bytes', + fileOriginalName: 'baderech-long.pdf', + fileMimeType: 'application/pdf', + fileSizeBytes: 1024, ) ); @@ -249,17 +341,71 @@ class UpdateElementTest extends TestCase $updatedElement->getIconImageUrl(), ); $this->assertSame( - 'element-pdfs/fake-baderech.pdf', - $updatedElement->getPdfPath(), + 'element-pdfs/short/fake-baderech.pdf', + $updatedElement->getShortPdfPath(), + ); + $this->assertSame( + 'element-pdfs/long/fake-baderech-long.pdf', + $updatedElement->getLongPdfPath(), ); $this->assertSame( 'element-icons', $this->fileUploader->uploads[0]['folder'], ); $this->assertSame( - 'element-pdfs', + 'element-pdfs/short', $this->fileUploader->uploads[1]['folder'], ); + $this->assertSame( + 'element-pdfs/long', + $this->fileUploader->uploads[2]['folder'], + ); + } + + public function testThrowsWhenFileTypeMissingForUpload(): void + { + $this->expectException(BadRequestException::class); + $this->expectExceptionMessage('fileType is required'); + + $this->updateElement->execute(new UpdateElementRequest( + id: 1, + title: null, + description: null, + iconImageUrl: null, + richText: null, + shortPdfPath: null, + longPdfPath: null, + pdfPath: null, + youtubeUrl: null, + fileType: null, + fileContents: 'binary-image-bytes', + fileOriginalName: 'icon.png', + fileMimeType: 'image/png', + fileSizeBytes: 1024, + )); + } + + public function testThrowsWhenFileTypeInvalid(): void + { + $this->expectException(BadRequestException::class); + $this->expectExceptionMessage('fileType is invalid'); + + $this->updateElement->execute(new UpdateElementRequest( + id: 1, + title: null, + description: null, + iconImageUrl: null, + richText: null, + shortPdfPath: null, + longPdfPath: null, + pdfPath: null, + youtubeUrl: null, + fileType: 'audio', + fileContents: 'binary-audio-bytes', + fileOriginalName: 'shiur.mp3', + fileMimeType: 'audio/mpeg', + fileSizeBytes: 1024, + )); } public function testThrowsWhenIdMissing(): void @@ -273,16 +419,15 @@ class UpdateElementTest extends TestCase description: 'Updated description', iconImageUrl: null, richText: '

Updated rich text

', + shortPdfPath: null, + longPdfPath: null, pdfPath: null, youtubeUrl: null, - iconImageContents: null, - iconImageOriginalName: null, - iconImageMimeType: null, - iconImageSizeBytes: null, - pdfContents: null, - pdfOriginalName: null, - pdfMimeType: null, - pdfSizeBytes: null, + fileType: null, + fileContents: null, + fileOriginalName: null, + fileMimeType: null, + fileSizeBytes: null, )); } @@ -297,16 +442,15 @@ class UpdateElementTest extends TestCase description: null, iconImageUrl: null, richText: null, + shortPdfPath: null, + longPdfPath: null, pdfPath: null, youtubeUrl: null, - iconImageContents: null, - iconImageOriginalName: null, - iconImageMimeType: null, - iconImageSizeBytes: null, - pdfContents: null, - pdfOriginalName: null, - pdfMimeType: null, - pdfSizeBytes: null, + fileType: null, + fileContents: null, + fileOriginalName: null, + fileMimeType: null, + fileSizeBytes: null, )); } @@ -321,16 +465,15 @@ class UpdateElementTest extends TestCase description: 'Updated description', iconImageUrl: null, richText: '

Updated rich text

', + shortPdfPath: null, + longPdfPath: null, pdfPath: null, youtubeUrl: null, - iconImageContents: null, - iconImageOriginalName: null, - iconImageMimeType: null, - iconImageSizeBytes: null, - pdfContents: null, - pdfOriginalName: null, - pdfMimeType: null, - pdfSizeBytes: null, + fileType: null, + fileContents: null, + fileOriginalName: null, + fileMimeType: null, + fileSizeBytes: null, )); } @@ -345,16 +488,15 @@ class UpdateElementTest extends TestCase description: 'Updated description', iconImageUrl: null, richText: '

Updated rich text

', + shortPdfPath: null, + longPdfPath: null, pdfPath: null, youtubeUrl: null, - iconImageContents: null, - iconImageOriginalName: null, - iconImageMimeType: null, - iconImageSizeBytes: null, - pdfContents: null, - pdfOriginalName: null, - pdfMimeType: null, - pdfSizeBytes: null, + fileType: null, + fileContents: null, + fileOriginalName: null, + fileMimeType: null, + fileSizeBytes: null, )); } @@ -374,7 +516,8 @@ class UpdateElementTest extends TestCase string $description, ?string $iconImageUrl, string $richText, - ?string $pdfPath, + ?string $shortPdfPath, + ?string $longPdfPath, ?string $youtubeUrl, ?Element $parentElement, ): Element { @@ -384,7 +527,8 @@ class UpdateElementTest extends TestCase description: $description, iconImageUrl: $iconImageUrl, richText: $richText, - pdfPath: $pdfPath, + shortPdfPath: $shortPdfPath, + longPdfPath: $longPdfPath, youtubeUrl: $youtubeUrl, parentElement: $parentElement, )); diff --git a/backend/tests/Unit/Element/UseCases/UpdateIconImageTest.php b/backend/tests/Unit/Element/UseCases/UpdateIconImageTest.php index af8ae7f..2aef04a 100644 --- a/backend/tests/Unit/Element/UseCases/UpdateIconImageTest.php +++ b/backend/tests/Unit/Element/UseCases/UpdateIconImageTest.php @@ -33,19 +33,19 @@ class UpdateIconImageTest extends TestCase /** * @return array{ - * iconImageContents: string, - * iconImageOriginalName: string, - * iconImageMimeType: string, - * iconImageSizeBytes: int + * fileContents: string, + * fileOriginalName: string, + * fileMimeType: string, + * fileSizeBytes: int * } */ private function imageArgs(): array { return [ - 'iconImageContents' => 'binary-image-bytes', - 'iconImageOriginalName' => 'icon.png', - 'iconImageMimeType' => 'image/png', - 'iconImageSizeBytes' => 1024, + 'fileContents' => 'binary-image-bytes', + 'fileOriginalName' => 'icon.png', + 'fileMimeType' => 'image/png', + 'fileSizeBytes' => 1024, ]; } @@ -97,10 +97,10 @@ class UpdateIconImageTest extends TestCase $this->useCase->execute( new UpdateIconImageRequest( id: 1, - iconImageContents: null, - iconImageOriginalName: null, - iconImageMimeType: null, - iconImageSizeBytes: null, + fileContents: null, + fileOriginalName: null, + fileMimeType: null, + fileSizeBytes: null, ) ); } @@ -115,10 +115,10 @@ class UpdateIconImageTest extends TestCase $this->useCase->execute( new UpdateIconImageRequest( id: 1, - iconImageContents: 'not-an-image', - iconImageOriginalName: 'icon.pdf', - iconImageMimeType: 'application/pdf', - iconImageSizeBytes: 1024, + fileContents: 'not-an-image', + fileOriginalName: 'icon.pdf', + fileMimeType: 'application/pdf', + fileSizeBytes: 1024, ) ); } @@ -131,10 +131,10 @@ class UpdateIconImageTest extends TestCase $this->useCase->execute( new UpdateIconImageRequest( id: 1, - iconImageContents: 'big', - iconImageOriginalName: 'icon.png', - iconImageMimeType: 'image/png', - iconImageSizeBytes: 6 * 1024 * 1024, + fileContents: 'big', + fileOriginalName: 'icon.png', + fileMimeType: 'image/png', + fileSizeBytes: 6 * 1024 * 1024, ) ); } @@ -167,7 +167,8 @@ class UpdateIconImageTest extends TestCase description: 'Original description', iconImageUrl: null, richText: '', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, parentElement: null, )); diff --git a/backend/tests/Unit/Element/UseCases/UpdateLongPdfTest.php b/backend/tests/Unit/Element/UseCases/UpdateLongPdfTest.php new file mode 100644 index 0000000..ba34617 --- /dev/null +++ b/backend/tests/Unit/Element/UseCases/UpdateLongPdfTest.php @@ -0,0 +1,95 @@ +elementRepository = new FakeElementRepository(); + $this->fileUploader = new FakeFileUploader(); + $this->useCase = new UpdateLongPdf( + $this->elementRepository, + $this->fileUploader, + ); + } + + public function testUploadsLongPdfAndStoresPath(): void + { + $element = $this->createElement(); + + $updatedElement = $this->useCase->execute( + new UpdateLongPdfRequest( + id: $element->getId(), + fileContents: 'binary-pdf-bytes', + fileOriginalName: 'baderech-long.pdf', + fileMimeType: 'application/pdf', + fileSizeBytes: 1024, + ) + ); + + $this->assertNull($updatedElement->getShortPdfPath()); + $this->assertSame( + 'element-pdfs/long/fake-baderech-long.pdf', + $updatedElement->getLongPdfPath(), + ); + $this->assertSame( + 'element-pdfs/long', + $this->fileUploader->uploads[0]['folder'], + ); + } + + public function testDisallowedMimeThrowsBadRequest(): void + { + $this->expectException(BadRequestException::class); + $this->expectExceptionMessage('pdf must be a pdf file'); + + $this->useCase->execute( + new UpdateLongPdfRequest( + id: 1, + fileContents: 'not-a-pdf', + fileOriginalName: 'icon.png', + fileMimeType: 'image/png', + fileSizeBytes: 1024, + ) + ); + } + + private function createElement(): Element + { + $set = new DomainSet( + id: 1, + name: 'Baderech', + description: 'Baderech description', + iconImageUrl: '/assets/baderech-icon.png', + ); + + return $this->elementRepository->create(new CreateElementDto( + set: $set, + title: 'Original title', + description: 'Original description', + iconImageUrl: null, + richText: '', + shortPdfPath: null, + longPdfPath: null, + youtubeUrl: null, + parentElement: null, + )); + } +} diff --git a/backend/tests/Unit/Element/UseCases/UpdatePdfTest.php b/backend/tests/Unit/Element/UseCases/UpdateShortPdfTest.php similarity index 65% rename from backend/tests/Unit/Element/UseCases/UpdatePdfTest.php rename to backend/tests/Unit/Element/UseCases/UpdateShortPdfTest.php index 9a3b30b..9cea03a 100644 --- a/backend/tests/Unit/Element/UseCases/UpdatePdfTest.php +++ b/backend/tests/Unit/Element/UseCases/UpdateShortPdfTest.php @@ -4,8 +4,8 @@ namespace Tests\Unit\Element\UseCases; use App\Element\CreateElementDto; use App\Element\Element; -use App\Element\UseCases\UpdateElement\UpdatePdf; -use App\Element\UseCases\UpdateElement\UpdatePdfRequest; +use App\Element\UseCases\UpdateElement\UpdateShortPdf; +use App\Element\UseCases\UpdateElement\UpdateShortPdfRequest; use App\Exceptions\BadRequestException; use App\Exceptions\NotFoundException; use App\Set\Set as DomainSet; @@ -13,19 +13,19 @@ use Tests\Fakes\FakeElementRepository; use Tests\Fakes\FakeFileUploader; use Tests\TestCase; -class UpdatePdfTest extends TestCase +class UpdateShortPdfTest extends TestCase { private FakeElementRepository $elementRepository; private FakeFileUploader $fileUploader; - private UpdatePdf $useCase; + private UpdateShortPdf $useCase; protected function setUp(): void { $this->elementRepository = new FakeElementRepository(); $this->fileUploader = new FakeFileUploader(); - $this->useCase = new UpdatePdf( + $this->useCase = new UpdateShortPdf( $this->elementRepository, $this->fileUploader, ); @@ -33,45 +33,46 @@ class UpdatePdfTest extends TestCase /** * @return array{ - * pdfContents: string, - * pdfOriginalName: string, - * pdfMimeType: string, - * pdfSizeBytes: int + * fileContents: string, + * fileOriginalName: string, + * fileMimeType: string, + * fileSizeBytes: int * } */ private function pdfArgs(): array { return [ - 'pdfContents' => 'binary-pdf-bytes', - 'pdfOriginalName' => 'baderech.pdf', - 'pdfMimeType' => 'application/pdf', - 'pdfSizeBytes' => 1024, + 'fileContents' => 'binary-pdf-bytes', + 'fileOriginalName' => 'baderech.pdf', + 'fileMimeType' => 'application/pdf', + 'fileSizeBytes' => 1024, ]; } - public function testUploadsPdfAndStoresPath(): void + public function testUploadsShortPdfAndStoresPath(): void { $element = $this->createElement(); $updatedElement = $this->useCase->execute( - new UpdatePdfRequest( + new UpdateShortPdfRequest( ...$this->pdfArgs(), id: $element->getId(), ) ); $this->assertSame( - 'element-pdfs/fake-baderech.pdf', - $updatedElement->getPdfPath(), + 'element-pdfs/short/fake-baderech.pdf', + $updatedElement->getShortPdfPath(), ); + $this->assertNull($updatedElement->getLongPdfPath()); $storedElement = $this->elementRepository->find($element->getId()); $this->assertNotNull($storedElement); $this->assertSame( - 'element-pdfs/fake-baderech.pdf', - $storedElement->getPdfPath(), + 'element-pdfs/short/fake-baderech.pdf', + $storedElement->getShortPdfPath(), ); $this->assertSame( - 'element-pdfs', + 'element-pdfs/short', $this->fileUploader->uploads[0]['folder'], ); } @@ -82,7 +83,7 @@ class UpdatePdfTest extends TestCase $this->expectExceptionMessage('id is required'); $this->useCase->execute( - new UpdatePdfRequest( + new UpdateShortPdfRequest( ...$this->pdfArgs(), id: null, ) @@ -95,12 +96,12 @@ class UpdatePdfTest extends TestCase $this->expectExceptionMessage('pdf is required'); $this->useCase->execute( - new UpdatePdfRequest( + new UpdateShortPdfRequest( id: 1, - pdfContents: null, - pdfOriginalName: null, - pdfMimeType: null, - pdfSizeBytes: null, + fileContents: null, + fileOriginalName: null, + fileMimeType: null, + fileSizeBytes: null, ) ); } @@ -111,12 +112,12 @@ class UpdatePdfTest extends TestCase $this->expectExceptionMessage('pdf must be a pdf file'); $this->useCase->execute( - new UpdatePdfRequest( + new UpdateShortPdfRequest( id: 1, - pdfContents: 'not-a-pdf', - pdfOriginalName: 'icon.png', - pdfMimeType: 'image/png', - pdfSizeBytes: 1024, + fileContents: 'not-a-pdf', + fileOriginalName: 'icon.png', + fileMimeType: 'image/png', + fileSizeBytes: 1024, ) ); } @@ -127,12 +128,12 @@ class UpdatePdfTest extends TestCase $this->expectExceptionMessage('pdf must be 10MB or smaller'); $this->useCase->execute( - new UpdatePdfRequest( + new UpdateShortPdfRequest( id: 1, - pdfContents: 'big', - pdfOriginalName: 'baderech.pdf', - pdfMimeType: 'application/pdf', - pdfSizeBytes: 11 * 1024 * 1024, + fileContents: 'big', + fileOriginalName: 'baderech.pdf', + fileMimeType: 'application/pdf', + fileSizeBytes: 11 * 1024 * 1024, ) ); } @@ -143,7 +144,7 @@ class UpdatePdfTest extends TestCase $this->expectExceptionMessage('Element not found'); $this->useCase->execute( - new UpdatePdfRequest( + new UpdateShortPdfRequest( ...$this->pdfArgs(), id: 999, ) @@ -165,7 +166,8 @@ class UpdatePdfTest extends TestCase description: 'Original description', iconImageUrl: null, richText: '', - pdfPath: null, + shortPdfPath: null, + longPdfPath: null, youtubeUrl: null, parentElement: null, )); diff --git a/frontend/rabbi_gerzi/cypress/e2e/admin-element.cy.ts b/frontend/rabbi_gerzi/cypress/e2e/admin-element.cy.ts index 38dc7a1..c6ab389 100644 --- a/frontend/rabbi_gerzi/cypress/e2e/admin-element.cy.ts +++ b/frontend/rabbi_gerzi/cypress/e2e/admin-element.cy.ts @@ -126,28 +126,45 @@ describe('admin element editing', () => { .and('have.attr', 'src') .and('include', '/storage/element-icons/') - cy.get('[data-cy="admin-element-pdf-input"]').selectFile( + cy.get('[data-cy="admin-element-short-pdf-input"]').selectFile( 'public/assets/pdfs/baderech.pdf', { force: true }, ) cy.wait('@updateElement') - cy.get('[data-cy="admin-element-pdf-status"]') + cy.get('[data-cy="admin-element-short-pdf-status"]') .should('be.visible') - .and('contain.text', 'PDF updated') - cy.get('[data-cy="admin-element-current-pdf"]') + .and('contain.text', 'Short PDF updated') + cy.get('[data-cy="admin-element-current-short-pdf"]') .should('be.visible') .and('have.attr', 'href') - .and('include', '/storage/element-pdfs/') + .and('include', '/storage/element-pdfs/short/') + + cy.get('[data-cy="admin-element-long-pdf-input"]').selectFile( + 'public/assets/pdfs/baderech.pdf', + { force: true }, + ) + cy.wait('@updateElement') + cy.get('[data-cy="admin-element-long-pdf-status"]') + .should('be.visible') + .and('contain.text', 'Long PDF updated') + cy.get('[data-cy="admin-element-current-long-pdf"]') + .should('be.visible') + .and('have.attr', 'href') + .and('include', '/storage/element-pdfs/long/') cy.contains('header.site-header a', 'View Element').click() cy.get('[data-cy="element-icon"]') .should('be.visible') .and('have.attr', 'src') .and('include', '/storage/element-icons/') - cy.get('[data-cy="element-pdf-link"]') + cy.get('[data-cy="element-short-pdf-link"]') .should('be.visible') .and('have.attr', 'href') - .and('include', '/storage/element-pdfs/') + .and('include', '/storage/element-pdfs/short/') + cy.get('[data-cy="element-long-pdf-link"]') + .should('be.visible') + .and('have.attr', 'href') + .and('include', '/storage/element-pdfs/long/') cy.resetDb() }) @@ -163,7 +180,12 @@ describe('admin element editing', () => { { force: true }, ) cy.wait('@updateElement') - cy.get('[data-cy="admin-element-pdf-input"]').selectFile( + cy.get('[data-cy="admin-element-short-pdf-input"]').selectFile( + 'public/assets/pdfs/baderech.pdf', + { force: true }, + ) + cy.wait('@updateElement') + cy.get('[data-cy="admin-element-long-pdf-input"]').selectFile( 'public/assets/pdfs/baderech.pdf', { force: true }, ) @@ -177,17 +199,26 @@ describe('admin element editing', () => { cy.get('[data-cy="admin-element-current-icon"]').should('not.exist') cy.contains('No icon image').should('be.visible') - cy.contains('button', 'Remove PDF').click() + cy.contains('button', 'Remove short PDF').click() cy.wait('@updateElement') - cy.get('[data-cy="admin-element-pdf-status"]') + cy.get('[data-cy="admin-element-short-pdf-status"]') .should('be.visible') - .and('contain.text', 'PDF removed') - cy.get('[data-cy="admin-element-current-pdf"]').should('not.exist') - cy.contains('No PDF').should('be.visible') + .and('contain.text', 'Short PDF removed') + cy.get('[data-cy="admin-element-current-short-pdf"]').should('not.exist') + cy.contains('No short PDF').should('be.visible') + + cy.contains('button', 'Remove long PDF').click() + cy.wait('@updateElement') + cy.get('[data-cy="admin-element-long-pdf-status"]') + .should('be.visible') + .and('contain.text', 'Long PDF removed') + cy.get('[data-cy="admin-element-current-long-pdf"]').should('not.exist') + cy.contains('No long PDF').should('be.visible') cy.contains('header.site-header a', 'View Element').click() cy.get('[data-cy="element-icon"]').should('not.exist') - cy.get('[data-cy="element-pdf-link"]').should('not.exist') + cy.get('[data-cy="element-short-pdf-link"]').should('not.exist') + cy.get('[data-cy="element-long-pdf-link"]').should('not.exist') cy.resetDb() }) diff --git a/frontend/rabbi_gerzi/cypress/e2e/media.cy.ts b/frontend/rabbi_gerzi/cypress/e2e/media.cy.ts index e0f361a..805be28 100644 --- a/frontend/rabbi_gerzi/cypress/e2e/media.cy.ts +++ b/frontend/rabbi_gerzi/cypress/e2e/media.cy.ts @@ -51,7 +51,8 @@ describe('media page sets', () => { cy.get('[data-cy="element-rich-text"]').should('not.exist') cy.get('[data-cy="element-youtube-embed"]') .should('not.exist') - cy.get('[data-cy="element-pdf-link"]').should('not.exist') + cy.get('[data-cy="element-short-pdf-link"]').should('not.exist') + cy.get('[data-cy="element-long-pdf-link"]').should('not.exist') cy.get('[data-cy="child-element-list"]').should('be.visible') cy.get('[data-cy="child-element-list"]') .should( @@ -116,13 +117,14 @@ describe('media page sets', () => { ) .should('have.css', 'text-align', 'center') cy.get('[data-cy="element-youtube-embed"]').should('not.exist') - cy.contains('[data-cy="element-pdf-link"]', 'View PDF') - .as('pdfLink') + cy.contains('[data-cy="element-short-pdf-link"]', 'View Short PDF') + .as('shortPdfLink') .should('be.visible') .and('have.attr', 'target', '_blank') - cy.get('@pdfLink') + cy.get('@shortPdfLink') .and('have.attr', 'href') - .and('include', '/storage/element-pdfs/baderech.pdf') + .and('include', '/storage/element-pdfs/short/baderech.pdf') + cy.get('[data-cy="element-long-pdf-link"]').should('not.exist') cy.contains('[data-cy="child-element-link"]', introductionAudioTitle) .as('introductionAudioLink') .should('have.attr', 'href', '/element/8') @@ -132,7 +134,8 @@ describe('media page sets', () => { cy.contains('h1', introductionAudioTitle).should('be.visible') cy.get('[data-cy="element-icon"]').should('not.exist') cy.get('[data-cy="element-rich-text"]').should('not.exist') - cy.get('[data-cy="element-pdf-link"]').should('not.exist') + cy.get('[data-cy="element-short-pdf-link"]').should('not.exist') + cy.get('[data-cy="element-long-pdf-link"]').should('not.exist') cy.get('[data-cy="child-element-list"]').should('not.exist') cy.get('[data-cy="element-youtube-embed"]') .should('be.visible')