From 34d37ea9dee6240b41bf93f2eab9c0732647b7b0 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 8 Mar 2024 18:01:50 +0100 Subject: [PATCH] all tests working --- ...05164344.php => Version20240308161707.php} | 4 +-- src/ApiResource/PartnerApi.php | 1 + src/ApiResource/UserApi.php | 3 ++ src/Entity/User.php | 3 +- src/Mapper/UserApiToEntityMapper.php | 17 ++++------- src/Mapper/UserEntityToApiMapper.php | 1 + src/Serializer/MediaObjectNormalizer.php | 2 +- tests/Functional/CommentResourceTest.php | 1 - tests/Functional/ContactResourceTest.php | 4 +-- tests/Functional/MediaObjectResourceTest.php | 28 ++++++++++++------ tests/Functional/PartnerResourceTest.php | 4 +-- tests/Functional/ProductResourceTest.php | 2 +- tests/fixtures/1176_upload.png | Bin 3989 -> 0 bytes 13 files changed, 40 insertions(+), 30 deletions(-) rename migrations/{Version20240305164344.php => Version20240308161707.php} (98%) delete mode 100644 tests/fixtures/1176_upload.png diff --git a/migrations/Version20240305164344.php b/migrations/Version20240308161707.php similarity index 98% rename from migrations/Version20240305164344.php rename to migrations/Version20240308161707.php index 3a1f3be..cd91d1e 100644 --- a/migrations/Version20240305164344.php +++ b/migrations/Version20240308161707.php @@ -10,7 +10,7 @@ use Doctrine\Migrations\AbstractMigration; /** * Auto-generated Migration: Please modify to your needs! */ -final class Version20240305164344 extends AbstractMigration +final class Version20240308161707 extends AbstractMigration { public function getDescription(): string { @@ -36,7 +36,7 @@ final class Version20240305164344 extends AbstractMigration $this->addSql('ALTER TABLE posting ADD CONSTRAINT FK_BD275D739393F8FE FOREIGN KEY (partner_id) REFERENCES partner (id)'); $this->addSql('ALTER TABLE posting ADD CONSTRAINT FK_BD275D73E7A1254A FOREIGN KEY (contact_id) REFERENCES contact (id)'); $this->addSql('ALTER TABLE product ADD CONSTRAINT FK_D34A04AD3DA5256D FOREIGN KEY (image_id) REFERENCES media_object (id) ON DELETE SET NULL'); - $this->addSql('ALTER TABLE `user` ADD CONSTRAINT FK_8D93D6493DA5256D FOREIGN KEY (image_id) REFERENCES media_object (id)'); + $this->addSql('ALTER TABLE `user` ADD CONSTRAINT FK_8D93D6493DA5256D FOREIGN KEY (image_id) REFERENCES media_object (id) ON DELETE SET NULL'); } public function down(Schema $schema): void diff --git a/src/ApiResource/PartnerApi.php b/src/ApiResource/PartnerApi.php index c5f6313..cba0a4e 100644 --- a/src/ApiResource/PartnerApi.php +++ b/src/ApiResource/PartnerApi.php @@ -79,6 +79,7 @@ class PartnerApi #[ApiProperty(writable: false)] public ?string $logoUrl = null; + #[ApiProperty(writable: false)] public ?\DateTimeImmutable $createdAt = null; /** diff --git a/src/ApiResource/UserApi.php b/src/ApiResource/UserApi.php index c0db4f3..bf05def 100644 --- a/src/ApiResource/UserApi.php +++ b/src/ApiResource/UserApi.php @@ -14,6 +14,7 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\GetCollection; use ApiPlatform\Metadata\Patch; use ApiPlatform\Metadata\Post; +use App\Entity\MediaObject; use App\Entity\User; use App\State\EntityClassDtoStateProcessor; use App\State\EntityToDtoStateProvider; @@ -57,6 +58,8 @@ class UserApi #[Assert\NotBlank] public ?string $lastName = null; + public ?MediaObject $image = null; + /** * The plaintext password when being set or changed. */ diff --git a/src/Entity/User.php b/src/Entity/User.php index 1641bbe..534dd7c 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -27,7 +27,8 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface #[ORM\Column(length: 255)] private ?string $lastName = null; - #[ORM\ManyToOne] + #[ORM\ManyToOne(targetEntity: MediaObject::class)] + #[ORM\JoinColumn(nullable: true, onDelete: "SET NULL")] private ?MediaObject $image = null; #[ORM\Column] diff --git a/src/Mapper/UserApiToEntityMapper.php b/src/Mapper/UserApiToEntityMapper.php index dfe8f84..1d0025f 100644 --- a/src/Mapper/UserApiToEntityMapper.php +++ b/src/Mapper/UserApiToEntityMapper.php @@ -17,10 +17,10 @@ use Symfonycasts\MicroMapper\MicroMapperInterface; class UserApiToEntityMapper implements MapperInterface { public function __construct( - private UserRepository $userRepository, + private UserRepository $repository, private UserPasswordHasherInterface $userPasswordHasher, - private MicroMapperInterface $microMapper, - private PropertyAccessorInterface $propertyAccessor, + private MicroMapperInterface $microMapper, + private PropertyAccessorInterface $propertyAccessor, ) { } @@ -30,12 +30,12 @@ class UserApiToEntityMapper implements MapperInterface $dto = $from; assert($dto instanceof UserApi); - $userEntity = $dto->id ? $this->userRepository->find($dto->id) : new User(); - if (!$userEntity) { + $entity = $dto->id ? $this->repository->find($dto->id) : new User(); + if (!$entity) { throw new \Exception('User not found'); } - return $userEntity; + return $entity; } public function populate(object $from, object $to, array $context): object @@ -53,11 +53,6 @@ class UserApiToEntityMapper implements MapperInterface } $userPostsEntities = new ArrayCollection(); - foreach ($dto->posts as $userPostApi) { - $userPostsEntities[] = $this->microMapper->map($userPostApi, Posting::class, [ - MicroMapperInterface::MAX_DEPTH => 1, - ]); - } $this->propertyAccessor->setValue($entity, 'postings', $userPostsEntities); return $entity; diff --git a/src/Mapper/UserEntityToApiMapper.php b/src/Mapper/UserEntityToApiMapper.php index e916509..ebc0527 100644 --- a/src/Mapper/UserEntityToApiMapper.php +++ b/src/Mapper/UserEntityToApiMapper.php @@ -40,6 +40,7 @@ class UserEntityToApiMapper implements MapperInterface $dto->email = $entity->getEmail(); $dto->firstName = $entity->getFirstName(); $dto->lastName = $entity->getLastName(); + $dto->image = $entity->getImage(); return $dto; } diff --git a/src/Serializer/MediaObjectNormalizer.php b/src/Serializer/MediaObjectNormalizer.php index 6b97d37..fe1ed5e 100644 --- a/src/Serializer/MediaObjectNormalizer.php +++ b/src/Serializer/MediaObjectNormalizer.php @@ -44,7 +44,7 @@ final class MediaObjectNormalizer implements NormalizerInterface, SerializerAwar if (isset($context[self::ALREADY_CALLED])) { //return false; } - + // return $data instanceof MediaObject; return $this->normalizer->supportsNormalization($data, $format, $context); } diff --git a/tests/Functional/CommentResourceTest.php b/tests/Functional/CommentResourceTest.php index 350492e..8cd0292 100644 --- a/tests/Functional/CommentResourceTest.php +++ b/tests/Functional/CommentResourceTest.php @@ -82,7 +82,6 @@ class CommentResourceTest extends KernelTestCase ], ]) ->assertSuccessful() - ->dd() ; } } \ No newline at end of file diff --git a/tests/Functional/ContactResourceTest.php b/tests/Functional/ContactResourceTest.php index fabae5e..8484b5d 100644 --- a/tests/Functional/ContactResourceTest.php +++ b/tests/Functional/ContactResourceTest.php @@ -56,7 +56,7 @@ class ContactResourceTest extends KernelTestCase 'lastName' => 'Test', 'partner' => '/api/partners/' . $partner->getId(), 'birthday' => '1984-02-10', - 'image' => '/api/media/' . $mediaObject->getId(), + 'image' => '/api/medias/' . $mediaObject->getId(), 'position' => 'CEO', 'phone' => '123456789', 'email' => 'peter@test2.de', @@ -80,7 +80,7 @@ class ContactResourceTest extends KernelTestCase ; $this->browser() - ->delete('/api/media/' . $mediaObject->getId(), [ + ->delete('/api/medias/' . $mediaObject->getId(), [ 'headers' => [ 'Authorization' => 'Bearer ' . $token, ], diff --git a/tests/Functional/MediaObjectResourceTest.php b/tests/Functional/MediaObjectResourceTest.php index ab81ccc..d956cae 100644 --- a/tests/Functional/MediaObjectResourceTest.php +++ b/tests/Functional/MediaObjectResourceTest.php @@ -53,7 +53,16 @@ class MediaObjectResourceTest extends KernelTestCase $token = $this->JWTManager->create($user->object()); $this->browser() - ->post('/api/media', [ + ->get('/api/medias', [ + 'headers' => [ + 'Authorization' => 'Bearer ' . $token, + ], + ]) + ->assertSuccessful() + ; + + $this->browser() + ->post('/api/medias', [ 'headers' => [ 'Authorization' => 'Bearer ' . $token, 'Content-Type' => 'multipart/form-data' @@ -67,22 +76,24 @@ class MediaObjectResourceTest extends KernelTestCase $partner = PartnerFactory::createOne(); $this->browser() - ->patch('/api/partner/' . $partner->getId(), [ + ->patch('/api/partners/' . $partner->getId(), + [ + 'json' => [ + 'logo' => '/api/medias/1' + ], 'headers' => [ 'Authorization' => 'Bearer ' . $token, + 'Content-Type' => 'application/merge-patch+json' ], - 'json' => [ - 'logo' => '/api/media/1' - ] ]) ->assertSuccessful() ; $this->browser() - ->delete('/api/media/1', [ + ->delete('/api/medias/1', + [ 'headers' => [ 'Authorization' => 'Bearer ' . $token, - 'Content-Type' => 'multipart/form-data' ], ]) ->assertSuccessful() @@ -102,10 +113,9 @@ class MediaObjectResourceTest extends KernelTestCase ); $token = $this->JWTManager->create($user->object()); $this->browser() - ->delete('/api/media/' . $mediaObject->getId(), [ + ->delete('/api/medias/' . $mediaObject->getId(), [ 'headers' => [ 'Authorization' => 'Bearer ' . $token, - 'Content-Type' => 'multipart/form-data' ], ]) ->assertSuccessful() diff --git a/tests/Functional/PartnerResourceTest.php b/tests/Functional/PartnerResourceTest.php index f728b5d..7abfea0 100644 --- a/tests/Functional/PartnerResourceTest.php +++ b/tests/Functional/PartnerResourceTest.php @@ -55,7 +55,7 @@ class PartnerResourceTest extends KernelTestCase 'city' => 'test city', 'country' => 'test country', 'website' => 'wwe.test.de', - 'logo' => '/api/media/' . $mediaObject->getId(), + 'logo' => '/api/medias/' . $mediaObject->getId(), ], 'headers' => [ 'Authorization' => 'Bearer ' . $token, @@ -79,7 +79,7 @@ class PartnerResourceTest extends KernelTestCase ; $this->browser() - ->delete('/api/media/' . $mediaObject->getId(), [ + ->delete('/api/medias/' . $mediaObject->getId(), [ 'headers' => [ 'Authorization' => 'Bearer ' . $token, ], diff --git a/tests/Functional/ProductResourceTest.php b/tests/Functional/ProductResourceTest.php index bf988c1..45a1b6b 100644 --- a/tests/Functional/ProductResourceTest.php +++ b/tests/Functional/ProductResourceTest.php @@ -54,7 +54,7 @@ class ProductResourceTest extends KernelTestCase 'json' => [ 'name' => 'Test', 'description' => 'more test', - 'image' => '/api/media/' . $mediaObject->getId(), + 'image' => '/api/medias/' . $mediaObject->getId(), ], 'headers' => [ 'Authorization' => 'Bearer ' . $token, diff --git a/tests/fixtures/1176_upload.png b/tests/fixtures/1176_upload.png deleted file mode 100644 index 54a8ef6d64ec964458d7f3b493346842901e721f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3989 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 E09R5S9smFU