From fa5fb9b619be2138bbd8423eb8cadea0d55e38d0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marko=20Ivan=C4=8Di=C4=87?= <marko.ivancic@srce.hr>
Date: Tue, 11 Jul 2023 11:47:29 +0200
Subject: [PATCH] WIP

---
 src/Entities/Providers/Identity/Oidc.php      |   2 +-
 src/Entities/Providers/Service/Oidc.php       |   2 +-
 .../Bases/AbstractOidcProviderTest.php        |   6 +-
 .../Bases/AbstractSaml2ProviderTest.php       | 136 ++++++++++++++++++
 .../Entities/Providers/Identity/OidcTest.php  |   1 +
 .../Entities/Providers/Service/OidcTest.php   |   1 +
 tests/src/Helpers/ArrayTest.php               |   1 +
 tests/src/Helpers/ProviderResolverTest.php    |   2 +
 8 files changed, 147 insertions(+), 4 deletions(-)
 create mode 100644 tests/src/Entities/Providers/Bases/AbstractSaml2ProviderTest.php

diff --git a/src/Entities/Providers/Identity/Oidc.php b/src/Entities/Providers/Identity/Oidc.php
index 0394cc5..0ead0e2 100755
--- a/src/Entities/Providers/Identity/Oidc.php
+++ b/src/Entities/Providers/Identity/Oidc.php
@@ -34,7 +34,7 @@ class Oidc extends AbstractOidcProvider implements IdentityProviderInterface
             return $this->metadata[self::METADATA_KEY_ENTITY_ID];
         }
 
-        throw new MetadataException('OpenID VersionedDataProvider metadata does not contain entity ID.');
+        throw new MetadataException($this->getProviderDescription() . ' metadata does not contain entity ID.');
     }
 
     protected function getProviderDescription(): string
diff --git a/src/Entities/Providers/Service/Oidc.php b/src/Entities/Providers/Service/Oidc.php
index d074e77..10cb030 100755
--- a/src/Entities/Providers/Service/Oidc.php
+++ b/src/Entities/Providers/Service/Oidc.php
@@ -36,7 +36,7 @@ class Oidc extends AbstractOidcProvider implements ServiceProviderInterface
             return $this->metadata[self::METADATA_KEY_ENTITY_ID];
         }
 
-        throw new MetadataException('Relying VersionedDataProvider metadata does not contain entity ID.');
+        throw new MetadataException($this->getProviderDescription() . ' metadata does not contain entity ID.');
     }
 
     protected function getProviderDescription(): string
diff --git a/tests/src/Entities/Providers/Bases/AbstractOidcProviderTest.php b/tests/src/Entities/Providers/Bases/AbstractOidcProviderTest.php
index 882ce99..40dc7dc 100644
--- a/tests/src/Entities/Providers/Bases/AbstractOidcProviderTest.php
+++ b/tests/src/Entities/Providers/Bases/AbstractOidcProviderTest.php
@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 namespace SimpleSAML\Test\Module\accounting\Entities\Providers\Bases;
 
 use PHPUnit\Framework\MockObject\Stub;
@@ -8,7 +10,6 @@ use SimpleSAML\Module\accounting\Entities\Providers\Bases\AbstractOidcProvider;
 use PHPUnit\Framework\TestCase;
 use SimpleSAML\Module\accounting\Helpers\Arr;
 use SimpleSAML\Module\accounting\Services\HelpersManager;
