/Tests/Security/Authentication/Provider/FacebookProviderTest.php

http://github.com/FriendsOfSymfony/FOSFacebookBundle · PHP · 342 lines · 238 code · 57 blank · 47 comment · 0 complexity · b5ab313c48c6bd2f3b437a93b8f33554 MD5 · raw file

  1. <?php
  2. /*
  3. * This file is part of the FOSFacebookBundle package.
  4. *
  5. * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace FOS\FacebookBundle\Tests\Security\Authentication\Provider;
  11. use FOS\FacebookBundle\Security\Authentication\Token\FacebookUserToken;
  12. use FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider;
  13. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  14. class FacebookProviderTest extends \PHPUnit_Framework_TestCase
  15. {
  16. /**
  17. * @expectedException \InvalidArgumentException
  18. */
  19. public function testThatUserCheckerCannotBeNullWhenUserProviderIsNotNull()
  20. {
  21. $facebookMock = $this->getMockBuilder('FOS\FacebookBundle\Facebook\FacebookSessionPersistence')
  22. ->disableOriginalConstructor()
  23. ->getMock();
  24. new FacebookProvider('main', $facebookMock, $this->getMock('Symfony\Component\Security\Core\User\UserProviderInterface'));
  25. }
  26. /**
  27. * @covers FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider::authenticate
  28. */
  29. public function testThatCannotAuthenticateWhenTokenIsNotFacebookUserToken()
  30. {
  31. $facebookMock = $this->getMockBuilder('FOS\FacebookBundle\Facebook\FacebookSessionPersistence')
  32. ->disableOriginalConstructor()
  33. ->getMock();
  34. $facebookProvider = new FacebookProvider('main', $facebookMock);
  35. $this->assertNull($facebookProvider->authenticate($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')));
  36. }
  37. /**
  38. * @covers FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider::authenticate
  39. * @covers FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider::supports
  40. */
  41. public function testThatCannotAuthenticateWhenTokenFromOtherFirewall()
  42. {
  43. $providerKeyForProvider = 'main';
  44. $providerKeyForToken = 'connect';
  45. $facebookMock = $this->getMockBuilder('FOS\FacebookBundle\Facebook\FacebookSessionPersistence')
  46. ->disableOriginalConstructor()
  47. ->getMock();
  48. $facebookProvider = new FacebookProvider($providerKeyForProvider, $facebookMock);
  49. $tokenMock = $this->getMock('FOS\FacebookBundle\Security\Authentication\Token\FacebookUserToken', array('getProviderKey'), array($providerKeyForToken));
  50. $tokenMock->expects($this->any())
  51. ->method('getProviderKey')
  52. ->will($this->returnValue($providerKeyForToken));
  53. $this->assertFalse($facebookProvider->supports($tokenMock));
  54. $this->assertNull($facebookProvider->authenticate($tokenMock));
  55. }
  56. /**
  57. * @covers FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider::authenticate
  58. * @covers FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider::supports
  59. * @covers FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider::createAuthenticatedToken
  60. */
  61. public function testThatCanAuthenticateUserWithoutUserProvider()
  62. {
  63. $providerKey = 'main';
  64. $facebookMock = $this->getMockBuilder('FOS\FacebookBundle\Facebook\FacebookSessionPersistence')
  65. ->disableOriginalConstructor()
  66. ->setMethods(array('getUser'))
  67. ->getMock();
  68. $facebookMock->expects($this->once())
  69. ->method('getUser')
  70. ->will($this->returnValue('123'));
  71. $facebookProvider = new FacebookProvider($providerKey, $facebookMock);
  72. $tokenMock = $this->getMock('FOS\FacebookBundle\Security\Authentication\Token\FacebookUserToken', array('getAttributes', 'getProviderKey'), array($providerKey));
  73. $tokenMock->expects($this->once())
  74. ->method('getAttributes')
  75. ->will($this->returnValue(array()));
  76. $tokenMock->expects($this->any())
  77. ->method('getProviderKey')
  78. ->will($this->returnValue($providerKey));
  79. $this->assertTrue($facebookProvider->supports($tokenMock));
  80. $this->assertEquals('123', $facebookProvider->authenticate($tokenMock)->getUser());
  81. }
  82. /**
  83. * @expectedException Symfony\Component\Security\Core\Exception\AuthenticationException
  84. */
  85. public function testThatCannotAuthenticateWhenUserProviderThrowsAuthenticationException()
  86. {
  87. $providerKey = 'main';
  88. $facebookMock = $this->getMockBuilder('FOS\FacebookBundle\Facebook\FacebookSessionPersistence')
  89. ->disableOriginalConstructor()
  90. ->setMethods(array('getUser'))
  91. ->getMock();
  92. $facebookMock->expects($this->once())
  93. ->method('getUser')
  94. ->will($this->returnValue('123'));
  95. $userProviderMock = $this->getMock('Symfony\Component\Security\Core\User\UserProviderInterface');
  96. $userProviderMock->expects($this->once())
  97. ->method('loadUserByUsername')
  98. ->with('123')
  99. ->will($this->throwException(new AuthenticationException('test')));
  100. $userCheckerMock = $this->getMock('Symfony\Component\Security\Core\User\UserCheckerInterface');
  101. $tokenMock = $this->getMock('FOS\FacebookBundle\Security\Authentication\Token\FacebookUserToken', array('getProviderKey'), array($providerKey));
  102. $tokenMock->expects($this->any())
  103. ->method('getProviderKey')
  104. ->will($this->returnValue($providerKey));
  105. $facebookProvider = new FacebookProvider($providerKey, $facebookMock, $userProviderMock, $userCheckerMock);
  106. $facebookProvider->authenticate($tokenMock);
  107. }
  108. /**
  109. * @expectedException Symfony\Component\Security\Core\Exception\AuthenticationException
  110. */
  111. public function testThatCannotAuthenticateWhenUserProviderDoesNotReturnUserInterface()
  112. {
  113. $providerKey = 'main';
  114. $facebookMock = $this->getMockBuilder('FOS\FacebookBundle\Facebook\FacebookSessionPersistence')
  115. ->disableOriginalConstructor()
  116. ->setMethods(array('getUser'))
  117. ->getMock();
  118. $facebookMock->expects($this->once())
  119. ->method('getUser')
  120. ->will($this->returnValue('123'));
  121. $userProviderMock = $this->getMock('Symfony\Component\Security\Core\User\UserProviderInterface');
  122. $userProviderMock->expects($this->once())
  123. ->method('loadUserByUsername')
  124. ->with('123')
  125. ->will($this->returnValue('234'));
  126. $userCheckerMock = $this->getMock('Symfony\Component\Security\Core\User\UserCheckerInterface');
  127. $tokenMock = $this->getMock('FOS\FacebookBundle\Security\Authentication\Token\FacebookUserToken', array('getProviderKey'), array($providerKey));
  128. $tokenMock->expects($this->any())
  129. ->method('getProviderKey')
  130. ->will($this->returnValue($providerKey));
  131. $facebookProvider = new FacebookProvider($providerKey, $facebookMock, $userProviderMock, $userCheckerMock);
  132. $facebookProvider->authenticate($tokenMock);
  133. }
  134. /**
  135. * @expectedException Symfony\Component\Security\Core\Exception\AuthenticationException
  136. */
  137. public function testThatCannotAuthenticateWhenCannotRetrieveFacebookUserFromSession()
  138. {
  139. $providerKey = 'main';
  140. $facebookMock = $this->getMockBuilder('FOS\FacebookBundle\Facebook\FacebookSessionPersistence')
  141. ->disableOriginalConstructor()
  142. ->setMethods(array('getUser'))
  143. ->getMock();
  144. $facebookMock->expects($this->once())
  145. ->method('getUser')
  146. ->will($this->returnValue(false));
  147. $userProviderMock = $this->getMock('Symfony\Component\Security\Core\User\UserProviderInterface');
  148. $userCheckerMock = $this->getMock('Symfony\Component\Security\Core\User\UserCheckerInterface');
  149. $tokenMock = $this->getMock('FOS\FacebookBundle\Security\Authentication\Token\FacebookUserToken', array('getProviderKey'), array($providerKey));
  150. $tokenMock->expects($this->any())
  151. ->method('getProviderKey')
  152. ->will($this->returnValue($providerKey));
  153. $facebookProvider = new FacebookProvider($providerKey, $facebookMock, $userProviderMock, $userCheckerMock);
  154. $facebookProvider->authenticate($tokenMock);
  155. }
  156. /**
  157. * @covers FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider::authenticate
  158. * @covers FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider::createAuthenticatedToken
  159. */
  160. public function testThatCanAutenticateUsingUserProvider()
  161. {
  162. $providerKey = 'main';
  163. $userMock = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
  164. $userMock->expects($this->once())
  165. ->method('getUsername')
  166. ->will($this->returnValue('l3l0'));
  167. $userMock->expects($this->once())
  168. ->method('getRoles')
  169. ->will($this->returnValue(array()));
  170. $facebookMock = $this->getMockBuilder('FOS\FacebookBundle\Facebook\FacebookSessionPersistence')
  171. ->disableOriginalConstructor()
  172. ->setMethods(array('getUser'))
  173. ->getMock();
  174. $facebookMock->expects($this->once())
  175. ->method('getUser')
  176. ->will($this->returnValue('123'));
  177. $userProviderMock = $this->getMock('Symfony\Component\Security\Core\User\UserProviderInterface');
  178. $userProviderMock->expects($this->once())
  179. ->method('loadUserByUsername')
  180. ->with('123')
  181. ->will($this->returnValue($userMock));
  182. $userCheckerMock = $this->getMock('Symfony\Component\Security\Core\User\UserCheckerInterface');
  183. $userCheckerMock->expects($this->once())
  184. ->method('checkPostAuth');
  185. $tokenMock = $this->getMock('FOS\FacebookBundle\Security\Authentication\Token\FacebookUserToken', array('getAttributes', 'getProviderKey'), array($providerKey));
  186. $tokenMock->expects($this->once())
  187. ->method('getAttributes')
  188. ->will($this->returnValue(array()));
  189. $tokenMock->expects($this->any())
  190. ->method('getProviderKey')
  191. ->will($this->returnValue($providerKey));
  192. $facebookProvider = new FacebookProvider($providerKey, $facebookMock, $userProviderMock, $userCheckerMock);
  193. $this->assertEquals('l3l0', $facebookProvider->authenticate($tokenMock)->getUsername());
  194. }
  195. /**
  196. * @expectedException Symfony\Component\Security\Core\Exception\AuthenticationException
  197. */
  198. public function testThatAccessTokenIsSetToFacebookSessionPersistenceWithAccessTokenFromFacebookUserToken()
  199. {
  200. $providerKey = 'main';
  201. $accessToken = 'AbCd';
  202. $facebookMock = $this->getMockBuilder('FOS\FacebookBundle\Facebook\FacebookSessionPersistence')
  203. ->disableOriginalConstructor()
  204. ->setMethods(array('setAccessToken','getUser'))
  205. ->getMock();
  206. $facebookMock->expects($this->once())
  207. ->method('setAccessToken')
  208. ->with($accessToken);
  209. $facebookMock->expects($this->once())
  210. ->method('getUser');
  211. $userProviderMock = $this->getMock('Symfony\Component\Security\Core\User\UserProviderInterface');
  212. $userCheckerMock = $this->getMock('Symfony\Component\Security\Core\User\UserCheckerInterface');
  213. $tokenMock = $this->getMock('FOS\FacebookBundle\Security\Authentication\Token\FacebookUserToken', array('getProviderKey','getAccessToken'), array($providerKey,'',array(),$accessToken));
  214. $tokenMock->expects($this->any())
  215. ->method('getProviderKey')
  216. ->will($this->returnValue($providerKey));
  217. $tokenMock->expects($this->any())
  218. ->method('getAccessToken')
  219. ->will($this->returnValue($accessToken));
  220. $facebookProvider = new FacebookProvider($providerKey, $facebookMock, $userProviderMock, $userCheckerMock);
  221. $facebookProvider->authenticate($tokenMock);
  222. }
  223. /**
  224. * @covers FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider::authenticate
  225. * @covers FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider::createAuthenticatedToken
  226. */
  227. public function testThatAccessTokenIsSetToNewFacebookUserTokenWhenAuthenticateWithUserProvider()
  228. {
  229. $providerKey = 'main';
  230. $accessToken = 'AbCd';
  231. $userMock = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
  232. $userMock->expects($this->once())
  233. ->method('getRoles')
  234. ->will($this->returnValue(array()));
  235. $facebookMock = $this->getMockBuilder('FOS\FacebookBundle\Facebook\FacebookSessionPersistence')
  236. ->disableOriginalConstructor()
  237. ->setMethods(array('getUser'))
  238. ->getMock();
  239. $facebookMock->expects($this->once())
  240. ->method('getUser')
  241. ->will($this->returnValue('123'));
  242. $userProviderMock = $this->getMock('Symfony\Component\Security\Core\User\UserProviderInterface');
  243. $userProviderMock->expects($this->once())
  244. ->method('loadUserByUsername')
  245. ->with('123')
  246. ->will($this->returnValue($userMock));
  247. $userCheckerMock = $this->getMock('Symfony\Component\Security\Core\User\UserCheckerInterface');
  248. $userCheckerMock->expects($this->once())
  249. ->method('checkPostAuth');
  250. $tokenMock = $this->getMock('FOS\FacebookBundle\Security\Authentication\Token\FacebookUserToken', array('getAttributes', 'getProviderKey'), array($providerKey,'',array(),$accessToken));
  251. $tokenMock->expects($this->once())
  252. ->method('getAttributes')
  253. ->will($this->returnValue(array()));
  254. $tokenMock->expects($this->any())
  255. ->method('getProviderKey')
  256. ->will($this->returnValue($providerKey));
  257. $facebookProvider = new FacebookProvider($providerKey, $facebookMock, $userProviderMock, $userCheckerMock);
  258. $this->assertEquals($accessToken, $facebookProvider->authenticate($tokenMock)->getAccessToken());
  259. }
  260. /**
  261. * @covers FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider::authenticate
  262. * @covers FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider::createAuthenticatedToken
  263. */
  264. public function testThatAccessTokenIsSetToNewFacebookUserTokenWhenAuthenticateWithoutUserProvider()
  265. {
  266. $providerKey = 'main';
  267. $accessToken = 'AbCd';
  268. $facebookMock = $this->getMockBuilder('FOS\FacebookBundle\Facebook\FacebookSessionPersistence')
  269. ->disableOriginalConstructor()
  270. ->setMethods(array('getUser'))
  271. ->getMock();
  272. $facebookMock->expects($this->once())
  273. ->method('getUser')
  274. ->will($this->returnValue('123'));
  275. $facebookProvider = new FacebookProvider($providerKey, $facebookMock);
  276. $tokenMock = $this->getMock('FOS\FacebookBundle\Security\Authentication\Token\FacebookUserToken', array('getAttributes', 'getProviderKey'), array($providerKey,'',array(),$accessToken));
  277. $tokenMock->expects($this->once())
  278. ->method('getAttributes')
  279. ->will($this->returnValue(array()));
  280. $tokenMock->expects($this->any())
  281. ->method('getProviderKey')
  282. ->will($this->returnValue($providerKey));
  283. $this->assertEquals($accessToken, $facebookProvider->authenticate($tokenMock)->getAccessToken());
  284. }
  285. }