OAuth2ProviderTest.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. <?php
  2. namespace SocialiteProviders\Manager\Test;
  3. use Laravel\Socialite\Contracts\Factory as SocialiteFactoryContract;
  4. use Laravel\Socialite\One\AbstractProvider;
  5. use Mockery as m;
  6. use PHPUnit\Framework\TestCase;
  7. use SocialiteProviders\Manager\Config;
  8. use SocialiteProviders\Manager\Exception\InvalidArgumentException;
  9. use SocialiteProviders\Manager\Exception\MissingConfigException;
  10. use SocialiteProviders\Manager\SocialiteWasCalled;
  11. use SocialiteProviders\Manager\Test\Stubs\OAuth2ProviderStub;
  12. class OAuth2ProviderTest extends TestCase
  13. {
  14. use ManagerTestTrait;
  15. /**
  16. * @test
  17. */
  18. public function it_throws_if_there_is_no_config_in_services_or_env(): void
  19. {
  20. $this->expectExceptionObject(new MissingConfigException());
  21. $providerName = 'bar';
  22. $providerClass = $this->oauth2ProviderStubClass();
  23. $socialite = $this->socialiteMock();
  24. $socialite
  25. ->shouldReceive('buildProvider')
  26. ->withArgs([$providerClass, $this->config()])
  27. ->andReturn($this->oauth2ProviderStub());
  28. $socialite
  29. ->shouldReceive('extend')
  30. ->withArgs([
  31. $providerName,
  32. m::on(function ($closure) use ($providerClass) {
  33. $this->assertInstanceOf($providerClass, $closure());
  34. return is_callable($closure);
  35. }),
  36. ]);
  37. $app = $this->appMock();
  38. $app
  39. ->shouldReceive('make')
  40. ->with(SocialiteFactoryContract::class)
  41. ->andReturn($socialite);
  42. $configRetriever = $this->configRetrieverMock();
  43. $configRetriever
  44. ->shouldReceive('fromServices')
  45. ->andThrow(MissingConfigException::class);
  46. $event = new SocialiteWasCalled($app, $configRetriever);
  47. $event->extendSocialite($providerName, $providerClass);
  48. }
  49. /**
  50. * @test
  51. */
  52. public function it_allows_the_config_to_be_retrieved_from_the_services_array(): void
  53. {
  54. $providerName = 'bar';
  55. $providerClass = $this->oauth2ProviderStubClass();
  56. $socialite = $this->socialiteMock();
  57. $socialite
  58. ->shouldReceive('buildProvider')
  59. ->withArgs([$providerClass, $this->config()])
  60. ->andReturn($this->oauth2ProviderStub());
  61. $socialite
  62. ->shouldReceive('extend')
  63. ->withArgs([
  64. $providerName,
  65. m::on(function ($closure) use ($providerClass) {
  66. $this->assertInstanceOf($providerClass, $closure());
  67. return is_callable($closure);
  68. }),
  69. ]);
  70. $config = $this->configObject();
  71. $app = $this->appMock();
  72. $app
  73. ->shouldReceive('make')
  74. ->with(SocialiteFactoryContract::class)
  75. ->andReturn($socialite);
  76. $configRetriever = $this->configRetrieverMock();
  77. $configRetriever
  78. ->shouldReceive('fromServices')
  79. ->andReturn($config);
  80. $event = new SocialiteWasCalled($app, $configRetriever);
  81. $event->extendSocialite($providerName, $providerClass);
  82. }
  83. /**
  84. * @test
  85. */
  86. public function it_allows_a_custom_config_to_be_passed_dynamically(): void
  87. {
  88. $provider = new OAuth2ProviderStub(
  89. $this->buildRequest(),
  90. 'client id',
  91. 'client secret',
  92. 'redirect url'
  93. );
  94. $result = $provider->setConfig(new Config('key', 'secret', 'callback uri'));
  95. $this->assertSame($provider, $result);
  96. }
  97. /**
  98. * @test
  99. */
  100. public function it_retrieves_from_the_config_if_no_config_is_provided(): void
  101. {
  102. $providerName = 'bar';
  103. $providerClass = $this->oauth2ProviderStubClass();
  104. $socialite = $this->socialiteMock();
  105. $socialite
  106. ->shouldReceive('buildProvider')
  107. ->withArgs([$providerClass, $this->config()])
  108. ->andReturn($this->oauth2ProviderStub());
  109. $socialite
  110. ->shouldReceive('extend')
  111. ->withArgs([
  112. $providerName,
  113. m::on(function ($closure) use ($providerClass) {
  114. $this->assertInstanceOf($providerClass, $closure());
  115. return is_callable($closure);
  116. }),
  117. ]);
  118. $app = $this->appMock();
  119. $app
  120. ->shouldReceive('make')
  121. ->with(SocialiteFactoryContract::class)
  122. ->andReturn($socialite);
  123. $configRetriever = $this->configRetrieverMockWithDefaultExpectations(
  124. $providerName,
  125. $providerClass
  126. );
  127. $event = new SocialiteWasCalled($app, $configRetriever);
  128. $event->extendSocialite($providerName, $providerClass);
  129. }
  130. /**
  131. * @test
  132. */
  133. public function it_should_build_a_provider_and_extend_socialite(): void
  134. {
  135. $providerName = 'bar';
  136. $providerClass = $this->oauth2ProviderStubClass();
  137. $socialite = $this->socialiteMock();
  138. $socialite
  139. ->shouldReceive('buildProvider')
  140. ->withArgs([$providerClass, $this->config()])
  141. ->andReturn($this->oauth2ProviderStub());
  142. $socialite
  143. ->shouldReceive('extend')
  144. ->withArgs([
  145. $providerName,
  146. m::on(function ($closure) use ($providerClass) {
  147. $this->assertInstanceOf($providerClass, $closure());
  148. return is_callable($closure);
  149. }),
  150. ]);
  151. $config = $this->configObject();
  152. $app = $this->appMock();
  153. $app
  154. ->shouldReceive('make')
  155. ->with(SocialiteFactoryContract::class)
  156. ->andReturn($socialite);
  157. $app
  158. ->shouldReceive('make')
  159. ->with("SocialiteProviders.config.{$providerName}")
  160. ->andReturn($config);
  161. $configRetriever = $this->configRetrieverMockWithDefaultExpectations(
  162. $providerName,
  163. $providerClass
  164. );
  165. $event = new SocialiteWasCalled($app, $configRetriever);
  166. $event->extendSocialite($providerName, $providerClass);
  167. }
  168. /**
  169. * @test
  170. */
  171. public function it_throws_if_given_a_bad_provider_class_name(): void
  172. {
  173. $this->expectExceptionObject(new InvalidArgumentException("FooBar doesn't exist"));
  174. $providerName = 'bar';
  175. $providerClass = $this->oauth2ProviderStubClass();
  176. $socialite = $this->socialiteMock();
  177. $socialite
  178. ->shouldReceive('buildProvider')
  179. ->withArgs([$providerClass, $this->config()])
  180. ->andReturn($this->oauth2ProviderStub());
  181. $socialite
  182. ->shouldReceive('extend')
  183. ->withArgs([
  184. $providerName,
  185. m::on(function ($closure) use ($providerClass) {
  186. $this->assertInstanceOf($providerClass, $closure());
  187. return is_callable($closure);
  188. }),
  189. ]);
  190. $config = $this->configObject();
  191. $app = $this->appMock();
  192. $app
  193. ->shouldReceive('make')
  194. ->with(SocialiteFactoryContract::class)
  195. ->andReturn($socialite);
  196. $app
  197. ->shouldReceive('make')
  198. ->with("SocialiteProviders.config.{$providerName}")
  199. ->andReturn($config);
  200. $configRetriever = $this->configRetrieverMockWithDefaultExpectations(
  201. $providerName,
  202. $providerClass
  203. );
  204. $event = new SocialiteWasCalled($app, $configRetriever);
  205. $event->extendSocialite($providerName, $this->invalidClass());
  206. }
  207. /**
  208. * @test
  209. */
  210. public function it_throws_if_given_an_invalid_oauth2_provider(): void
  211. {
  212. $this->expectExceptionObject(new InvalidArgumentException("FooBar doesn't exist"));
  213. $providerName = 'foo';
  214. $providerClass = $this->oauth2ProviderStubClass();
  215. $socialite = $this->socialiteMock();
  216. $app = $this->appMock();
  217. $app
  218. ->shouldReceive('make')
  219. ->andReturn($socialite);
  220. $configRetriever = $this->configRetrieverMockWithDefaultExpectations(
  221. $providerName,
  222. $providerClass
  223. );
  224. $event = new SocialiteWasCalled($app, $configRetriever);
  225. $event->extendSocialite($providerName, $this->invalidClass());
  226. }
  227. /**
  228. * @test
  229. */
  230. public function it_throws_if_oauth1_server_is_passed_for_oauth2(): void
  231. {
  232. $this->expectExceptionObject(new InvalidArgumentException(
  233. sprintf('%s does not extend %s', OAuth2ProviderStub::class, AbstractProvider::class)
  234. ));
  235. $providerName = 'baz';
  236. $providerClass = $this->oauth2ProviderStubClass();
  237. $socialite = $this->socialiteMock();
  238. $socialite
  239. ->shouldReceive('formatConfig')
  240. ->with($this->config())
  241. ->andReturn($this->oauth1FormattedConfig($this->config()));
  242. $app = $this->appMock();
  243. $app
  244. ->shouldReceive('make')
  245. ->andReturn($socialite);
  246. $configRetriever = $this->configRetrieverMockWithDefaultExpectations(
  247. $providerName,
  248. $providerClass
  249. );
  250. $event = new SocialiteWasCalled($app, $configRetriever);
  251. $event->extendSocialite($providerName, $providerClass, $this->oauth1ServerStubClass());
  252. }
  253. }