From df5bdc48b18800adc7ae4e7e452f818b6e15e1e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Klatt?= Date: Thu, 20 Jun 2024 15:18:38 +0200 Subject: [PATCH] ACP-3384 Only deactivate configurations to prevent loss of config details. --- .../Controller/AppConfigController.php | 2 + .../Controller/AppDisconnectController.php | 26 ++++- .../AppKernelToAppKernelFacadeBridge.php | 12 --- .../AppKernelToAppKernelFacadeInterface.php | 9 -- .../Business/AppKernelBusinessFactory.php | 12 --- .../AppKernel/Business/AppKernelFacade.php | 18 ---- .../Business/AppKernelFacadeInterface.php | 19 ---- .../Business/Deleter/ConfigDeleter.php | 92 ----------------- .../Deleter/ConfigDeleterInterface.php | 21 ---- .../Business/Writer/ConfigWriter.php | 74 +++++++++++++- .../Persistence/AppKernelEntityManager.php | 15 --- .../AppKernelEntityManagerInterface.php | 8 -- .../Controller/AppConfigureControllerTest.php | 98 +++++++++++++++++++ .../AppDisconnectControllerTest.php | 4 +- .../Helper/AppKernelAssertionHelper.php | 50 +++++++++- 15 files changed, 245 insertions(+), 215 deletions(-) delete mode 100644 src/Spryker/Zed/AppKernel/Business/Deleter/ConfigDeleter.php delete mode 100644 src/Spryker/Zed/AppKernel/Business/Deleter/ConfigDeleterInterface.php diff --git a/src/Spryker/Glue/AppKernel/Controller/AppConfigController.php b/src/Spryker/Glue/AppKernel/Controller/AppConfigController.php index b0b38fb..16de612 100644 --- a/src/Spryker/Glue/AppKernel/Controller/AppConfigController.php +++ b/src/Spryker/Glue/AppKernel/Controller/AppConfigController.php @@ -39,6 +39,7 @@ public function postConfigureAction(GlueRequestTransfer $glueRequestTransfer): G ->mapGlueRequestTransferToAppConfigTransfer($glueRequestTransfer, new AppConfigTransfer()); $appConfigTransfer = $this->updateStatus($appConfigTransfer); + $appConfigTransfer->setIsActive(true); $appConfigResponseTransfer = $this->getFactory()->getAppKernelFacade() ->saveConfig($appConfigTransfer); @@ -66,6 +67,7 @@ protected function updateStatus(AppConfigTransfer $appConfigTransfer): AppConfig ->getConfig((new AppConfigCriteriaTransfer())->setTenantIdentifier($appConfigTransfer->getTenantIdentifier())); $appConfigTransfer->setStatus($existingAppConfigTransfer->getStatus()); + $appConfigTransfer->setIsActive($existingAppConfigTransfer->getIsActive()); } catch (AppConfigNotFoundException) { } } diff --git a/src/Spryker/Glue/AppKernel/Controller/AppDisconnectController.php b/src/Spryker/Glue/AppKernel/Controller/AppDisconnectController.php index 830c7f2..4d272de 100644 --- a/src/Spryker/Glue/AppKernel/Controller/AppDisconnectController.php +++ b/src/Spryker/Glue/AppKernel/Controller/AppDisconnectController.php @@ -7,11 +7,13 @@ namespace Spryker\Glue\AppKernel\Controller; +use Generated\Shared\Transfer\AppConfigCriteriaTransfer; use Generated\Shared\Transfer\AppDisconnectTransfer; use Generated\Shared\Transfer\GlueRequestTransfer; use Generated\Shared\Transfer\GlueResponseTransfer; use Spryker\Glue\AppKernel\AppKernelConfig; use Spryker\Glue\Kernel\Backend\Controller\AbstractController; +use Spryker\Zed\AppKernel\Persistence\Exception\AppConfigNotFoundException; /** * @method \Spryker\Glue\AppKernel\AppKernelFactory getFactory() @@ -36,11 +38,27 @@ public function postDisconnectAction(GlueRequestTransfer $glueRequestTransfer): $disconnectParameterTransfer = $this->getFactory()->createGlueRequestMapper() ->mapGlueRequestTransferToAppDisconnectTransfer($glueRequestTransfer, new AppDisconnectTransfer()); - $appDisconnectResponseTransfer = $this->getFactory()->getAppKernelFacade() - ->deleteConfig($disconnectParameterTransfer); + $appConfigCriteriaTransfer = new AppConfigCriteriaTransfer(); + $appConfigCriteriaTransfer->setTenantIdentifier($disconnectParameterTransfer->getTenantIdentifier()); - if (!$appDisconnectResponseTransfer->getIsSuccessful()) { - return $this->getFactory()->createResponseBuilder() + try { + $appConfigTransfer = $this->getFactory() + ->getAppKernelFacade() + ->getConfig($appConfigCriteriaTransfer); + + $appConfigTransfer->setIsActive(false); + $appConfigResponseTransfer = $this->getFactory() + ->getAppKernelFacade() + ->saveConfig($appConfigTransfer); + } catch (AppConfigNotFoundException $exception) { + return $this->getFactory() + ->createResponseBuilder() + ->buildErrorResponse($exception->getMessage()); + } + + if (!$appConfigResponseTransfer->getIsSuccessful()) { + return $this->getFactory() + ->createResponseBuilder() ->buildErrorResponse(AppKernelConfig::RESPONSE_MESSAGE_DISCONNECT_ERROR); } diff --git a/src/Spryker/Glue/AppKernel/Dependency/Facade/AppKernelToAppKernelFacadeBridge.php b/src/Spryker/Glue/AppKernel/Dependency/Facade/AppKernelToAppKernelFacadeBridge.php index ead2268..7c1542c 100644 --- a/src/Spryker/Glue/AppKernel/Dependency/Facade/AppKernelToAppKernelFacadeBridge.php +++ b/src/Spryker/Glue/AppKernel/Dependency/Facade/AppKernelToAppKernelFacadeBridge.php @@ -10,8 +10,6 @@ use Generated\Shared\Transfer\AppConfigCriteriaTransfer; use Generated\Shared\Transfer\AppConfigResponseTransfer; use Generated\Shared\Transfer\AppConfigTransfer; -use Generated\Shared\Transfer\AppDisconnectResponseTransfer; -use Generated\Shared\Transfer\AppDisconnectTransfer; class AppKernelToAppKernelFacadeBridge implements AppKernelToAppKernelFacadeInterface { @@ -47,14 +45,4 @@ public function saveConfig(AppConfigTransfer $appConfigTransfer): AppConfigRespo { return $this->appKernelFacade->saveConfig($appConfigTransfer); } - - /** - * @param \Generated\Shared\Transfer\AppDisconnectTransfer $appDisconnectTransfer - * - * @return \Generated\Shared\Transfer\AppDisconnectResponseTransfer - */ - public function deleteConfig(AppDisconnectTransfer $appDisconnectTransfer): AppDisconnectResponseTransfer - { - return $this->appKernelFacade->deleteConfig($appDisconnectTransfer); - } } diff --git a/src/Spryker/Glue/AppKernel/Dependency/Facade/AppKernelToAppKernelFacadeInterface.php b/src/Spryker/Glue/AppKernel/Dependency/Facade/AppKernelToAppKernelFacadeInterface.php index 6e05244..2f03f37 100644 --- a/src/Spryker/Glue/AppKernel/Dependency/Facade/AppKernelToAppKernelFacadeInterface.php +++ b/src/Spryker/Glue/AppKernel/Dependency/Facade/AppKernelToAppKernelFacadeInterface.php @@ -10,8 +10,6 @@ use Generated\Shared\Transfer\AppConfigCriteriaTransfer; use Generated\Shared\Transfer\AppConfigResponseTransfer; use Generated\Shared\Transfer\AppConfigTransfer; -use Generated\Shared\Transfer\AppDisconnectResponseTransfer; -use Generated\Shared\Transfer\AppDisconnectTransfer; interface AppKernelToAppKernelFacadeInterface { @@ -28,11 +26,4 @@ public function getConfig(AppConfigCriteriaTransfer $appConfigCriteriaTransfer): * @return \Generated\Shared\Transfer\AppConfigResponseTransfer */ public function saveConfig(AppConfigTransfer $appConfigTransfer): AppConfigResponseTransfer; - - /** - * @param \Generated\Shared\Transfer\AppDisconnectTransfer $appDisconnectTransfer - * - * @return \Generated\Shared\Transfer\AppDisconnectResponseTransfer - */ - public function deleteConfig(AppDisconnectTransfer $appDisconnectTransfer): AppDisconnectResponseTransfer; } diff --git a/src/Spryker/Zed/AppKernel/Business/AppKernelBusinessFactory.php b/src/Spryker/Zed/AppKernel/Business/AppKernelBusinessFactory.php index e541bdf..4dcf5e7 100644 --- a/src/Spryker/Zed/AppKernel/Business/AppKernelBusinessFactory.php +++ b/src/Spryker/Zed/AppKernel/Business/AppKernelBusinessFactory.php @@ -8,8 +8,6 @@ namespace Spryker\Zed\AppKernel\Business; use Spryker\Zed\AppKernel\AppKernelDependencyProvider; -use Spryker\Zed\AppKernel\Business\Deleter\ConfigDeleter; -use Spryker\Zed\AppKernel\Business\Deleter\ConfigDeleterInterface; use Spryker\Zed\AppKernel\Business\EncryptionConfigurator\PropelEncryptionConfigurator; use Spryker\Zed\AppKernel\Business\EncryptionConfigurator\PropelEncryptionConfiguratorInterface; use Spryker\Zed\AppKernel\Business\Reader\ConfigReader; @@ -40,16 +38,6 @@ public function createConfigWriter(): ConfigWriterInterface $this->createPropelEncryptionConfigurator(), $this->getConfigurationBeforeSavePlugins(), $this->getConfigurationAfterSavePlugins(), - ); - } - - /** - * @return \Spryker\Zed\AppKernel\Business\Deleter\ConfigDeleterInterface - */ - public function createConfigDeleter(): ConfigDeleterInterface - { - return new ConfigDeleter( - $this->getEntityManager(), $this->getConfigurationBeforeDeletePlugins(), $this->getConfigurationAfterDeletePlugins(), ); diff --git a/src/Spryker/Zed/AppKernel/Business/AppKernelFacade.php b/src/Spryker/Zed/AppKernel/Business/AppKernelFacade.php index f237cc6..af7c4be 100644 --- a/src/Spryker/Zed/AppKernel/Business/AppKernelFacade.php +++ b/src/Spryker/Zed/AppKernel/Business/AppKernelFacade.php @@ -10,8 +10,6 @@ use Generated\Shared\Transfer\AppConfigCriteriaTransfer; use Generated\Shared\Transfer\AppConfigResponseTransfer; use Generated\Shared\Transfer\AppConfigTransfer; -use Generated\Shared\Transfer\AppDisconnectResponseTransfer; -use Generated\Shared\Transfer\AppDisconnectTransfer; use Spryker\Shared\Kernel\Transfer\TransferInterface; use Spryker\Zed\Kernel\Business\AbstractFacade; @@ -38,22 +36,6 @@ public function saveConfig(AppConfigTransfer $appConfigTransfer): AppConfigRespo ->saveConfig($appConfigTransfer); } - /** - * {@inheritDoc} - * - * @api - * - * @param \Generated\Shared\Transfer\AppDisconnectTransfer $appDisconnectTransfer - * - * @return \Generated\Shared\Transfer\AppDisconnectResponseTransfer - */ - public function deleteConfig(AppDisconnectTransfer $appDisconnectTransfer): AppDisconnectResponseTransfer - { - return $this->getFactory() - ->createConfigDeleter() - ->deleteConfig($appDisconnectTransfer); - } - /** * {@inheritDoc} * diff --git a/src/Spryker/Zed/AppKernel/Business/AppKernelFacadeInterface.php b/src/Spryker/Zed/AppKernel/Business/AppKernelFacadeInterface.php index 8730cac..88b3452 100644 --- a/src/Spryker/Zed/AppKernel/Business/AppKernelFacadeInterface.php +++ b/src/Spryker/Zed/AppKernel/Business/AppKernelFacadeInterface.php @@ -10,8 +10,6 @@ use Generated\Shared\Transfer\AppConfigCriteriaTransfer; use Generated\Shared\Transfer\AppConfigResponseTransfer; use Generated\Shared\Transfer\AppConfigTransfer; -use Generated\Shared\Transfer\AppDisconnectResponseTransfer; -use Generated\Shared\Transfer\AppDisconnectTransfer; use Spryker\Shared\Kernel\Transfer\TransferInterface; interface AppKernelFacadeInterface @@ -38,23 +36,6 @@ interface AppKernelFacadeInterface */ public function saveConfig(AppConfigTransfer $appConfigTransfer): AppConfigResponseTransfer; - /** - * Specification: - * - Deletes the App configuration from the DB. - * - Requires `AppDisconnectTransfer.tenantIdentifier` to be set. - * - Executes `ConfigurationBeforeDeletePluginInterface::beforeDelete()` method before the configuration is deleted from the database. - * - Executes `ConfigurationAfterDeletePluginInterface::afterDelete()` method after the configuration was deleted from the database. - * - Returns a successful `AppDisconnectResponseTransfer` when configuration was deleted from the database. - * - Returns a failed `AppDisconnectResponseTransfer` when configuration could not be deleted from the database. - * - * @api - * - * @param \Generated\Shared\Transfer\AppDisconnectTransfer $appDisconnectTransfer - * - * @return \Generated\Shared\Transfer\AppDisconnectResponseTransfer - */ - public function deleteConfig(AppDisconnectTransfer $appDisconnectTransfer): AppDisconnectResponseTransfer; - /** * Specification: * - Reads the App configuration from the DB. diff --git a/src/Spryker/Zed/AppKernel/Business/Deleter/ConfigDeleter.php b/src/Spryker/Zed/AppKernel/Business/Deleter/ConfigDeleter.php deleted file mode 100644 index 64f95e2..0000000 --- a/src/Spryker/Zed/AppKernel/Business/Deleter/ConfigDeleter.php +++ /dev/null @@ -1,92 +0,0 @@ - $configurationBeforeDeletePlugin - * @param array<\Spryker\Zed\AppKernelExtension\Dependency\Plugin\ConfigurationAfterDeletePluginInterface> $configurationAfterDeletePlugin - */ - public function __construct( - protected AppKernelEntityManagerInterface $appEntityManager, - protected array $configurationBeforeDeletePlugin = [], - protected array $configurationAfterDeletePlugin = [] - ) { - } - - /** - * @param \Generated\Shared\Transfer\AppDisconnectTransfer $appDisconnectTransfer - * - * @return \Generated\Shared\Transfer\AppDisconnectResponseTransfer - */ - public function deleteConfig(AppDisconnectTransfer $appDisconnectTransfer): AppDisconnectResponseTransfer - { - try { - $this->executeConfigurationBeforeDeletePlugin($appDisconnectTransfer); - - $appConfigCriteriaTransfer = (new AppConfigCriteriaTransfer()) - ->fromArray($appDisconnectTransfer->toArray(), true); - - $numberOfDeletedRows = $this->appEntityManager->deleteConfig($appConfigCriteriaTransfer); - - if ($numberOfDeletedRows === 0) { - return (new AppDisconnectResponseTransfer()) - ->setIsSuccessful(false) - ->setErrorMessage(static::DISCONNECT_ERROR_MESSAGE); - } - - $this->executeConfigurationAfterDeletePlugin($appDisconnectTransfer); - - return (new AppDisconnectResponseTransfer())->setIsSuccessful(true); - } catch (Throwable $throwable) { - return (new AppDisconnectResponseTransfer()) - ->setIsSuccessful(false) - ->setErrorMessage(sprintf('%s: %s', static::DISCONNECT_ERROR_MESSAGE, $throwable->getMessage())); - } - } - - /** - * @param \Generated\Shared\Transfer\AppDisconnectTransfer $appDisconnectTransfer - * - * @return void - */ - protected function executeConfigurationBeforeDeletePlugin(AppDisconnectTransfer $appDisconnectTransfer): void - { - foreach ($this->configurationBeforeDeletePlugin as $configurationBeforeDeletePlugin) { - $configurationBeforeDeletePlugin->beforeDelete($appDisconnectTransfer); - } - } - - /** - * @param \Generated\Shared\Transfer\AppDisconnectTransfer $appDisconnectTransfer - * - * @return void - */ - protected function executeConfigurationAfterDeletePlugin(AppDisconnectTransfer $appDisconnectTransfer): void - { - foreach ($this->configurationAfterDeletePlugin as $configurationAfterDeletePlugin) { - $configurationAfterDeletePlugin->afterDelete($appDisconnectTransfer); - } - } -} diff --git a/src/Spryker/Zed/AppKernel/Business/Deleter/ConfigDeleterInterface.php b/src/Spryker/Zed/AppKernel/Business/Deleter/ConfigDeleterInterface.php deleted file mode 100644 index b948b17..0000000 --- a/src/Spryker/Zed/AppKernel/Business/Deleter/ConfigDeleterInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - $configurationBeforeSavePlugins * @param array<\Spryker\Zed\AppKernelExtension\Dependency\Plugin\ConfigurationAfterSavePluginInterface> $configurationAfterSavePlugins + * @param array<\Spryker\Zed\AppKernelExtension\Dependency\Plugin\ConfigurationBeforeDeletePluginInterface> $configurationBeforeDeletePlugin + * @param array<\Spryker\Zed\AppKernelExtension\Dependency\Plugin\ConfigurationAfterDeletePluginInterface> $configurationAfterDeletePlugin */ public function __construct( protected AppKernelEntityManagerInterface $appEntityManager, protected AppKernelRepositoryInterface $appKernelRepository, protected PropelEncryptionConfiguratorInterface $propelEncryptionConfigurator, protected array $configurationBeforeSavePlugins = [], - protected array $configurationAfterSavePlugins = [] + protected array $configurationAfterSavePlugins = [], + protected array $configurationBeforeDeletePlugin = [], + protected array $configurationAfterDeletePlugin = [] ) { } @@ -77,16 +82,45 @@ public function saveConfig(AppConfigTransfer $appConfigTransfer): AppConfigRespo */ protected function doSaveAppConfig(AppConfigTransfer $appConfigTransfer): AppConfigTransfer { - $appConfigTransfer = $this->executeConfigurationBeforeSavePlugins($appConfigTransfer); + $appConfigTransfer = $this->executeBeforePlugins($appConfigTransfer); $this->configurePropelEncryption($appConfigTransfer); if (!$appConfigTransfer->getStatus()) { $appConfigTransfer->setStatus(AppKernelConfig::APP_STATUS_NEW); } + $appConfigTransfer = $this->appEntityManager->saveConfig($appConfigTransfer); - return $this->executeConfigurationAfterSavePlugins($appConfigTransfer); + return $this->executeAfterPlugins($appConfigTransfer); + } + + /** + * @param \Generated\Shared\Transfer\AppConfigTransfer $appConfigTransfer + * + * @return \Generated\Shared\Transfer\AppConfigTransfer + */ + protected function executeBeforePlugins(AppConfigTransfer $appConfigTransfer): AppConfigTransfer + { + if ($appConfigTransfer->getIsActive() !== false) { + return $this->executeConfigurationBeforeSavePlugins($appConfigTransfer); + } + + return $this->executeConfigurationBeforeDeletePlugins($appConfigTransfer); + } + + /** + * @param \Generated\Shared\Transfer\AppConfigTransfer $appConfigTransfer + * + * @return \Generated\Shared\Transfer\AppConfigTransfer + */ + protected function executeAfterPlugins(AppConfigTransfer $appConfigTransfer): AppConfigTransfer + { + if ($appConfigTransfer->getIsActive() !== false) { + return $this->executeConfigurationAfterSavePlugins($appConfigTransfer); + } + + return $this->executeConfigurationAfterDeletePlugins($appConfigTransfer); } /** @@ -156,4 +190,38 @@ protected function getFailResponse(string $errorMessage): AppConfigResponseTrans ->setIsSuccessful(false) ->setErrorMessage($errorMessage); } + + /** + * @param \Generated\Shared\Transfer\AppConfigTransfer $appConfigTransfer + * + * @return \Generated\Shared\Transfer\AppConfigTransfer + */ + protected function executeConfigurationBeforeDeletePlugins(AppConfigTransfer $appConfigTransfer): AppConfigTransfer + { + $appDisconnectTransfer = new AppDisconnectTransfer(); + $appDisconnectTransfer->setTenantIdentifier($appConfigTransfer->getTenantIdentifier()); + + foreach ($this->configurationBeforeDeletePlugin as $configurationBeforeDeletePlugin) { + $configurationBeforeDeletePlugin->beforeDelete($appDisconnectTransfer); + } + + return $appConfigTransfer; + } + + /** + * @param \Generated\Shared\Transfer\AppConfigTransfer $appConfigTransfer + * + * @return \Generated\Shared\Transfer\AppConfigTransfer + */ + protected function executeConfigurationAfterDeletePlugins(AppConfigTransfer $appConfigTransfer): AppConfigTransfer + { + $appDisconnectTransfer = new AppDisconnectTransfer(); + $appDisconnectTransfer->setTenantIdentifier($appConfigTransfer->getTenantIdentifier()); + + foreach ($this->configurationAfterDeletePlugin as $configurationAfterDeletePlugin) { + $configurationAfterDeletePlugin->afterDelete($appDisconnectTransfer); + } + + return $appConfigTransfer; + } } diff --git a/src/Spryker/Zed/AppKernel/Persistence/AppKernelEntityManager.php b/src/Spryker/Zed/AppKernel/Persistence/AppKernelEntityManager.php index dd976ae..9c964d1 100644 --- a/src/Spryker/Zed/AppKernel/Persistence/AppKernelEntityManager.php +++ b/src/Spryker/Zed/AppKernel/Persistence/AppKernelEntityManager.php @@ -7,7 +7,6 @@ namespace Spryker\Zed\AppKernel\Persistence; -use Generated\Shared\Transfer\AppConfigCriteriaTransfer; use Generated\Shared\Transfer\AppConfigTransfer; use Orm\Zed\AppKernel\Persistence\SpyAppConfig; use Spryker\Zed\Kernel\Persistence\AbstractEntityManager; @@ -43,18 +42,4 @@ public function saveConfig(AppConfigTransfer $appConfigTransfer): AppConfigTrans return $appConfigTransfer; } - - /** - * @param \Generated\Shared\Transfer\AppConfigCriteriaTransfer $appConfigCriteriaTransfer - * - * @return int Affected number of deleted rows - */ - public function deleteConfig(AppConfigCriteriaTransfer $appConfigCriteriaTransfer): int - { - $appConfigQuery = $this->getFactory()->createAppConfigQuery(); - - return $appConfigQuery - ->filterByTenantIdentifier($appConfigCriteriaTransfer->getTenantIdentifierOrFail()) - ->delete(); - } } diff --git a/src/Spryker/Zed/AppKernel/Persistence/AppKernelEntityManagerInterface.php b/src/Spryker/Zed/AppKernel/Persistence/AppKernelEntityManagerInterface.php index d7a3013..ec6236f 100644 --- a/src/Spryker/Zed/AppKernel/Persistence/AppKernelEntityManagerInterface.php +++ b/src/Spryker/Zed/AppKernel/Persistence/AppKernelEntityManagerInterface.php @@ -7,7 +7,6 @@ namespace Spryker\Zed\AppKernel\Persistence; -use Generated\Shared\Transfer\AppConfigCriteriaTransfer; use Generated\Shared\Transfer\AppConfigTransfer; interface AppKernelEntityManagerInterface @@ -18,11 +17,4 @@ interface AppKernelEntityManagerInterface * @return \Generated\Shared\Transfer\AppConfigTransfer */ public function saveConfig(AppConfigTransfer $appConfigTransfer): AppConfigTransfer; - - /** - * @param \Generated\Shared\Transfer\AppConfigCriteriaTransfer $appConfigCriteriaTransfer - * - * @return int Affected number of deleted rows - */ - public function deleteConfig(AppConfigCriteriaTransfer $appConfigCriteriaTransfer): int; } diff --git a/tests/SprykerTest/Glue/AppKernel/Controller/AppConfigureControllerTest.php b/tests/SprykerTest/Glue/AppKernel/Controller/AppConfigureControllerTest.php index 23b96fb..06edc83 100644 --- a/tests/SprykerTest/Glue/AppKernel/Controller/AppConfigureControllerTest.php +++ b/tests/SprykerTest/Glue/AppKernel/Controller/AppConfigureControllerTest.php @@ -64,6 +64,24 @@ public function testPostConfigureReturnsSuccessResponseWhenRequestIsValid(): voi $this->tester->assertAppConfigIsPersisted('tenant-identifier'); } + /** + * @return void + */ + public function testPostConfigureReturnsSuccessResponseAndActivatesTheAppConfigurationWhenAnAppConfigurationExistsAndWasMarkedAsDeactivated(): void + { + // Arrange + $glueRequest = $this->tester->createGlueRequestFromFixture('valid-config-request'); + $this->tester->havePersistedAppConfigTransfer([AppConfigTransfer::TENANT_IDENTIFIER => 'tenant-identifier', AppConfigTransfer::IS_ACTIVE => false]); + $appConfigController = $this->tester->createAppConfigController(); + + // Act + $glueResponse = $appConfigController->postConfigureAction($glueRequest); + + // Assert + $this->tester->assertGlueResponseContainsSuccessContents($glueRequest, $glueResponse); + $this->tester->assertAppConfigIsActivated('tenant-identifier'); + } + /** * @return void */ @@ -103,6 +121,46 @@ public function beforeSave(AppConfigTransfer $appConfigTransfer): AppConfigTrans $this->assertTrue($this->beforeSavePluginWasExecuted, 'Expected that the ConfigurationBeforeSavePluginInterface gets executed but was not.'); } + /** + * @return void + */ + public function testPostConfigureExecutesBeforeSavePluginWhenAnExistingAppConfigurationWasFoundAndIsSetToEnabledAgain(): void + { + // Arrange + $glueRequest = $this->tester->createGlueRequestFromFixture('valid-config-request'); + $this->tester->havePersistedAppConfigTransfer([AppConfigTransfer::TENANT_IDENTIFIER => 'tenant-identifier', AppConfigTransfer::IS_ACTIVE => false]); + $appConfigController = $this->tester->createAppConfigController(); + + $configurationBeforeSavePlugin = new class ($this) implements ConfigurationBeforeSavePluginInterface { + /** + * @param \SprykerTest\Glue\AppKernel\Controller\AppConfigureControllerTest $test + */ + public function __construct(protected AppConfigureControllerTest $test) + { + } + + /** + * @param \Generated\Shared\Transfer\AppConfigTransfer $appConfigTransfer + * + * @return \Generated\Shared\Transfer\AppConfigTransfer + */ + public function beforeSave(AppConfigTransfer $appConfigTransfer): AppConfigTransfer + { + $this->test->beforeSavePluginWasExecuted = true; + + return $appConfigTransfer; + } + }; + + $this->getDependencyProviderHelper()->setDependency(AppKernelDependencyProvider::PLUGIN_CONFIGURATION_BEFORE_SAVE_PLUGINS, [$configurationBeforeSavePlugin]); + + // Act + $appConfigController->postConfigureAction($glueRequest); + + // Assert + $this->assertTrue($this->beforeSavePluginWasExecuted, 'Expected that the ConfigurationBeforeSavePluginInterface gets executed but was not.'); + } + /** * @return void */ @@ -142,6 +200,46 @@ public function afterSave(AppConfigTransfer $appConfigTransfer): AppConfigTransf $this->assertTrue($this->afterSavePluginWasExecuted, 'Expected that the ConfigurationAfterSavePluginInterface gets executed but was not.'); } + /** + * @return void + */ + public function testPostConfigureExecutesAfterSavePluginWhenAnExistingAppConfigurationWasFoundAndIsSetToEnabledAgain(): void + { + // Arrange + $glueRequest = $this->tester->createGlueRequestFromFixture('valid-config-request'); + $this->tester->havePersistedAppConfigTransfer([AppConfigTransfer::TENANT_IDENTIFIER => 'tenant-identifier', AppConfigTransfer::IS_ACTIVE => false]); + $appConfigController = $this->tester->createAppConfigController(); + + $configurationAfterSavePlugin = new class ($this) implements ConfigurationAfterSavePluginInterface { + /** + * @param \SprykerTest\Glue\AppKernel\Controller\AppConfigureControllerTest $test + */ + public function __construct(protected AppConfigureControllerTest $test) + { + } + + /** + * @param \Generated\Shared\Transfer\AppConfigTransfer $appConfigTransfer + * + * @return \Generated\Shared\Transfer\AppConfigTransfer + */ + public function afterSave(AppConfigTransfer $appConfigTransfer): AppConfigTransfer + { + $this->test->afterSavePluginWasExecuted = true; + + return $appConfigTransfer; + } + }; + + $this->getDependencyProviderHelper()->setDependency(AppKernelDependencyProvider::PLUGIN_CONFIGURATION_AFTER_SAVE_PLUGINS, [$configurationAfterSavePlugin]); + + // Act + $appConfigController->postConfigureAction($glueRequest); + + // Assert + $this->assertTrue($this->afterSavePluginWasExecuted, 'Expected that the ConfigurationAfterSavePluginInterface gets executed but was not.'); + } + /** * @return void */ diff --git a/tests/SprykerTest/Glue/AppKernel/Controller/AppDisconnectControllerTest.php b/tests/SprykerTest/Glue/AppKernel/Controller/AppDisconnectControllerTest.php index e02cb4f..ac373d8 100644 --- a/tests/SprykerTest/Glue/AppKernel/Controller/AppDisconnectControllerTest.php +++ b/tests/SprykerTest/Glue/AppKernel/Controller/AppDisconnectControllerTest.php @@ -66,7 +66,7 @@ public function testPostDisconnectReturnsSuccessResponseWhenAppSuccessfullyDisco // Assert $this->tester->assertGlueResponseContainsSuccessContentsWhenDisconnectIsSuccessful($glueResponse); - $this->tester->assertAppConfigIsNotPersisted($appConfigTransfer->getTenantIdentifier()); + $this->tester->assertAppConfigIsDeactivated($appConfigTransfer->getTenantIdentifier()); } /** @@ -174,6 +174,8 @@ public function testPostDisconnectRequestReturnsInvalidResponseWhenXTenantIdenti } /** + * This should fail because there is no configuration for the tenant identifier. + * * @return void */ public function testPostDisconnectReturnsErrorResponseWithStatusCode400WhenAppCouldNotBeDisconnected(): void diff --git a/tests/SprykerTest/Zed/AppKernel/_support/Helper/AppKernelAssertionHelper.php b/tests/SprykerTest/Zed/AppKernel/_support/Helper/AppKernelAssertionHelper.php index cad9cfa..7d64719 100644 --- a/tests/SprykerTest/Zed/AppKernel/_support/Helper/AppKernelAssertionHelper.php +++ b/tests/SprykerTest/Zed/AppKernel/_support/Helper/AppKernelAssertionHelper.php @@ -44,9 +44,57 @@ public function assertAppConfigIsNotPersisted(string $tenantIdentifier): void ->toArray(); $this->assertSame(0, count($appConfigEntities), sprintf( - 'Expected to have no persisted configurations for tenant identifier "%s" but found "%d".', + 'Expected to have exactly no persisted configuration for tenant identifier "%s" but found "%d".', $tenantIdentifier, count($appConfigEntities), )); } + + /** + * @param string $tenantIdentifier + * + * @return void + */ + public function assertAppConfigIsActivated(string $tenantIdentifier): void + { + $appConfigEntities = SpyAppConfigQuery::create() + ->filterByTenantIdentifier($tenantIdentifier) + ->find() + ->toArray(); + + $this->assertSame(1, count($appConfigEntities), sprintf( + 'Expected to have one persisted configurations for tenant identifier "%s" but found "%d".', + $tenantIdentifier, + count($appConfigEntities), + )); + + $this->assertTrue($appConfigEntities[0]['IsActive'] === true, sprintf( + 'Expected to have the configuration for tenant identifier "%s" activated but it is deactivated.', + $tenantIdentifier, + )); + } + + /** + * @param string $tenantIdentifier + * + * @return void + */ + public function assertAppConfigIsDeactivated(string $tenantIdentifier): void + { + $appConfigEntities = SpyAppConfigQuery::create() + ->filterByTenantIdentifier($tenantIdentifier) + ->find() + ->toArray(); + + $this->assertSame(1, count($appConfigEntities), sprintf( + 'Expected to have one persisted configurations for tenant identifier "%s" but found "%d".', + $tenantIdentifier, + count($appConfigEntities), + )); + + $this->assertTrue($appConfigEntities[0]['IsActive'] === false, sprintf( + 'Expected to have the configuration for tenant identifier "%s" deactivated but it is activated.', + $tenantIdentifier, + )); + } }