diff --git a/composer.json b/composer.json index 2dd872d..b67e9ed 100644 --- a/composer.json +++ b/composer.json @@ -1,61 +1,61 @@ { - "name": "wearepixel/laravel-quickbooks", - "version": "2.0.0", - "description": "Laravel Client for QuickBooks.", - "keywords": [ - "quickbooks", - "client", - "laravel", - "wearepixel" - ], - "license": "MIT", - "authors": [ - { - "name": "Pixel", - "email": "hello@wearepixel.com.au" - } - ], - "require": { - "php": "^8.3", - "illuminate/database": "^10.0|^11.0|^12.0", - "illuminate/http": "^10.0|^11.0|^12.0", - "illuminate/routing": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "nesbot/carbon": "^2.62.1|^3.0", - "quickbooks/v3-php-sdk": "^5.4.6" - }, - "require-dev": { - "laravel/pint": "^1.2", - "mockery/mockery": "^1.6", - "pestphp/pest": "^3.0", - "psy/psysh": "^0.12" - }, - "autoload": { - "psr-4": { - "Wearepixel\\QuickBooks\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "Wearepixel\\QuickBooks\\": "tests/" + "name": "wearepixel/laravel-quickbooks", + "version": "2.0.1", + "description": "Laravel Client for QuickBooks.", + "keywords": [ + "quickbooks", + "client", + "laravel", + "wearepixel" + ], + "license": "MIT", + "authors": [ + { + "name": "Pixel", + "email": "hello@wearepixel.com.au" + } + ], + "require": { + "php": "^8.3", + "illuminate/database": "^10.0|^11.0|^12.0", + "illuminate/http": "^10.0|^11.0|^12.0", + "illuminate/routing": "^10.0|^11.0|^12.0", + "illuminate/support": "^10.0|^11.0|^12.0", + "nesbot/carbon": "^2.62.1|^3.0", + "quickbooks/v3-php-sdk": "^5.4.6" }, - "files": [ - "tests/Overrides.php" - ] - }, - "extra": { - "laravel": { - "providers": [ - "Wearepixel\\QuickBooks\\Providers\\ServiceProvider", - "Wearepixel\\QuickBooks\\Providers\\ClientServiceProvider" - ] - } - }, - "config": { - "allow-plugins": { - "pestphp/pest-plugin": true + "require-dev": { + "laravel/pint": "^1.2", + "mockery/mockery": "^1.6", + "pestphp/pest": "^3.0", + "psy/psysh": "^0.12" }, - "sort-packages": true - }, - "prefer-stable": true + "autoload": { + "psr-4": { + "Wearepixel\\QuickBooks\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Wearepixel\\QuickBooks\\": "tests/" + }, + "files": [ + "tests/Overrides.php" + ] + }, + "extra": { + "laravel": { + "providers": [ + "Wearepixel\\QuickBooks\\Providers\\ServiceProvider", + "Wearepixel\\QuickBooks\\Providers\\ClientServiceProvider" + ] + } + }, + "config": { + "allow-plugins": { + "pestphp/pest-plugin": true + }, + "sort-packages": true + }, + "prefer-stable": true } diff --git a/src/Client.php b/src/Client.php index c18510d..0b88f62 100644 --- a/src/Client.php +++ b/src/Client.php @@ -181,6 +181,12 @@ public function hasValidRefreshToken(): bool * 2) Have valid refresh token, so renew access token & then use * 3) No existing token, so need to link account * + * useJson() is applied in every case: the SDK's default XML deserializer reflects + * declared properties on its Data classes and throws when QuickBooks adds a new + * response field the installed SDK version doesn't know about yet. The JSON + * deserializer builds instances from the class's own properties and silently + * ignores unrecognised keys instead, so it tolerates QuickBooks-side schema drift. + * * @throws SdkException * @throws ServiceException */ @@ -203,7 +209,7 @@ protected function makeDataService(): DataService 'QBORealmID' => $this->token->realm_id, 'refreshTokenKey' => $this->token->refresh_token, ]), - ); + )->useJson(); } // Have refresh, so update access & allow app to run @@ -214,7 +220,7 @@ protected function makeDataService(): DataService 'QBORealmID' => $this->token->realm_id, 'refreshTokenKey' => $this->token->refresh_token, ]), - ); + )->useJson(); $oauth_token = $data_service->getOAuth2LoginHelper()->refreshToken(); @@ -226,7 +232,7 @@ protected function makeDataService(): DataService } // Create new... - return DataService::Configure($this->parseDataConfigs()); + return DataService::Configure($this->parseDataConfigs())->useJson(); } /** diff --git a/tests/ClientTest.php b/tests/ClientTest.php index ebd30b4..4110f23 100644 --- a/tests/ClientTest.php +++ b/tests/ClientTest.php @@ -1,5 +1,6 @@ skip('Once we figure out how to test around the static DataService::Configure'); +it('configures the data service to use JSON serialization so unrecognised QuickBooks response fields do not throw', function () { + $this->token_mock + ->shouldReceive('getAttribute') + ->twice() + ->with('hasValidAccessToken') + ->andReturnFalse(); + + $this->token_mock + ->shouldReceive('getAttribute') + ->once() + ->with('hasValidRefreshToken') + ->andReturnFalse(); + + $format = $this->client + ->getDataService() + ->getServiceContext() + ->IppConfiguration->Message->Request->SerializationFormat; + + expect($format)->toBe(SerializationFormat::Json); +}); + it('has logging off by default') ->skip('Have to figure out how to test this with the new code in 5.x');