| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613 |
- <?php
- namespace Illuminate\Tests\Auth;
- use Illuminate\Auth\AuthenticationException;
- use Illuminate\Auth\Events\Attempting;
- use Illuminate\Auth\Events\Authenticated;
- use Illuminate\Auth\Events\CurrentDeviceLogout;
- use Illuminate\Auth\Events\Failed;
- use Illuminate\Auth\Events\Login;
- use Illuminate\Auth\Events\Logout;
- use Illuminate\Auth\Events\Validated;
- use Illuminate\Auth\SessionGuard;
- use Illuminate\Contracts\Auth\Authenticatable;
- use Illuminate\Contracts\Auth\UserProvider;
- use Illuminate\Contracts\Events\Dispatcher;
- use Illuminate\Contracts\Session\Session;
- use Illuminate\Cookie\CookieJar;
- use Illuminate\Support\Timebox;
- use Mockery as m;
- use PHPUnit\Framework\TestCase;
- use Symfony\Component\HttpFoundation\Cookie;
- use Symfony\Component\HttpFoundation\Request;
- use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
- class AuthGuardTest extends TestCase
- {
- protected function tearDown(): void
- {
- m::close();
- }
- public function testBasicReturnsNullOnValidAttempt()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $guard = m::mock(SessionGuard::class.'[check,attempt]', ['default', $provider, $session]);
- $guard->shouldReceive('check')->once()->andReturn(false);
- $guard->shouldReceive('attempt')->once()->with(['email' => 'foo@bar.com', 'password' => 'secret'])->andReturn(true);
- $request = Request::create('/', 'GET', [], [], [], ['PHP_AUTH_USER' => 'foo@bar.com', 'PHP_AUTH_PW' => 'secret']);
- $guard->setRequest($request);
- $guard->basic('email');
- }
- public function testBasicReturnsNullWhenAlreadyLoggedIn()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $guard = m::mock(SessionGuard::class.'[check]', ['default', $provider, $session]);
- $guard->shouldReceive('check')->once()->andReturn(true);
- $guard->shouldReceive('attempt')->never();
- $request = Request::create('/', 'GET', [], [], [], ['PHP_AUTH_USER' => 'foo@bar.com', 'PHP_AUTH_PW' => 'secret']);
- $guard->setRequest($request);
- $guard->basic('email');
- }
- public function testBasicReturnsResponseOnFailure()
- {
- $this->expectException(UnauthorizedHttpException::class);
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $guard = m::mock(SessionGuard::class.'[check,attempt]', ['default', $provider, $session]);
- $guard->shouldReceive('check')->once()->andReturn(false);
- $guard->shouldReceive('attempt')->once()->with(['email' => 'foo@bar.com', 'password' => 'secret'])->andReturn(false);
- $request = Request::create('/', 'GET', [], [], [], ['PHP_AUTH_USER' => 'foo@bar.com', 'PHP_AUTH_PW' => 'secret']);
- $guard->setRequest($request);
- $guard->basic('email');
- }
- public function testBasicWithExtraConditions()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $guard = m::mock(SessionGuard::class.'[check,attempt]', ['default', $provider, $session]);
- $guard->shouldReceive('check')->once()->andReturn(false);
- $guard->shouldReceive('attempt')->once()->with(['email' => 'foo@bar.com', 'password' => 'secret', 'active' => 1])->andReturn(true);
- $request = Request::create('/', 'GET', [], [], [], ['PHP_AUTH_USER' => 'foo@bar.com', 'PHP_AUTH_PW' => 'secret']);
- $guard->setRequest($request);
- $guard->basic('email', ['active' => 1]);
- }
- public function testBasicWithExtraArrayConditions()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $guard = m::mock(SessionGuard::class.'[check,attempt]', ['default', $provider, $session]);
- $guard->shouldReceive('check')->once()->andReturn(false);
- $guard->shouldReceive('attempt')->once()->with(['email' => 'foo@bar.com', 'password' => 'secret', 'active' => 1, 'type' => [1, 2, 3]])->andReturn(true);
- $request = Request::create('/', 'GET', [], [], [], ['PHP_AUTH_USER' => 'foo@bar.com', 'PHP_AUTH_PW' => 'secret']);
- $guard->setRequest($request);
- $guard->basic('email', ['active' => 1, 'type' => [1, 2, 3]]);
- }
- public function testAttemptCallsRetrieveByCredentials()
- {
- $guard = $this->getGuard();
- $guard->setDispatcher($events = m::mock(Dispatcher::class));
- $timebox = $guard->getTimebox();
- $timebox->shouldReceive('call')->once()->andReturnUsing(function ($callback) use ($timebox) {
- return $callback($timebox);
- });
- $events->shouldReceive('dispatch')->once()->with(m::type(Attempting::class));
- $events->shouldReceive('dispatch')->once()->with(m::type(Failed::class));
- $events->shouldNotReceive('dispatch')->with(m::type(Validated::class));
- $guard->getProvider()->shouldReceive('retrieveByCredentials')->once()->with(['foo']);
- $guard->attempt(['foo']);
- }
- public function testAttemptReturnsUserInterface()
- {
- [$session, $provider, $request, $cookie, $timebox] = $this->getMocks();
- $guard = $this->getMockBuilder(SessionGuard::class)->onlyMethods(['login'])->setConstructorArgs(['default', $provider, $session, $request, $timebox])->getMock();
- $guard->setDispatcher($events = m::mock(Dispatcher::class));
- $timebox->shouldReceive('call')->once()->andReturnUsing(function ($callback, $microseconds) use ($timebox) {
- return $callback($timebox->shouldReceive('returnEarly')->once()->getMock());
- });
- $events->shouldReceive('dispatch')->once()->with(m::type(Attempting::class));
- $events->shouldReceive('dispatch')->once()->with(m::type(Validated::class));
- $user = $this->createMock(Authenticatable::class);
- $guard->getProvider()->shouldReceive('retrieveByCredentials')->once()->andReturn($user);
- $guard->getProvider()->shouldReceive('validateCredentials')->with($user, ['foo'])->andReturn(true);
- $guard->expects($this->once())->method('login')->with($this->equalTo($user));
- $this->assertTrue($guard->attempt(['foo']));
- }
- public function testAttemptReturnsFalseIfUserNotGiven()
- {
- $mock = $this->getGuard();
- $mock->setDispatcher($events = m::mock(Dispatcher::class));
- $timebox = $mock->getTimebox();
- $timebox->shouldReceive('call')->once()->andReturnUsing(function ($callback, $microseconds) use ($timebox) {
- return $callback($timebox);
- });
- $events->shouldReceive('dispatch')->once()->with(m::type(Attempting::class));
- $events->shouldReceive('dispatch')->once()->with(m::type(Failed::class));
- $events->shouldNotReceive('dispatch')->with(m::type(Validated::class));
- $mock->getProvider()->shouldReceive('retrieveByCredentials')->once()->andReturn(null);
- $this->assertFalse($mock->attempt(['foo']));
- }
- public function testAttemptAndWithCallbacks()
- {
- [$session, $provider, $request, $cookie, $timebox] = $this->getMocks();
- $mock = $this->getMockBuilder(SessionGuard::class)->onlyMethods(['getName'])->setConstructorArgs(['default', $provider, $session, $request, $timebox])->getMock();
- $mock->setDispatcher($events = m::mock(Dispatcher::class));
- $timebox->shouldReceive('call')->andReturnUsing(function ($callback) use ($timebox) {
- return $callback($timebox->shouldReceive('returnEarly')->getMock());
- });
- $user = m::mock(Authenticatable::class);
- $events->shouldReceive('dispatch')->times(3)->with(m::type(Attempting::class));
- $events->shouldReceive('dispatch')->once()->with(m::type(Login::class));
- $events->shouldReceive('dispatch')->once()->with(m::type(Authenticated::class));
- $events->shouldReceive('dispatch')->twice()->with(m::type(Validated::class));
- $events->shouldReceive('dispatch')->twice()->with(m::type(Failed::class));
- $mock->expects($this->once())->method('getName')->willReturn('foo');
- $user->shouldReceive('getAuthIdentifier')->once()->andReturn('bar');
- $mock->getSession()->shouldReceive('put')->with('foo', 'bar')->once();
- $session->shouldReceive('migrate')->once();
- $mock->getProvider()->shouldReceive('retrieveByCredentials')->times(3)->with(['foo'])->andReturn($user);
- $mock->getProvider()->shouldReceive('validateCredentials')->twice()->andReturnTrue();
- $mock->getProvider()->shouldReceive('validateCredentials')->once()->andReturnFalse();
- $this->assertTrue($mock->attemptWhen(['foo'], function ($user, $guard) {
- static::assertInstanceOf(Authenticatable::class, $user);
- static::assertInstanceOf(SessionGuard::class, $guard);
- return true;
- }));
- $this->assertFalse($mock->attemptWhen(['foo'], function ($user, $guard) {
- static::assertInstanceOf(Authenticatable::class, $user);
- static::assertInstanceOf(SessionGuard::class, $guard);
- return false;
- }));
- $executed = false;
- $this->assertFalse($mock->attemptWhen(['foo'], false, function () use (&$executed) {
- return $executed = true;
- }));
- $this->assertFalse($executed);
- }
- public function testLoginStoresIdentifierInSession()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $mock = $this->getMockBuilder(SessionGuard::class)->onlyMethods(['getName'])->setConstructorArgs(['default', $provider, $session, $request])->getMock();
- $user = m::mock(Authenticatable::class);
- $mock->expects($this->once())->method('getName')->willReturn('foo');
- $user->shouldReceive('getAuthIdentifier')->once()->andReturn('bar');
- $mock->getSession()->shouldReceive('put')->with('foo', 'bar')->once();
- $session->shouldReceive('migrate')->once();
- $mock->login($user);
- }
- public function testSessionGuardIsMacroable()
- {
- $guard = $this->getGuard();
- $guard->macro('foo', function () {
- return 'bar';
- });
- $this->assertSame(
- 'bar', $guard->foo()
- );
- }
- public function testLoginFiresLoginAndAuthenticatedEvents()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $mock = $this->getMockBuilder(SessionGuard::class)->onlyMethods(['getName'])->setConstructorArgs(['default', $provider, $session, $request])->getMock();
- $mock->setDispatcher($events = m::mock(Dispatcher::class));
- $user = m::mock(Authenticatable::class);
- $events->shouldReceive('dispatch')->once()->with(m::type(Login::class));
- $events->shouldReceive('dispatch')->once()->with(m::type(Authenticated::class));
- $mock->expects($this->once())->method('getName')->willReturn('foo');
- $user->shouldReceive('getAuthIdentifier')->once()->andReturn('bar');
- $mock->getSession()->shouldReceive('put')->with('foo', 'bar')->once();
- $session->shouldReceive('migrate')->once();
- $mock->login($user);
- }
- public function testFailedAttemptFiresFailedEvent()
- {
- $guard = $this->getGuard();
- $guard->setDispatcher($events = m::mock(Dispatcher::class));
- $timebox = $guard->getTimebox();
- $timebox->shouldReceive('call')->once()->andReturnUsing(function ($callback, $microseconds) use ($timebox) {
- return $callback($timebox);
- });
- $events->shouldReceive('dispatch')->once()->with(m::type(Attempting::class));
- $events->shouldReceive('dispatch')->once()->with(m::type(Failed::class));
- $events->shouldNotReceive('dispatch')->with(m::type(Validated::class));
- $guard->getProvider()->shouldReceive('retrieveByCredentials')->once()->with(['foo'])->andReturn(null);
- $guard->attempt(['foo']);
- }
- public function testAuthenticateReturnsUserWhenUserIsNotNull()
- {
- $user = m::mock(Authenticatable::class);
- $guard = $this->getGuard()->setUser($user);
- $this->assertEquals($user, $guard->authenticate());
- }
- public function testSetUserFiresAuthenticatedEvent()
- {
- $user = m::mock(Authenticatable::class);
- $guard = $this->getGuard();
- $guard->setDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('dispatch')->once()->with(m::type(Authenticated::class));
- $guard->setUser($user);
- }
- public function testAuthenticateThrowsWhenUserIsNull()
- {
- $this->expectException(AuthenticationException::class);
- $this->expectExceptionMessage('Unauthenticated.');
- $guard = $this->getGuard();
- $guard->getSession()->shouldReceive('get')->once()->andReturn(null);
- $guard->authenticate();
- }
- public function testHasUserReturnsTrueWhenUserIsNotNull()
- {
- $user = m::mock(Authenticatable::class);
- $guard = $this->getGuard()->setUser($user);
- $this->assertTrue($guard->hasUser());
- }
- public function testHasUserReturnsFalseWhenUserIsNull()
- {
- $guard = $this->getGuard();
- $guard->getSession()->shouldNotReceive('get');
- $this->assertFalse($guard->hasUser());
- }
- public function testIsAuthedReturnsTrueWhenUserIsNotNull()
- {
- $user = m::mock(Authenticatable::class);
- $mock = $this->getGuard();
- $mock->setUser($user);
- $this->assertTrue($mock->check());
- $this->assertFalse($mock->guest());
- }
- public function testIsAuthedReturnsFalseWhenUserIsNull()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $mock = $this->getMockBuilder(SessionGuard::class)->onlyMethods(['user'])->setConstructorArgs(['default', $provider, $session, $request])->getMock();
- $mock->expects($this->exactly(2))->method('user')->willReturn(null);
- $this->assertFalse($mock->check());
- $this->assertTrue($mock->guest());
- }
- public function testUserMethodReturnsCachedUser()
- {
- $user = m::mock(Authenticatable::class);
- $mock = $this->getGuard();
- $mock->setUser($user);
- $this->assertSame($user, $mock->user());
- }
- public function testNullIsReturnedForUserIfNoUserFound()
- {
- $mock = $this->getGuard();
- $mock->getSession()->shouldReceive('get')->once()->andReturn(null);
- $this->assertNull($mock->user());
- }
- public function testUserIsSetToRetrievedUser()
- {
- $mock = $this->getGuard();
- $mock->getSession()->shouldReceive('get')->once()->andReturn(1);
- $user = m::mock(Authenticatable::class);
- $mock->getProvider()->shouldReceive('retrieveById')->once()->with(1)->andReturn($user);
- $this->assertSame($user, $mock->user());
- $this->assertSame($user, $mock->getUser());
- }
- public function testLogoutRemovesSessionTokenAndRememberMeCookie()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $mock = $this->getMockBuilder(SessionGuard::class)->onlyMethods(['getName', 'getRecallerName', 'recaller'])->setConstructorArgs(['default', $provider, $session, $request])->getMock();
- $mock->setCookieJar($cookies = m::mock(CookieJar::class));
- $user = m::mock(Authenticatable::class);
- $user->shouldReceive('getRememberToken')->once()->andReturn('a');
- $user->shouldReceive('setRememberToken')->once();
- $mock->expects($this->once())->method('getName')->willReturn('foo');
- $mock->expects($this->once())->method('getRecallerName')->willReturn('bar');
- $mock->expects($this->once())->method('recaller')->willReturn('non-null-cookie');
- $provider->shouldReceive('updateRememberToken')->once();
- $cookie = m::mock(Cookie::class);
- $cookies->shouldReceive('forget')->once()->with('bar')->andReturn($cookie);
- $cookies->shouldReceive('queue')->once()->with($cookie);
- $mock->getSession()->shouldReceive('remove')->once()->with('foo');
- $mock->setUser($user);
- $mock->logout();
- $this->assertNull($mock->getUser());
- }
- public function testLogoutDoesNotEnqueueRememberMeCookieForDeletionIfCookieDoesntExist()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $mock = $this->getMockBuilder(SessionGuard::class)->onlyMethods(['getName', 'recaller'])->setConstructorArgs(['default', $provider, $session, $request])->getMock();
- $mock->setCookieJar($cookies = m::mock(CookieJar::class));
- $user = m::mock(Authenticatable::class);
- $user->shouldReceive('getRememberToken')->andReturn(null);
- $mock->expects($this->once())->method('getName')->willReturn('foo');
- $mock->expects($this->once())->method('recaller')->willReturn(null);
- $mock->getSession()->shouldReceive('remove')->once()->with('foo');
- $mock->setUser($user);
- $mock->logout();
- $this->assertNull($mock->getUser());
- }
- public function testLogoutFiresLogoutEvent()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $mock = $this->getMockBuilder(SessionGuard::class)->onlyMethods(['clearUserDataFromStorage'])->setConstructorArgs(['default', $provider, $session, $request])->getMock();
- $mock->expects($this->once())->method('clearUserDataFromStorage');
- $mock->setDispatcher($events = m::mock(Dispatcher::class));
- $user = m::mock(Authenticatable::class);
- $user->shouldReceive('getRememberToken')->andReturn(null);
- $events->shouldReceive('dispatch')->once()->with(m::type(Authenticated::class));
- $mock->setUser($user);
- $events->shouldReceive('dispatch')->once()->with(m::type(Logout::class));
- $mock->logout();
- }
- public function testLogoutDoesNotSetRememberTokenIfNotPreviouslySet()
- {
- [$session, $provider, $request] = $this->getMocks();
- $mock = $this->getMockBuilder(SessionGuard::class)->onlyMethods(['clearUserDataFromStorage'])->setConstructorArgs(['default', $provider, $session, $request])->getMock();
- $user = m::mock(Authenticatable::class);
- $user->shouldReceive('getRememberToken')->andReturn(null);
- $user->shouldNotReceive('setRememberToken');
- $provider->shouldNotReceive('updateRememberToken');
- $mock->setUser($user);
- $mock->logout();
- }
- public function testLogoutCurrentDeviceRemovesRememberMeCookie()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $mock = $this->getMockBuilder(SessionGuard::class)->onlyMethods(['getName', 'getRecallerName', 'recaller'])->setConstructorArgs(['default', $provider, $session, $request])->getMock();
- $mock->setCookieJar($cookies = m::mock(CookieJar::class));
- $user = m::mock(Authenticatable::class);
- $mock->expects($this->once())->method('getName')->willReturn('foo');
- $mock->expects($this->once())->method('getRecallerName')->willReturn('bar');
- $mock->expects($this->once())->method('recaller')->willReturn('non-null-cookie');
- $cookie = m::mock(Cookie::class);
- $cookies->shouldReceive('forget')->once()->with('bar')->andReturn($cookie);
- $cookies->shouldReceive('queue')->once()->with($cookie);
- $mock->getSession()->shouldReceive('remove')->once()->with('foo');
- $mock->setUser($user);
- $mock->logoutCurrentDevice();
- $this->assertNull($mock->getUser());
- }
- public function testLogoutCurrentDeviceDoesNotEnqueueRememberMeCookieForDeletionIfCookieDoesntExist()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $mock = $this->getMockBuilder(SessionGuard::class)->onlyMethods(['getName', 'recaller'])->setConstructorArgs(['default', $provider, $session, $request])->getMock();
- $mock->setCookieJar($cookies = m::mock(CookieJar::class));
- $user = m::mock(Authenticatable::class);
- $user->shouldReceive('getRememberToken')->andReturn(null);
- $mock->expects($this->once())->method('getName')->willReturn('foo');
- $mock->expects($this->once())->method('recaller')->willReturn(null);
- $mock->getSession()->shouldReceive('remove')->once()->with('foo');
- $mock->setUser($user);
- $mock->logoutCurrentDevice();
- $this->assertNull($mock->getUser());
- }
- public function testLogoutCurrentDeviceFiresLogoutEvent()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $mock = $this->getMockBuilder(SessionGuard::class)->onlyMethods(['clearUserDataFromStorage'])->setConstructorArgs(['default', $provider, $session, $request])->getMock();
- $mock->expects($this->once())->method('clearUserDataFromStorage');
- $mock->setDispatcher($events = m::mock(Dispatcher::class));
- $user = m::mock(Authenticatable::class);
- $user->shouldReceive('getRememberToken')->andReturn(null);
- $events->shouldReceive('dispatch')->once()->with(m::type(Authenticated::class));
- $mock->setUser($user);
- $events->shouldReceive('dispatch')->once()->with(m::type(CurrentDeviceLogout::class));
- $mock->logoutCurrentDevice();
- }
- public function testLoginMethodQueuesCookieWhenRemembering()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $guard = new SessionGuard('default', $provider, $session, $request);
- $guard->setCookieJar($cookie);
- $foreverCookie = new Cookie($guard->getRecallerName(), 'foo');
- $cookie->shouldReceive('make')->once()->with($guard->getRecallerName(), 'foo|recaller|bar', 2628000)->andReturn($foreverCookie);
- $cookie->shouldReceive('queue')->once()->with($foreverCookie);
- $guard->getSession()->shouldReceive('put')->once()->with($guard->getName(), 'foo');
- $session->shouldReceive('migrate')->once();
- $user = m::mock(Authenticatable::class);
- $user->shouldReceive('getAuthIdentifier')->andReturn('foo');
- $user->shouldReceive('getAuthPassword')->andReturn('bar');
- $user->shouldReceive('getRememberToken')->andReturn('recaller');
- $user->shouldReceive('setRememberToken')->never();
- $provider->shouldReceive('updateRememberToken')->never();
- $guard->login($user, true);
- }
- public function testLoginMethodQueuesCookieWhenRememberingAndAllowsOverride()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $guard = new SessionGuard('default', $provider, $session, $request);
- $guard->setRememberDuration(5000);
- $guard->setCookieJar($cookie);
- $foreverCookie = new Cookie($guard->getRecallerName(), 'foo');
- $cookie->shouldReceive('make')->once()->with($guard->getRecallerName(), 'foo|recaller|bar', 5000)->andReturn($foreverCookie);
- $cookie->shouldReceive('queue')->once()->with($foreverCookie);
- $guard->getSession()->shouldReceive('put')->once()->with($guard->getName(), 'foo');
- $session->shouldReceive('migrate')->once();
- $user = m::mock(Authenticatable::class);
- $user->shouldReceive('getAuthIdentifier')->andReturn('foo');
- $user->shouldReceive('getAuthPassword')->andReturn('bar');
- $user->shouldReceive('getRememberToken')->andReturn('recaller');
- $user->shouldReceive('setRememberToken')->never();
- $provider->shouldReceive('updateRememberToken')->never();
- $guard->login($user, true);
- }
- public function testLoginMethodCreatesRememberTokenIfOneDoesntExist()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $guard = new SessionGuard('default', $provider, $session, $request);
- $guard->setCookieJar($cookie);
- $foreverCookie = new Cookie($guard->getRecallerName(), 'foo');
- $cookie->shouldReceive('make')->once()->andReturn($foreverCookie);
- $cookie->shouldReceive('queue')->once()->with($foreverCookie);
- $guard->getSession()->shouldReceive('put')->once()->with($guard->getName(), 'foo');
- $session->shouldReceive('migrate')->once();
- $user = m::mock(Authenticatable::class);
- $user->shouldReceive('getAuthIdentifier')->andReturn('foo');
- $user->shouldReceive('getAuthPassword')->andReturn('foo');
- $user->shouldReceive('getRememberToken')->andReturn(null);
- $user->shouldReceive('setRememberToken')->once();
- $provider->shouldReceive('updateRememberToken')->once();
- $guard->login($user, true);
- }
- public function testLoginUsingIdLogsInWithUser()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $guard = m::mock(SessionGuard::class, ['default', $provider, $session])->makePartial();
- $user = m::mock(Authenticatable::class);
- $guard->getProvider()->shouldReceive('retrieveById')->once()->with(10)->andReturn($user);
- $guard->shouldReceive('login')->once()->with($user, false);
- $this->assertSame($user, $guard->loginUsingId(10));
- }
- public function testLoginUsingIdFailure()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $guard = m::mock(SessionGuard::class, ['default', $provider, $session])->makePartial();
- $guard->getProvider()->shouldReceive('retrieveById')->once()->with(11)->andReturn(null);
- $guard->shouldNotReceive('login');
- $this->assertFalse($guard->loginUsingId(11));
- }
- public function testOnceUsingIdSetsUser()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $guard = m::mock(SessionGuard::class, ['default', $provider, $session])->makePartial();
- $user = m::mock(Authenticatable::class);
- $guard->getProvider()->shouldReceive('retrieveById')->once()->with(10)->andReturn($user);
- $guard->shouldReceive('setUser')->once()->with($user);
- $this->assertSame($user, $guard->onceUsingId(10));
- }
- public function testOnceUsingIdFailure()
- {
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $guard = m::mock(SessionGuard::class, ['default', $provider, $session])->makePartial();
- $guard->getProvider()->shouldReceive('retrieveById')->once()->with(11)->andReturn(null);
- $guard->shouldNotReceive('setUser');
- $this->assertFalse($guard->onceUsingId(11));
- }
- public function testUserUsesRememberCookieIfItExists()
- {
- $guard = $this->getGuard();
- [$session, $provider, $request, $cookie] = $this->getMocks();
- $request = Request::create('/', 'GET', [], [$guard->getRecallerName() => 'id|recaller|baz']);
- $guard = new SessionGuard('default', $provider, $session, $request);
- $guard->getSession()->shouldReceive('get')->once()->with($guard->getName())->andReturn(null);
- $user = m::mock(Authenticatable::class);
- $guard->getProvider()->shouldReceive('retrieveByToken')->once()->with('id', 'recaller')->andReturn($user);
- $user->shouldReceive('getAuthIdentifier')->once()->andReturn('bar');
- $guard->getSession()->shouldReceive('put')->with($guard->getName(), 'bar')->once();
- $session->shouldReceive('migrate')->once();
- $this->assertSame($user, $guard->user());
- $this->assertTrue($guard->viaRemember());
- }
- public function testLoginOnceSetsUser()
- {
- [$session, $provider, $request, $cookie, $timebox] = $this->getMocks();
- $guard = m::mock(SessionGuard::class, ['default', $provider, $session, $request, $timebox])->makePartial();
- $user = m::mock(Authenticatable::class);
- $timebox->shouldReceive('call')->once()->andReturnUsing(function ($callback) use ($timebox) {
- return $callback($timebox->shouldReceive('returnEarly')->once()->getMock());
- });
- $guard->getProvider()->shouldReceive('retrieveByCredentials')->once()->with(['foo'])->andReturn($user);
- $guard->getProvider()->shouldReceive('validateCredentials')->once()->with($user, ['foo'])->andReturn(true);
- $guard->shouldReceive('setUser')->once()->with($user);
- $this->assertTrue($guard->once(['foo']));
- }
- public function testLoginOnceFailure()
- {
- [$session, $provider, $request, $cookie, $timebox] = $this->getMocks();
- $guard = m::mock(SessionGuard::class, ['default', $provider, $session, $request, $timebox])->makePartial();
- $user = m::mock(Authenticatable::class);
- $timebox->shouldReceive('call')->once()->andReturnUsing(function ($callback) use ($timebox) {
- return $callback($timebox);
- });
- $guard->getProvider()->shouldReceive('retrieveByCredentials')->once()->with(['foo'])->andReturn($user);
- $guard->getProvider()->shouldReceive('validateCredentials')->once()->with($user, ['foo'])->andReturn(false);
- $this->assertFalse($guard->once(['foo']));
- }
- protected function getGuard()
- {
- [$session, $provider, $request, $cookie, $timebox] = $this->getMocks();
- return new SessionGuard('default', $provider, $session, $request, $timebox);
- }
- protected function getMocks()
- {
- return [
- m::mock(Session::class),
- m::mock(UserProvider::class),
- Request::create('/', 'GET'),
- m::mock(CookieJar::class),
- m::mock(Timebox::class),
- ];
- }
- protected function getCookieJar()
- {
- return new CookieJar(Request::create('/foo', 'GET'), m::mock(Encrypter::class), ['domain' => 'foo.com', 'path' => '/', 'secure' => false, 'httpOnly' => false]);
- }
- }
|