AuthDatabaseUserProviderTest.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. namespace Illuminate\Tests\Auth;
  3. use Illuminate\Auth\DatabaseUserProvider;
  4. use Illuminate\Auth\GenericUser;
  5. use Illuminate\Contracts\Auth\Authenticatable;
  6. use Illuminate\Contracts\Hashing\Hasher;
  7. use Illuminate\Database\Connection;
  8. use Mockery as m;
  9. use PHPUnit\Framework\TestCase;
  10. use stdClass;
  11. class AuthDatabaseUserProviderTest extends TestCase
  12. {
  13. protected function tearDown(): void
  14. {
  15. m::close();
  16. }
  17. public function testRetrieveByIDReturnsUserWhenUserIsFound()
  18. {
  19. $conn = m::mock(Connection::class);
  20. $conn->shouldReceive('table')->once()->with('foo')->andReturn($conn);
  21. $conn->shouldReceive('find')->once()->with(1)->andReturn(['id' => 1, 'name' => 'Dayle']);
  22. $hasher = m::mock(Hasher::class);
  23. $provider = new DatabaseUserProvider($conn, $hasher, 'foo');
  24. $user = $provider->retrieveById(1);
  25. $this->assertInstanceOf(GenericUser::class, $user);
  26. $this->assertSame(1, $user->getAuthIdentifier());
  27. $this->assertSame('Dayle', $user->name);
  28. }
  29. public function testRetrieveByIDReturnsNullWhenUserIsNotFound()
  30. {
  31. $conn = m::mock(Connection::class);
  32. $conn->shouldReceive('table')->once()->with('foo')->andReturn($conn);
  33. $conn->shouldReceive('find')->once()->with(1)->andReturn(null);
  34. $hasher = m::mock(Hasher::class);
  35. $provider = new DatabaseUserProvider($conn, $hasher, 'foo');
  36. $user = $provider->retrieveById(1);
  37. $this->assertNull($user);
  38. }
  39. public function testRetrieveByTokenReturnsUser()
  40. {
  41. $mockUser = new stdClass;
  42. $mockUser->remember_token = 'a';
  43. $conn = m::mock(Connection::class);
  44. $conn->shouldReceive('table')->once()->with('foo')->andReturn($conn);
  45. $conn->shouldReceive('find')->once()->with(1)->andReturn($mockUser);
  46. $hasher = m::mock(Hasher::class);
  47. $provider = new DatabaseUserProvider($conn, $hasher, 'foo');
  48. $user = $provider->retrieveByToken(1, 'a');
  49. $this->assertEquals(new GenericUser((array) $mockUser), $user);
  50. }
  51. public function testRetrieveTokenWithBadIdentifierReturnsNull()
  52. {
  53. $conn = m::mock(Connection::class);
  54. $conn->shouldReceive('table')->once()->with('foo')->andReturn($conn);
  55. $conn->shouldReceive('find')->once()->with(1)->andReturn(null);
  56. $hasher = m::mock(Hasher::class);
  57. $provider = new DatabaseUserProvider($conn, $hasher, 'foo');
  58. $user = $provider->retrieveByToken(1, 'a');
  59. $this->assertNull($user);
  60. }
  61. public function testRetrieveByBadTokenReturnsNull()
  62. {
  63. $mockUser = new stdClass;
  64. $mockUser->remember_token = null;
  65. $conn = m::mock(Connection::class);
  66. $conn->shouldReceive('table')->once()->with('foo')->andReturn($conn);
  67. $conn->shouldReceive('find')->once()->with(1)->andReturn($mockUser);
  68. $hasher = m::mock(Hasher::class);
  69. $provider = new DatabaseUserProvider($conn, $hasher, 'foo');
  70. $user = $provider->retrieveByToken(1, 'a');
  71. $this->assertNull($user);
  72. }
  73. public function testRetrieveByCredentialsReturnsUserWhenUserIsFound()
  74. {
  75. $conn = m::mock(Connection::class);
  76. $conn->shouldReceive('table')->once()->with('foo')->andReturn($conn);
  77. $conn->shouldReceive('where')->once()->with('username', 'dayle');
  78. $conn->shouldReceive('whereIn')->once()->with('group', ['one', 'two']);
  79. $conn->shouldReceive('first')->once()->andReturn(['id' => 1, 'name' => 'taylor']);
  80. $hasher = m::mock(Hasher::class);
  81. $provider = new DatabaseUserProvider($conn, $hasher, 'foo');
  82. $user = $provider->retrieveByCredentials(['username' => 'dayle', 'password' => 'foo', 'group' => ['one', 'two']]);
  83. $this->assertInstanceOf(GenericUser::class, $user);
  84. $this->assertSame(1, $user->getAuthIdentifier());
  85. $this->assertSame('taylor', $user->name);
  86. }
  87. public function testRetrieveByCredentialsAcceptsCallback()
  88. {
  89. $conn = m::mock(Connection::class);
  90. $conn->shouldReceive('table')->once()->with('foo')->andReturn($conn);
  91. $conn->shouldReceive('where')->once()->with('username', 'dayle');
  92. $conn->shouldReceive('whereIn')->once()->with('group', ['one', 'two']);
  93. $conn->shouldReceive('first')->once()->andReturn(['id' => 1, 'name' => 'taylor']);
  94. $hasher = m::mock(Hasher::class);
  95. $provider = new DatabaseUserProvider($conn, $hasher, 'foo');
  96. $user = $provider->retrieveByCredentials([function ($builder) {
  97. $builder->where('username', 'dayle');
  98. $builder->whereIn('group', ['one', 'two']);
  99. }]);
  100. $this->assertInstanceOf(GenericUser::class, $user);
  101. $this->assertSame(1, $user->getAuthIdentifier());
  102. $this->assertSame('taylor', $user->name);
  103. }
  104. public function testRetrieveByCredentialsReturnsNullWhenUserIsFound()
  105. {
  106. $conn = m::mock(Connection::class);
  107. $conn->shouldReceive('table')->once()->with('foo')->andReturn($conn);
  108. $conn->shouldReceive('where')->once()->with('username', 'dayle');
  109. $conn->shouldReceive('first')->once()->andReturn(null);
  110. $hasher = m::mock(Hasher::class);
  111. $provider = new DatabaseUserProvider($conn, $hasher, 'foo');
  112. $user = $provider->retrieveByCredentials(['username' => 'dayle']);
  113. $this->assertNull($user);
  114. }
  115. public function testCredentialValidation()
  116. {
  117. $conn = m::mock(Connection::class);
  118. $hasher = m::mock(Hasher::class);
  119. $hasher->shouldReceive('check')->once()->with('plain', 'hash')->andReturn(true);
  120. $provider = new DatabaseUserProvider($conn, $hasher, 'foo');
  121. $user = m::mock(Authenticatable::class);
  122. $user->shouldReceive('getAuthPassword')->once()->andReturn('hash');
  123. $result = $provider->validateCredentials($user, ['password' => 'plain']);
  124. $this->assertTrue($result);
  125. }
  126. }