magento2-docker/dev/tests/integration/testsuite/Magento/Framework/Communication/ConfigTest.php

421 lines
15 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Framework\Communication;
/**
* Test of communication configuration reading and parsing.
*
* @magentoCache config disabled
*/
class ConfigTest extends \PHPUnit\Framework\TestCase
{
/**
* Check how valid communication XML config is parsed.
*/
public function testGetTopics()
{
$topics = $this->getConfigInstance(
[__DIR__ . '/_files/valid_communication.xml', __DIR__ . '/_files/valid_communication_extra.xml']
)->getTopics();
$expectedParsedTopics = include __DIR__ . '/_files/valid_communication_expected.php';
$this->assertEquals($expectedParsedTopics, $topics);
}
/**
* Get topic configuration by its name
*
*/
public function testGetTopicsNumeric()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Service method specified in the definition of topic "customerDeletedNumbers" is not av'
);
$this->getConfigInstance([__DIR__ . '/_files/valid_communication_numeric.xml'])->getTopics();
}
// @codingStandardsIgnoreStart
/**
* Get topic configuration by its name
*
Element 'topic', attribute 'schema': [facet 'pattern'] The value '55\Customer\Api\CustomerRepositoryInterface::delete' is not accepted by the pattern '[a-zA-Z]+[a-zA-Z0-9\\]+::[a-zA-Z0-9]+'.
Line: 9
Element 'topic', attribute 'schema': '55\Customer\Api\CustomerRepositoryInterface::delete' is not a valid value of the atomic type 'schemaType'.
Line: 9
Element 'handler', attribute 'type': [facet 'pattern'] The value '55\Customer\Api\CustomerRepositoryInterface' is not accepted by the pattern '[a-zA-Z]+[a-zA-Z0-9\\]+'.
Line: 10
Element 'handler', attribute 'type': '55\Customer\Api\CustomerRepositoryInterface' is not a valid value of the atomic type 'serviceTypeType'.
Line: 10
Verify the XML and try again.
*
*/
// @codingStandardsIgnoreEnd
public function testGetTopicsNumericInvalid()
{
$this->expectException(\Magento\Framework\Exception\LocalizedException::class);
$this->expectExceptionMessage('The XML in file "0" is invalid:');
$this->getConfigInstance([__DIR__ . '/_files/invalid_communication_numeric.xml'])->getTopics();
}
/**
* Get topic configuration by its name
*/
public function testGetTopic()
{
$topics = $this->getConfigInstance(
[__DIR__ . '/_files/valid_communication.xml', __DIR__ . '/_files/valid_communication_extra.xml']
)->getTopic('customerCreated');
$expectedParsedTopics = include __DIR__ . '/_files/valid_communication_expected.php';
$this->assertEquals($expectedParsedTopics['customerCreated'], $topics);
}
/**
* Get topic configuration by its name
*
*/
public function testGetTopicInvalidName()
{
$this->expectException(\Magento\Framework\Exception\LocalizedException::class);
$this->expectExceptionMessage('Topic "invalidTopic" is not configured.');
$this->getConfigInstance([__DIR__ . '/_files/valid_communication.xml'])->getTopic('invalidTopic');
}
/**
*/
public function testGetTopicsExceptionMissingRequest()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Either "request" or "schema" attribute must be specified for topic "customerUpdated"'
);
$this->getConfigInstance([__DIR__ . '/_files/communication_missing_request.xml'])->getTopics();
}
/**
*/
public function testGetTopicsExceptionNotExistingServiceMethod()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage('Service method specified in the definition of topic "customerRetrieved" is not');
$this->getConfigInstance([__DIR__ . '/_files/communication_not_existing_service_method.xml'])->getTopics();
}
/**
*/
public function testGetTopicsExceptionNotExistingService()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage('Service method specified in the definition of topic "customerRetrieved" is not');
$this->getConfigInstance([__DIR__ . '/_files/communication_not_existing_service.xml'])->getTopics();
}
/**
*/
public function testGetTopicsExceptionNoAttributes()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Either "request" or "schema" attribute must be specified for topic "customerRetrieved"'
);
$this->getConfigInstance([__DIR__ . '/_files/communication_no_attributes.xml'])->getTopics();
}
/**
*/
public function testGetTopicsExceptionInvalidResponseSchema()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Response schema definition for topic "customerUpdated" should reference existing'
);
$this->getConfigInstance([__DIR__ . '/_files/communication_response_not_existing_service.xml'])->getTopics();
}
/**
*/
public function testGetTopicsExceptionInvalidRequestSchema()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Request schema definition for topic "customerUpdated" should reference existing'
);
$this->getConfigInstance([__DIR__ . '/_files/communication_request_not_existing_service.xml'])->getTopics();
}
/**
*/
public function testGetTopicsExceptionMultipleHandlersSynchronousMode()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Topic "customerDeleted" is configured for synchronous requests, that is why it must'
);
$this->getConfigInstance([__DIR__ . '/_files/communication_multiple_handlers_synchronous_mode.xml'])
->getTopics();
}
/**
*/
public function testGetTopicsExceptionInvalidHandler()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Service method specified in the definition of handler "customHandler" for topic "custo'
);
$this->getConfigInstance([__DIR__ . '/_files/communication_not_existing_handler_method.xml'])->getTopics();
}
/**
*/
public function testGetTopicsExceptionInvalidTopicNameInEnv()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Topic name "customerAdded" and attribute "name" = "customerCreated" must be equal'
);
$this->getConfigInstance(
[__DIR__ . '/_files/valid_communication.xml'],
__DIR__ . '/_files/communication_invalid_topic_name.php'
)->getTopics();
}
/**
*/
public function testGetTopicsExceptionTopicWithoutDataInEnv()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage('Topic "customerCreated" must contain data');
$this->getConfigInstance(
[__DIR__ . '/_files/valid_communication.xml'],
__DIR__ . '/_files/communication_topic_without_data.php'
)->getTopics();
}
/**
*/
public function testGetTopicsExceptionTopicWithMissedKeysInEnv()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage('Topic "customerCreated" has missed keys: [response]');
$this->getConfigInstance(
[__DIR__ . '/_files/valid_communication.xml'],
__DIR__ . '/_files/communication_topic_with_missed_keys.php'
)->getTopics();
}
/**
*/
public function testGetTopicsExceptionTopicWithExcessiveKeysInEnv()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage('Topic "customerCreated" has excessive keys: [some_incorrect_key]');
$this->getConfigInstance(
[__DIR__ . '/_files/valid_communication.xml'],
__DIR__ . '/_files/communication_topic_with_excessive_keys.php'
)->getTopics();
}
/**
*/
public function testGetTopicsExceptionTopicWithNonMatchedNameInEnv()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Topic name "customerDeleted" and attribute "name" = "customerRemoved" must be equal'
);
$this->getConfigInstance(
[__DIR__ . '/_files/valid_communication.xml'],
__DIR__ . '/_files/communication_with_non_matched_name.php'
)->getTopics();
}
/**
*/
public function testGetTopicsExceptionMultipleHandlersSynchronousModeInEnv()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Topic "customerDeleted" is configured for synchronous requests, that is why it must'
);
$this->getConfigInstance(
[__DIR__ . '/_files/valid_communication.xml'],
__DIR__ . '/_files/communication_multiple_handlers_synchronous_mode.php'
)->getTopics();
}
/**
*/
public function testGetTopicsExceptionInvalidRequestSchemaInEnv()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Request schema definition for topic "customerCreated" should reference existing service'
);
$this->getConfigInstance(
[__DIR__ . '/_files/valid_communication.xml'],
__DIR__ . '/_files/communication_request_not_existing_service.php'
)->getTopics();
}
/**
*/
public function testGetTopicsExceptionInvalidResponseSchemaInEnv()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Response schema definition for topic "customerCreated" should reference existing type o'
);
$this->getConfigInstance(
[__DIR__ . '/_files/valid_communication.xml'],
__DIR__ . '/_files/communication_response_not_existing_service.php'
)->getTopics();
}
/**
*/
public function testGetTopicsExceptionInvalidMethodInHandlerInEnv()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Service method specified in the definition of handler "customerCreatedFirst" for topic'
);
$this->getConfigInstance(
[__DIR__ . '/_files/valid_communication.xml'],
__DIR__ . '/_files/communication_not_existing_handler_method.php'
)->getTopics();
}
/**
*/
public function testGetTopicsExceptionWithDisabledHandlerInEnv()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Disabled handler "default" for topic "customerCreated" cannot be added to the config fi'
);
$this->getConfigInstance(
[__DIR__ . '/_files/valid_communication.xml'],
__DIR__ . '/_files/communication_with_disabled_handler.php'
)->getTopics();
}
/**
*/
public function testGetTopicsExceptionIncorrectRequestSchemaTypeInEnv()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'Request schema type for topic "customerCreated" must be "object_interface" or "service_'
);
$this->getConfigInstance(
[__DIR__ . '/_files/valid_communication.xml'],
__DIR__ . '/_files/communication_incorrect_request_schema_type.php'
)->getTopics();
}
/**
*/
public function testGetTopicsExceptionIsNotBooleanTypeOfIsSynchronousInEnv()
{
$this->expectException(\LogicException::class);
$this->expectExceptionMessage(
'The attribute "is_synchronous" for topic "customerCreated" should have the value of the'
);
$this->getConfigInstance(
[__DIR__ . '/_files/valid_communication.xml'],
__DIR__ . '/_files/communication_is_synchronous_is_not_boolean.php'
)->getTopics();
}
/**
* Create config instance initialized with configuration from $configFilePath
*
* @param array $configFilePaths
* @param string|null $envConfigFilePath
* @return \Magento\Framework\Communication\ConfigInterface
*/
protected function getConfigInstance($configFilePaths, $envConfigFilePath = null)
{
$fileResolver = $this->getMockForAbstractClass(\Magento\Framework\Config\FileResolverInterface::class);
$fileResolverResult = [];
foreach ($configFilePaths as $configFilePath) {
$fileResolverResult[] = file_get_contents($configFilePath);
}
$fileResolver->expects($this->any())
->method('get')
->willReturn($fileResolverResult);
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
$xmlReader = $objectManager->create(
\Magento\Framework\Communication\Config\Reader\XmlReader::class,
['fileResolver' => $fileResolver]
);
$deploymentConfigReader = $this->getMockBuilder(\Magento\Framework\App\DeploymentConfig\Reader::class)
->disableOriginalConstructor()
->setMethods([])
->getMock();
$envConfigData = include $envConfigFilePath ?: __DIR__ . '/_files/valid_communication_input.php';
$deploymentConfigReader->expects($this->any())->method('load')->willReturn($envConfigData);
$deploymentConfig = $objectManager->create(
\Magento\Framework\App\DeploymentConfig::class,
['reader' => $deploymentConfigReader]
);
$methodsMap = $objectManager->create(\Magento\Framework\Reflection\MethodsMap::class);
$envReader = $objectManager->create(
\Magento\Framework\Communication\Config\Reader\EnvReader::class,
[
'deploymentConfig' => $deploymentConfig,
'methodsMap' => $methodsMap
]
);
$readersConfig = [
'xmlReader' => ['reader' => $xmlReader, 'sortOrder' => 10],
'envReader' => ['reader' => $envReader, 'sortOrder' => 20]
];
/** @var \Magento\Framework\Communication\Config\CompositeReader $reader */
$reader = $objectManager->create(
\Magento\Framework\Communication\Config\CompositeReader::class,
['readers' => $readersConfig]
);
/** @var \Magento\Framework\Communication\Config $config */
$configData = $objectManager->create(
\Magento\Framework\Communication\Config\Data::class,
[
'reader' => $reader
]
);
return $objectManager->create(
\Magento\Framework\Communication\ConfigInterface::class,
['configData' => $configData]
);
}
}