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

@@ -0,0 +1,144 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\DocStoreBundle\Tests\Serializer\Normalizer;
use Chill\DocStoreBundle\Entity\StoredObject;
use Chill\DocStoreBundle\Repository\StoredObjectRepositoryInterface;
use Chill\DocStoreBundle\Serializer\Normalizer\StoredObjectDenormalizer;
use PHPUnit\Framework\TestCase;
use Prophecy\PhpUnit\ProphecyTrait;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
/**
* @internal
*
* @coversNothing
*/
class StoredObjectDenormalizerTest extends TestCase
{
use ProphecyTrait;
public function testDenormalizeWithoutObjectToPopulateWithUUID(): void
{
$storedObject = new StoredObject();
$storedObjectRepository = $this->prophesize(StoredObjectRepositoryInterface::class);
$storedObjectRepository->findOneByUUID($uuid = $storedObject->getUUID()->toString())
->shouldBeCalledOnce()
->willReturn($storedObject);
$denormalizer = new StoredObjectDenormalizer($storedObjectRepository->reveal());
$actual = $denormalizer->denormalize(['uuid' => $uuid], 'json');
self::assertSame($storedObject, $actual);
}
public function testDenormalizeWithoutObjectToPopulateWithId(): void
{
$storedObject = new StoredObject();
$storedObjectRepository = $this->prophesize(StoredObjectRepositoryInterface::class);
$storedObjectRepository->find($id = 1)
->shouldBeCalledOnce()
->willReturn($storedObject);
$denormalizer = new StoredObjectDenormalizer($storedObjectRepository->reveal());
$actual = $denormalizer->denormalize(['id' => $id], 'json');
self::assertSame($storedObject, $actual);
}
public function testDenormalizeTitle(): void
{
$storedObject = new StoredObject();
$storedObject->setTitle('foo');
$storedObjectRepository = $this->prophesize(StoredObjectRepositoryInterface::class);
$denormalizer = new StoredObjectDenormalizer($storedObjectRepository->reveal());
$actual = $denormalizer->denormalize([], StoredObject::class, 'json', [AbstractNormalizer::OBJECT_TO_POPULATE => $storedObject]);
self::assertEquals('foo', $actual->getTitle(), 'the title should remains the same');
$actual = $denormalizer->denormalize(['title' => 'bar'], StoredObject::class, 'json', [AbstractNormalizer::OBJECT_TO_POPULATE => $storedObject]);
self::assertEquals('bar', $actual->getTitle(), 'the title should have been updated');
}
public function testDenormalizeNoNewVersion(): void
{
$storedObject = new StoredObject();
$version = $storedObject->registerVersion();
$iv = $version->getIv();
$keyInfos = $version->getKeyInfos();
$type = $version->getType();
$filename = $version->getFilename();
$storedObjectRepository = $this->prophesize(StoredObjectRepositoryInterface::class);
$denormalizer = new StoredObjectDenormalizer($storedObjectRepository->reveal());
$actual = $denormalizer->denormalize([
'currentVersion' => [
'iv' => $iv,
'keyInfos' => $keyInfos,
'type' => $type,
'filename' => $filename,
],
], StoredObject::class, 'json', [AbstractNormalizer::OBJECT_TO_POPULATE => $storedObject]);
self::assertSame($storedObject, $actual);
self::assertSame($version, $storedObject->getCurrentVersion());
self::assertEquals($iv, $version->getIv());
self::assertEquals($keyInfos, $version->getKeyInfos());
self::assertEquals($type, $version->getType());
self::assertEquals($filename, $version->getFilename());
}
public function testDenormalizeNewVersion(): void
{
$storedObject = new StoredObject();
$version = $storedObject->registerVersion();
$iv = ['1, 2, 3'];
$keyInfos = ['some-key' => 'some'];
$type = 'text/html';
$filename = 'Foo-Bar';
$storedObjectRepository = $this->prophesize(StoredObjectRepositoryInterface::class);
$denormalizer = new StoredObjectDenormalizer($storedObjectRepository->reveal());
$actual = $denormalizer->denormalize([
'currentVersion' => [
'iv' => $iv,
'keyInfos' => $keyInfos,
'type' => $type,
'filename' => $filename,
// this is the required key for new versions
'persisted' => false,
],
], StoredObject::class, 'json', [AbstractNormalizer::OBJECT_TO_POPULATE => $storedObject]);
self::assertSame($storedObject, $actual);
self::assertNotSame($version, $storedObject->getCurrentVersion());
$version = $storedObject->getCurrentVersion();
self::assertEquals($iv, $version->getIv());
self::assertEquals($keyInfos, $version->getKeyInfos());
self::assertEquals($type, $version->getType());
self::assertEquals($filename, $version->getFilename());
}
}

View File

@@ -9,25 +9,32 @@ declare(strict_types=1);
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\DocStoreBundle\Tests\Serializer\Normalizer;
namespace ChillDocStoreBundle\Tests\Serializer\Normalizer;
use Chill\DocStoreBundle\Entity\StoredObject;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Chill\DocStoreBundle\Serializer\Normalizer\StoredObjectVersionNormalizer;
use Chill\MainBundle\Serializer\Normalizer\UserNormalizer;
use Chill\MainBundle\Templating\Entity\UserRender;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Clock\MockClock;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Serializer\Serializer;
/**
* @internal
*
* @coversNothing
*/
class StoredObjectVersionNormalizerTest extends KernelTestCase
class StoredObjectVersionNormalizerTest extends TestCase
{
private NormalizerInterface $normalizer;
protected function setUp(): void
{
self::bootKernel();
$this->normalizer = self::getContainer()->get(NormalizerInterface::class);
$userRender = $this->createMock(UserRender::class);
$userRender->method('renderString')->willReturn('user');
$this->normalizer = new StoredObjectVersionNormalizer();
$this->normalizer->setNormalizer(new Serializer([new UserNormalizer($userRender, new MockClock())]));
}
public function testNormalize(): void
@@ -58,4 +65,14 @@ class StoredObjectVersionNormalizerTest extends KernelTestCase
$actual
);
}
public function testNormalizeUnsupportedObject(): void
{
$this->expectException(\InvalidArgumentException::class);
$this->expectExceptionMessage('The object must be an instance of Chill\DocStoreBundle\Entity\StoredObjectVersion');
$unsupportedObject = new \stdClass();
$this->normalizer->normalize($unsupportedObject, 'json', ['groups' => ['read']]);
}
}