Update DropFile to handle object versioning

This commit is contained in:
2024-09-02 16:24:23 +02:00
parent b6edbb3eed
commit 3d49c959e0
42 changed files with 857 additions and 539 deletions

View File

@@ -15,11 +15,17 @@ use Chill\DocStoreBundle\Entity\StoredObject;
use Chill\DocStoreBundle\Form\DataMapper\StoredObjectDataMapper;
use Chill\DocStoreBundle\Form\DataTransformer\StoredObjectDataTransformer;
use Chill\DocStoreBundle\Form\StoredObjectType;
use Chill\DocStoreBundle\Repository\StoredObjectRepositoryInterface;
use Chill\DocStoreBundle\Security\Authorization\StoredObjectRoleEnum;
use Chill\DocStoreBundle\Security\Guard\JWTDavTokenProviderInterface;
use Chill\DocStoreBundle\Serializer\Normalizer\StoredObjectDenormalizer;
use Chill\DocStoreBundle\Serializer\Normalizer\StoredObjectNormalizer;
use Chill\DocStoreBundle\Serializer\Normalizer\StoredObjectVersionNormalizer;
use Chill\MainBundle\Serializer\Normalizer\UserNormalizer;
use Chill\MainBundle\Templating\Entity\UserRender;
use Prophecy\Argument;
use Prophecy\PhpUnit\ProphecyTrait;
use Symfony\Component\Clock\MockClock;
use Symfony\Component\Form\PreloadedExtension;
use Symfony\Component\Form\Test\TypeTestCase;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
@@ -36,33 +42,41 @@ class StoredObjectTypeTest extends TypeTestCase
{
use ProphecyTrait;
private StoredObject $model;
protected function setUp(): void
{
$this->model = new StoredObject();
$this->model->registerVersion();
parent::setUp();
}
public function testChangeTitleValue(): void
{
$formData = ['title' => $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"}}}
{"uuid":"9855d676-690b-11ef-88d3-9f5a4129a7b7"}
JSON];
$model = new StoredObject();
$form = $this->factory->create(StoredObjectType::class, $model, ['has_title' => true]);
$form = $this->factory->create(StoredObjectType::class, $this->model, ['has_title' => true]);
$form->submit($formData);
$this->assertTrue($form->isSynchronized());
$this->assertEquals($newTitle, $model->getTitle());
$this->assertEquals($newTitle, $this->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"}
{"uuid":"9855d676-690b-11ef-88d3-9f5a4129a7b7","currentVersion":{"filename":"abcdef","iv":[10, 15, 20, 30],"keyInfos":[],"type":"text/html","persisted": false}}
JSON];
$model = new StoredObject();
$originalObjectId = spl_object_hash($model);
$form = $this->factory->create(StoredObjectType::class, $model, ['has_title' => true]);
$originalObjectId = spl_object_hash($this->model);
$form = $this->factory->create(StoredObjectType::class, $this->model, ['has_title' => true]);
$form->submit($formData);
$this->assertTrue($form->isSynchronized());
$model = $form->getData();
$this->assertEquals($originalObjectId, spl_object_hash($model));
$this->assertEquals('abcdef', $model->getFilename());
@@ -71,6 +85,29 @@ class StoredObjectTypeTest extends TypeTestCase
$this->assertEquals($newTitle, $model->getTitle());
}
public function testNothingIsChanged(): void
{
$formData = ['title' => $newTitle = 'new title', 'stored_object' => <<<'JSON'
{"uuid":"9855d676-690b-11ef-88d3-9f5a4129a7b7","currentVersion":{"filename":"abcdef","iv":[10, 15, 20, 30],"keyInfos":[],"type":"text/html"}}
JSON];
$originalObjectId = spl_object_hash($this->model);
$originalVersion = $this->model->getCurrentVersion();
$originalFilename = $originalVersion->getFilename();
$originalKeyInfos = $originalVersion->getKeyInfos();
$form = $this->factory->create(StoredObjectType::class, $this->model, ['has_title' => true]);
$form->submit($formData);
$this->assertTrue($form->isSynchronized());
$model = $form->getData();
$this->assertEquals($originalObjectId, spl_object_hash($model));
$this->assertSame($originalVersion, $model->getCurrentVersion());
$this->assertEquals($originalFilename, $model->getCurrentVersion()->getFilename());
$this->assertEquals($originalKeyInfos, $model->getCurrentVersion()->getKeyInfos());
}
protected function getExtensions()
{
$jwtTokenProvider = $this->prophesize(JWTDavTokenProviderInterface::class);
@@ -84,6 +121,12 @@ class StoredObjectTypeTest extends TypeTestCase
$security = $this->prophesize(Security::class);
$security->isGranted(Argument::cetera())->willReturn(true);
$storedObjectRepository = $this->prophesize(StoredObjectRepositoryInterface::class);
$storedObjectRepository->findOneByUUID(Argument::type('string'))
->willReturn($this->model);
$userRender = $this->prophesize(UserRender::class);
$serializer = new Serializer(
[
new StoredObjectNormalizer(
@@ -91,6 +134,9 @@ class StoredObjectTypeTest extends TypeTestCase
$urlGenerator->reveal(),
$security->reveal()
),
new StoredObjectDenormalizer($storedObjectRepository->reveal()),
new StoredObjectVersionNormalizer(),
new UserNormalizer($userRender->reveal(), new MockClock()),
],
[
new JsonEncoder(),