scopeConfigMock = $this->getMockForAbstractClass(ScopeConfigInterface::class); $this->scopeConfigMock->expects($this->any())->method('isSetFlag')->willReturn(false); $requestMock = $this->getMockForAbstractClass(RequestInterface::class); $context = $this->createMock(Context::class); $context->method('getRequest') ->willReturn($requestMock); $context->expects($this->any()) ->method('getScopeConfig') ->willReturn($this->scopeConfigMock); $configCacheType = $this->createMock(Config::class); $this->_countryCollection = $this->createMock(CountryCollection::class); $this->_regionCollection = $this->createMock(RegionCollection::class); $regCollectionFactory = $this->createPartialMock( CollectionFactory::class, ['create'] ); $regCollectionFactory->expects( $this->any() )->method( 'create' )->willReturn( $this->_regionCollection ); $this->jsonHelperMock = $this->createMock(JsonDataHelper::class); $this->_store = $this->createMock(Store::class); $storeManager = $this->getMockForAbstractClass(StoreManagerInterface::class); $storeManager->expects($this->any())->method('getStore')->willReturn($this->_store); $currencyFactory = $this->createMock(CurrencyFactory::class); $arguments = [ 'context' => $context, 'configCacheType' => $configCacheType, 'countryCollection' => $this->_countryCollection, 'regCollectionFactory' => $regCollectionFactory, 'jsonHelper' => $this->jsonHelperMock, 'storeManager' => $storeManager, 'currencyFactory' => $currencyFactory, ]; $this->_object = $objectManager->getObject(Data::class, $arguments); } /** * @param string|null $configValue * @param array $countryIds * @param array $regionList * @param array $expectedDataToEncode * * @throws NoSuchEntityException * @dataProvider getRegionJsonDataProvider */ public function testGetRegionJson( ?string $configValue, array $countryIds, array $regionList, array $expectedDataToEncode ) { $this->scopeConfigMock->method('getValue') ->willReturnMap( [ [ AllowedCountries::ALLOWED_COUNTRIES_PATH, ScopeConfigInterface::SCOPE_TYPE_DEFAULT, null, $configValue ], [Data::XML_PATH_STATES_REQUIRED, ScopeInterface::SCOPE_STORE, null, ''] ] ); $regions = []; foreach ($regionList as $region) { $regions[] = new DataObject($region); } $regionIterator = new \ArrayIterator($regions); $this->_regionCollection->expects( $this->once() )->method( 'addCountryFilter' )->with( $countryIds )->willReturnSelf(); $this->_regionCollection->expects($this->once())->method('load'); $this->_regionCollection->expects( $this->once() )->method( 'getIterator' )->willReturn( $regionIterator ); $this->jsonHelperMock->expects( $this->once() )->method( 'jsonEncode' )->with( new IsIdentical($expectedDataToEncode) )->willReturn( 'encoded_json' ); // Test $result = $this->_object->getRegionJson(); $this->assertEquals('encoded_json', $result); } /** * @return array */ public function getRegionJsonDataProvider(): array { return [ [ 'Country1,Country2', [ 'Country1', 'Country2', ], [ [ 'country_id' => 'Country1', 'region_id' => 'r1', 'code' => 'r1-code', 'name' => 'r1-name', ], [ 'country_id' => 'Country1', 'region_id' => 'r2', 'code' => 'r2-code', 'name' => 'r2-name', ], [ 'country_id' => 'Country2', 'region_id' => 'r3', 'code' => 'r3-code', 'name' => 'r3-name', ], ], [ 'config' => [ 'show_all_regions' => false, 'regions_required' => [], ], 'Country1' => [ 'r1' => [ 'code' => 'r1-code', 'name' => 'r1-name', ], 'r2' => [ 'code' => 'r2-code', 'name' => 'r2-name', ], ], 'Country2' => [ 'r3' => [ 'code' => 'r3-code', 'name' => 'r3-name', ] ], ], ], [ null, [''], [], [ 'config' => [ 'show_all_regions' => false, 'regions_required' => [], ], ], ], ]; } /** * @param string $configValue * @param mixed $expected * @dataProvider countriesCommaListDataProvider */ public function testGetCountriesWithStatesRequired($configValue, $expected) { $this->scopeConfigMock->expects( $this->once() )->method( 'getValue' )->with( 'general/region/state_required' )->willReturn( $configValue ); $result = $this->_object->getCountriesWithStatesRequired(); $this->assertEquals($expected, $result); } /** * @param string $configValue * @param mixed $expected * @dataProvider countriesCommaListDataProvider */ public function testGetCountriesWithOptionalZip($configValue, $expected) { $this->scopeConfigMock->expects( $this->once() )->method( 'getValue' )->with( 'general/country/optional_zip_countries' )->willReturn( $configValue ); $result = $this->_object->getCountriesWithOptionalZip(); $this->assertEquals($expected, $result); } /** * @return array */ public static function countriesCommaListDataProvider() { return [ 'empty_list' => ['', []], 'null_list' => [null, []], 'normal_list' => ['Country1,Country2', ['Country1', 'Country2']] ]; } public function testGetDefaultCountry() { $storeId = 'storeId'; $country = 'country'; $this->scopeConfigMock->expects($this->once()) ->method('getValue') ->with( Data::XML_PATH_DEFAULT_COUNTRY, ScopeInterface::SCOPE_STORE, $storeId )->willReturn($country); $this->assertEquals($country, $this->_object->getDefaultCountry($storeId)); } public function testGetCountryCollection() { $this->_countryCollection->expects( $this->once() )->method( 'isLoaded' )->willReturn( 0 ); $store = $this->createMock(Store::class); $this->_countryCollection->expects( $this->once() )->method( 'loadByStore' )->with( $store ); $this->_object->getCountryCollection($store); } /** * @param string $topCountriesValue * @param array $expectedResult * @dataProvider topCountriesDataProvider */ public function testGetTopCountryCodesReturnsParsedConfigurationValue($topCountriesValue, $expectedResult) { $this->scopeConfigMock->expects($this->once()) ->method('getValue')->with(Data::XML_PATH_TOP_COUNTRIES) ->willReturn($topCountriesValue); $this->assertEquals($expectedResult, $this->_object->getTopCountryCodes()); } /** * @return array */ public function topCountriesDataProvider() { return [ [null, []], ['', []], ['US', ['US']], ['US,RU', ['US', 'RU']], ]; } /** * Test private method `getCurrentScope`, if no request parameter `scope type` sent. * * @throws \ReflectionException */ public function testGetCurrentScopeWithoutRequestParameters() { $storeId = 1; $scope = [ 'type' => ScopeInterface::SCOPE_STORE, 'value' => $storeId, ]; $this->_store->expects($this->atLeastOnce())->method('getId')->willReturn($storeId); $reflector = new \ReflectionClass($this->_object); $method = $reflector->getMethod('getCurrentScope'); $method->setAccessible(true); $result = $method->invoke($this->_object); $this->assertIsArray($result); $this->assertEquals($scope, $result); } }