Skip to content

Commit 72c876f

Browse files
committed
ACP2E-3647: [CLOUD]: GraphQl error Internal server error placeOrder mutation
1 parent d0560c9 commit 72c876f

File tree

2 files changed

+158
-18
lines changed

2 files changed

+158
-18
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
<?php
2+
/**
3+
* Copyright 2025 Adobe
4+
* All Rights Reserved.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\SalesGraphQl\Test\Unit\Model\Resolver;
9+
10+
use Magento\Framework\GraphQl\Query\Resolver\ContextInterface;
11+
use Magento\Sales\Api\Data\OrderExtensionInterface;
12+
use PHPUnit\Framework\MockObject\MockObject;
13+
use PHPUnit\Framework\TestCase;
14+
use Magento\SalesGraphQl\Model\Resolver\OrderTotal;
15+
use Magento\Sales\Api\Data\OrderInterface;
16+
use Magento\Quote\Model\QuoteFactory;
17+
use Magento\Framework\GraphQl\Config\Element\Field;
18+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
19+
use Magento\Framework\Exception\LocalizedException;
20+
21+
class OrderTotalTest extends TestCase
22+
{
23+
/**
24+
* @var OrderInterface|MockObject
25+
*/
26+
private $orderMock;
27+
28+
/**
29+
* @var QuoteFactory|MockObject
30+
*/
31+
private $quoteFactoryMock;
32+
33+
/**
34+
* @var OrderTotal|MockObject
35+
*/
36+
private $orderTotal;
37+
38+
/**
39+
* @var ContextInterface|MockObject
40+
*/
41+
private $contextMock;
42+
43+
/**
44+
* @var Field|MockObject
45+
*/
46+
private $fieldMock;
47+
48+
/**
49+
* @var ResolveInfo|MockObject
50+
*/
51+
private $resolveInfoMock;
52+
53+
/**
54+
* @var OrderExtensionInterface|MockObject
55+
*/
56+
private $extensionAttributesMock;
57+
58+
protected function setUp(): void
59+
{
60+
$this->contextMock = $this->createMock(ContextInterface::class);
61+
$this->fieldMock = $this->createMock(Field::class);
62+
$this->resolveInfoMock = $this->createMock(ResolveInfo::class);
63+
$this->quoteFactoryMock = $this->createMock(QuoteFactory::class);
64+
$this->extensionAttributesMock = $this->createMock(OrderExtensionInterface::class);
65+
$this->orderMock = $this->createMock(OrderInterface::class);
66+
$this->orderMock->method('getOrderCurrencyCode')->willReturn('USD');
67+
$this->orderMock->method('getBaseCurrencyCode')->willReturn('USD');
68+
$this->orderMock->method('getBaseGrandTotal')->willReturn(100.00);
69+
$this->orderMock->method('getGrandTotal')->willReturn(110.00);
70+
$this->orderMock->method('getSubtotal')->willReturn(110.00);
71+
$this->orderMock->method('getTaxAmount')->willReturn(10.00);
72+
$this->orderMock->method('getShippingAmount')->willReturn(5.00);
73+
$this->orderMock->method('getShippingInclTax')->willReturn(7.00);
74+
$this->orderMock->method('getDiscountAmount')->willReturn(7.00);
75+
$this->orderMock->method('getDiscountDescription')->willReturn('TEST123');
76+
$this->orderTotal = new OrderTotal($this->quoteFactoryMock);
77+
}
78+
79+
public function testResolve(): void
80+
{
81+
$fieldMock = $this->createMock(Field::class);
82+
$resolveInfoMock = $this->createMock(ResolveInfo::class);
83+
$value = ['model' => $this->orderMock];
84+
$args = [];
85+
$this->extensionAttributesMock->expects($this->once())
86+
->method('getAppliedTaxes')
87+
->willReturn([]);
88+
$this->orderMock->method('getExtensionAttributes')->willReturn($this->extensionAttributesMock);
89+
$result = $this->orderTotal->resolve($fieldMock, $this->contextMock, $resolveInfoMock, $value, $args);
90+
$this->assertArrayHasKey('base_grand_total', $result);
91+
$this->assertEquals(100.00, $result['base_grand_total']['value']);
92+
$this->assertEquals('USD', $result['base_grand_total']['currency']);
93+
$this->assertArrayHasKey('grand_total', $result);
94+
$this->assertEquals(110.00, $result['grand_total']['value']);
95+
$this->assertEquals('USD', $result['grand_total']['currency']);
96+
$this->assertArrayHasKey('subtotal', $result);
97+
$this->assertEquals(110.00, $result['subtotal']['value']);
98+
$this->assertEquals('USD', $result['subtotal']['currency']);
99+
$this->assertArrayHasKey('total_tax', $result);
100+
$this->assertEquals(10.00, $result['total_tax']['value']);
101+
$this->assertEquals('USD', $result['total_tax']['currency']);
102+
$this->assertArrayHasKey('discounts', $result);
103+
foreach ($result['discounts'] as $discount) {
104+
$this->assertEquals('TEST123', $discount['label']);
105+
$this->assertEquals(7.00, $discount['amount']['value']);
106+
$this->assertEquals('USD', $discount['amount']['currency']);
107+
$this->assertArrayHasKey('order_model', $discount);
108+
}
109+
}
110+
111+
public function testResolveThrowsExceptionForMissingModelValue(): void
112+
{
113+
$this->expectException(LocalizedException::class);
114+
$this->expectExceptionMessage('"model" value should be specified');
115+
$value = ['model' => null];
116+
$args = [];
117+
118+
$this->orderTotal->resolve($this->fieldMock, $this->contextMock, $this->resolveInfoMock, $value, $args);
119+
}
120+
}

