From dd93880098fe63e89457230d2fcaaf2706feb97b Mon Sep 17 00:00:00 2001 From: Benjamin Friedman Date: Mon, 30 Oct 2017 17:08:38 -0700 Subject: [PATCH 1/8] Adds ParseServerInfo and tests --- src/Parse/ParseServerInfo.php | 161 ++++++++++++++++++++++++++++ tests/Parse/ParseServerInfoTest.php | 94 ++++++++++++++++ 2 files changed, 255 insertions(+) create mode 100644 src/Parse/ParseServerInfo.php create mode 100644 tests/Parse/ParseServerInfoTest.php diff --git a/src/Parse/ParseServerInfo.php b/src/Parse/ParseServerInfo.php new file mode 100644 index 00000000..f5d4cc05 --- /dev/null +++ b/src/Parse/ParseServerInfo.php @@ -0,0 +1,161 @@ + + * @package Parse + */ +class ParseServerInfo +{ + /** + * Reported server features and configs + * + * @var array + */ + private static $serverFeatures; + + /** + * Reported server version + * + * @var string + */ + private static $serverVersion; + + /** + * Requests and sets server features and version + * + * @throws ParseException + */ + private static function setServerInfo() + { + $info = ParseClient::_request( + 'GET', + 'serverInfo/', + null, + null, + true + ); + + // validate we have features & version + + if(!isset($info['features'])) { + throw new ParseException('Missing features in server info.'); + } + + if(!isset($info['parseServerVersion'])) { + throw new ParseException('Missing version in server info'); + } + + self::$serverFeatures = $info['features']; + self::$serverVersion = $info['parseServerVersion']; + } + + /** + * Get a specific feature set from the server + * + * @param string $key Feature set to get + * @return mixed + */ + public static function get($key) + { + if(!isset(self::$serverFeatures)) { + self::setServerInfo(); + } + return self::$serverFeatures[$key]; + } + + /** + * Gets features for the current server + * + * @return array + */ + public static function getFeatures() + { + if(!isset(self::$serverFeatures)) { + self::setServerInfo(); + } + return self::$serverFeatures; + } + + /** + * Gets the reported version of the current server + * + * @return string + */ + public static function getVersion() + { + if(!isset(self::$serverVersion)) { + self::setServerInfo(); + } + return self::$serverVersion; + } + + /** + * Gets features available for globalConfig + * + * @return array + */ + public static function getGlobalConfigFeatures() + { + return self::get('globalConfig'); + } + + /** + * Gets features available for hooks + * + * @return array + */ + public static function getHooksFeatures() + { + return self::get('hooks'); + } + + /** + * Gets features available for cloudCode + * + * @return array + */ + public static function getCloudCodeFeatures() + { + return self::get('cloudCode'); + } + + /** + * Gets features available for logs + * + * @return array + */ + public static function getLogsFeatures() + { + return self::get('logs'); + } + + /** + * Gets features available for push + * + * @return array + */ + public static function getPushFeatures() + { + return self::get('push'); + } + + /** + * Gets features available for schemas + * + * @return array + */ + public static function getSchemasFeatures() + { + return self::get('schemas'); + } +} \ No newline at end of file diff --git a/tests/Parse/ParseServerInfoTest.php b/tests/Parse/ParseServerInfoTest.php new file mode 100644 index 00000000..f19cd6ca --- /dev/null +++ b/tests/Parse/ParseServerInfoTest.php @@ -0,0 +1,94 @@ +assertNotNull($logs); + } + + public function testGetFeatures() + { + $features = ParseServerInfo::getFeatures(); + $this->assertNotEmpty($features); + } + + public function testGetVersion() + { + $version = ParseServerInfo::getVersion(); + $this->assertNotNull($version); + } + + public function testGlobalConfigFeatures() + { + $globalConfigFeatures = ParseServerInfo::getGlobalConfigFeatures(); + $this->assertTrue($globalConfigFeatures['create']); + $this->assertTrue($globalConfigFeatures['read']); + $this->assertTrue($globalConfigFeatures['update']); + $this->assertTrue($globalConfigFeatures['delete']); + } + + public function testHooksFeatures() + { + $hooksFeatures = ParseServerInfo::getHooksFeatures(); + $this->assertTrue($hooksFeatures['create']); + $this->assertTrue($hooksFeatures['read']); + $this->assertTrue($hooksFeatures['update']); + $this->assertTrue($hooksFeatures['delete']); + } + + public function testCloudCodeFeatures() + { + $cloudCodeFeatures = ParseServerInfo::getCloudCodeFeatures(); + $this->assertTrue($cloudCodeFeatures['jobs']); + } + + public function testLogsFeatures() + { + $logsFeatures = ParseServerInfo::getLogsFeatures(); + $this->assertTrue($logsFeatures['level']); + $this->assertTrue($logsFeatures['size']); + $this->assertTrue($logsFeatures['order']); + $this->assertTrue($logsFeatures['until']); + $this->assertTrue($logsFeatures['from']); + } + + public function testPushFeatures() + { + $pushFeatures = ParseServerInfo::getPushFeatures(); + + // these may change depending on the server being tested against + $this->assertTrue(isset($pushFeatures['immediatePush'])); + $this->assertTrue(isset($pushFeatures['scheduledPush'])); + $this->assertTrue(isset($pushFeatures['storedPushData'])); + + $this->assertTrue($pushFeatures['pushAudiences']); + $this->assertTrue($pushFeatures['localization']); + } + + public function testSchemasFeatures() + { + $schemasFeatures = ParseServerInfo::getSchemasFeatures(); + $this->assertTrue($schemasFeatures['addField']); + $this->assertTrue($schemasFeatures['removeField']); + $this->assertTrue($schemasFeatures['addClass']); + $this->assertTrue($schemasFeatures['removeClass']); + $this->assertTrue($schemasFeatures['clearAllDataFromClass']); + $this->assertFalse($schemasFeatures['exportClass']); + $this->assertTrue($schemasFeatures['editClassLevelPermissions']); + $this->assertTrue($schemasFeatures['editPointerPermissions']); + } + +} \ No newline at end of file From 90dbd492582e045470b2009dc2de103ccb468cd3 Mon Sep 17 00:00:00 2001 From: Benjamin Friedman Date: Mon, 30 Oct 2017 17:08:51 -0700 Subject: [PATCH 2/8] Indicate server version being actively tested against --- tests/bootstrap-stream.php | 6 ++++++ tests/bootstrap.php | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/tests/bootstrap-stream.php b/tests/bootstrap-stream.php index 0beb835a..4b2718e1 100644 --- a/tests/bootstrap-stream.php +++ b/tests/bootstrap-stream.php @@ -9,6 +9,8 @@ namespace Parse; +use Parse\Test\Helper; + require_once dirname(__DIR__).'/vendor/autoload.php'; define('APPLICATION_PATH', dirname(__DIR__)); @@ -16,4 +18,8 @@ // use the steam client $USE_CLIENT_STREAM = true; +// indicate which server version & client we're testing against +Helper::setUp(); +$version = ParseServerInfo::getVersion(); + echo "[ testing with stream client ]\n"; \ No newline at end of file diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 06b8f9eb..32e21fd1 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -7,8 +7,14 @@ namespace Parse; +use Parse\Test\Helper; + require_once dirname(__DIR__).'/vendor/autoload.php'; define('APPLICATION_PATH', dirname(__DIR__)); -echo "[ testing with curl client ]\n"; \ No newline at end of file +// indicate which server version & client we're testing against +Helper::setUp(); +$version = ParseServerInfo::getVersion(); + +echo "[ testing against {$version} with curl client ]\n"; \ No newline at end of file From 9a46e5574011fc8202c3525f91d06a6001204be7 Mon Sep 17 00:00:00 2001 From: Benjamin Friedman Date: Mon, 30 Oct 2017 17:19:52 -0700 Subject: [PATCH 3/8] lint --- src/Parse/ParseServerInfo.php | 12 ++++++------ tests/Parse/ParseServerInfoTest.php | 4 +--- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/Parse/ParseServerInfo.php b/src/Parse/ParseServerInfo.php index f5d4cc05..7150d584 100644 --- a/src/Parse/ParseServerInfo.php +++ b/src/Parse/ParseServerInfo.php @@ -47,11 +47,11 @@ private static function setServerInfo() // validate we have features & version - if(!isset($info['features'])) { + if (!isset($info['features'])) { throw new ParseException('Missing features in server info.'); } - if(!isset($info['parseServerVersion'])) { + if (!isset($info['parseServerVersion'])) { throw new ParseException('Missing version in server info'); } @@ -67,7 +67,7 @@ private static function setServerInfo() */ public static function get($key) { - if(!isset(self::$serverFeatures)) { + if (!isset(self::$serverFeatures)) { self::setServerInfo(); } return self::$serverFeatures[$key]; @@ -80,7 +80,7 @@ public static function get($key) */ public static function getFeatures() { - if(!isset(self::$serverFeatures)) { + if (!isset(self::$serverFeatures)) { self::setServerInfo(); } return self::$serverFeatures; @@ -93,7 +93,7 @@ public static function getFeatures() */ public static function getVersion() { - if(!isset(self::$serverVersion)) { + if (!isset(self::$serverVersion)) { self::setServerInfo(); } return self::$serverVersion; @@ -158,4 +158,4 @@ public static function getSchemasFeatures() { return self::get('schemas'); } -} \ No newline at end of file +} diff --git a/tests/Parse/ParseServerInfoTest.php b/tests/Parse/ParseServerInfoTest.php index f19cd6ca..3740f281 100644 --- a/tests/Parse/ParseServerInfoTest.php +++ b/tests/Parse/ParseServerInfoTest.php @@ -8,7 +8,6 @@ namespace Parse\Test; - use Parse\ParseServerInfo; class ParseServerInfoTest extends \PHPUnit_Framework_TestCase @@ -90,5 +89,4 @@ public function testSchemasFeatures() $this->assertTrue($schemasFeatures['editClassLevelPermissions']); $this->assertTrue($schemasFeatures['editPointerPermissions']); } - -} \ No newline at end of file +} From b21fe5c165bed102e38fc11f7c715075a0984cfb Mon Sep 17 00:00:00 2001 From: Benjamin Friedman Date: Mon, 30 Oct 2017 18:30:16 -0700 Subject: [PATCH 4/8] coverage bump, adjustments --- src/Parse/ParseServerInfo.php | 73 +++++++++++++++++------------ tests/Parse/ParseServerInfoTest.php | 17 +++++++ tests/bootstrap-stream.php | 2 +- 3 files changed, 62 insertions(+), 30 deletions(-) diff --git a/src/Parse/ParseServerInfo.php b/src/Parse/ParseServerInfo.php index 7150d584..4483ffc7 100644 --- a/src/Parse/ParseServerInfo.php +++ b/src/Parse/ParseServerInfo.php @@ -31,32 +31,52 @@ class ParseServerInfo private static $serverVersion; /** - * Requests and sets server features and version + * Requests, sets and returns server features and version * + * @return array * @throws ParseException */ - private static function setServerInfo() + private static function getServerInfo() { - $info = ParseClient::_request( - 'GET', - 'serverInfo/', - null, - null, - true - ); - - // validate we have features & version - - if (!isset($info['features'])) { - throw new ParseException('Missing features in server info.'); + if(!isset(self::$serverFeatures) || !isset(self::$serverVersion)) { + $info = ParseClient::_request( + 'GET', + 'serverInfo/', + null, + null, + true + ); + + // validate we have features & version + + if (!isset($info['features'])) { + throw new ParseException('Missing features in server info.'); + } + + if (!isset($info['parseServerVersion'])) { + throw new ParseException('Missing version in server info'); + } + + self::$serverFeatures = $info['features']; + self::_setServerVersion($info['parseServerVersion']); } - if (!isset($info['parseServerVersion'])) { - throw new ParseException('Missing version in server info'); - } + return [ + 'features' => self::$serverFeatures, + 'version' => self::$serverVersion + ]; + } - self::$serverFeatures = $info['features']; - self::$serverVersion = $info['parseServerVersion']; + /** + * Sets the current server version. + * Allows setting the server version to avoid making an additional request + * if the version is obtained elsewhere. + * + * @param string $version Version to set + */ + public static function _setServerVersion($version) + { + self::$serverVersion = $version; } /** @@ -67,10 +87,7 @@ private static function setServerInfo() */ public static function get($key) { - if (!isset(self::$serverFeatures)) { - self::setServerInfo(); - } - return self::$serverFeatures[$key]; + return self::getServerInfo()['features'][$key]; } /** @@ -80,10 +97,7 @@ public static function get($key) */ public static function getFeatures() { - if (!isset(self::$serverFeatures)) { - self::setServerInfo(); - } - return self::$serverFeatures; + return self::getServerInfo()['features']; } /** @@ -94,9 +108,10 @@ public static function getFeatures() public static function getVersion() { if (!isset(self::$serverVersion)) { - self::setServerInfo(); + return self::getServerInfo()['version']; + } else { + return self::$serverVersion; } - return self::$serverVersion; } /** diff --git a/tests/Parse/ParseServerInfoTest.php b/tests/Parse/ParseServerInfoTest.php index 3740f281..aa0b475d 100644 --- a/tests/Parse/ParseServerInfoTest.php +++ b/tests/Parse/ParseServerInfoTest.php @@ -24,12 +24,29 @@ public function testGetFeatures() $this->assertNotEmpty($features); } + /** + * @group test-get-version + */ public function testGetVersion() { + ParseServerInfo::_setServerVersion(null); $version = ParseServerInfo::getVersion(); $this->assertNotNull($version); } + public function testSetVersion() + { + /** + * Tests setting the version. + * /health may return the version in the future as well. + * Rather than fetch that information again we can always have the option + * to set it from wherever we happen to get it. + */ + $version = '1.2.3'; + ParseServerInfo::_setServerVersion($version); + $this->assertEquals($version, ParseServerInfo::getVersion()); + } + public function testGlobalConfigFeatures() { $globalConfigFeatures = ParseServerInfo::getGlobalConfigFeatures(); diff --git a/tests/bootstrap-stream.php b/tests/bootstrap-stream.php index 4b2718e1..29c33548 100644 --- a/tests/bootstrap-stream.php +++ b/tests/bootstrap-stream.php @@ -22,4 +22,4 @@ Helper::setUp(); $version = ParseServerInfo::getVersion(); -echo "[ testing with stream client ]\n"; \ No newline at end of file +echo "[ testing against {$version} with stream client ]\n"; \ No newline at end of file From 9216eec412097cecf7f2d3ce2a17ea18ad717154 Mon Sep 17 00:00:00 2001 From: Benjamin Friedman Date: Mon, 30 Oct 2017 23:12:43 -0700 Subject: [PATCH 5/8] lint --- src/Parse/ParseServerInfo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Parse/ParseServerInfo.php b/src/Parse/ParseServerInfo.php index 4483ffc7..d3bafa38 100644 --- a/src/Parse/ParseServerInfo.php +++ b/src/Parse/ParseServerInfo.php @@ -38,7 +38,7 @@ class ParseServerInfo */ private static function getServerInfo() { - if(!isset(self::$serverFeatures) || !isset(self::$serverVersion)) { + if (!isset(self::$serverFeatures) || !isset(self::$serverVersion)) { $info = ParseClient::_request( 'GET', 'serverInfo/', From dd48d706189921f2d84b37213e8cc3431bc751d1 Mon Sep 17 00:00:00 2001 From: Benjamin Friedman Date: Tue, 31 Oct 2017 12:09:23 -0700 Subject: [PATCH 6/8] test exception cases --- src/Parse/ParseServerInfo.php | 2 +- tests/Parse/ParseServerInfoTest.php | 77 +++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/Parse/ParseServerInfo.php b/src/Parse/ParseServerInfo.php index d3bafa38..83c908e6 100644 --- a/src/Parse/ParseServerInfo.php +++ b/src/Parse/ParseServerInfo.php @@ -54,7 +54,7 @@ private static function getServerInfo() } if (!isset($info['parseServerVersion'])) { - throw new ParseException('Missing version in server info'); + throw new ParseException('Missing version in server info.'); } self::$serverFeatures = $info['features']; diff --git a/tests/Parse/ParseServerInfoTest.php b/tests/Parse/ParseServerInfoTest.php index aa0b475d..affd6018 100644 --- a/tests/Parse/ParseServerInfoTest.php +++ b/tests/Parse/ParseServerInfoTest.php @@ -8,10 +8,17 @@ namespace Parse\Test; +use Parse\ParseClient; +use Parse\ParseException; use Parse\ParseServerInfo; class ParseServerInfoTest extends \PHPUnit_Framework_TestCase { + public function setUp() + { + Helper::setHttpClient(); + } + public function testDirectGet() { $logs = ParseServerInfo::get('logs'); @@ -47,6 +54,76 @@ public function testSetVersion() $this->assertEquals($version, ParseServerInfo::getVersion()); } + /** + * @group server-info-missing-features + */ + public function testMissingFeatures() + { + $this->setExpectedException( + 'Parse\ParseException', + 'Missing features in server info.' + ); + + $httpClient = ParseClient::getHttpClient(); + + // create a mock of the current http client + $stubClient = $this->getMockBuilder(get_class($httpClient)) + ->getMock(); + + // stub the response type to return + // something we will try to work with + $stubClient + ->method('getResponseContentType') + ->willReturn('application/octet-stream'); + + $stubClient + ->method('send') + ->willReturn(json_encode([ + 'empty' => true + ])); + + // replace the client with our stub + ParseClient::setHttpClient($stubClient); + + ParseServerInfo::_setServerVersion(null); + ParseServerInfo::getFeatures(); + } + + /** + * @group server-info-missing-version + */ + public function testMissingVersion() + { + $this->setExpectedException( + 'Parse\ParseException', + 'Missing version in server info.' + ); + + $httpClient = ParseClient::getHttpClient(); + + // create a mock of the current http client + $stubClient = $this->getMockBuilder(get_class($httpClient)) + ->getMock(); + + // stub the response type to return + // something we will try to work with + $stubClient + ->method('getResponseContentType') + ->willReturn('application/octet-stream'); + + $stubClient + ->method('send') + ->willReturn(json_encode([ + 'features' => [] + ])); + + // replace the client with our stub + ParseClient::setHttpClient($stubClient); + + ParseServerInfo::_setServerVersion(null); + ParseServerInfo::getFeatures(); + } + public function testGlobalConfigFeatures() { $globalConfigFeatures = ParseServerInfo::getGlobalConfigFeatures(); From d21c82176037ccfabd94f9cd2cc1a42e3a7a9f65 Mon Sep 17 00:00:00 2001 From: Benjamin Friedman Date: Tue, 31 Oct 2017 16:17:10 -0700 Subject: [PATCH 7/8] updated README.md with examples --- README.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/README.md b/README.md index 29013864..aadb0869 100644 --- a/README.md +++ b/README.md @@ -328,6 +328,40 @@ if(ParsePush::hasStatus($response)) { } ``` +Server Info: + +Get information regarding the configuration of the server you are connecting to. +```php +// get the current version of the server you are connected to (2.6.5, 2.5.4, etc.) +$version = ParseServerInfo::getVersion(); + +// get various features +$globalConfigFeatures = ParseServerInfo::getGlobalConfigFeatures(); +/** + * Returns json of the related features + * { + * "create" : true, + * "read" : true, + * "update" : true, + * "delete" : true + * } + */ +``` + + You can get details on the following features as well: + + ```php + ParseServerInfo::getHooksFeatures(); + ParseServerInfo::getCloudCodeFeatures(); + ParseServerInfo::getLogsFeatures(); + ParseServerInfo::getPushFeatures(); + ParseServerInfo::getSchemasFeatures(); + + // additional features can be obtained manually using 'get' + $feature = ParseServerInfo::get('new-feature'); + + ``` + Contributing / Testing ---------------------- From 6093202e47ce6baaa49955d65622ad922f9511dd Mon Sep 17 00:00:00 2001 From: Benjamin Friedman Date: Tue, 31 Oct 2017 16:37:48 -0700 Subject: [PATCH 8/8] Updated informative comments --- src/Parse/ParseServerInfo.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Parse/ParseServerInfo.php b/src/Parse/ParseServerInfo.php index 83c908e6..13da5830 100644 --- a/src/Parse/ParseServerInfo.php +++ b/src/Parse/ParseServerInfo.php @@ -1,9 +1,6 @@ + * @author Ben Friedman * @package Parse */ class ParseServerInfo