Skip to content

Commit cf9cd29

Browse files
committed
fix: Undefined array key "result" parse-community#518
1 parent 353a85b commit cf9cd29

File tree

2 files changed

+92
-2
lines changed

2 files changed

+92
-2
lines changed

Diff for: src/Parse/ParseCloud.php

+36-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,37 @@
1313
*/
1414
class ParseCloud
1515
{
16+
protected static $requestCallable;
17+
18+
/**
19+
* Sets a callable to be used for making requests.
20+
*
21+
* This method allows injection of a mockable callable for testing purposes.
22+
*
23+
* @param callable $callable The callable to use for requests.
24+
*/
25+
public static function setRequestCallable(callable $callable)
26+
{
27+
self::$requestCallable = $callable;
28+
}
29+
30+
/**
31+
* Gets the callable used for making requests.
32+
*
33+
* If no callable has been set, it returns the default callable that calls ParseClient::_request.
34+
*
35+
* @return callable The callable used for requests.
36+
*/
37+
protected static function getRequestCallable()
38+
{
39+
if (!self::$requestCallable) {
40+
self::$requestCallable = function($method, $path, $sessionToken = null, $data = null, $useMasterKey = false, $contentType = 'application/json', $returnHeaders = false) {
41+
return ParseClient::_request($method, $path, $sessionToken, $data, $useMasterKey, $contentType, $returnHeaders);
42+
};
43+
}
44+
return self::$requestCallable;
45+
}
46+
1647
/**
1748
* Makes a call to a Cloud function.
1849
*
@@ -28,15 +59,18 @@ public static function run($name, $data = [], $useMasterKey = false)
2859
if (ParseUser::getCurrentUser()) {
2960
$sessionToken = ParseUser::getCurrentUser()->getSessionToken();
3061
}
31-
$response = ParseClient::_request(
62+
63+
$response = call_user_func(
64+
self::getRequestCallable(),
3265
'POST',
3366
'functions/'.$name,
3467
$sessionToken,
3568
json_encode(ParseClient::_encode($data, false)),
3669
$useMasterKey
3770
);
3871

39-
return ParseClient::_decode($response['result']);
72+
$returnVal = isset($response['result']) ? $response['result'] : [];
73+
return ParseClient::_decode($returnVal);
4074
}
4175

4276
/**

Diff for: tests/Parse/ParseCloudTest.php

+56
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ public function tearDown() : void
2323
ParseUser::logOut();
2424
$user->destroy(true);
2525
}
26+
27+
// Reset the callable after each test
28+
ParseCloud::setRequestCallable(function($method, $path, $sessionToken = null, $data = null, $useMasterKey = false, $contentType = 'application/json', $returnHeaders = false) {
29+
return \Parse\ParseClient::_request($method, $path, $sessionToken, $data, $useMasterKey, $contentType, $returnHeaders);
30+
});
31+
32+
parent::tearDown();
2633
}
2734

2835
/**
@@ -72,6 +79,55 @@ public function testFunctionCallException()
7279
]);
7380
}
7481

82+
/**
83+
* @group cloud-code
84+
*/
85+
public function testFunctionCallWithNullParams()
86+
{
87+
$this->expectException(
88+
'Parse\ParseException',
89+
'bad stuff happened'
90+
);
91+
$response = ParseCloud::run('bar', null);
92+
}
93+
94+
/**
95+
* @group cloud-code
96+
*/
97+
public function testFunctionCallWithEmptyParams() {
98+
$this->expectException(
99+
'Parse\ParseException',
100+
'bad stuff happened'
101+
);
102+
$response = ParseCloud::run('bar', []);
103+
}
104+
105+
/**
106+
* @group cloud-code
107+
*/
108+
public function testFunctionCallWithoutResultKey()
109+
{
110+
// Mock the _request method to return a response without the 'result' key
111+
$mockResponse = [];
112+
$mockCallable = $this->getMockBuilder(\stdClass::class)
113+
->addMethods(['__invoke'])
114+
->getMock();
115+
$mockCallable->expects($this->once())
116+
->method('__invoke')
117+
->willReturn($mockResponse);
118+
119+
// Set the mock callable in ParseCloud
120+
ParseCloud::setRequestCallable($mockCallable);
121+
122+
$response = ParseCloud::run('bar', [
123+
'key1' => 'value2',
124+
'key2' => 'value1'
125+
]);
126+
127+
// Since 'result' key is missing, the default value is returned
128+
$this->assertEquals([], $response);
129+
}
130+
75131
/**
76132
* @group cloud-code
77133
*/

0 commit comments

Comments
 (0)