From 9a335a748683dc27e1d50d026f0b92eae1c8bb8d Mon Sep 17 00:00:00 2001 From: julianzangl Date: Thu, 6 Jul 2023 14:24:24 +0200 Subject: [PATCH] added SkillSetProgress with Tests --- src/Api/SkillSetProgress.php | 80 +++++++++++ src/Entity/SkillSet.php | 5 + src/Entity/SkillSetProgress.php | 63 +++++++++ tests/Unit/Api/SkillSetProgressTest.php | 150 +++++++++++++++++++++ tests/Unit/Entity/SkillSetProgressTest.php | 88 ++++++++++++ tests/Unit/Entity/SkillSetTest.php | 15 +++ 6 files changed, 401 insertions(+) create mode 100644 src/Api/SkillSetProgress.php create mode 100644 src/Entity/SkillSetProgress.php create mode 100644 tests/Unit/Api/SkillSetProgressTest.php create mode 100644 tests/Unit/Entity/SkillSetProgressTest.php diff --git a/src/Api/SkillSetProgress.php b/src/Api/SkillSetProgress.php new file mode 100644 index 0000000..e8412e0 --- /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/Entity/SkillSet.php b/src/Entity/SkillSet.php index b7a549b..d4acf2a 100644 --- a/src/Entity/SkillSet.php +++ b/src/Entity/SkillSet.php @@ -56,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..49b22b7 --- /dev/null +++ b/src/Entity/SkillSetProgress.php @@ -0,0 +1,63 @@ + + * + * 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/tests/Unit/Api/SkillSetProgressTest.php b/tests/Unit/Api/SkillSetProgressTest.php new file mode 100644 index 0000000..f35a749 --- /dev/null +++ b/tests/Unit/Api/SkillSetProgressTest.php @@ -0,0 +1,150 @@ + + * + * 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 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('{"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..8f46314 --- /dev/null +++ b/tests/Unit/Entity/SkillSetProgressTest.php @@ -0,0 +1,88 @@ + + * + * 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 10abed1..0ab3b5f 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 */