auth.test.php 9.0 KB

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