-use SimpleSAML\Module\accounting\Services\JobRunner\State;
 use SimpleSAML\Test\Module\accounting\Constants\StateArrays;
 
 /**
@@ -54,7 +55,8 @@ class AbstractOidcProviderTest extends TestCase
     protected function prepareInstance(array $metadata): AbstractOidcProvider
     {
         $this->helpersManagerStub->method('getArr')->willReturn($this->arrStub);
-        return new class($metadata, $this->helpersManagerStub) extends AbstractOidcProvider {
+
+        return new class ($metadata, $this->helpersManagerStub) extends AbstractOidcProvider {
             public function getName(string $locale = self::DEFAULT_LOCALE): ?string
             {
                 return 'name';
diff --git a/tests/src/Entities/Providers/Bases/AbstractSaml2ProviderTest.php b/tests/src/Entities/Providers/Bases/AbstractSaml2ProviderTest.php
new file mode 100644
index 0000000..0822ec2
--- /dev/null
+++ b/tests/src/Entities/Providers/Bases/AbstractSaml2ProviderTest.php
@@ -0,0 +1,136 @@
+<?php
+
+declare(strict_types=1);
+
+namespace SimpleSAML\Test\Module\accounting\Entities\Providers\Bases;
+
+use PHPUnit\Framework\MockObject\Stub;
+use SimpleSAML\Module\accounting\Entities\Interfaces\AuthenticationProtocolInterface;
+use SimpleSAML\Module\accounting\Entities\Interfaces\ProviderInterface;
+use SimpleSAML\Module\accounting\Entities\Providers\Bases\AbstractSaml2Provider;
+use PHPUnit\Framework\TestCase;
+use SimpleSAML\Module\accounting\Exceptions\MetadataException;
+use SimpleSAML\Module\accounting\Helpers\Arr;
+use SimpleSAML\Module\accounting\Services\HelpersManager;
+use SimpleSAML\Test\Module\accounting\Constants\StateArrays;
+
+/**
+ * @covers \SimpleSAML\Module\accounting\Entities\Providers\Bases\AbstractSaml2Provider
+ * @uses \SimpleSAML\Module\accounting\Entities\Bases\AbstractProvider
+ */
+class AbstractSaml2ProviderTest extends TestCase
+{
+    protected Stub $helpersManagerStub;
+    protected Stub $arrStub;
+    protected array $metadata;
+
+    protected function setUp(): void
+    {
+        $this->helpersManagerStub = $this->createStub(HelpersManager::class);
+        $this->arrStub = $this->createStub(Arr::class);
+        $this->metadata = StateArrays::SAML2_FULL['SPMetadata'];
+    }
+
+    protected function prepareInstance(array $metadata): AbstractSaml2Provider
+    {
+        $this->helpersManagerStub->method('getArr')->willReturn($this->arrStub);
+
+        return new class ($metadata, $this->helpersManagerStub) extends AbstractSaml2Provider {
+            protected function getProviderDescription(): string
+            {
+                return 'service description';
+            }
+        };
+    }
+
+    public function testCanCreateInstance(): void
+    {
+        $this->assertInstanceOf(AbstractSaml2Provider::class, $this->prepareInstance($this->metadata));
+    }
+
+    public function testCanGetName(): void
+    {
+        $metadata = $this->metadata;
+        $this->assertSame(
+            $this->metadata[AbstractSaml2Provider::METADATA_KEY_NAME],
+            $this->prepareInstance($metadata)->getName()
+        );
+
+        unset($metadata[AbstractSaml2Provider::METADATA_KEY_NAME]);
+        $this->assertSame(
+            $this->metadata[AbstractSaml2Provider::METADATA_KEY_UI_INFO]
+                [AbstractSaml2Provider::METADATA_KEY_UI_INFO_DISPLAY_NAME]
+                [ProviderInterface::DEFAULT_LOCALE],
+            $this->prepareInstance($metadata)->getName()
+        );
+
+        unset($metadata[AbstractSaml2Provider::METADATA_KEY_UI_INFO]);
+        $this->assertNull($this->prepareInstance($metadata)->getName());
+    }
+
+    public function testCanGetDescription(): void
+    {
+        $metadata = $this->metadata;
+        $this->assertSame(
+            $this->metadata[AbstractSaml2Provider::METADATA_KEY_DESCRIPTION],
+            $this->prepareInstance($metadata)->getDescription()
+        );
+
+        unset($metadata[AbstractSaml2Provider::METADATA_KEY_DESCRIPTION]);
+        $this->assertSame(
+            $this->metadata[AbstractSaml2Provider::METADATA_KEY_UI_INFO]
+            [AbstractSaml2Provider::METADATA_KEY_UI_INFO_DESCRIPTION]
+            [ProviderInterface::DEFAULT_LOCALE],
+            $this->prepareInstance($metadata)->getDescription()
+        );
+
+        unset($metadata[AbstractSaml2Provider::METADATA_KEY_UI_INFO]);
+        $this->assertNull($this->prepareInstance($metadata)->getDescription());
+    }
+
+    public function testCanGetLogo(): void
+    {
+        $this->arrStub->method('getNestedElementByKey')->willReturn(['https://example.org/logo']);
+
+        $this->assertSame(
+            'https://example.org/logo',
+            $this->prepareInstance($this->metadata)->getLogoUrl()
+        );
+    }
+
+    public function testGetLogoNotFound(): void
+    {
+        $this->arrStub->method('getNestedElementByKey')->willReturn(null);
+
+        $this->assertNull(
+            $this->prepareInstance($this->metadata)->getLogoUrl()
+        );
+    }
+
+    public function testGetLogoIsNullIfNotValid(): void
+    {
+        $this->arrStub->method('getNestedElementByKey')->willReturn(['not-valid']);
+
+        $this->assertNull(
+            $this->prepareInstance($this->metadata)->getLogoUrl()
+        );
+    }
+
+    public function testThrowsForInvalidEntityId(): void
+    {
+        $metadata = $this->metadata;
+        unset($metadata[AbstractSaml2Provider::METADATA_KEY_ENTITY_ID]);
+
+        $this->expectException(MetadataException::class);
+
+        $this->prepareInstance($metadata);
+    }
+
+    public function testCanGetProtocol(): void
+    {
+        $this->assertInstanceOf(
+            AuthenticationProtocolInterface::class,
+            $this->prepareInstance($this->metadata)->getProtocol()
+        );
+    }
+}
diff --git a/tests/src/Entities/Providers/Identity/OidcTest.php b/tests/src/Entities/Providers/Identity/OidcTest.php
index 9d1a6a3..32591e2 100755
--- a/tests/src/Entities/Providers/Identity/OidcTest.php
+++ b/tests/src/Entities/Providers/Identity/OidcTest.php
@@ -12,6 +12,7 @@ use SimpleSAML\Module\accounting\Exceptions\MetadataException;
  * @covers \SimpleSAML\Module\accounting\Entities\Providers\Identity\Oidc
  * @uses \SimpleSAML\Module\accounting\Entities\Bases\AbstractProvider
  * @uses \SimpleSAML\Module\accounting\Entities\Providers\Bases\AbstractOidcProvider
