Skip to content

Commit

Permalink
FRW-8522 Adjusted product URL name. (#11025)
Browse files Browse the repository at this point in the history
FRW-8522 Adjusted product URL name.
  • Loading branch information
dimitriyTsemma authored Aug 6, 2024
1 parent 5ab8ef1 commit b6c4cdc
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use Spryker\Zed\Product\Business\Product\NameGenerator\ProductAbstractNameGeneratorInterface;
use Spryker\Zed\Product\Dependency\Facade\ProductToLocaleInterface;
use Spryker\Zed\Product\Dependency\Service\ProductToUtilTextInterface;
use Spryker\Zed\Product\ProductConfig;

class ProductUrlGenerator implements ProductUrlGeneratorInterface
{
Expand All @@ -32,19 +33,37 @@ class ProductUrlGenerator implements ProductUrlGeneratorInterface
*/
protected $utilTextService;

/**
* @var \Spryker\Zed\Product\ProductConfig
*/
protected ProductConfig $productConfig;

/**
* @var string
*/
protected const STR_SEARCH = '_';

/**
* @var string
*/
protected const STR_REPLACE = '-';

/**
* @param \Spryker\Zed\Product\Business\Product\NameGenerator\ProductAbstractNameGeneratorInterface $productAbstractNameGenerator
* @param \Spryker\Zed\Product\Dependency\Facade\ProductToLocaleInterface $localeFacade
* @param \Spryker\Zed\Product\Dependency\Service\ProductToUtilTextInterface $utilTextService
* @param \Spryker\Zed\Product\ProductConfig $productConfig
*/
public function __construct(
ProductAbstractNameGeneratorInterface $productAbstractNameGenerator,
ProductToLocaleInterface $localeFacade,
ProductToUtilTextInterface $utilTextService
ProductToUtilTextInterface $utilTextService,
ProductConfig $productConfig
) {
$this->productAbstractNameGenerator = $productAbstractNameGenerator;
$this->localeFacade = $localeFacade;
$this->utilTextService = $utilTextService;
$this->productConfig = $productConfig;
}

/**
Expand Down Expand Up @@ -84,6 +103,13 @@ protected function generateUrlByLocale(ProductAbstractTransfer $productAbstractT
$this->productAbstractNameGenerator->getLocalizedProductAbstractName($productAbstractTransfer, $localeTransfer),
);

return '/' . mb_substr($localeTransfer->getLocaleName(), 0, 2) . '/' . $productName . '-' . $productAbstractTransfer->getIdProductAbstract();
return $this->productConfig->isFullLocaleNamesInUrlEnabled() ?
sprintf(
'/%s/%s-%s',
str_replace(static::STR_SEARCH, static::STR_REPLACE, strtolower($localeTransfer->getLocaleName())),
$productName,
$productAbstractTransfer->getIdProductAbstract(),
)
: '/' . mb_substr($localeTransfer->getLocaleName(), 0, 2) . '/' . $productName . '-' . $productAbstractTransfer->getIdProductAbstract();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ public function createProductUrlGenerator()
$this->createProductAbstractNameGenerator(),
$this->getLocaleFacade(),
$this->getUtilTextService(),
$this->getConfig(),
);
}

Expand Down
13 changes: 13 additions & 0 deletions src/Spryker/Zed/Product/ProductConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -103,4 +103,17 @@ public function getTenantIdentifier(): string
{
return $this->get(ProductConstants::TENANT_IDENTIFIER, '');
}

/**
* Specification:
* - Defines if full locale name in URL is enabled.
*
* @api
*
* @return bool
*/
public function isFullLocaleNamesInUrlEnabled(): bool
{
return false;
}
}
47 changes: 44 additions & 3 deletions tests/SprykerTest/Zed/Product/Business/ProductUrlGeneratorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
use Spryker\Zed\Product\Business\Product\Url\ProductUrlGenerator;
use Spryker\Zed\Product\Dependency\Facade\ProductToLocaleBridge;
use Spryker\Zed\Product\Dependency\Service\ProductToUtilTextBridge;
use Spryker\Zed\Product\ProductConfig;

/**
* Auto-generated group annotations
Expand Down Expand Up @@ -167,11 +168,11 @@ public function testGetProductUrlShouldReturnTransfer(): void
{
$expectedDEUrl = (new LocalizedUrlTransfer())
->setLocale($this->locales['de_DE'])
->setUrl('/de/product-name-dede-1');
->setUrl('/de-de/product-name-dede-1');

$expectedENUrl = (new LocalizedUrlTransfer())
->setLocale($this->locales['en_US'])
->setUrl('/en/product-name-enus-1');
->setUrl('/en-us/product-name-enus-1');

$productUrlExpected = (new ProductUrlTransfer())
->setAbstractSku(
Expand All @@ -187,7 +188,47 @@ public function testGetProductUrlShouldReturnTransfer(): void
->withConsecutive([static::PRODUCT_NAME['de_DE']], [static::PRODUCT_NAME['en_US']])
->willReturnOnConsecutiveCalls('product-name-dede', 'product-name-enus');

$urlGenerator = new ProductUrlGenerator($this->productAbstractNameGenerator, $this->localeFacade, $this->utilTextService);
$configMock = $this->createMock(ProductConfig::class);
$configMock->method('isFullLocaleNamesInUrlEnabled')->willReturn(true);

$urlGenerator = new ProductUrlGenerator($this->productAbstractNameGenerator, $this->localeFacade, $this->utilTextService, $configMock);
$productUrl = $urlGenerator->generateProductUrl($this->productAbstractTransfer);

$this->assertSame($productUrlExpected->getAbstractSku(), $productUrl->getAbstractSku());
$this->assertEquals($productUrlExpected, $productUrl);
}

/**
* @return void
*/
public function testGetProductUrlShouldReturnTransferBCCheck(): void
{
$expectedDEUrl = (new LocalizedUrlTransfer())
->setLocale($this->locales['de_DE'])
->setUrl('/de/product-name-dede-1');

$expectedENUrl = (new LocalizedUrlTransfer())
->setLocale($this->locales['en_US'])
->setUrl('/en/product-name-enus-1');

$productUrlExpected = (new ProductUrlTransfer())
->setAbstractSku(
$this->productAbstractTransfer->getSku(),
)
->setUrls(
new ArrayObject([$expectedDEUrl, $expectedENUrl]),
);

$this->utilTextService
->expects($this->exactly(2))
->method('generateSlug')
->withConsecutive([static::PRODUCT_NAME['de_DE']], [static::PRODUCT_NAME['en_US']])
->willReturnOnConsecutiveCalls('product-name-dede', 'product-name-enus');

$configMock = $this->createMock(ProductConfig::class);
$configMock->method('isFullLocaleNamesInUrlEnabled')->willReturn(false);

$urlGenerator = new ProductUrlGenerator($this->productAbstractNameGenerator, $this->localeFacade, $this->utilTextService, $configMock);
$productUrl = $urlGenerator->generateProductUrl($this->productAbstractTransfer);

$this->assertSame($productUrlExpected->getAbstractSku(), $productUrl->getAbstractSku());
Expand Down
50 changes: 46 additions & 4 deletions tests/SprykerTest/Zed/Product/Business/UrlHandlingTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
use Generated\Shared\Transfer\ProductUrlTransfer;
use Generated\Shared\Transfer\UrlTransfer;
use Spryker\Shared\Url\UrlConfig;
use Spryker\Zed\Product\Business\ProductBusinessFactory;
use Spryker\Zed\Product\ProductConfig;
use Spryker\Zed\Url\Business\Exception\UrlExistsException;

/**
Expand All @@ -28,11 +30,51 @@ class UrlHandlingTest extends FacadeTestAbstract
/**
* @return void
*/
protected function setUp(): void
{
parent::setUp();

$configMock = $this->createMock(ProductConfig::class);
$configMock->method('isFullLocaleNamesInUrlEnabled')->willReturn(true);
$productBusinessFactory = new ProductBusinessFactory();
$productBusinessFactory->setConfig($configMock);
$this->productFacade->setFactory($productBusinessFactory);
}

/**
* @return void
*/
public function testCreateProductUrlShouldCreateNewUrlForProductAbstract(): void
{
$idProductAbstract = $this->productAbstractManager->createProductAbstract($this->productAbstractTransfer);
$this->productAbstractTransfer->setIdProductAbstract($idProductAbstract);

$expectedENUrl = (new LocalizedUrlTransfer())
->setLocale($this->locales['en_US'])
->setUrl('/en-us/product-name-enus-' . $idProductAbstract);
$expectedDEUrl = (new LocalizedUrlTransfer())
->setLocale($this->locales['de_DE'])
->setUrl('/de-de/product-name-dede-' . $idProductAbstract);

$productUrl = $this->productFacade->createProductUrl($this->productAbstractTransfer);

$this->assertProductUrl($productUrl, $expectedENUrl);
$this->assertProductUrl($productUrl, $expectedDEUrl);
}

/**
* @return void
*/
public function testCreateProductUrlShouldCreateNewUrlForProductAbstractBCCheck(): void
{
$configMock = $this->createMock(ProductConfig::class);
$configMock->method('isFullLocaleNamesInUrlEnabled')->willReturn(false);
$productBusinessFactory = new ProductBusinessFactory();
$productBusinessFactory->setConfig($configMock);
$this->productFacade->setFactory($productBusinessFactory);
$idProductAbstract = $this->productAbstractManager->createProductAbstract($this->productAbstractTransfer);
$this->productAbstractTransfer->setIdProductAbstract($idProductAbstract);

$expectedENUrl = (new LocalizedUrlTransfer())
->setLocale($this->locales['en_US'])
->setUrl('/en/product-name-enus-' . $idProductAbstract);
Expand All @@ -57,10 +99,10 @@ public function testUpdateProductUrlShouldSaveUrlForProductAbstract(): void

$expectedENUrl = (new LocalizedUrlTransfer())
->setLocale($this->locales['en_US'])
->setUrl('/en/new-product-name-enus-' . $idProductAbstract);
->setUrl('/en-us/new-product-name-enus-' . $idProductAbstract);
$expectedDEUrl = (new LocalizedUrlTransfer())
->setLocale($this->locales['de_DE'])
->setUrl('/de/new-product-name-dede-' . $idProductAbstract);
->setUrl('/de-de/new-product-name-dede-' . $idProductAbstract);

foreach ($this->productAbstractTransfer->getLocalizedAttributes() as $localizedAttribute) {
$localizedAttribute->setName('New ' . $localizedAttribute->getName());
Expand Down Expand Up @@ -152,10 +194,10 @@ public function testGetProductUrl(): void

$expectedENUrl = (new LocalizedUrlTransfer())
->setLocale($this->locales['en_US'])
->setUrl('/en/product-name-enus-' . $idProductAbstract);
->setUrl('/en-us/product-name-enus-' . $idProductAbstract);
$expectedDEUrl = (new LocalizedUrlTransfer())
->setLocale($this->locales['de_DE'])
->setUrl('/de/product-name-dede-' . $idProductAbstract);
->setUrl('/de-de/product-name-dede-' . $idProductAbstract);

$productUrl = $this->productFacade->getProductUrl($this->productAbstractTransfer);

Expand Down

0 comments on commit b6c4cdc

Please sign in to comment.