AuthDatabaseTokenRepositoryTest.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php
  2. namespace Illuminate\Tests\Auth;
  3. use Illuminate\Auth\Passwords\DatabaseTokenRepository;
  4. use Illuminate\Contracts\Auth\CanResetPassword;
  5. use Illuminate\Contracts\Hashing\Hasher;
  6. use Illuminate\Database\Connection;
  7. use Illuminate\Support\Carbon;
  8. use Mockery as m;
  9. use PHPUnit\Framework\TestCase;
  10. use stdClass;
  11. class AuthDatabaseTokenRepositoryTest extends TestCase
  12. {
  13. protected function setUp(): void
  14. {
  15. parent::setUp();
  16. Carbon::setTestNow(Carbon::now());
  17. }
  18. protected function tearDown(): void
  19. {
  20. parent::tearDown();
  21. m::close();
  22. Carbon::setTestNow(null);
  23. }
  24. public function testCreateInsertsNewRecordIntoTable()
  25. {
  26. $repo = $this->getRepo();
  27. $repo->getHasher()->shouldReceive('make')->once()->andReturn('hashed-token');
  28. $repo->getConnection()->shouldReceive('table')->times(2)->with('table')->andReturn($query = m::mock(stdClass::class));
  29. $query->shouldReceive('where')->once()->with('email', 'email')->andReturn($query);
  30. $query->shouldReceive('delete')->once();
  31. $query->shouldReceive('insert')->once();
  32. $user = m::mock(CanResetPassword::class);
  33. $user->shouldReceive('getEmailForPasswordReset')->times(2)->andReturn('email');
  34. $results = $repo->create($user);
  35. $this->assertIsString($results);
  36. $this->assertGreaterThan(1, strlen($results));
  37. }
  38. public function testExistReturnsFalseIfNoRowFoundForUser()
  39. {
  40. $repo = $this->getRepo();
  41. $repo->getConnection()->shouldReceive('table')->once()->with('table')->andReturn($query = m::mock(stdClass::class));
  42. $query->shouldReceive('where')->once()->with('email', 'email')->andReturn($query);
  43. $query->shouldReceive('first')->once()->andReturn(null);
  44. $user = m::mock(CanResetPassword::class);
  45. $user->shouldReceive('getEmailForPasswordReset')->once()->andReturn('email');
  46. $this->assertFalse($repo->exists($user, 'token'));
  47. }
  48. public function testExistReturnsFalseIfRecordIsExpired()
  49. {
  50. $repo = $this->getRepo();
  51. $repo->getConnection()->shouldReceive('table')->once()->with('table')->andReturn($query = m::mock(stdClass::class));
  52. $query->shouldReceive('where')->once()->with('email', 'email')->andReturn($query);
  53. $date = Carbon::now()->subSeconds(300000)->toDateTimeString();
  54. $query->shouldReceive('first')->once()->andReturn((object) ['created_at' => $date, 'token' => 'hashed-token']);
  55. $user = m::mock(CanResetPassword::class);
  56. $user->shouldReceive('getEmailForPasswordReset')->once()->andReturn('email');
  57. $this->assertFalse($repo->exists($user, 'token'));
  58. }
  59. public function testExistReturnsTrueIfValidRecordExists()
  60. {
  61. $repo = $this->getRepo();
  62. $repo->getHasher()->shouldReceive('check')->once()->with('token', 'hashed-token')->andReturn(true);
  63. $repo->getConnection()->shouldReceive('table')->once()->with('table')->andReturn($query = m::mock(stdClass::class));
  64. $query->shouldReceive('where')->once()->with('email', 'email')->andReturn($query);
  65. $date = Carbon::now()->subMinutes(10)->toDateTimeString();
  66. $query->shouldReceive('first')->once()->andReturn((object) ['created_at' => $date, 'token' => 'hashed-token']);
  67. $user = m::mock(CanResetPassword::class);
  68. $user->shouldReceive('getEmailForPasswordReset')->once()->andReturn('email');
  69. $this->assertTrue($repo->exists($user, 'token'));
  70. }
  71. public function testExistReturnsFalseIfInvalidToken()
  72. {
  73. $repo = $this->getRepo();
  74. $repo->getHasher()->shouldReceive('check')->once()->with('wrong-token', 'hashed-token')->andReturn(false);
  75. $repo->getConnection()->shouldReceive('table')->once()->with('table')->andReturn($query = m::mock(stdClass::class));
  76. $query->shouldReceive('where')->once()->with('email', 'email')->andReturn($query);
  77. $date = Carbon::now()->subMinutes(10)->toDateTimeString();
  78. $query->shouldReceive('first')->once()->andReturn((object) ['created_at' => $date, 'token' => 'hashed-token']);
  79. $user = m::mock(CanResetPassword::class);
  80. $user->shouldReceive('getEmailForPasswordReset')->once()->andReturn('email');
  81. $this->assertFalse($repo->exists($user, 'wrong-token'));
  82. }
  83. public function testRecentlyCreatedReturnsFalseIfNoRowFoundForUser()
  84. {
  85. $repo = $this->getRepo();
  86. $repo->getConnection()->shouldReceive('table')->once()->with('table')->andReturn($query = m::mock(stdClass::class));
  87. $query->shouldReceive('where')->once()->with('email', 'email')->andReturn($query);
  88. $query->shouldReceive('first')->once()->andReturn(null);
  89. $user = m::mock(CanResetPassword::class);
  90. $user->shouldReceive('getEmailForPasswordReset')->once()->andReturn('email');
  91. $this->assertFalse($repo->recentlyCreatedToken($user));
  92. }
  93. public function testRecentlyCreatedReturnsTrueIfRecordIsRecentlyCreated()
  94. {
  95. $repo = $this->getRepo();
  96. $repo->getConnection()->shouldReceive('table')->once()->with('table')->andReturn($query = m::mock(stdClass::class));
  97. $query->shouldReceive('where')->once()->with('email', 'email')->andReturn($query);
  98. $date = Carbon::now()->subSeconds(59)->toDateTimeString();
  99. $query->shouldReceive('first')->once()->andReturn((object) ['created_at' => $date, 'token' => 'hashed-token']);
  100. $user = m::mock(CanResetPassword::class);
  101. $user->shouldReceive('getEmailForPasswordReset')->once()->andReturn('email');
  102. $this->assertTrue($repo->recentlyCreatedToken($user));
  103. }
  104. public function testRecentlyCreatedReturnsFalseIfValidRecordExists()
  105. {
  106. $repo = $this->getRepo();
  107. $repo->getConnection()->shouldReceive('table')->once()->with('table')->andReturn($query = m::mock(stdClass::class));
  108. $query->shouldReceive('where')->once()->with('email', 'email')->andReturn($query);
  109. $date = Carbon::now()->subSeconds(61)->toDateTimeString();
  110. $query->shouldReceive('first')->once()->andReturn((object) ['created_at' => $date, 'token' => 'hashed-token']);
  111. $user = m::mock(CanResetPassword::class);
  112. $user->shouldReceive('getEmailForPasswordReset')->once()->andReturn('email');
  113. $this->assertFalse($repo->recentlyCreatedToken($user));
  114. }
  115. public function testDeleteMethodDeletesByToken()
  116. {
  117. $repo = $this->getRepo();
  118. $repo->getConnection()->shouldReceive('table')->once()->with('table')->andReturn($query = m::mock(stdClass::class));
  119. $query->shouldReceive('where')->once()->with('email', 'email')->andReturn($query);
  120. $query->shouldReceive('delete')->once();
  121. $user = m::mock(CanResetPassword::class);
  122. $user->shouldReceive('getEmailForPasswordReset')->once()->andReturn('email');
  123. $repo->delete($user);
  124. }
  125. public function testDeleteExpiredMethodDeletesExpiredTokens()
  126. {
  127. $repo = $this->getRepo();
  128. $repo->getConnection()->shouldReceive('table')->once()->with('table')->andReturn($query = m::mock(stdClass::class));
  129. $query->shouldReceive('where')->once()->with('created_at', '<', m::any())->andReturn($query);
  130. $query->shouldReceive('delete')->once();
  131. $repo->deleteExpired();
  132. }
  133. protected function getRepo()
  134. {
  135. return new DatabaseTokenRepository(
  136. m::mock(Connection::class),
  137. m::mock(Hasher::class),
  138. 'table', 'key');
  139. }
  140. }