+ * @uses \SimpleSAML\Module\accounting\Entities\Authentication\Protocol\Oidc
  */
 class OidcTest extends TestCase
 {
diff --git a/tests/src/Entities/Providers/Service/OidcTest.php b/tests/src/Entities/Providers/Service/OidcTest.php
index a1445d4..dbba56c 100755
--- a/tests/src/Entities/Providers/Service/OidcTest.php
+++ b/tests/src/Entities/Providers/Service/OidcTest.php
@@ -12,6 +12,7 @@ use SimpleSAML\Module\accounting\Exceptions\MetadataException;
  * @covers \SimpleSAML\Module\accounting\Entities\Providers\Service\Oidc
  * @uses \SimpleSAML\Module\accounting\Entities\Bases\AbstractProvider
  * @uses \SimpleSAML\Module\accounting\Entities\Providers\Bases\AbstractOidcProvider
+ * @uses \SimpleSAML\Module\accounting\Entities\Authentication\Protocol\Oidc
  */
 class OidcTest extends TestCase
 {
diff --git a/tests/src/Helpers/ArrayTest.php b/tests/src/Helpers/ArrayTest.php
index c1a409a..2ad8905 100755
--- a/tests/src/Helpers/ArrayTest.php
+++ b/tests/src/Helpers/ArrayTest.php
@@ -82,6 +82,7 @@ class ArrayTest extends TestCase
         $this->assertSame($arrHelper->getNestedElementByKey($simpleIndexed, 0), [1]);
         $this->assertNull($arrHelper->getNestedElementByKey($simpleIndexed, 3));
         $this->assertNull($arrHelper->getNestedElementByKey($simpleIndexed, 'a'));
+        $this->assertNull($arrHelper->getNestedElementByKey($simpleIndexed, 0, 'a'));
 
         $this->assertSame($arrHelper->getNestedElementByKey($nestedIndexed, 0), [1, [2, [4, [5]]]]);
         $this->assertSame($arrHelper->getNestedElementByKey($nestedIndexed, 0), [1, [2, [4, [5]]]]);
diff --git a/tests/src/Helpers/ProviderResolverTest.php b/tests/src/Helpers/ProviderResolverTest.php
index 1e7f3fe..854e1af 100755
--- a/tests/src/Helpers/ProviderResolverTest.php
+++ b/tests/src/Helpers/ProviderResolverTest.php
@@ -22,7 +22,9 @@ use SimpleSAML\Test\Module\accounting\Constants\StateArrays;
  * @uses \SimpleSAML\Module\accounting\Entities\Providers\Service\Saml2
  * @uses \SimpleSAML\Module\accounting\Entities\Providers\Service\Oidc
  * @uses \SimpleSAML\Module\accounting\Entities\Providers\Bases\AbstractSaml2Provider
+ * @uses \SimpleSAML\Module\accounting\Entities\Providers\Bases\AbstractOidcProvider
  * @uses \SimpleSAML\Module\accounting\Entities\Authentication\Protocol\Saml2
+ * @uses \SimpleSAML\Module\accounting\Entities\Authentication\Protocol\Oidc
  */
 class ProviderResolverTest extends TestCase
 {
-- 
GitLab