auth.test.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. <?php
  2. use Symfony\Component\HttpFoundation\LaravelRequest as RequestFoundation;
  3. use Laravel\Str;
  4. use Laravel\Auth;
  5. use Laravel\Cookie;
  6. use Laravel\Session;
  7. use Laravel\Crypter;
  8. use Laravel\Session\Payload;
  9. class AuthTest extends PHPUnit_Framework_TestCase {
  10. /**
  11. * Setup teh test environment.
  12. */
  13. public function setUp()
  14. {
  15. $_SERVER['auth.login.stub'] = null;
  16. Cookie::$jar = array();
  17. Config::$items = array();
  18. Auth::driver()->user = null;
  19. Session::$instance = null;
  20. Config::set('database.default', 'sqlite');
  21. }
  22. /**
  23. * Tear down the test environment.
  24. */
  25. public function tearDown()
  26. {
  27. $_SERVER['auth.login.stub'] = null;
  28. Cookie::$jar = array();
  29. Config::$items = array();
  30. Auth::driver()->user = null;
  31. Session::$instance = null;
  32. Config::set('database.default', 'mysql');
  33. }
  34. /**
  35. * Set one of the $_SERVER variables.
  36. *
  37. * @param string $key
  38. * @param string $value
  39. */
  40. protected function setServerVar($key, $value)
  41. {
  42. $_SERVER[$key] = $value;
  43. $this->restartRequest();
  44. }
  45. /**
  46. * Reinitialize the global request.
  47. *
  48. * @return void
  49. */
  50. protected function restartRequest()
  51. {
  52. // FIXME: Ugly hack, but old contents from previous requests seem to
  53. // trip up the Foundation class.
  54. $_FILES = array();
  55. Request::$foundation = RequestFoundation::createFromGlobals();
  56. }
  57. /**
  58. * Test the Auth::user method.
  59. *
  60. * @group laravel
  61. */
  62. public function testUserMethodReturnsCurrentUser()
  63. {
  64. Auth::driver()->user = 'Taylor';
  65. $this->assertEquals('Taylor', Auth::user());
  66. }
  67. /**
  68. * Test the Auth::check method.
  69. *
  70. * @group laravel
  71. */
  72. public function testCheckMethodReturnsTrueWhenUserIsSet()
  73. {
  74. $auth = new AuthUserReturnsDummy;
  75. $this->assertTrue($auth->check());
  76. }
  77. /**
  78. * Test the Auth::check method.
  79. *
  80. * @group laravel
  81. */
  82. public function testCheckMethodReturnsFalseWhenNoUserIsSet()
  83. {
  84. $auth = new AuthUserReturnsNull;
  85. $this->assertFalse($auth->check());
  86. }
  87. /**
  88. * Test the Auth::guest method.
  89. *
  90. * @group laravel
  91. */
  92. public function testGuestReturnsTrueWhenNoUserIsSet()
  93. {
  94. $auth = new AuthUserReturnsNull;
  95. $this->assertTrue($auth->guest());
  96. }
  97. /**
  98. * Test the Auth::guest method.
  99. *
  100. * @group laravel
  101. */
  102. public function testGuestReturnsFalseWhenUserIsSet()
  103. {
  104. $auth = new AuthUserReturnsDummy;
  105. $this->assertFalse($auth->guest());
  106. }
  107. /**
  108. * Test the Auth::user method.
  109. *
  110. * @group laravel
  111. */
  112. public function testUserMethodReturnsNullWhenNoUserExistsAndNoRecallerExists()
  113. {
  114. Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver'));
  115. $this->assertNull(Auth::user());
  116. }
  117. /**
  118. * Test the Auth::user method.
  119. *
  120. * @group laravel
  121. */
  122. public function testUserReturnsUserByID()
  123. {
  124. Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver'));
  125. Auth::login(1);
  126. $this->assertEquals('Taylor Otwell', Auth::user()->name);
  127. Auth::logout();
  128. }
  129. /**
  130. * Test the Auth::user method.
  131. *
  132. * @group laravel
  133. */
  134. public function testNullReturnedWhenUserIDNotValidInteger()
  135. {
  136. Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver'));
  137. Auth::login('asdlkasd');
  138. $this->assertNull(Auth::user());
  139. }
  140. /**
  141. * Test the Auth::recall method.
  142. *
  143. * @group laravel
  144. */
  145. public function testUserCanBeRecalledViaCookie()
  146. {
  147. Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver'));
  148. $cookie = Crypter::encrypt('1|'.Str::random(40));
  149. Cookie::forever('authloginstub_remember', $cookie);
  150. $auth = new AuthLoginStub;
  151. $this->assertEquals('Taylor Otwell', $auth->user()->name);
  152. $this->assertTrue($auth->user()->id === $_SERVER['auth.login.stub']['user']);
  153. }
  154. /**
  155. * Test the Auth::attempt method.
  156. *
  157. * @group laravel
  158. */
  159. public function testAttemptMethodReturnsFalseWhenCredentialsAreInvalid()
  160. {
  161. $this->assertFalse(Auth::attempt(array('username' => 'foo', 'password' => 'foo')));
  162. $this->assertFalse(Auth::attempt(array('username' => 'foo', 'password' => null)));
  163. $this->assertFalse(Auth::attempt(array('username' => null, 'password' => null)));
  164. $this->assertFalse(Auth::attempt(array('username' => 'taylor', 'password' => 'password')));
  165. $this->assertFalse(Auth::attempt(array('username' => 'taylor', 'password' => 232)));
  166. }
  167. /**
  168. * Test the Auth::attempt method.
  169. *
  170. * @group laravel
  171. */
  172. public function testAttemptReturnsTrueWhenCredentialsAreCorrect()
  173. {
  174. Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver'));
  175. $auth = new AuthLoginStub;
  176. $this->assertTrue($auth->attempt(array('username' => 'taylor', 'password' => 'password1')));
  177. $this->assertEquals('1', $_SERVER['auth.login.stub']['user']);
  178. $this->assertFalse($_SERVER['auth.login.stub']['remember']);
  179. $auth_secure = new AuthLoginStub;
  180. $this->assertTrue($auth_secure->attempt(array('username' => 'taylor', 'password' => 'password1', 'remember' => true)));
  181. $this->assertEquals('1', $_SERVER['auth.login.stub']['user']);
  182. $this->assertTrue($_SERVER['auth.login.stub']['remember']);
  183. $auth_secure->logout();
  184. $auth->logout();
  185. }
  186. /**
  187. * Test Auth::login method.
  188. *
  189. * @group laravel
  190. */
  191. public function testLoginMethodStoresUserKeyInSession()
  192. {
  193. Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver'));
  194. $user = new StdClass;
  195. $user->id = 10;
  196. Auth::login($user);
  197. // FIXME: Not sure whether hard-coding the key is a good idea.
  198. $user = Session::$instance->session['data']['laravel_auth_drivers_fluent_login'];
  199. $this->assertEquals(10, $user->id);
  200. Auth::logout();
  201. Auth::login(5);
  202. $user = Session::$instance->session['data']['laravel_auth_drivers_fluent_login'];
  203. $this->assertEquals(5, $user);
  204. Auth::logout(5);
  205. }
  206. /**
  207. * Test the Auth::login method.
  208. *
  209. * @group laravel
  210. */
  211. public function testLoginStoresRememberCookieWhenNeeded()
  212. {
  213. Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver'));
  214. $this->setServerVar('HTTPS', 'on');
  215. // Set the session vars to make sure remember cookie uses them
  216. Config::set('session.path', 'foo');
  217. Config::set('session.domain', 'bar');
  218. Config::set('session.secure', true);
  219. Auth::login(1, true);
  220. $this->assertTrue(isset(Cookie::$jar['laravel_auth_drivers_fluent_remember']));
  221. $cookie = Cookie::get('laravel_auth_drivers_fluent_remember');
  222. $cookie = explode('|', Crypter::decrypt($cookie));
  223. $this->assertEquals(1, $cookie[0]);
  224. $this->assertEquals('foo', Cookie::$jar['laravel_auth_drivers_fluent_remember']['path']);
  225. $this->assertEquals('bar', Cookie::$jar['laravel_auth_drivers_fluent_remember']['domain']);
  226. $this->assertTrue(Cookie::$jar['laravel_auth_drivers_fluent_remember']['secure']);
  227. Auth::logout();
  228. $this->setServerVar('HTTPS', 'off');
  229. }
  230. /**
  231. * Test the Auth::logout method.
  232. *
  233. * @group laravel
  234. */
  235. public function testLogoutMethodLogsOutUser()
  236. {
  237. Session::$instance = new Payload($this->getMock('Laravel\\Session\\Drivers\\Driver'));
  238. $data = Session::$instance->session['data']['laravel_auth_drivers_fluent_login'] = 1;
  239. Auth::logout();
  240. $this->assertNull(Auth::user());
  241. $this->assertFalse(isset(Session::$instance->session['data']['laravel_auth_drivers_fluent_login']));
  242. $this->assertTrue(Cookie::$jar['laravel_auth_drivers_fluent_remember']['expiration'] < time());
  243. }
  244. }
  245. class AuthUserReturnsNull extends Laravel\Auth\Drivers\Driver {
  246. public function user() { return null; }
  247. public function retrieve($id) { return null; }
  248. public function attempt($arguments = array()) { return null; }
  249. }
  250. class AuthUserReturnsDummy extends Laravel\Auth\Drivers\Driver {
  251. public function user() { return 'Taylor'; }
  252. public function retrieve($id) { return null; }
  253. public function attempt($arguments = array())
  254. {
  255. return $this->login($arguments['username']);
  256. }
  257. }
  258. class AuthLoginStub extends Laravel\Auth\Drivers\Fluent {
  259. public function login($user, $remember = false)
  260. {
  261. if (is_null($remember)) $remember = false;
  262. $_SERVER['auth.login.stub'] = compact('user', 'remember');
  263. return parent::login($user, $remember);
  264. }
  265. public function logout()
  266. {
  267. parent::logout();
  268. }
  269. public function retrieve($id)
  270. {
  271. $user = parent::retrieve($id);
  272. $_SERVER['auth.login.stub'] = array(
  273. 'user' => $user->id,
  274. 'remember' => false,
  275. );
  276. return $user;
  277. }
  278. }