Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/2.4-develop' into 2.4-develop
Browse files Browse the repository at this point in the history
  • Loading branch information
mrtuvn committed Feb 13, 2020
2 parents 15269d9 + ee5d56a commit e2c403f
Show file tree
Hide file tree
Showing 39 changed files with 1,734 additions and 202 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,7 @@ public function addParentFilterData(int $parentId, int $parentEntityId, string $
public function getOptionsByParentId(int $parentId) : array
{
$options = $this->fetch();
if (!isset($options[$parentId])) {
return [];
}

return $options[$parentId];
return $options[$parentId] ?? [];
}

/**
Expand Down Expand Up @@ -115,7 +111,7 @@ private function fetch() : array

$this->extensionAttributesJoinProcessor->process($optionsCollection);
if (empty($optionsCollection->getData())) {
return null;
return [];
}

/** @var \Magento\Bundle\Model\Option $option */
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

declare(strict_types=1);

namespace Magento\Captcha\Test\Unit\Observer;

use Magento\Captcha\Model\ResourceModel\Log;
use Magento\Captcha\Model\ResourceModel\LogFactory;
use Magento\Captcha\Observer\ResetAttemptForBackendObserver;
use Magento\Framework\Event;
use Magento\Framework\Event\Observer;
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;

/**
* Unit test for \Magento\Captcha\Observer\ResetAttemptForBackendObserver
*/
class ResetAttemptForBackendObserverTest extends TestCase
{
/**
* Test that the method resets attempts for Backend
*/
public function testExecuteExpectsDeleteUserAttemptsCalled()
{
$logMock = $this->createMock(Log::class);
$logMock->expects($this->once())->method('deleteUserAttempts')->willReturnSelf();

$resLogFactoryMock = $this->createMock(LogFactory::class);
$resLogFactoryMock->expects($this->once())
->method('create')
->willReturn($logMock);

/** @var MockObject|Observer $eventObserverMock */
$eventObserverMock = $this->createPartialMock(Observer::class, ['getUser']);
$eventMock = $this->createMock(Event::class);
$eventObserverMock->expects($this->once())
->method('getUser')
->willReturn($eventMock);

$objectManager = new ObjectManagerHelper($this);
/** @var ResetAttemptForBackendObserver $observer */
$observer = $objectManager->getObject(
ResetAttemptForBackendObserver::class,
['resLogFactory' => $resLogFactoryMock]
);
$this->assertInstanceOf(Log::class, $observer->execute($eventObserverMock));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

declare(strict_types=1);

namespace Magento\Captcha\Test\Unit\Observer;

use Magento\Captcha\Model\ResourceModel\Log;
use Magento\Captcha\Model\ResourceModel\LogFactory;
use Magento\Captcha\Observer\ResetAttemptForFrontendObserver;
use Magento\Customer\Model\Customer;
use Magento\Framework\Event\Observer;
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;

/**
* Unit test for \Magento\Captcha\Observer\ResetAttemptForFrontendObserver
*/
class ResetAttemptForFrontendObserverTest extends TestCase
{
/**
* Test that the method resets attempts for Frontend
*/
public function testExecuteExpectsDeleteUserAttemptsCalled()
{
$logMock = $this->createMock(Log::class);
$logMock->expects($this->once())->method('deleteUserAttempts')->willReturnSelf();

$resLogFactoryMock = $this->createMock(LogFactory::class);
$resLogFactoryMock->expects($this->once())
->method('create')
->willReturn($logMock);

/** @var MockObject|Observer $eventObserverMock */
$eventObserverMock = $this->createPartialMock(Observer::class, ['getModel']);
$eventObserverMock->expects($this->once())
->method('getModel')
->willReturn($this->createMock(Customer::class));

$objectManager = new ObjectManagerHelper($this);
/** @var ResetAttemptForFrontendObserver $observer */
$observer = $objectManager->getObject(
ResetAttemptForFrontendObserver::class,
['resLogFactory' => $resLogFactoryMock]
);
$this->assertInstanceOf(Log::class, $observer->execute($eventObserverMock));
}
}
27 changes: 27 additions & 0 deletions app/code/Magento/Catalog/Api/CategoryListDeleteBySkuInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

namespace Magento\Catalog\Api;

/**
* @api
* @since 100.0.2
*/
interface CategoryListDeleteBySkuInterface
{
/**
* Delete by skus list
*
* @param int $categoryId
* @param string[] $productSkuList
* @return bool
*
* @throws \Magento\Framework\Exception\CouldNotSaveException
* @throws \Magento\Framework\Exception\NoSuchEntityException
* @throws \Magento\Framework\Exception\InputException
*/
public function deleteBySkus(int $categoryId, array $productSkuList): bool;
}
77 changes: 67 additions & 10 deletions app/code/Magento/Catalog/Model/CategoryLinkRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,35 +6,52 @@

namespace Magento\Catalog\Model;

use Magento\Framework\Exception\InputException;
use Magento\Catalog\Api\CategoryLinkRepositoryInterface;
use Magento\Catalog\Api\CategoryListDeleteBySkuInterface;
use Magento\Catalog\Api\CategoryRepositoryInterface;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Catalog\Model\ResourceModel\Product;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Exception\CouldNotSaveException;
use Magento\Framework\Exception\InputException;

class CategoryLinkRepository implements \Magento\Catalog\Api\CategoryLinkRepositoryInterface
/**
* @inheritdoc
*/
class CategoryLinkRepository implements CategoryLinkRepositoryInterface, CategoryListDeleteBySkuInterface
{
/**
* @var CategoryRepository
*/
protected $categoryRepository;

/**
* @var \Magento\Catalog\Api\ProductRepositoryInterface
* @var ProductRepositoryInterface
*/
protected $productRepository;

/**
* @param \Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository
* @param \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
* @var Product
*/
private $productResource;

/**
* @param CategoryRepositoryInterface $categoryRepository
* @param ProductRepositoryInterface $productRepository
* @param Product $productResource
*/
public function __construct(
\Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository,
\Magento\Catalog\Api\ProductRepositoryInterface $productRepository
CategoryRepositoryInterface $categoryRepository,
ProductRepositoryInterface $productRepository,
Product $productResource = null
) {
$this->categoryRepository = $categoryRepository;
$this->productRepository = $productRepository;
$this->productResource = $productResource ?? ObjectManager::getInstance()->get(Product::class);
}

/**
* {@inheritdoc}
* @inheritdoc
*/
public function save(\Magento\Catalog\Api\Data\CategoryProductLinkInterface $productLink)
{
Expand All @@ -60,15 +77,15 @@ public function save(\Magento\Catalog\Api\Data\CategoryProductLinkInterface $pro
}

/**
* {@inheritdoc}
* @inheritdoc
*/
public function delete(\Magento\Catalog\Api\Data\CategoryProductLinkInterface $productLink)
{
return $this->deleteByIds($productLink->getCategoryId(), $productLink->getSku());
}

/**
* {@inheritdoc}
* @inheritdoc
*/
public function deleteByIds($categoryId, $sku)
{
Expand Down Expand Up @@ -101,4 +118,44 @@ public function deleteByIds($categoryId, $sku)
}
return true;
}

/**
* @inheritdoc
*/
public function deleteBySkus(int $categoryId, array $productSkuList): bool
{
$category = $this->categoryRepository->get($categoryId);
$products = $this->productResource->getProductsIdsBySkus($productSkuList);

if (!$products) {
throw new InputException(__("The category doesn't contain the specified products."));
}

$productPositions = $category->getProductsPosition();

foreach ($products as $productId) {
if (isset($productPositions[$productId])) {
unset($productPositions[$productId]);
}
}

$category->setPostedProducts($productPositions);

try {
$category->save();
} catch (\Exception $e) {
throw new CouldNotSaveException(
__(
'Could not save products "%products" to category %category',
[
"products" => implode(',', $productSkuList),
"category" => $category->getId()
]
),
$e
);
}

return true;
}
}
Loading

0 comments on commit e2c403f

Please sign in to comment.