From 111a21fcec1e6d9497efdcebdb76f7bcd9bffeb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 28 May 2024 12:08:02 +0200 Subject: [PATCH] Add new file for StoredObjectType tests and update class definitions This commit adds a new file, StoredObjectTypeTest.php, to ChillDocStoreBundle Tests. It contains unit tests for the StoredObjectType class. Changes are also made in StoredObjectNormalizer and StoredObjectDataMapper classes, making JWTDavTokenProviderInterface and UrlGeneratorInterface as readonly in StoredObjectNormalizer and removing unnecessary EntityManagerInterface and debug commands on StoredObjectDataMapper. These changes improve test coverage and optimize the code for better performance. --- .../DataMapper/StoredObjectDataMapper.php | 11 +- .../Normalizer/StoredObjectNormalizer.php | 6 +- .../Tests/Form/StoredObjectTypeTest.php | 105 ++++++++++++++++++ 3 files changed, 110 insertions(+), 12 deletions(-) create mode 100644 src/Bundle/ChillDocStoreBundle/Tests/Form/StoredObjectTypeTest.php diff --git a/src/Bundle/ChillDocStoreBundle/Form/DataMapper/StoredObjectDataMapper.php b/src/Bundle/ChillDocStoreBundle/Form/DataMapper/StoredObjectDataMapper.php index 2869522a0..3ec52134f 100644 --- a/src/Bundle/ChillDocStoreBundle/Form/DataMapper/StoredObjectDataMapper.php +++ b/src/Bundle/ChillDocStoreBundle/Form/DataMapper/StoredObjectDataMapper.php @@ -12,16 +12,14 @@ declare(strict_types=1); namespace Chill\DocStoreBundle\Form\DataMapper; use Chill\DocStoreBundle\Entity\StoredObject; -use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\Form\DataMapperInterface; use Symfony\Component\Form\Exception; use Symfony\Component\Form\FormInterface; class StoredObjectDataMapper implements DataMapperInterface { - public function __construct( - private EntityManagerInterface $entityManager, - ) { + public function __construct() + { } /** @@ -55,10 +53,7 @@ class StoredObjectDataMapper implements DataMapperInterface throw new Exception\UnexpectedTypeException($viewData, StoredObject::class); } - dump($forms['stored_object']->getData(), $viewData); - if (null === $forms['stored_object']->getData()) { - return; } @@ -76,7 +71,5 @@ class StoredObjectDataMapper implements DataMapperInterface if (array_key_exists('title', $forms)) { $viewData->setTitle($forms['title']->getData()); } - - dump($viewData); } } diff --git a/src/Bundle/ChillDocStoreBundle/Serializer/Normalizer/StoredObjectNormalizer.php b/src/Bundle/ChillDocStoreBundle/Serializer/Normalizer/StoredObjectNormalizer.php index e74ab5547..1b00cc447 100644 --- a/src/Bundle/ChillDocStoreBundle/Serializer/Normalizer/StoredObjectNormalizer.php +++ b/src/Bundle/ChillDocStoreBundle/Serializer/Normalizer/StoredObjectNormalizer.php @@ -24,15 +24,15 @@ use Symfony\Component\Serializer\Normalizer\NormalizerInterface; * * Normalizes a StoredObject entity to an array of data. */ -class StoredObjectNormalizer implements NormalizerInterface, NormalizerAwareInterface +final class StoredObjectNormalizer implements NormalizerInterface, NormalizerAwareInterface { use NormalizerAwareTrait; public const ADD_DAV_SEE_LINK_CONTEXT = 'dav-see-link-context'; public const ADD_DAV_EDIT_LINK_CONTEXT = 'dav-edit-link-context'; public function __construct( - private JWTDavTokenProviderInterface $JWTDavTokenProvider, - private UrlGeneratorInterface $urlGenerator + private readonly JWTDavTokenProviderInterface $JWTDavTokenProvider, + private readonly UrlGeneratorInterface $urlGenerator ) { } diff --git a/src/Bundle/ChillDocStoreBundle/Tests/Form/StoredObjectTypeTest.php b/src/Bundle/ChillDocStoreBundle/Tests/Form/StoredObjectTypeTest.php new file mode 100644 index 000000000..863433af8 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Tests/Form/StoredObjectTypeTest.php @@ -0,0 +1,105 @@ + $newTitle = 'new title', 'stored_object' => <<<'JSON' + {"datas":[],"filename":"","id":null,"iv":[],"keyInfos":[],"title":"","type":"","uuid":"3c6a28fe-f913-40b9-a201-5eccc4f2d312","status":"ready","createdAt":null,"createdBy":null,"creationDate":null,"_links":{"dav_link":{"href":"http:\/\/url\/fake","expiration":"1716889578"}}} + JSON]; + $model = new StoredObject(); + $form = $this->factory->create(StoredObjectType::class, $model, ['has_title' => true]); + + $form->submit($formData); + + $this->assertTrue($form->isSynchronized()); + + $this->assertEquals($newTitle, $model->getTitle()); + } + + public function testReplaceByAnotherObject(): void + { + $formData = ['title' => $newTitle = 'new title', 'stored_object' => <<<'JSON' + {"filename":"abcdef","iv":[10, 15, 20, 30],"keyInfos":[],"type":"text/html","status":"object_store_created"} + JSON]; + $model = new StoredObject(); + $originalObjectId = spl_object_id($model); + $form = $this->factory->create(StoredObjectType::class, $model, ['has_title' => true]); + + $form->submit($formData); + + $this->assertTrue($form->isSynchronized()); + $model = $form->getData(); + $this->assertNotEquals($originalObjectId, spl_object_hash($model)); + $this->assertEquals('abcdef', $model->getFilename()); + $this->assertEquals([10, 15, 20, 30], $model->getIv()); + $this->assertEquals('text/html', $model->getType()); + $this->assertEquals($newTitle, $model->getTitle()); + } + + protected function getExtensions() + { + $jwtTokenProvider = $this->prophesize(JWTDavTokenProviderInterface::class); + $jwtTokenProvider->createToken(Argument::type(StoredObject::class), Argument::type(StoredObjectRoleEnum::class)) + ->willReturn('token'); + $jwtTokenProvider->getTokenExpiration('token')->willReturn(new \DateTimeImmutable()); + $urlGenerator = $this->prophesize(UrlGeneratorInterface::class); + $urlGenerator->generate('chill_docstore_dav_document_get', Argument::type('array'), UrlGeneratorInterface::ABSOLUTE_URL) + ->willReturn('http://url/fake'); + + $serializer = new Serializer( + [ + new StoredObjectNormalizer( + $jwtTokenProvider->reveal(), + $urlGenerator->reveal(), + ), + ], + [ + new JsonEncoder(), + ] + ); + $dataTransformer = new StoredObjectDataTransformer($serializer); + $dataMapper = new StoredObjectDataMapper(); + $type = new StoredObjectType( + $dataTransformer, + $dataMapper, + ); + + return [ + new PreloadedExtension([$type], []), + ]; + } +}