diff --git a/composer.json b/composer.json index ba77aab1..c76e0fd6 100644 --- a/composer.json +++ b/composer.json @@ -32,8 +32,8 @@ "guzzlehttp/guzzle": "^7.9", "nette/di": "^3.1.10", "nette/utils": "^4.0.0|^3.2.5", - "symfony/console": "^7.0.2", - "tracy/tracy": "^2.6.7", + "symfony/console": "^7.0.3", + "tracy/tracy": "^2.9", "monolog/monolog": "^3.0.0", "ezimuel/ringphp": "^1.2" }, @@ -41,7 +41,7 @@ "slevomat/coding-standard": "^8.15.0", "spameri/dependency-mocker": "^1.3", "nette/tester": "^v2.5.7", - "phpstan/phpstan": "^1.11.3", + "phpstan/phpstan": "^1.11.10", "php-coveralls/php-coveralls": "^2.1", "nette/bootstrap": "^3.1", "nette/http": "^3.0.7", @@ -67,5 +67,11 @@ "branch-alias": { "dev-master": "2.0-dev" } + }, + "conflict": { + "nette/neon": "<3.3.4 || >=3.4.0 <3.4.4", + "symfony/string": "<6.4.3 || >=7.0 <7.0.3", + "psr/http-factory": "<1.1", + "symfony/polyfill-mbstring": "<1.3" } } diff --git a/phpstan-low.neon b/phpstan-low.neon index 07703a2c..a8799eff 100644 --- a/phpstan-low.neon +++ b/phpstan-low.neon @@ -6,11 +6,6 @@ parameters: - %rootDir%/../../../phpstanConstants.php ignoreErrors: - - - message: "#^Unreachable statement \\- code above always terminates\\.$#" - count: 1 - path: src/Factory/EntityFactory.php - - message: "#^Variable \\$propertyValue might not be defined\\.$#" count: 1 diff --git a/src/EntityManager.php b/src/EntityManager.php index dc8dbff3..186707ea 100644 --- a/src/EntityManager.php +++ b/src/EntityManager.php @@ -204,6 +204,9 @@ public function persist( $this->dispatchEvents->execute($entity, EventManager::POST_CREATE); $this->dispatchEvents->execute($entity, EventManager::POST_PERSIST); + // The entity is stored now: a second persist of this instance is an update, not a create. + $this->changeSet->markExisting($entity); + return $id; } diff --git a/tests/SpameriTests/Elastic/EntityManager/PersistTest.phpt b/tests/SpameriTests/Elastic/EntityManager/PersistTest.phpt index 7ac881ad..acf7d93e 100644 --- a/tests/SpameriTests/Elastic/EntityManager/PersistTest.phpt +++ b/tests/SpameriTests/Elastic/EntityManager/PersistTest.phpt @@ -195,6 +195,46 @@ class PersistTest extends \SpameriTests\Elastic\AbstractTestCase } + public function testSecondPersistOfSameInstanceFiresPostUpdate(): void + { + $createListener = new \SpameriTests\Elastic\Data\Listener\MockListener( + [\SpameriTests\Elastic\Data\Entity\Title::class], + \Spameri\Elastic\EventManager::POST_CREATE, + ); + $updateListener = new \SpameriTests\Elastic\Data\Listener\MockListener( + [\SpameriTests\Elastic\Data\Entity\Title::class], + \Spameri\Elastic\EventManager::POST_UPDATE, + ); + + /** @var \Spameri\Elastic\EventManager $eventManager */ + $eventManager = $this->container->getByType(\Spameri\Elastic\EventManager::class); + $eventManager->addListener( + \Spameri\Elastic\EventManager::POST_CREATE, + \SpameriTests\Elastic\Data\Entity\Title::class, + $createListener, + ); + $eventManager->addListener( + \Spameri\Elastic\EventManager::POST_UPDATE, + \SpameriTests\Elastic\Data\Entity\Title::class, + $updateListener, + ); + + /** @var \Spameri\Elastic\EntityManager $entityManager */ + $entityManager = $this->container->getByType(\Spameri\Elastic\EntityManager::class); + + $entity = new \SpameriTests\Elastic\Data\Entity\Title( + new \Spameri\Elastic\Entity\Property\EmptyElasticId(), + null, + ); + + $entityManager->persist($entity); + $entityManager->persist($entity); + + \Tester\Assert::same(1, $createListener->getCallCount()); + \Tester\Assert::same(1, $updateListener->getCallCount()); + } + + public function testPersistReturnsIdString(): void { /** @var \Spameri\Elastic\EntityManager $entityManager */ diff --git a/tests/SpameriTests/Elastic/Model/DumpIndex/Execute.phpt b/tests/SpameriTests/Elastic/Model/DumpIndex/Execute.phpt index 9280688b..86af6a51 100644 --- a/tests/SpameriTests/Elastic/Model/DumpIndex/Execute.phpt +++ b/tests/SpameriTests/Elastic/Model/DumpIndex/Execute.phpt @@ -30,6 +30,9 @@ class Execute extends \SpameriTests\Elastic\AbstractTestCase $restoreIndex->setOutput(new \Symfony\Component\Console\Output\ConsoleOutput()); $restoreIndex->execute(__DIR__ . '/dumpData.json', 500); + + // The dump reads through search, which only sees documents after a refresh. + $clientProvider->client()->indices()->refresh(['index' => \SpameriTests\Elastic\Config::INDEX_DUMP]); }