app/code/Magento/SalesRuleGraphQl/Test/Unit/Model/Resolver/CouponTest.php

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
use Magento\Sales\Api\Data\OrderInterface;
1818
use Magento\SalesRule\Model\Quote\GetCouponCodes;
1919
use Magento\SalesRuleGraphQl\Model\Resolver\Coupon;
20+
use PHPUnit\Framework\MockObject\MockObject;
2021
use PHPUnit\Framework\TestCase;
22+
use Magento\Framework\GraphQl\Query\Resolver\ContextInterface;
2123

2224
class CouponTest extends TestCase
2325
{
@@ -36,10 +38,28 @@ class CouponTest extends TestCase
3638
*/
3739
private $resolver;
3840

41+
/**
42+
* @var ContextInterface|MockObject
43+
*/
44+
private $contextMock;
45+
46+
/**
47+
* @var Field|MockObject
48+
*/
49+
private $fieldMock;
50+
51+
/**
52+
* @var ResolveInfo|MockObject
53+
*/
54+
private $resolveInfoMock;
55+
3956
protected function setUp(): void
4057
{
4158
$this->getCouponCodesMock = $this->createMock(GetCouponCodes::class);
4259
$this->getCouponsMock = $this->createMock(GetCoupons::class);
60+
$this->contextMock = $this->createMock(ContextInterface::class);
61+
$this->fieldMock = $this->createMock(Field::class);
62+
$this->resolveInfoMock = $this->createMock(ResolveInfo::class);
4363
$this->resolver = new Coupon(
4464
$this->getCouponCodesMock,
4565
$this->getCouponsMock
@@ -53,9 +73,9 @@ public function testResolveWithOrderModel(): void
5373
->method('getCouponCode')
5474
->willReturn('TEST1234');
5575
$result = $this->resolver->resolve(
56-
$this->createMock(Field::class),
57-
[],
58-
$this->createMock(ResolveInfo::class),
76+
$this->fieldMock,
77+
$this->contextMock,
78+
$this->resolveInfoMock,
5979
['order_model' => $orderModel]
6080
);
6181

@@ -67,9 +87,9 @@ public function testResolveWithoutDiscountModel(): void
6787
$this->expectException(LocalizedException::class);
6888
$this->expectExceptionMessage('"discount_model" value should be specified');
6989
$this->resolver->resolve(
70-
$this->createMock(Field::class),
71-
[],
72-
$this->createMock(ResolveInfo::class),
90+
$this->fieldMock,
91+
$this->contextMock,
92+
$this->resolveInfoMock,
7393
[]
7494
);
7595
}
@@ -79,9 +99,9 @@ public function testResolveWithoutQuoteModel(): void
7999
$this->expectException(LocalizedException::class);
80100
$this->expectExceptionMessage('"quote_model" value should be specified');
81101
$this->resolver->resolve(
82-
$this->createMock(Field::class),
83-
[],
84-
$this->createMock(ResolveInfo::class),
102+
$this->fieldMock,
103+
$this->contextMock,
104+
$this->resolveInfoMock,
85105
['discount_model' => $this->createMock(RuleDiscountInterface::class)]
86106
);
87107
}
@@ -93,9 +113,9 @@ public function testResolveWithoutCoupon(): void
93113
$this->getCouponCodesMock->method('execute')->willReturn([]);
94114
$this->getCouponsMock->method('execute')->willReturn([]);
95115
$result = $this->resolver->resolve(
96-
$this->createMock(Field::class),
97-
[],
98-
$this->createMock(ResolveInfo::class),
116+
$this->fieldMock,
117+
$this->contextMock,
118+
$this->resolveInfoMock,
99119
['discount_model' => $discountModel, 'quote_model' => $quoteModel]
100120
);
101121

@@ -113,9 +133,9 @@ public function testResolveWithMatchingRuleId(): void
113133
$this->getCouponCodesMock->method('execute')->willReturn(['test']);
114134
$this->getCouponsMock->method('execute')->willReturn([$couponMock]);
115135
$result = $this->resolver->resolve(
116-
$this->createMock(Field::class),
117-
[],
118-
$this->createMock(ResolveInfo::class),
136+
$this->fieldMock,
137+
$this->contextMock,
138+
$this->resolveInfoMock,
119139
['discount_model' => $discountModel, 'quote_model' => $quoteModel]
120140
);
121141

@@ -132,9 +152,9 @@ public function testResolveNoMatchingRuleId(): void
132152
$this->getCouponCodesMock->method('execute')->willReturn(['test']);
133153
$this->getCouponsMock->method('execute')->willReturn([$couponMock]);
134154
$result = $this->resolver->resolve(
135-
$this->createMock(Field::class),
136-
[],
137-
$this->createMock(ResolveInfo::class),
155+
$this->fieldMock,
156+
$this->contextMock,
157+
$this->resolveInfoMock,
138158
['discount_model' => $discountModel, 'quote_model' => $quoteModel]
139159
);
140160

0 commit comments

Comments
 (0)