Skip to content

Commit d941553

Browse files
committed
Merge branch '2.4.7-beta1-develop' of https://github.com/magento-gl/magento2ce into AC-8834
Merge
2 parents fb90b04 + 712e80c commit d941553

File tree

6 files changed

+126
-50
lines changed

6 files changed

+126
-50
lines changed

app/code/Magento/CatalogGraphQl/Model/AttributesJoiner.php

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use GraphQL\Language\AST\FieldNode;
1111
use GraphQL\Language\AST\InlineFragmentNode;
1212
use GraphQL\Language\AST\NodeKind;
13+
use GraphQL\Language\AST\NodeList;
1314
use Magento\Eav\Model\Entity\Collection\AbstractCollection;
1415
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1516
use Magento\Framework\ObjectManager\ResetAfterRequestInterface;
@@ -69,37 +70,49 @@ public function getQueryFields(FieldNode $fieldNode, ResolveInfo $resolveInfo):
6970
{
7071
if (null === $this->getFieldNodeSelections($fieldNode)) {
7172
$query = $fieldNode->selectionSet->selections;
72-
$selectedFields = [];
73-
$fragmentFields = [];
7473
/** @var FieldNode $field */
75-
foreach ($query as $field) {
76-
if ($field->kind === NodeKind::INLINE_FRAGMENT) {
77-
$fragmentFields[] = $this->addInlineFragmentFields($resolveInfo, $field);
78-
} elseif ($field->kind === NodeKind::FRAGMENT_SPREAD &&
79-
($spreadFragmentNode = $resolveInfo->fragments[$field->name->value])) {
80-
81-
foreach ($spreadFragmentNode->selectionSet->selections as $spreadNode) {
82-
if (isset($spreadNode->selectionSet->selections)
83-
&& $spreadNode->kind === NodeKind::INLINE_FRAGMENT) {
84-
$fragmentFields[] = $this->addInlineFragmentFields($resolveInfo, $spreadNode);
85-
} elseif (isset($spreadNode->selectionSet->selections)
86-
&& $spreadNode->kind !== NodeKind::INLINE_FRAGMENT) {
87-
$fragmentFields[] = $this->getQueryFields($spreadNode, $resolveInfo);
88-
} else {
74+
$result = $this->getQueryData($query, $resolveInfo);
75+
if ($result['fragmentFields']) {
76+
$result['selectedFields'] = array_merge([], $result['selectedFields'], ...$result['fragmentFields']);
77+
}
78+
$this->setSelectionsForFieldNode($fieldNode, array_unique($result['selectedFields']));
79+
}
80+
return $this->getFieldNodeSelections($fieldNode);
81+
}
82+
83+
/**
84+
* Get an array of queried data.
85+
*
86+
* @param NodeList $query
87+
* @param ResolveInfo $resolveInfo
88+
* @return array
89+
*/
90+
public function getQueryData(NodeList $query, ResolveInfo $resolveInfo): array
91+
{
92+
$selectedFields = $fragmentFields = $data = [];
93+
foreach ($query as $field) {
94+
if ($field->kind === NodeKind::INLINE_FRAGMENT) {
95+
$fragmentFields[] = $this->addInlineFragmentFields($resolveInfo, $field);
96+
} elseif ($field->kind === NodeKind::FRAGMENT_SPREAD &&
97+
($spreadFragmentNode = $resolveInfo->fragments[$field->name->value])) {
98+
foreach ($spreadFragmentNode->selectionSet->selections as $spreadNode) {
99+
if (isset($spreadNode->selectionSet->selections)) {
100+
if ($spreadNode->kind === NodeKind::FIELD && isset($spreadNode->name)) {
89101
$selectedFields[] = $spreadNode->name->value;
90102
}
103+
$fragmentFields[] = $this->getQueryFields($spreadNode, $resolveInfo);
104+
} else {
105+
$selectedFields[] = $spreadNode->name->value;
91106
}
92-
} else {
93-
$selectedFields[] = $field->name->value;
94107
}
108+
} else {
109+
$selectedFields[] = $field->name->value;
95110
}
96-
if ($fragmentFields) {
97-
$selectedFields = array_merge([], $selectedFields, ...$fragmentFields);
98-
}
99-
$this->setSelectionsForFieldNode($fieldNode, array_unique($selectedFields));
100111
}
112+
$data['selectedFields'] = $selectedFields;
113+
$data['fragmentFields'] = $fragmentFields;
101114

102-
return $this->getFieldNodeSelections($fieldNode);
115+
return $data;
103116
}
104117

105118
/**
@@ -117,15 +130,22 @@ private function addInlineFragmentFields(
117130
): array {
118131
$query = $inlineFragmentField->selectionSet->selections;
119132
/** @var FieldNode $field */
133+
$fragmentFields = [];
120134
foreach ($query as $field) {
121135
if ($field->kind === NodeKind::INLINE_FRAGMENT) {
122136
$this->addInlineFragmentFields($resolveInfo, $field, $inlineFragmentFields);
123137
} elseif (isset($field->selectionSet->selections)) {
124-
continue;
138+
if ($field->kind === NodeKind::FIELD && isset($field->name)) {
139+
$inlineFragmentFields[] = $field->name->value;
140+
}
141+
$fragmentFields[] = $this->getQueryFields($field, $resolveInfo);
125142
} else {
126143
$inlineFragmentFields[] = $field->name->value;
127144
}
128145
}
146+
if ($fragmentFields) {
147+
$inlineFragmentFields = array_merge([], $inlineFragmentFields, ...$fragmentFields);
148+
}
129149

130150
return array_unique($inlineFragmentFields);
131151
}

app/code/Magento/CatalogGraphQl/Model/Resolver/Product/ProductFieldsSelector.php

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace Magento\CatalogGraphQl\Model\Resolver\Product;
99

10-
use GraphQL\Language\AST\NodeKind;
10+
use Magento\CatalogGraphQl\Model\AttributesJoiner;
1111
use Magento\Framework\GraphQl\Query\FieldTranslator;
1212
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1313

@@ -19,14 +19,23 @@ class ProductFieldsSelector
1919
/**
2020
* @var FieldTranslator
2121
*/
22-
private $fieldTranslator;
22+
private FieldTranslator $fieldTranslator;
23+
24+
/**
25+
* @var AttributesJoiner
26+
*/
27+
private AttributesJoiner $attributesJoiner;
2328

2429
/**
2530
* @param FieldTranslator $fieldTranslator
31+
* @param AttributesJoiner $attributesJoiner
2632
*/
27-
public function __construct(FieldTranslator $fieldTranslator)
28-
{
33+
public function __construct(
34+
FieldTranslator $fieldTranslator,
35+
AttributesJoiner $attributesJoiner
36+
) {
2937
$this->fieldTranslator = $fieldTranslator;
38+
$this->attributesJoiner = $attributesJoiner;
3039
}
3140

3241
/**
@@ -36,27 +45,17 @@ public function __construct(FieldTranslator $fieldTranslator)
3645
* @param string $productNodeName
3746
* @return string[]
3847
*/
39-
public function getProductFieldsFromInfo(ResolveInfo $info, string $productNodeName = 'product') : array
48+
public function getProductFieldsFromInfo(ResolveInfo $info, string $productNodeName = 'product'): array
4049
{
4150
$fieldNames = [];
4251
foreach ($info->fieldNodes as $node) {
4352
if ($node->name->value !== $productNodeName) {
4453
continue;
4554
}
46-
foreach ($node->selectionSet->selections as $selectionNode) {
47-
if ($selectionNode->kind === NodeKind::INLINE_FRAGMENT) {
48-
foreach ($selectionNode->selectionSet->selections as $inlineSelection) {
49-
if ($inlineSelection->kind === NodeKind::INLINE_FRAGMENT) {
50-
continue;
51-
}
52-
$fieldNames[] = $this->fieldTranslator->translate($inlineSelection->name->value);
53-
}
54-
continue;
55-
}
56-
$fieldNames[] = $this->fieldTranslator->translate($selectionNode->name->value);
57-
}
55+
$queryFields = $this->attributesJoiner->getQueryFields($node, $info);
56+
$fieldNames[] = $queryFields;
5857
}
5958

60-
return $fieldNames;
59+
return array_merge(...$fieldNames);
6160
}
6261
}

app/code/Magento/ConfigurableProduct/Model/Product/VariationHandler.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,10 @@ protected function fillSimpleProductData(
200200
continue;
201201
}
202202

203-
$product->setData($attribute->getAttributeCode(), $parentProduct->getData($attribute->getAttributeCode()));
203+
$product->setData(
204+
$attribute->getAttributeCode(),
205+
$parentProduct->getData($attribute->getAttributeCode()) ?? $attribute->getDefaultValue()
206+
);
204207
}
205208

206209
$keysFilter = ['item_id', 'product_id', 'stock_id', 'type_id', 'website_id'];

dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductFragmentTest.php

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
namespace Magento\GraphQl\Catalog;
99

10+
use Exception;
1011
use Magento\TestFramework\TestCase\GraphQlAbstract;
1112

1213
/**
@@ -16,8 +17,9 @@ class ProductFragmentTest extends GraphQlAbstract
1617
{
1718
/**
1819
* @magentoApiDataFixture Magento/Catalog/_files/product_simple.php
20+
* @throws Exception
1921
*/
20-
public function testSimpleProductFragment()
22+
public function testSimpleProductNamedFragment(): void
2123
{
2224
$sku = 'simple';
2325
$name = 'Simple Product';
@@ -36,9 +38,9 @@ public function testSimpleProductFragment()
3638
fragment BasicProductInformation on ProductInterface {
3739
sku
3840
name
39-
price {
40-
regularPrice {
41-
amount {
41+
price_range{
42+
minimum_price{
43+
final_price{
4244
value
4345
}
4446
}
@@ -49,6 +51,42 @@ public function testSimpleProductFragment()
4951
$actualProductData = $result['products']['items'][0];
5052
$this->assertNotEmpty($actualProductData);
5153
$this->assertEquals($name, $actualProductData['name']);
52-
$this->assertEquals($price, $actualProductData['price']['regularPrice']['amount']['value']);
54+
$this->assertEquals($price, $actualProductData['price_range']['minimum_price']['final_price']['value']);
55+
}
56+
57+
/**
58+
* @magentoApiDataFixture Magento/Catalog/_files/product_simple.php
59+
* @throws Exception
60+
*/
61+
public function testSimpleProductInlineFragment(): void
62+
{
63+
$sku = 'simple';
64+
$name = 'Simple Product';
65+
$price = 10;
66+
67+
$query = <<<QUERY
68+
query GetProduct {
69+
products(filter: { sku: { eq: "$sku" } }) {
70+
items {
71+
sku
72+
... on ProductInterface {
73+
name
74+
price_range{
75+
minimum_price{
76+
final_price{
77+
value
78+
}
79+
}
80+
}
81+
}
82+
}
83+
}
84+
}
85+
QUERY;
86+
$result = $this->graphQlQuery($query);
87+
$actualProductData = $result['products']['items'][0];
88+
$this->assertNotEmpty($actualProductData);
89+
$this->assertEquals($name, $actualProductData['name']);
90+
$this->assertEquals($price, $actualProductData['price_range']['minimum_price']['final_price']['value']);
5391
}
5492
}

dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/VariationHandlerTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,20 @@ public function testGenerateSimpleProductsWithPartialData(array $productsData):
109109
}
110110
}
111111

112+
/**
113+
* @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
114+
* @dataProvider generateSimpleProductsWithPartialDataDataProvider
115+
* @param array $productsData
116+
* @return void
117+
*/
118+
public function testGeneratedSimpleProductInheritTaxClassFromParent(array $productsData): void
119+
{
120+
$this->product->setTaxClassId(2);
121+
$generatedProduct = $this->variationHandler->generateSimpleProducts($this->product, $productsData);
122+
$product = $this->productRepository->getById(reset($generatedProduct));
123+
$this->assertEquals(2, $product->getTaxClassId());
124+
}
125+
112126
/**
113127
* @return array
114128
*/

dev/tests/integration/testsuite/Magento/Framework/ObjectManager/ObjectManagerTest.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ class ObjectManagerTest extends \PHPUnit\Framework\TestCase
1212
/**#@+
1313
* Test class with type error
1414
*/
15-
public const TEST_CLASS_WITH_TYPE_ERROR = \Magento\Framework\ObjectManager\TestAsset\ConstructorWithTypeError::class;
15+
public const TEST_CLASS_WITH_TYPE_ERROR =
16+
\Magento\Framework\ObjectManager\TestAsset\ConstructorWithTypeError::class;
1617

1718
/**#@+
1819
* Test classes for basic instantiation
@@ -28,7 +29,8 @@ class ObjectManagerTest extends \PHPUnit\Framework\TestCase
2829
*/
2930
public const TEST_INTERFACE = \Magento\Framework\ObjectManager\TestAsset\TestAssetInterface::class;
3031

31-
public const TEST_INTERFACE_IMPLEMENTATION = \Magento\Framework\ObjectManager\TestAsset\InterfaceImplementation::class;
32+
public const TEST_INTERFACE_IMPLEMENTATION =
33+
\Magento\Framework\ObjectManager\TestAsset\InterfaceImplementation::class;
3234

3335
public const TEST_CLASS_WITH_INTERFACE = \Magento\Framework\ObjectManager\TestAsset\InterfaceInjection::class;
3436

0 commit comments

Comments
 (0)