From ae0c83872262eecb9c57e904983e4ee0e05dff42 Mon Sep 17 00:00:00 2001 From: lisam Date: Thu, 6 Jul 2023 14:48:23 +0200 Subject: [PATCH] Added Member and Organisation Statistic with Test --- src/Api/MemberSkills.php | 69 ++++++++++ src/Api/Organisation.php | 61 +++++++++ src/Entity/MemberSkill.php | 179 +++++++++++++++++++++++++ src/Entity/Organisation.php | 133 ++++++++++++++++++ tests/Unit/Api/MemberSkillsTest.php | 64 +++++++++ tests/Unit/Api/OrganisationTest.php | 66 +++++++++ tests/Unit/Entity/OrganisationTest.php | 59 ++++++++ 7 files changed, 631 insertions(+) create mode 100644 src/Api/MemberSkills.php create mode 100644 src/Api/Organisation.php create mode 100644 src/Entity/MemberSkill.php create mode 100644 src/Entity/Organisation.php create mode 100644 tests/Unit/Api/MemberSkillsTest.php create mode 100644 tests/Unit/Api/OrganisationTest.php create mode 100644 tests/Unit/Entity/OrganisationTest.php diff --git a/src/Api/MemberSkills.php b/src/Api/MemberSkills.php new file mode 100644 index 0000000..ec2c7f6 --- /dev/null +++ b/src/Api/MemberSkills.php @@ -0,0 +1,69 @@ +settings = $settings; + $this->client = $client; + } + + public function getMemberSkillsById(int $id) + { + if ($id <= 0) { + throw new \Exception('ID of Organisation has to be a positive integer.'); + } + $url = $this->settings->getAPIUrl() . '/api/v1/organisation/' . $id . '/listVerifications/json'; + 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 Organisation with id "' . $id . '" not available.', 1601881616); + } + throw $e; + } + + if ($result->getStatusCode() !== 200) { + throw new \Exception('Did not get proper response for Organisation.', 1600693562); + } + + $body = (string) $result->getBody(); + + if (strpos($body, 'Oops, an error occurred') !== false) { + throw new \Exception('Did not get proper response for Organisation. Organisation with id "' . $id . '" does probably not exist.', 1600694312); + } + + $body = json_decode((string) $result->getBody(), true); + $skills = []; + foreach ($body as $skill) { + $skills[] = Entity::createFromJson(json_encode($skill), $this->settings); + } + return $skills; + } +} diff --git a/src/Api/Organisation.php b/src/Api/Organisation.php new file mode 100644 index 0000000..67e2bc1 --- /dev/null +++ b/src/Api/Organisation.php @@ -0,0 +1,61 @@ +settings = $settings; + $this->client = $client; + } + + public function getStatisticById(int $id) + { + if ($id <= 0) { + throw new \Exception('ID of Organisation has to be a positive integer.'); + } + $url = $this->settings->getAPIUrl() . '/api/v1/organisation/' . $id . '/statistic'; + 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 Organisation with id "' . $id . '" not available.', 1601881616); + } + throw $e; + } + + if ($result->getStatusCode() !== 200) { + throw new \Exception('Did not get proper response for Organisation.', 1600693562); + } + + $body = (string) $result->getBody(); + + if (strpos($body, 'Oops, an error occurred') !== false) { + throw new \Exception('Did not get proper response for Organisation. Organisation with id "' . $id . '" does probably not exist.', 1600694312); + } + return Entity::createFromJson($body, $this->settings); + } +} diff --git a/src/Entity/MemberSkill.php b/src/Entity/MemberSkill.php new file mode 100644 index 0000000..6f78fd9 --- /dev/null +++ b/src/Entity/MemberSkill.php @@ -0,0 +1,179 @@ +id = $json['uid'] ?? 0; + $entity->created = $json['created'] ?? ''; + $entity->granted = $json['granted'] ?? ''; + $entity->skillUid = $json['skillUid'] ?? 0; + $entity->skillUUid = $json['skillUUid'] ?? ''; + $entity->skill = $json['skill'] ?? ''; + $entity->domainTag = $json['domainTag'] ?? ''; + $entity->level = $json['level'] ?? ''; + $entity->user = $json['user'] ?? ''; + $entity->firstName = $json['firstName'] ?? ''; + $entity->lastName = $json['lastName'] ?? ''; + $entity->certifier = $json['certifier'] ?? ''; + $entity->organisation = $json['organisation'] ?? ''; + $entity->campaign = $json['campaign'] ?? ''; + $entity->skillSetUid = $json['skillSetUid'] ?? 0; + $entity->skillSetName = $json['skillSetName'] ?? ''; + + return $entity; + } + + + /** + * @return string + */ + public function getCreated(): string + { + return $this->created; + } + + /** + * @return string + */ + public function getGranted(): string + { + return $this->granted; + } + + /** + * @return int + */ + public function getSkillUid(): int + { + return $this->skillUid; + } + + /** + * @return string + */ + public function getSkillUUid(): string + { + return $this->skillUUid; + } + + /** + * @return string + */ + public function getSkill(): string + { + return $this->skill; + } + + /** + * @return string + */ + public function getDomainTag(): string + { + return $this->domainTag; + } + + /** + * @return string + */ + public function getLevel(): string + { + return $this->level; + } + + /** + * @return string + */ + public function getUser(): string + { + return $this->user; + } + + /** + * @return string + */ + public function getFirstName(): string + { + return $this->firstName; + } + + /** + * @return string + */ + public function getLastName(): string + { + return $this->lastName; + } + + /** + * @return string + */ + public function getCertifier(): string + { + return $this->certifier; + } + + /** + * @return string + */ + public function getOrganisation(): string + { + return $this->organisation; + } + + /** + * @return string + */ + public function getCampaign(): string + { + return $this->campaign; + } + + /** + * @return int + */ + public function getSkillSetUid(): int + { + return $this->skillSetUid; + } + + /** + * @return string + */ + public function getSkillSetName(): string + { + return $this->skillSetName; + } + + /** + * @return int + */ + public function getId(): int + { + return $this->id; + } +} diff --git a/src/Entity/Organisation.php b/src/Entity/Organisation.php new file mode 100644 index 0000000..48a97a3 --- /dev/null +++ b/src/Entity/Organisation.php @@ -0,0 +1,133 @@ +data = $data; + $this->settings = $settings; + } + + public function getId(): int + { + return $this->data['uid']; + } + + public function getName(): string + { + return $this->data['name'] ?? ''; + } + + public function getBrand(): Brand + { + if ($this->brand instanceof Brand) { + return $this->brand; + } + + $this->brand = Brand::createFromJson(json_encode($this->data['brand']), $this->settings); + + return $this->brand; + } + + public function getComposition(): string + { + return $this->data['composition'] ?? ''; + } + + public function getCurrentMonthIssued(): int + { + return $this->data['currentMonthIssued'] ?? 0; + } + + public function getCurrentMonthUsers(): int + { + return $this->data['currentMonthUsers'] ?? 0; + } + + public function getCurrentMonthVerifications(): int + { + return $this->data['currentMonthVerifications'] ?? 0; + } + + public function getInterestSets(): array + { + return $this->data['interestSets'] ?? []; + } + + public function getLastMonthIssued(): int + { + return $this->data['lastMonthIssued'] ?? 0; + } + + public function getLastMonthUsers(): int + { + return $this->data['lastMonthUsers'] ?? 0; + } + + public function getLastMonthVerifications(): int + { + return $this->data['lastMonthVerifications'] ?? 0; + } + + public function getMonthlyScores(): array + { + return $this->data['monthlyScores'] ?? []; + } + + public function getPotential(): array + { + return $this->data['potential'] ?? []; + } + + public function getSumIssued(): int + { + return $this->data['sumSkills'] ?? 0; + } + + public function getSumSkills(): int + { + return $this->data['sumSkills'] ?? 0; + } + + public function getSumSupportedSkills(): int + { + return $this->data['sumSupportedSkills'] ?? 0; + } + + public function getSumVerifications(): int + { + return $this->data['sumVerifications'] ?? 0; + } + + public function getTotalScore(): int + { + return $this->data['totalScore'] ?? 0; + } + + public static function createFromJson(string $json, Settings $settings): self + { + return new Organisation(json_decode($json, true), $settings); + } + + public function getAsArray(): array + { + return $this->toArray(); + } + + public function toArray(): array + { + return $this->data; + } +} diff --git a/tests/Unit/Api/MemberSkillsTest.php b/tests/Unit/Api/MemberSkillsTest.php new file mode 100644 index 0000000..1635536 --- /dev/null +++ b/tests/Unit/Api/MemberSkillsTest.php @@ -0,0 +1,64 @@ +prophesize(Settings::class); + $client = $this->prophesize(Client::class); + $subject = new MemberSkills($settings->reveal(), $client->reveal()); + static::assertInstanceOf(MemberSkills::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/organisation/10/listVerifications/json' + && $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('[{"uid": 1},{"uid": 2}]'); + + $subject = new MemberSkills($settings->reveal(), $client->reveal()); + $skills = $subject->getMemberSkillsById(10); + + static::assertInstanceOf(MemberSkill::class, $skills[0]); + static::assertEquals(1, $skills[0]->getId()); + } +} diff --git a/tests/Unit/Api/OrganisationTest.php b/tests/Unit/Api/OrganisationTest.php new file mode 100644 index 0000000..3862dca --- /dev/null +++ b/tests/Unit/Api/OrganisationTest.php @@ -0,0 +1,66 @@ +prophesize(Settings::class); + $client = $this->prophesize(Client::class); + $subject = new Organisation($settings->reveal(), $client->reveal()); + + static::assertInstanceOf(Organisation::class, $subject); + } + + /** + * @test + */ + public function fetchOrganisationStatistic() + { + $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/organisation/10/statistic' + && $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('{"uid":10}'); + + $subject = new Organisation( + $settings->reveal(), + $client->reveal() + ); + $result = $subject->getStatisticById(10); + static::assertInstanceOf(Entity::class, $result); + } +} diff --git a/tests/Unit/Entity/OrganisationTest.php b/tests/Unit/Entity/OrganisationTest.php new file mode 100644 index 0000000..442c4e1 --- /dev/null +++ b/tests/Unit/Entity/OrganisationTest.php @@ -0,0 +1,59 @@ +prophesize(Settings::class); + $subject = Organisation::createFromJson('{}', $settings->reveal()); + static::assertInstanceOf(Organisation::class, $subject); + } + + /** + * @test + */ + public function instanceReturnsId() + { + $settings = $this->prophesize(Settings::class); + $subject = Organisation::createFromJson('{"uid":90}', $settings->reveal()); + static::assertSame(90, $subject->getId()); + } + + /** + * @test + */ + public function instanceReturnsName() + { + $settings = $this->prophesize(Settings::class); + $subject = Organisation::createFromJson('{"name":"Example name"}', $settings->reveal()); + static::assertSame('Example name', $subject->getName()); + } + + /** + * @test + */ + public function canBeConvertedToArray() + { + $settings = $this->prophesize(Settings::class); + $subject = Organisation::createFromJson('{"uid":90,"name":"Example name"}', $settings->reveal()); + static::assertSame(['uid' => 90, 'name' => 'Example name'], $subject->toArray()); + } +}