Skip to content

Commit eb04e47

Browse files
committed
B2B-2658: Implement GraphQL Resolver Cache for Customer query
- test fix
1 parent 4e0303f commit eb04e47

File tree

2 files changed

+110
-24
lines changed

2 files changed

+110
-24
lines changed

app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProvider.php

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -146,31 +146,9 @@ private function getInstancesForResolver(
146146
}
147147
$dataProcessingClassList = [];
148148
foreach ($resolverClassesConfig as $resolverClass => $classChain) {
149+
$this->validateClassChain($classChain, $interfaceName, $resolverClass);
149150
foreach ($classChain as $classData) {
150-
if (is_a($classData['class'], $interfaceName, true)) {
151-
$dataProcessingClassList[] = $classData;
152-
} else {
153-
if ($interfaceName == HydratorInterface::class) {
154-
throw new ConfigurationMismatchException(
155-
__(
156-
'Hydrator %1 configured for resolver %2 must implement %3.',
157-
$classData['class'],
158-
$resolverClass,
159-
$interfaceName
160-
)
161-
);
162-
} else {
163-
throw new ConfigurationMismatchException(
164-
__(
165-
'Dehydrator %1 configured for resolver %2 must implement %3.',
166-
$classData['class'],
167-
$resolverClass,
168-
$interfaceName
169-
)
170-
);
171-
}
172-
173-
}
151+
$dataProcessingClassList[] = $classData;
174152
}
175153
}
176154
usort($dataProcessingClassList, function ($data1, $data2) {
@@ -183,6 +161,43 @@ private function getInstancesForResolver(
183161
return $dataProcessingInstances;
184162
}
185163

164+
/**
165+
* Validate hydrator or dehydrator classes and throw exception if class does not implement relevant interface.
166+
*
167+
* @param array $classChain
168+
* @param string $interfaceName
169+
* @param string $resolverClass
170+
* @return void
171+
* @throws ConfigurationMismatchException
172+
*/
173+
private function validateClassChain(array $classChain, string $interfaceName, string $resolverClass)
174+
{
175+
foreach ($classChain as $classData) {
176+
if (!is_a($classData['class'], $interfaceName, true)) {
177+
if ($interfaceName == HydratorInterface::class) {
178+
throw new ConfigurationMismatchException(
179+
__(
180+
'Hydrator %1 configured for resolver %2 must implement %3.',
181+
$classData['class'],
182+
$resolverClass,
183+
$interfaceName
184+
)
185+
);
186+
} else {
187+
throw new ConfigurationMismatchException(
188+
__(
189+
'Dehydrator %1 configured for resolver %2 must implement %3.',
190+
$classData['class'],
191+
$resolverClass,
192+
$interfaceName
193+
)
194+
);
195+
}
196+
197+
}
198+
}
199+
}
200+
186201
/**
187202
* Get class inheritance chain for the given resolver object.
188203
*

dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,77 @@ public function testHydratorDoesNotExist()
169169
$this->assertNull($this->provider->getHydratorForResolver($resolver));
170170
}
171171

172+
/**
173+
* @magentoAppArea graphql
174+
*
175+
* @return void
176+
*/
177+
public function testHydratorClassMismatch()
178+
{
179+
$this->expectExceptionMessage('Hydrator TestResolverModelDehydrator configured for resolver '
180+
. 'Magento\StoreGraphQl\Model\Resolver\StoreConfigResolver must implement '
181+
. 'Magento\GraphQlResolverCache\Model\Resolver\Result\HydratorInterface.');
182+
$testModelDehydrator = $this->getMockBuilder(DehydratorInterface::class)
183+
->disableOriginalConstructor()
184+
->setMockClassName('TestResolverModelDehydrator')
185+
->onlyMethods(['dehydrate'])
186+
->getMock();
187+
$this->objectManager->addSharedInstance($testModelDehydrator, 'TestResolverModelDehydrator');
188+
189+
$this->provider = $this->objectManager->create(
190+
HydratorDehydratorProvider::class,
191+
[
192+
'hydratorConfig' => [
193+
'Magento\StoreGraphQl\Model\Resolver\StoreConfigResolver' => [
194+
'simple_dehydrator' => [
195+
'sortOrder' => 10,
196+
'class' => 'TestResolverModelDehydrator'
197+
],
198+
]
199+
]
200+
]
201+
);
202+
$resolver = $this->getMockBuilder(StoreConfigResolver::class)
203+
->disableOriginalConstructor()
204+
->getMockForAbstractClass();
205+
$this->assertNull($this->provider->getHydratorForResolver($resolver));
206+
}
207+
208+
/**
209+
* @magentoAppArea graphql
210+
*
211+
* @return void
212+
*/
213+
public function testDehydratorClassMismatch()
214+
{
215+
$this->expectExceptionMessage('Dehydrator TestResolverModelHydrator configured for resolver '
216+
. 'Magento\StoreGraphQl\Model\Resolver\StoreConfigResolver must implement '
217+
. 'Magento\GraphQlResolverCache\Model\Resolver\Result\DehydratorInterface.');
218+
$hydrator = $this->getMockBuilder(HydratorInterface::class)
219+
->disableOriginalConstructor()
220+
->setMockClassName('TestResolverModelHydrator')
221+
->getMock();
222+
$this->objectManager->addSharedInstance($hydrator, 'TestResolverModelHydrator');
223+
224+
$this->provider = $this->objectManager->create(
225+
HydratorDehydratorProvider::class,
226+
[
227+
'dehydratorConfig' => [
228+
'Magento\StoreGraphQl\Model\Resolver\StoreConfigResolver' => [
229+
'simple_dehydrator' => [
230+
'sortOrder' => 10,
231+
'class' => 'TestResolverModelHydrator'
232+
],
233+
]
234+
]
235+
]
236+
);
237+
$resolver = $this->getMockBuilder(StoreConfigResolver::class)
238+
->disableOriginalConstructor()
239+
->getMockForAbstractClass();
240+
$this->assertNull($this->provider->getDehydratorForResolver($resolver));
241+
}
242+
172243
/**
173244
* @magentoAppArea graphql
174245
*

0 commit comments

Comments
 (0)