diff --git a/src/Api/Campaigns.php b/src/Api/Campaigns.php index 775d2d2..0fe1c24 100644 --- a/src/Api/Campaigns.php +++ b/src/Api/Campaigns.php @@ -31,15 +31,9 @@ use SkillDisplay\PHPToolKit\Entity\Campaign; class Campaigns { - /** - * @var Settings - */ - protected $settings; + protected Settings $settings; - /** - * @var Client - */ - protected $client; + protected Client $client; public function __construct( Settings $settings, diff --git a/src/Api/Skill.php b/src/Api/Skill.php index 5ae0a50..bbd8ebc 100644 --- a/src/Api/Skill.php +++ b/src/Api/Skill.php @@ -31,15 +31,9 @@ use SkillDisplay\PHPToolKit\Entity\Skill as Entity; class Skill { - /** - * @var Settings - */ - protected $settings; + protected Settings $settings; - /** - * @var Client - */ - protected $client; + protected Client $client; public function __construct( Settings $settings, diff --git a/src/Api/SkillSet.php b/src/Api/SkillSet.php index fb55c7a..1a3b21c 100644 --- a/src/Api/SkillSet.php +++ b/src/Api/SkillSet.php @@ -31,15 +31,9 @@ use SkillDisplay\PHPToolKit\Entity\SkillSet as Entity; class SkillSet { - /** - * @var Settings - */ - protected $settings; + protected Settings $settings; - /** - * @var Client - */ - protected $client; + protected Client $client; public function __construct( Settings $settings, diff --git a/src/Api/SkillSetProgress.php b/src/Api/SkillSetProgress.php new file mode 100644 index 0000000..788cb0a --- /dev/null +++ b/src/Api/SkillSetProgress.php @@ -0,0 +1,80 @@ + + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +use GuzzleHttp\Client; +use GuzzleHttp\Exception\ClientException; +use GuzzleHttp\Psr7\Request; +use SkillDisplay\PHPToolKit\Configuration\Settings; +use SkillDisplay\PHPToolKit\Entity\SkillSetProgress as Entity; + +class SkillSetProgress +{ + protected Settings $settings; + protected Client $client; + + public function __construct( + Settings $settings, + Client $client + ) { + $this->settings = $settings; + $this->client = $client; + } + + public function getById(int $id): Entity + { + if ($id <= 0) { + throw new \Exception('ID of SkillSet has to be a positive integer.', 1688639724754); + } + + $url = $this->settings->getAPIUrl() . '/api/v1/skillset/' . $id . '/progress'; + try { + $result = $this->client->send(new Request( + 'GET', + $url, + [ + 'Content-Type' => 'application/json', + 'x-api-key' => $this->settings->getApiKey() + ] + )); + } catch (ClientException $e) { + if ($e->getCode() === 404) { + throw new \InvalidArgumentException('Given SkillSet with id "' . $id . '" not available.', 1688639748718); + } + throw $e; + } + + if ($result->getStatusCode() !== 200) { + throw new \Exception('Did not get proper response for SkillSetProgress.', 1688639840720); + } + + $body = (string) $result->getBody(); + + if (strpos($body, 'Oops, an error occurred') !== false) { + throw new \Exception('Did not get proper response for SkillSetProgress. SkillSet with id "' . $id . '" does probably not exist.', 1688639873065); + } + + return Entity::createFromJson($body, $this->settings); + } +} diff --git a/src/Configuration/Settings.php b/src/Configuration/Settings.php index 43cb133..d4df146 100644 --- a/src/Configuration/Settings.php +++ b/src/Configuration/Settings.php @@ -6,30 +6,15 @@ namespace SkillDisplay\PHPToolKit\Configuration; class Settings { - /** - * @var string - */ - private $user_secret = ''; + private string $user_secret = ''; - /** - * @var string - */ - private $apiKey = ''; + private string $apiKey = ''; - /** - * @var int - */ - private $verifierID = 0; + private int $verifierID = 0; - /** - * @var string - */ - private $APIUrl = ''; + private string $APIUrl = ''; - /** - * @var string - */ - private $mySkillDisplayUrl = ''; + private string $mySkillDisplayUrl = ''; public function getVerifierID(): int { diff --git a/src/Entity/Brand.php b/src/Entity/Brand.php index 7f8489e..2b61143 100644 --- a/src/Entity/Brand.php +++ b/src/Entity/Brand.php @@ -27,15 +27,9 @@ use SkillDisplay\PHPToolKit\Configuration\Settings; class Brand { - /** - * @var array - */ - private $data; + private array $data; - /** - * @var Settings - */ - private $settings; + private Settings $settings; private function __construct(array $data, Settings $settings) { diff --git a/src/Entity/Campaign.php b/src/Entity/Campaign.php index 27e4b08..67aca66 100644 --- a/src/Entity/Campaign.php +++ b/src/Entity/Campaign.php @@ -27,15 +27,9 @@ use SkillDisplay\PHPToolKit\Configuration\Settings; class Campaign { - /** - * @var array - */ - private $data; + private array $data; - /** - * @var Settings - */ - private $settings; + private Settings $settings; public function __construct(array $data, Settings $settings) { diff --git a/src/Entity/Skill.php b/src/Entity/Skill.php index 72e22b6..ccca05b 100644 --- a/src/Entity/Skill.php +++ b/src/Entity/Skill.php @@ -27,20 +27,11 @@ use SkillDisplay\PHPToolKit\Configuration\Settings; class Skill { - /** - * @var array - */ - private $data; + private array $data; - /** - * @var Settings - */ - private $settings; + private Settings $settings; - /** - * @var array - */ - private $brands = []; + private array $brands = []; private function __construct(array $data, Settings $settings) { diff --git a/src/Entity/SkillSet.php b/src/Entity/SkillSet.php index e9a0293..d4acf2a 100644 --- a/src/Entity/SkillSet.php +++ b/src/Entity/SkillSet.php @@ -27,25 +27,13 @@ use SkillDisplay\PHPToolKit\Configuration\Settings; class SkillSet { - /** - * @var array - */ - private $data; + private array $data; - /** - * @var Settings - */ - private $settings; + private Settings $settings; - /** - * @var array - */ - private $skills = []; + private array $skills = []; - /** - * @var Brand|null - */ - private $brand = null; + private ?Brand $brand = null; private function __construct(array $data, Settings $settings) { @@ -68,6 +56,11 @@ class SkillSet return $this->data['description'] ?? ''; } + public function getProgressPercentage(): SkillSetProgress + { + return SkillSetProgress::createFromJson(json_encode($this->data['progressPercentage']), $this->settings); + } + public function getBrand(): Brand { if ($this->brand instanceof Brand) { diff --git a/src/Entity/SkillSetProgress.php b/src/Entity/SkillSetProgress.php new file mode 100644 index 0000000..20c6c76 --- /dev/null +++ b/src/Entity/SkillSetProgress.php @@ -0,0 +1,64 @@ + + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +use SkillDisplay\PHPToolKit\Configuration\Settings; + +class SkillSetProgress +{ + private array $data; + + private Settings $settings; + + private function __construct(array $data, Settings $settings) + { + $this->data = $data; + $this->settings = $settings; + } + + public function getTier1(): float + { + return $this->data['tier1'] ?? 0; + } + + public function getTier2(): float + { + return $this->data['tier2'] ?? 0; + } + + public function getTier3(): float + { + return $this->data['tier3'] ?? 0; + } + + public function getTier4(): float + { + return $this->data['tier4'] ?? 0; + } + + public static function createFromJson(string $json, Settings $settings): SkillSetProgress + { + return new SkillSetProgress(json_decode($json, true), $settings); + } +} diff --git a/src/Example/FullSettingsRequired/AutoGrantBusinessVerification.php b/src/Example/FullSettingsRequired/AutoGrantBusinessVerification.php index 64b8171..76b82a8 100644 --- a/src/Example/FullSettingsRequired/AutoGrantBusinessVerification.php +++ b/src/Example/FullSettingsRequired/AutoGrantBusinessVerification.php @@ -14,4 +14,4 @@ use SkillDisplay\PHPToolKit\Verification\Issuer; // In order to grant an Educational Verification you just need to exchange the constant to VERIFICATION_EDUCATIONAL // (your Verifier Account needs the according permissions) $myVerificationTool = new Issuer($mySettings); -$myVerificationTool->outputResponse($myVerificationTool->issueVerification(193, '--skilldisplay-user-email--', VERIFICATION_BUSINESS, 567)); +$myVerificationTool->outputResponse($myVerificationTool->issueVerification(175, '--skilldisplay-user-email--', VERIFICATION_BUSINESS, false, 567, true)); diff --git a/src/Verification/Issuer.php b/src/Verification/Issuer.php index c885a00..9c63f01 100644 --- a/src/Verification/Issuer.php +++ b/src/Verification/Issuer.php @@ -10,15 +10,9 @@ use SkillDisplay\PHPToolKit\Configuration\Settings; class Issuer { - /** - * @var Settings - */ - private $settings; + private Settings $settings; - /** - * @var string - */ - private $apislug = '/api/v1/verification/create'; + private string $apislug = '/api/v1/verification/create'; /** * @param int $ID ID of the Skill or SkillSet @@ -26,7 +20,7 @@ class Issuer * @param string $vtype one of VERIFICATION_SELF, VERIFICATION_EDUCATIONAL, VERIFICATION_BUSINESS, VERIFICATION_CERTIFICATION * @param bool $isSkillSet * @param int $campaignId - * + * @param bool $autoConfirm * @return array */ private function generateSignedRequestData( diff --git a/src/Verification/Link.php b/src/Verification/Link.php index bc13f43..3b5c58f 100644 --- a/src/Verification/Link.php +++ b/src/Verification/Link.php @@ -18,10 +18,7 @@ class Link */ private $id; - /** - * @var Settings - */ - private $settings; + private Settings $settings; public const SKILL = 'skill'; @@ -29,10 +26,7 @@ class Link /* SVG Definitions */ - /** - * @var string - */ - private $verification_self_svg = ' + private string $verification_self_svg = ' @@ -40,10 +34,7 @@ class Link '; - /** - * @var string - */ - private $verification_educational_svg = ' + private string $verification_educational_svg = ' @@ -51,10 +42,7 @@ class Link '; - /** - * @var string - */ - private $verification_business_svg = ' + private string $verification_business_svg = ' @@ -62,10 +50,7 @@ class Link '; - /** - * @var string - */ - private $verification_certification_svg = ' + private string $verification_certification_svg = ' diff --git a/tests/Unit/Api/SkillSetProgressTest.php b/tests/Unit/Api/SkillSetProgressTest.php new file mode 100644 index 0000000..b833636 --- /dev/null +++ b/tests/Unit/Api/SkillSetProgressTest.php @@ -0,0 +1,148 @@ + + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +use GuzzleHttp\Client; +use GuzzleHttp\Psr7\Request; +use GuzzleHttp\Psr7\Response; +use GuzzleHttp\Psr7\Utils; +use Prophecy\Argument; +use Prophecy\PhpUnit\ProphecyTrait; +use SkillDisplay\PHPToolKit\Api\SkillSetProgress; +use PHPUnit\Framework\TestCase; +use SkillDisplay\PHPToolKit\Configuration\Settings; +use SkillDisplay\PHPToolKit\Entity\SkillSetProgress as Entity; + +/** + * @covers SkillDisplay\PHPToolKit\Api\SkillSetProgress + */ + +class SkillSetProgressTest extends TestCase +{ + use ProphecyTrait; + + /** + * @test + */ + public function instanceCanBeCreated() + { + $settings = $this->prophesize(Settings::class); + $client = $this->prophesize(Client::class); + + $subject = new SkillSetProgress( + $settings->reveal(), + $client->reveal() + ); + + static::assertInstanceOf(SkillSetProgress::class, $subject); + } + + /** + * @test + */ + public function fetchedEntityFromApi() + { + $settings = $this->prophesize(Settings::class); + $client = $this->prophesize(Client::class); + $response = $this->prophesize(Response::class); + + $settings->getAPIUrl()->willReturn('https://example.com'); + $settings->getApiKey()->willReturn('none'); + + $client->send(Argument::that(function (Request $request) { + return (string) $request->getUri() === 'https://example.com/api/v1/skillset/10/progress' + && $request->getHeader('x-api-key') === ['none'] + && $request->getHeader('Content-Type') === ['application/json'] + && $request->getMethod() === 'GET'; + }))->willReturn($response->reveal()); + + $response->getStatusCode()->willReturn(200); + $response->getBody()->willReturn(Utils::streamFor('{"tier3":44.44444444444444,"tier2":40.74074074074074,"tier1":0,"tier4":0}')); + + $progress = new SkillSetProgress( + $settings->reveal(), + $client->reveal() + ); + $result = $progress->getById(10); + static::assertInstanceOf(Entity::class, $result); + } + + /** + * @test + */ + public function throwsExceptionIfStatusCodeIsNot200() + { + $settings = $this->prophesize(Settings::class); + $client = $this->prophesize(Client::class); + $response = $this->prophesize(Response::class); + + $settings->getAPIUrl()->willReturn('https://example.com'); + $settings->getApiKey()->willReturn('none'); + + $client->send(Argument::any())->willReturn($response->reveal()); + + $response->getStatusCode()->willReturn(500); + + $progress = new SkillSetProgress( + $settings->reveal(), + $client->reveal() + ); + + $this->expectExceptionMessage('Did not get proper response for SkillSetProgress.'); + $this->expectExceptionCode(1688639840720); + $progress->getById(10); + } + + /** + * @test + * @dataProvider nonePositiveIds + */ + public function throwsExceptionIfSkillSetIdIsNotPositive(int $skillId) + { + $settings = $this->prophesize(Settings::class); + $client = $this->prophesize(Client::class); + + $progress = new SkillSetProgress( + $settings->reveal(), + $client->reveal() + ); + + $this->expectExceptionMessage('ID of SkillSet has to be a positive integer.'); + $this->expectExceptionCode(1688639724754); + + $progress->getById($skillId); + } + + public function nonePositiveIds(): array + { + return [ + 'zero' => [ + 'skillId' => 0, + ], + 'negative' => [ + 'skillId' => -1, + ], + ]; + } +} diff --git a/tests/Unit/Entity/SkillSetProgressTest.php b/tests/Unit/Entity/SkillSetProgressTest.php new file mode 100644 index 0000000..3a1cfca --- /dev/null +++ b/tests/Unit/Entity/SkillSetProgressTest.php @@ -0,0 +1,87 @@ + + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +use Prophecy\PhpUnit\ProphecyTrait; +use PHPUnit\Framework\TestCase; +use SkillDisplay\PHPToolKit\Configuration\Settings; +use SkillDisplay\PHPToolKit\Entity\SkillSetProgress; + +/** + * @covers SkillDisplay\PHPToolKit\Entity\SkillSetProgress + */ +class SkillSetProgressTest extends TestCase +{ + use ProphecyTrait; + + /** + * @test + */ + public function instanceCanBeCreatedFromJson() + { + $settings = $this->prophesize(Settings::class); + $progress = SkillSetProgress::createFromJson('{}', $settings->reveal()); + static::assertInstanceOf(SkillSetProgress::class, $progress); + } + + /** + * @test + */ + public function instanceReturnsTier1() + { + $settings = $this->prophesize(Settings::class); + $progress = SkillSetProgress::createFromJson('{"tier1": 44.444444}', $settings->reveal()); + static::assertSame(44.444444, $progress->getTier1()); + } + + /** + * @test + */ + public function instanceReturnsTier2() + { + $settings = $this->prophesize(Settings::class); + $progress = SkillSetProgress::createFromJson('{"tier2": 44.444444}', $settings->reveal()); + static::assertSame(44.444444, $progress->getTier2()); + } + + /** + * @test + */ + public function instanceReturnsTier3() + { + $settings = $this->prophesize(Settings::class); + $progress = SkillSetProgress::createFromJson('{"tier3": 44}', $settings->reveal()); + static::assertSame(44.0, $progress->getTier3()); + } + + /** + * @test + */ + public function instanceReturnsTier4() + { + $settings = $this->prophesize(Settings::class); + $progress = SkillSetProgress::createFromJson('{"tier4": 0}', $settings->reveal()); + static::assertSame(0.0, $progress->getTier4()); + } +} diff --git a/tests/Unit/Entity/SkillSetTest.php b/tests/Unit/Entity/SkillSetTest.php index dd97d9d..3465e7e 100644 --- a/tests/Unit/Entity/SkillSetTest.php +++ b/tests/Unit/Entity/SkillSetTest.php @@ -85,6 +85,21 @@ class SkillSetTest extends TestCase static::assertSame('

Example description

', $subject->getDescription()); } + /** + * @test + */ + public function instanceReturnsProgressPercentage() + { + $settings = $this->prophesize(Settings::class); + $subject = SkillSet::createFromJson('{"progressPercentage":{"tier3":44.44444444444444,"tier2":40.74074074074074,"tier1":0,"tier4":23}}', $settings->reveal()); + $progress = \SkillDisplay\PHPToolKit\Entity\SkillSetProgress::createFromJson('{"tier3":44.44444444444444,"tier2":40.74074074074074,"tier1":0,"tier4":23}', $settings->reveal()); + static::assertEquals($progress, $subject->getProgressPercentage()); + static::assertSame(0.0, $subject->getProgressPercentage()->getTier1()); + static::assertSame(40.74074074074074, $subject->getProgressPercentage()->getTier2()); + static::assertSame(44.44444444444444, $subject->getProgressPercentage()->getTier3()); + static::assertSame(23.0, $subject->getProgressPercentage()->getTier4()); + } + /** * @test */