![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-customer/Test/Unit/Block/Widget/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Magento\Customer\Test\Unit\Block\Widget; use Magento\Customer\Api\CustomerMetadataInterface; use Magento\Customer\Api\Data\AttributeMetadataInterface; use Magento\Customer\Api\Data\ValidationRuleInterface; use Magento\Customer\Block\Widget\Dob; use Magento\Customer\Helper\Address; use Magento\Framework\App\CacheInterface; use Magento\Framework\Cache\FrontendInterface; use Magento\Framework\Data\Form\FilterFactory; use Magento\Framework\Escaper; use Magento\Framework\Exception\NoSuchEntityException; use Magento\Framework\Json\EncoderInterface; use Magento\Framework\Locale\Resolver; use Magento\Framework\Locale\ResolverInterface; use Magento\Framework\Stdlib\DateTime\Intl\DateFormatterFactory; use Magento\Framework\Stdlib\DateTime\Timezone; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use Magento\Framework\View\Element\Html\Date; use Magento\Framework\View\Element\Template\Context; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Zend_Cache_Backend_BlackHole; use Zend_Cache_Core; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.TooManyPublicMethods) */ class DobTest extends TestCase { /** Constants used in the unit tests */ const MIN_DATE = '01/01/2010'; const MAX_DATE = '01/01/2020'; const DATE = '01/01/2014'; const DAY = '01'; // Value of date('d', strtotime(self::DATE)) const MONTH = '01'; // Value of date('m', strtotime(self::DATE)) const YEAR = '2014'; // Value of date('Y', strtotime(self::DATE)) const DATE_FORMAT = 'M/dd/y'; /** Constants used by Dob::setDateInput($code, $html) */ const DAY_HTML = '<div><label for="day"><span>d</span></label><input type="text" id="day" name="Day" value="1"></div>'; const MONTH_HTML = '<div><label for="month"><span>M</span></label><input type="text" id="month" name="Month" value="jan"></div>'; const YEAR_HTML = '<div><label for="year"><span>yy</span></label><input type="text" id="year" name="Year" value="14"></div>'; /** @var MockObject|AttributeMetadataInterface */ protected $attribute; /** @var Dob */ protected $_block; /** @var MockObject|CustomerMetadataInterface */ protected $customerMetadata; /** * @var FilterFactory|MockObject */ protected $filterFactory; /** * @var Escaper */ private $escaper; /** * @var Context */ private $context; /** * @var string */ private $_locale; /** * @var EncoderInterface */ private $encoder; /** * @var ResolverInterface */ private $localeResolver; /** * @inheritDoc */ protected function setUp(): void { $zendCacheCore = new Zend_Cache_Core(); $zendCacheCore->setBackend(new Zend_Cache_Backend_BlackHole()); $frontendCache = $this->getMockForAbstractClass( FrontendInterface::class, [], '', false ); $frontendCache->expects($this->any())->method('getLowLevelFrontend')->willReturn($zendCacheCore); $cache = $this->getMockForAbstractClass(CacheInterface::class); $cache->expects($this->any())->method('getFrontend')->willReturn($frontendCache); $objectManager = new ObjectManager($this); $this->localeResolver = $this->getMockForAbstractClass(ResolverInterface::class); $this->localeResolver->expects($this->any()) ->method('getLocale') ->willReturnCallback( function () { return $this->_locale; } ); $localeResolver = $this->localeResolver; $timezone = $objectManager->getObject( Timezone::class, ['localeResolver' => $localeResolver, 'dateFormatterFactory' => new DateFormatterFactory()] ); $this->_locale = Resolver::DEFAULT_LOCALE; $this->context = $this->createMock(Context::class); $this->context->expects($this->any())->method('getLocaleDate')->willReturn($timezone); $this->escaper = $this->getMockBuilder(Escaper::class) ->disableOriginalConstructor() ->setMethods(['escapeHtml']) ->getMock(); $this->context->expects($this->any())->method('getEscaper')->willReturn($this->escaper); $this->attribute = $this->getMockBuilder(AttributeMetadataInterface::class) ->getMockForAbstractClass(); $this->attribute ->expects($this->any()) ->method('getInputFilter') ->willReturn('date'); $this->customerMetadata = $this->getMockBuilder(CustomerMetadataInterface::class) ->getMockForAbstractClass(); $this->customerMetadata->expects($this->any()) ->method('getAttributeMetadata') ->willReturn($this->attribute); $this->filterFactory = $this->createMock(FilterFactory::class); $this->filterFactory ->expects($this->any()) ->method('create') ->willReturnCallback( function () use ($timezone, $localeResolver) { return new \Magento\Framework\Data\Form\Filter\Date( $timezone->getDateFormatWithLongYear(), $localeResolver ); } ); $this->encoder = $this->getMockForAbstractClass(EncoderInterface::class); $this->_block = new Dob( $this->context, $this->createMock(Address::class), $this->customerMetadata, $this->createMock(Date::class), $this->filterFactory, [], $this->encoder, $this->localeResolver ); } /** * @param bool $isVisible Determines whether the 'dob' attribute is visible or enabled * @param bool $expectedValue The value we expect from Dob::isEnabled() * * @dataProvider isEnabledDataProvider */ public function testIsEnabled($isVisible, $expectedValue) { $this->attribute->expects($this->once())->method('isVisible')->willReturn($isVisible); $this->assertSame($expectedValue, $this->_block->isEnabled()); } /** * @return array */ public function isEnabledDataProvider() { return [[true, true], [false, false]]; } /** * Tests isEnabled() */ public function testIsEnabledWithException() { $this->customerMetadata->expects($this->any()) ->method('getAttributeMetadata') ->willThrowException( new NoSuchEntityException( __( 'No such entity with %fieldName = %fieldValue', ['fieldName' => 'field', 'fieldValue' => 'value'] ) ) ); $this->assertFalse($this->_block->isEnabled()); } /** * @param bool $isRequired Determines whether the 'dob' attribute is required * @param bool $expectedValue The value we expect from Dob::isRequired() * * @dataProvider isRequiredDataProvider */ public function testIsRequired($isRequired, $expectedValue) { $this->attribute->expects($this->once())->method('isRequired')->willReturn($isRequired); $this->assertSame($expectedValue, $this->_block->isRequired()); } public function testIsRequiredWithException() { $this->customerMetadata->expects($this->any()) ->method('getAttributeMetadata') ->willThrowException( new NoSuchEntityException( __( 'No such entity with %fieldName = %fieldValue', ['fieldName' => 'field', 'fieldValue' => 'value'] ) ) ); $this->assertFalse($this->_block->isRequired()); } /** * @return array */ public function isRequiredDataProvider() { return [[true, true], [false, false]]; } /** * @param string|bool $date Date (e.g. '01/01/2020' or false for no date) * @param int|bool $expectedTime The value we expect from Dob::getTime() * @param string|bool $expectedDate The value we expect from Dob::getData('date') * @param string $locale * @dataProvider setDateDataProvider */ public function testSetDate($date, $expectedTime, $expectedDate, $locale = Resolver::DEFAULT_LOCALE) { $this->_locale = $locale; $this->assertSame($this->_block, $this->_block->setDate($date)); $this->assertSame($expectedTime, $this->_block->getTime()); $this->assertSame($expectedDate, $this->_block->getValue()); } /** * @return array */ public function setDateDataProvider() { return [ [false, false, false], ['', false, ''], ['12/31/1999', strtotime('1999-12-31'), '12/31/1999', 'en_US'], ['31-12-1999', strtotime('1999-12-31'), '12/31/1999', 'en_US'], ['1999-12-31', strtotime('1999-12-31'), '12/31/1999', 'en_US'], ['31 December 1999', strtotime('1999-12-31'), '12/31/1999', 'en_US'], ['12/31/1999', strtotime('1999-12-31'), '31/12/1999', 'fr_FR'], ['31-12-1999', strtotime('1999-12-31'), '31/12/1999', 'fr_FR'], ['31/12/1999', strtotime('1999-12-31'), '31/12/1999', 'fr_FR'], ['1999-12-31', strtotime('1999-12-31'), '31/12/1999', 'fr_FR'], ['31 Décembre 1999', strtotime('1999-12-31'), '31/12/1999', 'fr_FR'], ]; } /** * @param string|bool $date The date (e.g. '01/01/2020' or false for no date) * @param string $expectedDay The value we expect from Dob::getDay() * * @dataProvider getDayDataProvider */ public function testGetDay($date, $expectedDay) { $this->_block->setDate($date); $this->assertEquals($expectedDay, $this->_block->getDay()); } /** * @return array */ public function getDayDataProvider() { return [[self::DATE, self::DAY], [false, '']]; } /** * @param string|bool $date The date (e.g. '01/01/2020' or false for no date) * @param string $expectedMonth The value we expect from Dob::getMonth() * * @dataProvider getMonthDataProvider */ public function testGetMonth($date, $expectedMonth) { $this->_block->setDate($date); $this->assertEquals($expectedMonth, $this->_block->getMonth()); } /** * @return array */ public function getMonthDataProvider() { return [[self::DATE, self::MONTH], [false, '']]; } /** * @param string|bool $date The date (e.g. '01/01/2020' or false for no date) * @param string $expectedYear The value we expect from Dob::getYear() * * @dataProvider getYearDataProvider */ public function testGetYear($date, $expectedYear) { $this->_block->setDate($date); $this->assertEquals($expectedYear, $this->_block->getYear()); } /** * @return array */ public function getYearDataProvider() { return [[self::DATE, self::YEAR], [false, '']]; } /** * Is used to derive the Locale that is used to determine the value of Dob::getDateFormat() for that Locale * * @param string $locale * @param string $expectedFormat * @dataProvider getDateFormatDataProvider */ public function testGetDateFormat(string $locale, string $expectedFormat) { $this->_locale = $locale; $this->assertEquals($expectedFormat, $this->_block->getDateFormat()); } /** * @return array */ public function getDateFormatDataProvider(): array { return [ [ 'ar_SA', preg_replace( '/(?<!d)d(?!d)/', 'dd', preg_replace( '/[^MmDdYy\/\.\-]/', '', (new DateFormatterFactory()) ->create('ar_SA', \IntlDateFormatter::SHORT, \IntlDateFormatter::NONE) ->getPattern() ) ) ], [Resolver::DEFAULT_LOCALE, self::DATE_FORMAT], ]; } /** * This tests the Dob::setDateInput() method. The Dob::getSortedDateInputs() uses the value of * Dob::getDateFormat() to derive the return value, which is equivalent to self::DATE_FORMAT. */ public function testGetSortedDateInputs() { $this->_block->setDateInput('d', self::DAY_HTML); $this->_block->setDateInput('m', self::MONTH_HTML); $this->_block->setDateInput('y', self::YEAR_HTML); $this->assertEquals(self::MONTH_HTML . self::DAY_HTML . self::YEAR_HTML, $this->_block->getSortedDateInputs()); } /** * This tests the Dob::setDateInput() method. The Dob::getSortedDateInputs() uses the value of * Dob::getDateFormat() to derive the return value, which is equivalent to self::DATE_FORMAT. */ public function testGetSortedDateInputsWithoutStrippingNonInputChars() { $this->_block->setDateInput('d', self::DAY_HTML); $this->_block->setDateInput('m', self::MONTH_HTML); $this->_block->setDateInput('y', self::YEAR_HTML); $this->assertEquals( self::MONTH_HTML . '/' . self::DAY_HTML . '/' . self::YEAR_HTML, $this->_block->getSortedDateInputs(false) ); } /** * @param array $validationRules The date Min/Max validation rules * @param int $expectedValue The value we expect from Dob::getMinDateRange() * * @dataProvider getMinDateRangeDataProvider */ public function testGetMinDateRange($validationRules, $expectedValue) { $this->attribute->expects($this->once()) ->method('getValidationRules') ->willReturn($validationRules); $this->assertEquals($expectedValue, $this->_block->getMinDateRange()); } /** * @return array */ public function getMinDateRangeDataProvider() { $emptyValidationRule = $this->getMockBuilder(ValidationRuleInterface::class) ->disableOriginalConstructor() ->setMethods(['getName', 'getValue']) ->getMockForAbstractClass(); $validationRule = $this->getMockBuilder(ValidationRuleInterface::class) ->disableOriginalConstructor() ->setMethods(['getName', 'getValue']) ->getMockForAbstractClass(); $validationRule->expects($this->any()) ->method('getName') ->willReturn(Dob::MIN_DATE_RANGE_KEY); $validationRule->expects($this->any()) ->method('getValue') ->willReturn(strtotime(self::MIN_DATE)); return [ [ [ $validationRule, ], date('Y/m/d', strtotime(self::MIN_DATE)), ], [ [ $emptyValidationRule, ], null ] ]; } /** * Tests getMinDateRange() */ public function testGetMinDateRangeWithException() { $this->customerMetadata->expects($this->any()) ->method('getAttributeMetadata') ->willThrowException( new NoSuchEntityException( __( 'No such entity with %fieldName = %fieldValue', ['fieldName' => 'field', 'fieldValue' => 'value'] ) ) ); $this->assertNull($this->_block->getMinDateRange()); } /** * @param array $validationRules The date Min/Max validation rules * @param int $expectedValue The value we expect from Dob::getMaxDateRange() * * @dataProvider getMaxDateRangeDataProvider */ public function testGetMaxDateRange($validationRules, $expectedValue) { $this->attribute->expects($this->once()) ->method('getValidationRules') ->willReturn($validationRules); $this->assertEquals($expectedValue, $this->_block->getMaxDateRange()); } /** * @return array */ public function getMaxDateRangeDataProvider() { $emptyValidationRule = $this->getMockBuilder(ValidationRuleInterface::class) ->disableOriginalConstructor() ->setMethods(['getName', 'getValue']) ->getMockForAbstractClass(); $validationRule = $this->getMockBuilder(ValidationRuleInterface::class) ->disableOriginalConstructor() ->setMethods(['getName', 'getValue']) ->getMockForAbstractClass(); $validationRule->expects($this->any()) ->method('getName') ->willReturn(Dob::MAX_DATE_RANGE_KEY); $validationRule->expects($this->any()) ->method('getValue') ->willReturn(strtotime(self::MAX_DATE)); return [ [ [ $validationRule, ], date('Y/m/d', strtotime(self::MAX_DATE)), ], [ [ $emptyValidationRule, ], null ] ]; } /** * Tests getMaxDateRange() */ public function testGetMaxDateRangeWithException() { $this->customerMetadata->expects($this->any()) ->method('getAttributeMetadata') ->willThrowException( new NoSuchEntityException( __( 'No such entity with %fieldName = %fieldValue', ['fieldName' => 'field', 'fieldValue' => 'value'] ) ) ); $this->assertNull($this->_block->getMaxDateRange()); } /** * Tests getHtmlExtraParams() without required options */ public function testGetHtmlExtraParamsWithoutRequiredOption() { $validation = json_encode( [ 'validate-date' => [ 'dateFormat' => self::DATE_FORMAT ], 'validate-dob' => [ 'dateFormat' => self::DATE_FORMAT ], ] ); $this->escaper->expects($this->any()) ->method('escapeHtml') ->with($validation) ->willReturn( $validation ); $this->attribute->expects($this->once()) ->method("isRequired") ->willReturn(false); $this->assertEquals( "data-validate=\"$validation\"", $this->_block->getHtmlExtraParams() ); } /** * Tests getHtmlExtraParams() with required options */ public function testGetHtmlExtraParamsWithRequiredOption() { $validation = json_encode( [ 'required' => true, 'validate-date' => [ 'dateFormat' => self::DATE_FORMAT ], 'validate-dob' => [ 'dateFormat' => self::DATE_FORMAT ], ] ); $this->attribute->expects($this->once()) ->method("isRequired") ->willReturn(true); $this->escaper->expects($this->any()) ->method('escapeHtml') ->with($validation) ->willReturn( $validation ); $this->context->expects($this->any())->method('getEscaper')->willReturn($this->escaper); $this->assertEquals( "data-validate=\"$validation\"", $this->_block->getHtmlExtraParams() ); } /** * Tests getTranslatedCalendarConfigJson() * * @param string $locale * @param array $expectedArray * @param string $expectedJson * @dataProvider getTranslatedCalendarConfigJsonDataProvider * @return void */ public function testGetTranslatedCalendarConfigJson( string $locale, array $expectedArray, string $expectedJson ): void { $this->_locale = $locale; $this->encoder->expects($this->once()) ->method('encode') ->with($expectedArray) ->willReturn($expectedJson); $this->assertEquals( $expectedJson, $this->_block->getTranslatedCalendarConfigJson() ); } /** * Provider for testGetTranslatedCalendarConfigJson * * @return array */ public function getTranslatedCalendarConfigJsonDataProvider() { return [ [ 'locale' => 'en_US', 'expectedArray' => [ 'closeText' => 'Done', 'prevText' => 'Prev', 'nextText' => 'Next', 'currentText' => 'Today', 'monthNames' => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], 'monthNamesShort' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], 'dayNames' => ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], 'dayNamesShort' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], 'dayNamesMin' => ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'], ], // phpcs:disable Generic.Files.LineLength.TooLong 'expectedJson' => '{"closeText":"Done","prevText":"Prev","nextText":"Next","currentText":"Today","monthNames":["January","February","March","April","May","June","July","August","September","October","November","December"],"monthNamesShort":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"dayNames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dayNamesShort":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dayNamesMin":["Su","Mo","Tu","We","Th","Fr","Sa"]}' // phpcs:enable Generic.Files.LineLength.TooLong ], [ 'locale' => 'de_DE', 'expectedArray' => [ 'closeText' => 'Done', 'prevText' => 'Prev', 'nextText' => 'Next', 'currentText' => 'Today', 'monthNames' => ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], 'monthNamesShort' => ['Jan.', 'Feb.', 'März', 'Apr.', 'Mai', 'Juni', 'Juli', 'Aug.', 'Sept.', 'Okt.', 'Nov.', 'Dez.'], 'dayNames' => ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'], 'dayNamesShort' => ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'], 'dayNamesMin' => ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'], ], // phpcs:disable Generic.Files.LineLength.TooLong 'expectedJson' => '{"closeText":"Done","prevText":"Prev","nextText":"Next","currentText":"Today","monthNames":["Januar","Februar","M\u00e4rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"monthNamesShort":["Jan.","Feb.","M\u00e4rz","Apr.","Mai","Juni","Juli","Aug.","Sept.","Okt.","Nov.","Dez."],"dayNames":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"dayNamesShort":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"dayNamesMin":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."]}' // phpcs:enable Generic.Files.LineLength.TooLong ], ]; } }