123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- <?php
- /**
- * Test for validation rules implemented by XSD schemas for email templates configuration
- *
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Email\Test\Unit\Model\Template\Config;
- class XsdTest extends \PHPUnit\Framework\TestCase
- {
- /**
- * Test validation rules implemented by XSD schema for merged configs
- *
- * @param string $fixtureXml
- * @param array $expectedErrors
- * @dataProvider mergedXmlDataProvider
- */
- public function testMergedXml($fixtureXml, array $expectedErrors)
- {
- if (!function_exists('libxml_set_external_entity_loader')) {
- $this->markTestSkipped('Skipped on HHVM. Will be fixed in MAGETWO-45033');
- }
- $urnResolver = new \Magento\Framework\Config\Dom\UrnResolver();
- $schemaFile = $urnResolver->getRealPath('urn:magento:module:Magento_Email:etc/email_templates.xsd');
- $this->_testXmlAgainstXsd($fixtureXml, $schemaFile, $expectedErrors);
- }
- /**
- * @return array
- */
- public function mergedXmlDataProvider()
- {
- // @codingStandardsIgnoreStart
- return [
- 'valid' => [
- '<config><template id="test" label="Test" file="test.txt" type="text" module="Module" area="frontend"/></config>',
- [],
- ],
- 'empty root node' => [
- '<config/>',
- ["Element 'config': Missing child element(s). Expected is ( template )."],
- ],
- 'irrelevant root node' => [
- '<template id="test" label="Test" file="test.txt" type="text" module="Module" area="frontend"/>',
- ["Element 'template': No matching global declaration available for the validation root."],
- ],
- 'invalid node' => [
- '<config><invalid/></config>',
- ["Element 'invalid': This element is not expected. Expected is ( template )."],
- ],
- 'node "template" with value' => [
- '<config>
- <template id="test" label="Test" file="test.txt" type="text" module="Module" area="frontend">invalid</template>
- </config>',
- ["Element 'template': Character content is not allowed, because the content type is empty."],
- ],
- 'node "template" with children' => [
- '<config>
- <template id="test" label="Test" file="test.txt" type="text" module="Module" area="frontend"><invalid/></template>
- </config>',
- ["Element 'template': Element content is not allowed, because the content type is empty."],
- ],
- 'node "template" without attribute "id"' => [
- '<config><template label="Test" file="test.txt" type="text" module="Module" area="frontend"/></config>',
- ["Element 'template': The attribute 'id' is required but missing."],
- ],
- 'node "template" without attribute "label"' => [
- '<config><template id="test" file="test.txt" type="text" module="Module" area="frontend"/></config>',
- ["Element 'template': The attribute 'label' is required but missing."],
- ],
- 'node "template" without attribute "file"' => [
- '<config><template id="test" label="Test" type="text" module="Module" area="frontend"/></config>',
- ["Element 'template': The attribute 'file' is required but missing."],
- ],
- 'node "template" without attribute "type"' => [
- '<config><template id="test" label="Test" file="test.txt" module="Module" area="frontend"/></config>',
- ["Element 'template': The attribute 'type' is required but missing."],
- ],
- 'node "template" with invalid attribute "type"' => [
- '<config><template id="test" label="Test" file="test.txt" type="invalid" module="Module" area="frontend"/></config>',
- [
- "Element 'template', attribute 'type': " .
- "[facet 'enumeration'] The value 'invalid' is not an element of the set {'html', 'text'}.",
- "Element 'template', attribute 'type': " .
- "'invalid' is not a valid value of the atomic type 'emailTemplateFormatType'."
- ],
- ],
- 'node "template" without attribute "area"' => [
- '<config><template id="test" label="Test" file="test.txt" type="text" module="Module"/></config>',
- ["Element 'template': The attribute 'area' is required but missing."],
- ],
- 'node "template" with invalid attribute "area"' => [
- '<config><template id="test" label="Test" file="test.txt" type="text" module="Module" area="invalid"/></config>',
- [
- "Element 'template', attribute 'area': " .
- "[facet 'enumeration'] The value 'invalid' is not an element of the set {'frontend', 'adminhtml'}.",
- "Element 'template', attribute 'area': " .
- "'invalid' is not a valid value of the atomic type 'areaType'."
- ],
- ],
- 'node "template" with unknown attribute' => [
- '<config>
- <template id="test" label="Test" file="test.txt" type="text" module="Module" area="frontend" unknown="true"/>
- </config>',
- ["Element 'template', attribute 'unknown': The attribute 'unknown' is not allowed."],
- ]
- ];
- // @codingStandardsIgnoreEnd
- }
- /**
- * Test that XSD schema validates fixture XML contents producing expected results
- *
- * @param string $fixtureXml
- * @param string $schemaFile
- * @param array $expectedErrors
- */
- protected function _testXmlAgainstXsd($fixtureXml, $schemaFile, array $expectedErrors)
- {
- $validationStateMock = $this->createMock(\Magento\Framework\Config\ValidationStateInterface::class);
- $validationStateMock->method('isValidationRequired')
- ->willReturn(true);
- $dom = new \Magento\Framework\Config\Dom($fixtureXml, $validationStateMock, [], null, null, '%message%');
- $actualResult = $dom->validate($schemaFile, $actualErrors);
- $this->assertEquals(empty($expectedErrors), $actualResult);
- $this->assertEquals($expectedErrors, $actualErrors);
- }
- }
|