diff --git a/extensions/yii/authclient/provider/Collection.php b/extensions/yii/authclient/provider/Collection.php new file mode 100644 index 0000000..303f109 --- /dev/null +++ b/extensions/yii/authclient/provider/Collection.php @@ -0,0 +1,105 @@ + [ + * 'auth' => [ + * 'class' => 'yii\authclient\provider\Collection', + * 'providers' => [ + * 'google' => [ + * 'class' => 'yii\authclient\provider\GoogleOpenId' + * ], + * 'facebook' => [ + * 'class' => 'yii\authclient\provider\Facebook', + * 'clientId' => 'facebook_client_id', + * 'clientSecret' => 'facebook_client_secret', + * ], + * ], + * ] + * ... + * ] + * ~~~ + * + * @author Paul Klimov + * @since 2.0 + */ +class Collection extends Component +{ + /** + * @var array list of Auth providers with their configuration in format: 'providerId' => [...] + */ + private $_providers = []; + + /** + * @param array $providers list of auth providers + */ + public function setProviders(array $providers) + { + $this->_providers = $providers; + } + + /** + * @return ProviderInterface[] list of auth providers. + */ + public function getProviders() + { + $providers = []; + foreach ($this->_providers as $id => $provider) { + $providers[$id] = $this->getProvider($id); + } + return $providers; + } + + /** + * @param string $id service id. + * @return ProviderInterface auth service instance. + * @throws InvalidParamException on non existing provider request. + */ + public function getProvider($id) + { + if (!array_key_exists($id, $this->_providers)) { + throw new InvalidParamException("Unknown auth provider '{$id}'."); + } + if (!is_object($this->_providers[$id])) { + $this->_providers[$id] = $this->createProvider($id, $this->_providers[$id]); + } + return $this->_providers[$id]; + } + + /** + * Checks if provider exists in the hub. + * @param string $id provider id. + * @return boolean whether provider exist. + */ + public function hasProvider($id) + { + return array_key_exists($id, $this->_providers); + } + + /** + * Creates auth provider instance from its array configuration. + * @param string $id auth provider id. + * @param array $config auth provider instance configuration. + * @return ProviderInterface auth provider instance. + */ + protected function createProvider($id, array $config) + { + $config['id'] = $id; + return Yii::createObject($config); + } +} \ No newline at end of file diff --git a/tests/unit/extensions/authclient/provider/CollectionTest.php b/tests/unit/extensions/authclient/provider/CollectionTest.php new file mode 100644 index 0000000..9c65e59 --- /dev/null +++ b/tests/unit/extensions/authclient/provider/CollectionTest.php @@ -0,0 +1,90 @@ + new TestProvider(), + 'testProvider2' => new TestProvider(), + ]; + $collection->setProviders($providers); + $this->assertEquals($providers, $collection->getProviders(), 'Unable to setup providers!'); + } + + /** + * @depends testSetGet + */ + public function testGetProviderById() + { + $collection = new Collection(); + + $providerId = 'testProviderId'; + $provider = new TestProvider(); + $providers = [ + $providerId => $provider + ]; + $collection->setProviders($providers); + + $this->assertEquals($provider, $collection->getProvider($providerId), 'Unable to get provider by id!'); + } + + /** + * @depends testGetProviderById + */ + public function testCreateProvider() + { + $collection = new Collection(); + + $providerId = 'testProviderId'; + $providerClassName = TestProvider::className(); + $providers = [ + $providerId => [ + 'class' => $providerClassName + ] + ]; + $collection->setProviders($providers); + + $provider = $collection->getProvider($providerId); + $this->assertTrue(is_object($provider), 'Unable to create provider by config!'); + $this->assertTrue(is_a($provider, $providerClassName), 'Provider has wrong class name!'); + } + + /** + * @depends testSetGet + */ + public function testHasProvider() + { + $collection = new Collection(); + + $providerName = 'testProviderName'; + $providers = [ + $providerName => [ + 'class' => 'TestProvider1' + ], + ]; + $collection->setProviders($providers); + + $this->assertTrue($collection->hasProvider($providerName), 'Existing provider check fails!'); + $this->assertFalse($collection->hasProvider('unExistingProviderName'), 'Not existing provider check fails!'); + } +} + +class TestProvider extends Object implements ProviderInterface +{ + use ProviderTrait; + + public function authenticate() {} +} \ No newline at end of file