From ceafe0f975a7fb2ef0d5e65dc0a7809318c147c1 Mon Sep 17 00:00:00 2001 From: Can Demiralp Date: Thu, 22 Jan 2026 16:01:54 +0100 Subject: [PATCH 1/8] [ECP-9895] Use repository to obtain the order object --- Controller/Return/Index.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Controller/Return/Index.php b/Controller/Return/Index.php index 52f6886e10..1e404a5337 100755 --- a/Controller/Return/Index.php +++ b/Controller/Return/Index.php @@ -25,6 +25,7 @@ use Magento\Framework\Exception\NoSuchEntityException; use Magento\Quote\Api\CartRepositoryInterface; use Magento\Sales\Api\Data\OrderInterface; +use Magento\Sales\Api\OrderRepositoryInterface; use Magento\Sales\Model\Order; use Magento\Sales\Model\OrderFactory; use Magento\Store\Model\StoreManagerInterface; @@ -63,6 +64,7 @@ class Index extends Action * @param PaymentsDetails $paymentsDetailsHelper * @param PaymentResponseHandler $paymentResponseHandler * @param CartRepositoryInterface $cartRepository + * @param OrderRepositoryInterface $orderRepository */ public function __construct( Context $context, @@ -74,7 +76,8 @@ public function __construct( private readonly Config $configHelper, private readonly PaymentsDetails $paymentsDetailsHelper, private readonly PaymentResponseHandler $paymentResponseHandler, - private readonly CartRepositoryInterface $cartRepository + private readonly CartRepositoryInterface $cartRepository, + private readonly OrderRepositoryInterface $orderRepository ) { parent::__construct($context); } @@ -172,6 +175,7 @@ private function getOrder(?string $incrementId = null): Order { if ($incrementId !== null) { $order = $this->orderFactory->create()->loadByIncrementId($incrementId); + $order = $this->orderRepository->get($order->getEntityId()); } else { $order = $this->session->getLastRealOrder(); } From a0a6884483aa69fef0ae950b079a80726e4ec14a Mon Sep 17 00:00:00 2001 From: Can Demiralp Date: Fri, 23 Jan 2026 09:03:05 +0100 Subject: [PATCH 2/8] [ECP-9895] Skip OFFER_CLOSED webhook if the order is cancelled --- Helper/Webhook/OfferClosedWebhookHandler.php | 28 ++++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/Helper/Webhook/OfferClosedWebhookHandler.php b/Helper/Webhook/OfferClosedWebhookHandler.php index db1f3e0547..196700ec48 100644 --- a/Helper/Webhook/OfferClosedWebhookHandler.php +++ b/Helper/Webhook/OfferClosedWebhookHandler.php @@ -96,19 +96,31 @@ public function handleWebhook(MagentoOrder $order, Notification $notification, s return $order; } - // Move the order from PAYMENT_REVIEW to NEW, so that it can be cancelled - if (!$order->isCanceled() - && !$order->canCancel() - && $this->configHelper->getNotificationsCanCancel($order->getStoreId()) - ) { - $order->setState(MagentoOrder::STATE_NEW); + if ($order->isCanceled()) { + $message = __('The order has already been cancelled. Skipping the %1 webhook.', + $notification->getEventCode()); + + $this->adyenLogger->addAdyenNotification($message, [ + 'pspReference' => $notification->getPspreference(), + 'merchantReference' => $notification->getMerchantReference() + ]); + + $order->addCommentToStatusHistory($message); + } else { + // Move the order from PAYMENT_REVIEW to NEW, so that it can be cancelled + if (!$order->isCanceled() + && !$order->canCancel() + && $this->configHelper->getNotificationsCanCancel($order->getStoreId()) + ) { + $order->setState(MagentoOrder::STATE_NEW); + } + + $this->orderHelper->holdCancelOrder($order, true); } // Clean-up the data temporarily stored in `additional_information` $this->cleanupAdditionalInformation->execute($order->getPayment()); - $this->orderHelper->holdCancelOrder($order, true); - return $order; } } From 93880744b9e34d634010cddd96790cc151e01992 Mon Sep 17 00:00:00 2001 From: Can Demiralp Date: Mon, 26 Jan 2026 10:49:22 +0100 Subject: [PATCH 3/8] [ECP-9895] Update the repository and use the order registry --- Controller/Return/Index.php | 28 ++++++++++++++-------------- Model/Sales/OrderRepository.php | 24 ++++++++++++++++++++++++ etc/di.xml | 10 ++++++++++ 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/Controller/Return/Index.php b/Controller/Return/Index.php index 1e404a5337..b46f910c6c 100755 --- a/Controller/Return/Index.php +++ b/Controller/Return/Index.php @@ -17,6 +17,7 @@ use Adyen\Payment\Helper\Quote; use Adyen\Payment\Helper\Config; use Adyen\Payment\Logger\AdyenLogger; +use Adyen\Payment\Model\Sales\OrderRepository; use Exception; use Magento\Checkout\Model\Session; use Magento\Framework\App\Action\Action; @@ -25,7 +26,6 @@ use Magento\Framework\Exception\NoSuchEntityException; use Magento\Quote\Api\CartRepositoryInterface; use Magento\Sales\Api\Data\OrderInterface; -use Magento\Sales\Api\OrderRepositoryInterface; use Magento\Sales\Model\Order; use Magento\Sales\Model\OrderFactory; use Magento\Store\Model\StoreManagerInterface; @@ -64,7 +64,7 @@ class Index extends Action * @param PaymentsDetails $paymentsDetailsHelper * @param PaymentResponseHandler $paymentResponseHandler * @param CartRepositoryInterface $cartRepository - * @param OrderRepositoryInterface $orderRepository + * @param OrderRepository $orderRepository */ public function __construct( Context $context, @@ -77,7 +77,7 @@ public function __construct( private readonly PaymentsDetails $paymentsDetailsHelper, private readonly PaymentResponseHandler $paymentResponseHandler, private readonly CartRepositoryInterface $cartRepository, - private readonly OrderRepositoryInterface $orderRepository + private readonly OrderRepository $orderRepository ) { parent::__construct($context); } @@ -173,17 +173,17 @@ protected function validateRedirectResponse(array $redirectResponse): bool */ private function getOrder(?string $incrementId = null): Order { - if ($incrementId !== null) { - $order = $this->orderFactory->create()->loadByIncrementId($incrementId); - $order = $this->orderRepository->get($order->getEntityId()); - } else { - $order = $this->session->getLastRealOrder(); - } - - if (!$order->getId()) { - throw new LocalizedException( - __('Order cannot be loaded') - ); + try { + if ($incrementId !== null) { + $order = $this->orderRepository->getByIncrementId($incrementId); + } else { + $order = $this->session->getLastRealOrder(); + } + if (!$order->getId()) { + throw new NoSuchEntityException(); + } + } catch (NoSuchEntityException $e) { + throw new LocalizedException(__('Order cannot be loaded')); } return $order; diff --git a/Model/Sales/OrderRepository.php b/Model/Sales/OrderRepository.php index 42a29e02ed..682557cc19 100644 --- a/Model/Sales/OrderRepository.php +++ b/Model/Sales/OrderRepository.php @@ -17,6 +17,8 @@ use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface; use Magento\Framework\Api\SearchCriteriaBuilder; use Magento\Framework\Api\SortOrderBuilder; +use Magento\Framework\Exception\InputException; +use Magento\Framework\Exception\NoSuchEntityException; use Magento\Framework\Serialize\Serializer\Json as JsonSerializer; use Magento\Payment\Api\Data\PaymentAdditionalInfoInterfaceFactory; use Magento\Sales\Api\Data\OrderInterface; @@ -91,4 +93,26 @@ public function getOrderByQuoteId(int $quoteId) /** @var OrderInterface $order */ return reset($orders); } + + /** + * This method load the object through model class and loads the repository. + * Object registry is also updated as a part of this method. + * + * @param string $incrementId + * @return OrderInterface + * @throws InputException + * @throws NoSuchEntityException + */ + public function getByIncrementId(string $incrementId): OrderInterface + { + $entity = $this->metadata->getNewInstance()->loadByIncrementId($incrementId); + + if (!$entity->getEntityId()) { + throw new NoSuchEntityException( + __("The entity that was requested doesn't exist. Verify the entity and try again.") + ); + } + + return $this->get($entity->getEntityId()); + } } diff --git a/etc/di.xml b/etc/di.xml index 2abaab82cc..5ae7b94e24 100755 --- a/etc/di.xml +++ b/etc/di.xml @@ -1649,6 +1649,16 @@ Magento\Framework\Serialize\Serializer\Serialize + + + Adyen\Payment\Model\Sales\OrderRepository + + + + + Adyen\Payment\Model\Sales\OrderRepository + + Magento\Framework\Serialize\Serializer\Serialize From 1314a5b4d26a655b04fe4257d7bb96bbbe539ce2 Mon Sep 17 00:00:00 2001 From: Can Demiralp Date: Mon, 26 Jan 2026 11:13:37 +0100 Subject: [PATCH 4/8] [ECP-9895] Update unit tests --- Controller/Return/Index.php | 9 +++-- Test/Unit/Controller/Return/IndexTest.php | 22 ++++------- Test/Unit/Model/Sales/OrderRepositoryTest.php | 38 +++++++++++++++++++ 3 files changed, 50 insertions(+), 19 deletions(-) diff --git a/Controller/Return/Index.php b/Controller/Return/Index.php index b46f910c6c..d6b10f4894 100755 --- a/Controller/Return/Index.php +++ b/Controller/Return/Index.php @@ -171,16 +171,17 @@ protected function validateRedirectResponse(array $redirectResponse): bool /** * @throws LocalizedException */ - private function getOrder(?string $incrementId = null): Order + private function getOrder(?string $incrementId = null): OrderInterface { try { if ($incrementId !== null) { $order = $this->orderRepository->getByIncrementId($incrementId); } else { $order = $this->session->getLastRealOrder(); - } - if (!$order->getId()) { - throw new NoSuchEntityException(); + + if (!$order->getId()) { + throw new NoSuchEntityException(); + } } } catch (NoSuchEntityException $e) { throw new LocalizedException(__('Order cannot be loaded')); diff --git a/Test/Unit/Controller/Return/IndexTest.php b/Test/Unit/Controller/Return/IndexTest.php index ccc114fe14..85ded27b40 100644 --- a/Test/Unit/Controller/Return/IndexTest.php +++ b/Test/Unit/Controller/Return/IndexTest.php @@ -10,6 +10,7 @@ use Adyen\Payment\Helper\PaymentsDetails; use Adyen\Payment\Helper\Quote; use Adyen\Payment\Logger\AdyenLogger; +use Adyen\Payment\Model\Sales\OrderRepository; use Adyen\Payment\Test\Unit\AbstractAdyenTestCase; use Exception; use Magento\Checkout\Model\Session; @@ -20,13 +21,11 @@ use Magento\Framework\Exception\LocalizedException; use Magento\Quote\Api\CartRepositoryInterface; use Magento\Quote\Model\Quote as QuoteModel; -use Magento\Sales\Api\OrderRepositoryInterface; use Magento\Sales\Model\Order; use Magento\Sales\Model\OrderFactory; use Magento\Store\Model\Store; use Magento\Store\Model\StoreManagerInterface; use PHPUnit\Framework\MockObject\MockObject; -use PHPUnit\Framework\TestCase; class IndexTest extends AbstractAdyenTestCase { @@ -59,7 +58,7 @@ protected function setUp(): void $this->paymentsDetailsHelper = $this->createMock(PaymentsDetails::class); $this->paymentResponseHandler = $this->createMock(PaymentResponseHandler::class); $this->cartRepository = $this->createMock(CartRepositoryInterface::class); - $this->orderRepository = $this->createMock(OrderRepositoryInterface::class); + $this->orderRepository = $this->createMock(OrderRepository::class); $this->request = $this->createMock(RequestInterface::class); $this->response = $this->createMock(RedirectInterface::class); @@ -112,10 +111,7 @@ public function testExecuteWithSuccessfulRedirect(): void $order->method('getIncrementId')->willReturn('1001'); $order->method('getPayment')->willReturn($this->createMock(Order\Payment::class)); - $orderModel = $this->createMock(Order::class); - $orderModel->method('loadByIncrementId')->willReturn($order); - $orderModel->method('getId')->willReturn(1); - $this->orderFactory->method('create')->willReturn($orderModel); + $this->orderRepository->method('getByIncrementId')->willReturn($order); $this->paymentsDetailsHelper->method('initiatePaymentDetails')->willReturn(['resultCode' => 'Authorised']); $this->paymentResponseHandler->method('handlePaymentsDetailsResponse')->willReturn(true); @@ -142,9 +138,7 @@ public function testExecuteWithFailedRedirect(): void $order = $this->createMock(Order::class); $order->method('getId')->willReturn(1); - $orderModel = $this->createMock(Order::class); - $orderModel->method('loadByIncrementId')->willReturn($order); - $this->orderFactory->method('create')->willReturn($orderModel); + $this->orderRepository->method('getByIncrementId')->willReturn($order); $this->paymentsDetailsHelper->method('initiatePaymentDetails')->willThrowException(new Exception('Invalid')); $this->paymentResponseHandler->method('handlePaymentsDetailsResponse')->willReturn(false); @@ -175,8 +169,7 @@ public function testGetOrderWithValidId(): void { $order = $this->createMock(Order::class); $order->method('getId')->willReturn(10); - $this->orderFactory->method('create')->willReturn($order); - $order->method('loadByIncrementId')->with('1001')->willReturn($order); + $this->orderRepository->method('getByIncrementId')->with('1001')->willReturn($order); $reflection = new \ReflectionClass(Index::class); $method = $reflection->getMethod('getOrder'); @@ -192,13 +185,12 @@ public function testGetOrderThrowsExceptionOnInvalidOrder(): void $order = $this->createMock(Order::class); $order->method('getId')->willReturn(null); - $this->orderFactory->method('create')->willReturn($order); - $order->method('loadByIncrementId')->willReturn($order); + $this->session->method('getLastRealOrder')->willReturn($order); $reflection = new \ReflectionClass(Index::class); $method = $reflection->getMethod('getOrder'); $method->setAccessible(true); - $method->invokeArgs($this->indexController, ['1001']); + $method->invokeArgs($this->indexController, [null]); } } diff --git a/Test/Unit/Model/Sales/OrderRepositoryTest.php b/Test/Unit/Model/Sales/OrderRepositoryTest.php index d5d00e5b2c..a793472ffa 100644 --- a/Test/Unit/Model/Sales/OrderRepositoryTest.php +++ b/Test/Unit/Model/Sales/OrderRepositoryTest.php @@ -27,11 +27,13 @@ use Magento\Framework\ObjectManagerInterface; use Magento\Sales\Api\Data\OrderInterface; use Magento\Sales\Api\Data\OrderSearchResultInterfaceFactory as SearchResultFactory; +use Magento\Sales\Model\Order; use Magento\Sales\Model\ResourceModel\Metadata; use Magento\Tax\Api\Data\OrderTaxDetailsInterface; use Magento\Tax\Api\OrderTaxManagementInterface; use PHPUnit\Framework\MockObject\MockObject; use Magento\Sales\Model\ResourceModel\Order\Collection; +use Magento\Framework\Exception\NoSuchEntityException; class OrderRepositoryTest extends AbstractAdyenTestCase { @@ -119,4 +121,40 @@ public function testGetOrderByQuoteId() $order = $this->orderRepository->getOrderByQuoteId($quoteId); $this->assertInstanceOf(OrderInterface::class, $order); } + + public function testGetByIncrementIdSuccess() + { + $incrementId = '000000001'; + $entityId = 123; + + $orderExtensionMock = $this->createMock(\Magento\Sales\Api\Data\OrderExtensionInterface::class); + $orderExtensionMock->method('getShippingAssignments')->willReturn(true); + + $orderModelMock = $this->createMock(Order::class); + $orderModelMock->method('getEntityId')->willReturn($entityId); + $orderModelMock->method('loadByIncrementId')->with($incrementId)->willReturnSelf(); + $orderModelMock->method('load')->with($entityId)->willReturnSelf(); + $orderModelMock->method('getExtensionAttributes')->willReturn($orderExtensionMock); + + $this->metadata->method('getNewInstance')->willReturn($orderModelMock); + + $result = $this->orderRepository->getByIncrementId($incrementId); + + $this->assertInstanceOf(OrderInterface::class, $result); + } + + public function testGetByIncrementIdThrowsExceptionWhenOrderNotFound() + { + $incrementId = '000000999'; + + $orderModelMock = $this->createMock(Order::class); + $orderModelMock->method('getEntityId')->willReturn(null); + + $this->metadata->method('getNewInstance')->willReturn($orderModelMock); + $orderModelMock->method('loadByIncrementId')->with($incrementId)->willReturnSelf(); + + $this->expectException(NoSuchEntityException::class); + + $this->orderRepository->getByIncrementId($incrementId); + } } From 25e2d63ab9fda5a0d5feb9938376b2b05a4a9fd2 Mon Sep 17 00:00:00 2001 From: Can Demiralp Date: Mon, 26 Jan 2026 11:18:39 +0100 Subject: [PATCH 5/8] [ECP-9895] Add more unit tests --- .../Webhook/OfferClosedWebhookHandlerTest.php | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/Test/Unit/Helper/Webhook/OfferClosedWebhookHandlerTest.php b/Test/Unit/Helper/Webhook/OfferClosedWebhookHandlerTest.php index c3d7f40d09..71df474b90 100644 --- a/Test/Unit/Helper/Webhook/OfferClosedWebhookHandlerTest.php +++ b/Test/Unit/Helper/Webhook/OfferClosedWebhookHandlerTest.php @@ -116,6 +116,64 @@ public function testHandleWebhookReturnsOrderWhenCapturedPaymentsExist() $this->assertEquals($order, $result); } + public function testHandleWebhookSkipsWhenOrderAlreadyCancelled() + { + // Create a sample MagentoOrder and Notification + $order = $this->createMock(MagentoOrder::class); + $payment = $this->createPartialMock(Payment::class, ['getMethod', 'getEntityId']); + $notification = $this->createMock(Notification::class); + + // Set up payment mock + $payment->method('getMethod')->willReturn('adyen_cc'); + $payment->method('getEntityId')->willReturn(123); + $order->method('getPayment')->willReturn($payment); + + // Mock order as already cancelled + $order->method('isCanceled')->willReturn(true); + + // Mock notification methods for logging + $notification->method('getPspreference')->willReturn('test_psp_reference'); + $notification->method('getMerchantReference')->willReturn('test_merchant_reference'); + $notification->method('getEventCode')->willReturn('OFFER_CLOSED'); + + // Mock payment method comparison to return true (so we reach the isCanceled check) + $this->paymentMethodsHelper->method('compareOrderAndWebhookPaymentMethods') + ->with($order, $notification) + ->willReturn(true); + + // Mock empty captured payments (so we reach the isCanceled check) + $this->orderPaymentResourceModel->method('getLinkedAdyenOrderPayments')->willReturn([]); + + // Expect addCommentToStatusHistory to be called with the skip message + $order->expects($this->once()) + ->method('addCommentToStatusHistory'); + + // Create mock for logger to verify it's called + $mockAdyenLogger = $this->createMock(AdyenLogger::class); + $mockAdyenLogger->expects($this->once()) + ->method('addAdyenNotification'); + + // Create mock for cleanup to verify it's called + $cleanupAdditionalInformation = $this->createMock(CleanupAdditionalInformation::class); + $cleanupAdditionalInformation->expects($this->once()) + ->method('execute') + ->with($payment); + + // Create an instance of the OfferClosedWebhookHandler + $webhookHandler = $this->createOfferClosedWebhookHandler( + $this->paymentMethodsHelper, + $mockAdyenLogger, + null, + null, + $this->orderPaymentResourceModel, + $cleanupAdditionalInformation + ); + + // Call the handleWebhook method and assert that it returns the order + $result = $webhookHandler->handleWebhook($order, $notification, 'PAYMENT_REVIEW'); + $this->assertEquals($order, $result); + } + protected function createOfferClosedWebhookHandler( $mockPaymentMethodsHelper = null, $mockAdyenLogger = null, From b5f62770e64485e24c9578608cdcf0d9389999bf Mon Sep 17 00:00:00 2001 From: Can Demiralp Date: Mon, 26 Jan 2026 13:46:52 +0100 Subject: [PATCH 6/8] [ECP-9895] Revert the repository changes --- Controller/Return/Index.php | 17 +++++--- Test/Unit/Controller/Return/IndexTest.php | 43 +++++++++++++------ Test/Unit/Model/Sales/OrderRepositoryTest.php | 38 ---------------- etc/di.xml | 10 ----- 4 files changed, 42 insertions(+), 66 deletions(-) diff --git a/Controller/Return/Index.php b/Controller/Return/Index.php index d6b10f4894..458488884e 100755 --- a/Controller/Return/Index.php +++ b/Controller/Return/Index.php @@ -17,7 +17,6 @@ use Adyen\Payment\Helper\Quote; use Adyen\Payment\Helper\Config; use Adyen\Payment\Logger\AdyenLogger; -use Adyen\Payment\Model\Sales\OrderRepository; use Exception; use Magento\Checkout\Model\Session; use Magento\Framework\App\Action\Action; @@ -26,7 +25,7 @@ use Magento\Framework\Exception\NoSuchEntityException; use Magento\Quote\Api\CartRepositoryInterface; use Magento\Sales\Api\Data\OrderInterface; -use Magento\Sales\Model\Order; +use Magento\Sales\Api\OrderRepositoryInterface; use Magento\Sales\Model\OrderFactory; use Magento\Store\Model\StoreManagerInterface; @@ -64,7 +63,7 @@ class Index extends Action * @param PaymentsDetails $paymentsDetailsHelper * @param PaymentResponseHandler $paymentResponseHandler * @param CartRepositoryInterface $cartRepository - * @param OrderRepository $orderRepository + * @param OrderRepositoryInterface $orderRepository */ public function __construct( Context $context, @@ -77,7 +76,7 @@ public function __construct( private readonly PaymentsDetails $paymentsDetailsHelper, private readonly PaymentResponseHandler $paymentResponseHandler, private readonly CartRepositoryInterface $cartRepository, - private readonly OrderRepository $orderRepository + private readonly OrderRepositoryInterface $orderRepository ) { parent::__construct($context); } @@ -175,7 +174,15 @@ private function getOrder(?string $incrementId = null): OrderInterface { try { if ($incrementId !== null) { - $order = $this->orderRepository->getByIncrementId($incrementId); + $entity = $this->orderFactory->create()->loadByIncrementId($incrementId); + + if (!$entity->getEntityId()) { + throw new NoSuchEntityException( + __("The entity that was requested doesn't exist. Verify the entity and try again.") + ); + } + + $order = $this->orderRepository->get($entity->getEntityId()); } else { $order = $this->session->getLastRealOrder(); diff --git a/Test/Unit/Controller/Return/IndexTest.php b/Test/Unit/Controller/Return/IndexTest.php index 85ded27b40..a3ce447a62 100644 --- a/Test/Unit/Controller/Return/IndexTest.php +++ b/Test/Unit/Controller/Return/IndexTest.php @@ -21,7 +21,8 @@ use Magento\Framework\Exception\LocalizedException; use Magento\Quote\Api\CartRepositoryInterface; use Magento\Quote\Model\Quote as QuoteModel; -use Magento\Sales\Model\Order; +use Magento\Sales\Api\Data\OrderInterface; +use Magento\Sales\Model\Order as OrderModel; use Magento\Sales\Model\OrderFactory; use Magento\Store\Model\Store; use Magento\Store\Model\StoreManagerInterface; @@ -106,12 +107,17 @@ public function testExecuteWithSuccessfulRedirect(): void $quote->expects($this->once())->method('setIsActive')->with(false); $this->session->method('getQuote')->willReturn($quote); - $order = $this->createMock(Order::class); - $order->method('getId')->willReturn(1); + $order = $this->createMock(OrderInterface::class); $order->method('getIncrementId')->willReturn('1001'); - $order->method('getPayment')->willReturn($this->createMock(Order\Payment::class)); + $order->method('getPayment')->willReturn($this->createMock(OrderModel\Payment::class)); + $order->method('getEntityId')->willReturn(1); - $this->orderRepository->method('getByIncrementId')->willReturn($order); + $orderModel = $this->createMock(OrderModel::class); + $orderModel->method('getEntityId')->willReturn(1); + $orderModel->method('loadByIncrementId')->willReturn($orderModel); + + $this->orderFactory->method('create')->willReturn($orderModel); + $this->orderRepository->method('get')->willReturn($order); $this->paymentsDetailsHelper->method('initiatePaymentDetails')->willReturn(['resultCode' => 'Authorised']); $this->paymentResponseHandler->method('handlePaymentsDetailsResponse')->willReturn(true); @@ -135,10 +141,14 @@ public function testExecuteWithFailedRedirect(): void ['return_path', 1, 'checkout/cart'] ]); - $order = $this->createMock(Order::class); - $order->method('getId')->willReturn(1); + $order = $this->createMock(OrderInterface::class); + + $orderModel = $this->createMock(OrderModel::class); + $orderModel->method('getEntityId')->willReturn(1); + $orderModel->method('loadByIncrementId')->willReturn($orderModel); - $this->orderRepository->method('getByIncrementId')->willReturn($order); + $this->orderFactory->method('create')->willReturn($orderModel); + $this->orderRepository->method('get')->willReturn($order); $this->paymentsDetailsHelper->method('initiatePaymentDetails')->willThrowException(new Exception('Invalid')); $this->paymentResponseHandler->method('handlePaymentsDetailsResponse')->willReturn(false); @@ -167,15 +177,22 @@ public function testExecuteWithoutParams(): void public function testGetOrderWithValidId(): void { - $order = $this->createMock(Order::class); - $order->method('getId')->willReturn(10); - $this->orderRepository->method('getByIncrementId')->with('1001')->willReturn($order); + $orderModel = $this->createMock(OrderModel::class); + $orderModel->method('getEntityId')->willReturn(10); + $orderModel->method('loadByIncrementId')->willReturn($orderModel); + + $this->orderFactory->method('create')->willReturn($orderModel); + + $order = $this->createMock(OrderInterface::class); + $order->method('getEntityId')->willReturn(10); + + $this->orderRepository->method('get')->with(10)->willReturn($order); $reflection = new \ReflectionClass(Index::class); $method = $reflection->getMethod('getOrder'); $method->setAccessible(true); $result = $method->invokeArgs($this->indexController, ['1001']); - $this->assertSame($order, $result); + $this->assertInstanceOf(OrderInterface::class, $result); } public function testGetOrderThrowsExceptionOnInvalidOrder(): void @@ -183,7 +200,7 @@ public function testGetOrderThrowsExceptionOnInvalidOrder(): void $this->expectException(LocalizedException::class); $this->expectExceptionMessage('Order cannot be loaded'); - $order = $this->createMock(Order::class); + $order = $this->createMock(OrderModel::class); $order->method('getId')->willReturn(null); $this->session->method('getLastRealOrder')->willReturn($order); diff --git a/Test/Unit/Model/Sales/OrderRepositoryTest.php b/Test/Unit/Model/Sales/OrderRepositoryTest.php index a793472ffa..d5d00e5b2c 100644 --- a/Test/Unit/Model/Sales/OrderRepositoryTest.php +++ b/Test/Unit/Model/Sales/OrderRepositoryTest.php @@ -27,13 +27,11 @@ use Magento\Framework\ObjectManagerInterface; use Magento\Sales\Api\Data\OrderInterface; use Magento\Sales\Api\Data\OrderSearchResultInterfaceFactory as SearchResultFactory; -use Magento\Sales\Model\Order; use Magento\Sales\Model\ResourceModel\Metadata; use Magento\Tax\Api\Data\OrderTaxDetailsInterface; use Magento\Tax\Api\OrderTaxManagementInterface; use PHPUnit\Framework\MockObject\MockObject; use Magento\Sales\Model\ResourceModel\Order\Collection; -use Magento\Framework\Exception\NoSuchEntityException; class OrderRepositoryTest extends AbstractAdyenTestCase { @@ -121,40 +119,4 @@ public function testGetOrderByQuoteId() $order = $this->orderRepository->getOrderByQuoteId($quoteId); $this->assertInstanceOf(OrderInterface::class, $order); } - - public function testGetByIncrementIdSuccess() - { - $incrementId = '000000001'; - $entityId = 123; - - $orderExtensionMock = $this->createMock(\Magento\Sales\Api\Data\OrderExtensionInterface::class); - $orderExtensionMock->method('getShippingAssignments')->willReturn(true); - - $orderModelMock = $this->createMock(Order::class); - $orderModelMock->method('getEntityId')->willReturn($entityId); - $orderModelMock->method('loadByIncrementId')->with($incrementId)->willReturnSelf(); - $orderModelMock->method('load')->with($entityId)->willReturnSelf(); - $orderModelMock->method('getExtensionAttributes')->willReturn($orderExtensionMock); - - $this->metadata->method('getNewInstance')->willReturn($orderModelMock); - - $result = $this->orderRepository->getByIncrementId($incrementId); - - $this->assertInstanceOf(OrderInterface::class, $result); - } - - public function testGetByIncrementIdThrowsExceptionWhenOrderNotFound() - { - $incrementId = '000000999'; - - $orderModelMock = $this->createMock(Order::class); - $orderModelMock->method('getEntityId')->willReturn(null); - - $this->metadata->method('getNewInstance')->willReturn($orderModelMock); - $orderModelMock->method('loadByIncrementId')->with($incrementId)->willReturnSelf(); - - $this->expectException(NoSuchEntityException::class); - - $this->orderRepository->getByIncrementId($incrementId); - } } diff --git a/etc/di.xml b/etc/di.xml index 7cdd07e914..7104cc4ed8 100755 --- a/etc/di.xml +++ b/etc/di.xml @@ -1655,16 +1655,6 @@ Magento\Framework\Serialize\Serializer\Serialize - - - Adyen\Payment\Model\Sales\OrderRepository - - - - - Adyen\Payment\Model\Sales\OrderRepository - - Magento\Framework\Serialize\Serializer\Serialize From 11a34a32017cfd5e75d848529e9fd47fc5fc710d Mon Sep 17 00:00:00 2001 From: Can Demiralp Date: Mon, 26 Jan 2026 13:51:36 +0100 Subject: [PATCH 7/8] [ECP-9895] Remove the new repository method --- Model/Sales/OrderRepository.php | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/Model/Sales/OrderRepository.php b/Model/Sales/OrderRepository.php index 682557cc19..42a29e02ed 100644 --- a/Model/Sales/OrderRepository.php +++ b/Model/Sales/OrderRepository.php @@ -17,8 +17,6 @@ use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface; use Magento\Framework\Api\SearchCriteriaBuilder; use Magento\Framework\Api\SortOrderBuilder; -use Magento\Framework\Exception\InputException; -use Magento\Framework\Exception\NoSuchEntityException; use Magento\Framework\Serialize\Serializer\Json as JsonSerializer; use Magento\Payment\Api\Data\PaymentAdditionalInfoInterfaceFactory; use Magento\Sales\Api\Data\OrderInterface; @@ -93,26 +91,4 @@ public function getOrderByQuoteId(int $quoteId) /** @var OrderInterface $order */ return reset($orders); } - - /** - * This method load the object through model class and loads the repository. - * Object registry is also updated as a part of this method. - * - * @param string $incrementId - * @return OrderInterface - * @throws InputException - * @throws NoSuchEntityException - */ - public function getByIncrementId(string $incrementId): OrderInterface - { - $entity = $this->metadata->getNewInstance()->loadByIncrementId($incrementId); - - if (!$entity->getEntityId()) { - throw new NoSuchEntityException( - __("The entity that was requested doesn't exist. Verify the entity and try again.") - ); - } - - return $this->get($entity->getEntityId()); - } } From 62b35229786a6ae65202d4aa25702abe46826035 Mon Sep 17 00:00:00 2001 From: Can Demiralp Date: Mon, 26 Jan 2026 16:14:15 +0100 Subject: [PATCH 8/8] [ECP-9895] Update unit tests --- Test/Unit/Controller/Return/IndexTest.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Test/Unit/Controller/Return/IndexTest.php b/Test/Unit/Controller/Return/IndexTest.php index a3ce447a62..a188ad67ff 100644 --- a/Test/Unit/Controller/Return/IndexTest.php +++ b/Test/Unit/Controller/Return/IndexTest.php @@ -16,6 +16,7 @@ use Magento\Checkout\Model\Session; use Magento\Framework\App\Action\Context; use Magento\Framework\App\RequestInterface; +use Magento\Framework\Exception\NoSuchEntityException; use Magento\Framework\Message\ManagerInterface; use Magento\Framework\App\Response\RedirectInterface; use Magento\Framework\Exception\LocalizedException; @@ -210,4 +211,22 @@ public function testGetOrderThrowsExceptionOnInvalidOrder(): void $method->invokeArgs($this->indexController, [null]); } + + public function testGetOrderDoesNotTranslateIntoAnOrderWithValidIncrementId(): void + { + $this->expectException(LocalizedException::class); + $this->expectExceptionMessage('Order cannot be loaded'); + + $orderModel = $this->createMock(OrderModel::class); + $orderModel->method('loadByIncrementId')->willReturnSelf(); + $orderModel->method('getEntityId')->willReturn(null); + + $this->orderFactory->method('create')->willReturn($orderModel); + + $reflection = new \ReflectionClass(Index::class); + $method = $reflection->getMethod('getOrder'); + $method->setAccessible(true); + $method->invokeArgs($this->indexController, ['1001']); + + } }