MaintenanceModeTest.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?php
  2. namespace Illuminate\Tests\Integration\Foundation;
  3. use Illuminate\Foundation\Console\DownCommand;
  4. use Illuminate\Foundation\Console\UpCommand;
  5. use Illuminate\Foundation\Events\MaintenanceModeDisabled;
  6. use Illuminate\Foundation\Events\MaintenanceModeEnabled;
  7. use Illuminate\Foundation\Http\MaintenanceModeBypassCookie;
  8. use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance;
  9. use Illuminate\Support\Carbon;
  10. use Illuminate\Support\Facades\Event;
  11. use Illuminate\Support\Facades\Route;
  12. use Orchestra\Testbench\TestCase;
  13. use Symfony\Component\HttpFoundation\Cookie;
  14. class MaintenanceModeTest extends TestCase
  15. {
  16. protected function tearDown(): void
  17. {
  18. @unlink(storage_path('framework/down'));
  19. }
  20. public function testBasicMaintenanceModeResponse()
  21. {
  22. file_put_contents(storage_path('framework/down'), json_encode([
  23. 'retry' => 60,
  24. 'refresh' => 60,
  25. ]));
  26. Route::get('/foo', function () {
  27. return 'Hello World';
  28. })->middleware(PreventRequestsDuringMaintenance::class);
  29. $response = $this->get('/foo');
  30. $response->assertStatus(503);
  31. $response->assertHeader('Retry-After', '60');
  32. $response->assertHeader('Refresh', '60');
  33. }
  34. public function testMaintenanceModeCanHaveCustomStatus()
  35. {
  36. file_put_contents(storage_path('framework/down'), json_encode([
  37. 'retry' => 60,
  38. 'status' => 200,
  39. ]));
  40. Route::get('/foo', function () {
  41. return 'Hello World';
  42. })->middleware(PreventRequestsDuringMaintenance::class);
  43. $response = $this->get('/foo');
  44. $response->assertStatus(200);
  45. $response->assertHeader('Retry-After', '60');
  46. }
  47. public function testMaintenanceModeCanHaveCustomTemplate()
  48. {
  49. file_put_contents(storage_path('framework/down'), json_encode([
  50. 'retry' => 60,
  51. 'template' => 'Rendered Content',
  52. ]));
  53. Route::get('/foo', function () {
  54. return 'Hello World';
  55. })->middleware(PreventRequestsDuringMaintenance::class);
  56. $response = $this->get('/foo');
  57. $response->assertStatus(503);
  58. $response->assertHeader('Retry-After', '60');
  59. $this->assertSame('Rendered Content', $response->original);
  60. }
  61. public function testMaintenanceModeCanRedirectWithBypassCookie()
  62. {
  63. file_put_contents(storage_path('framework/down'), json_encode([
  64. 'retry' => 60,
  65. 'secret' => 'foo',
  66. 'template' => 'Rendered Content',
  67. ]));
  68. Route::get('/foo', function () {
  69. return 'Hello World';
  70. })->middleware(PreventRequestsDuringMaintenance::class);
  71. $response = $this->get('/foo');
  72. $response->assertStatus(302);
  73. $response->assertCookie('laravel_maintenance');
  74. }
  75. public function testMaintenanceModeCanBeBypassedWithValidCookie()
  76. {
  77. file_put_contents(storage_path('framework/down'), json_encode([
  78. 'retry' => 60,
  79. 'secret' => 'foo',
  80. ]));
  81. $cookie = MaintenanceModeBypassCookie::create('foo');
  82. Route::get('/test', function () {
  83. return 'Hello World';
  84. })->middleware(PreventRequestsDuringMaintenance::class);
  85. $response = $this->withUnencryptedCookies([
  86. 'laravel_maintenance' => $cookie->getValue(),
  87. ])->get('/test');
  88. $response->assertStatus(200);
  89. $this->assertSame('Hello World', $response->original);
  90. }
  91. public function testMaintenanceModeCantBeBypassedWithInvalidCookie()
  92. {
  93. file_put_contents(storage_path('framework/down'), json_encode([
  94. 'retry' => 60,
  95. 'secret' => 'foo',
  96. ]));
  97. $cookie = MaintenanceModeBypassCookie::create('test-key');
  98. Route::get('/test', function () {
  99. return 'Hello World';
  100. })->middleware(PreventRequestsDuringMaintenance::class);
  101. $response = $this->withUnencryptedCookies([
  102. 'laravel_maintenance' => $cookie->getValue(),
  103. ])->get('/test');
  104. $response->assertStatus(503);
  105. }
  106. public function testCanCreateBypassCookies()
  107. {
  108. $cookie = MaintenanceModeBypassCookie::create('test-key');
  109. $this->assertInstanceOf(Cookie::class, $cookie);
  110. $this->assertSame('laravel_maintenance', $cookie->getName());
  111. $this->assertTrue(MaintenanceModeBypassCookie::isValid($cookie->getValue(), 'test-key'));
  112. $this->assertFalse(MaintenanceModeBypassCookie::isValid($cookie->getValue(), 'wrong-key'));
  113. Carbon::setTestNow(now()->addMonths(6));
  114. $this->assertFalse(MaintenanceModeBypassCookie::isValid($cookie->getValue(), 'test-key'));
  115. Carbon::setTestNow(null);
  116. }
  117. public function testDispatchEventWhenMaintenanceModeIsEnabled()
  118. {
  119. Event::fake();
  120. Event::assertNotDispatched(MaintenanceModeEnabled::class);
  121. $this->artisan(DownCommand::class);
  122. Event::assertDispatched(MaintenanceModeEnabled::class);
  123. }
  124. public function testDispatchEventWhenMaintenanceModeIsDisabled()
  125. {
  126. file_put_contents(storage_path('framework/down'), json_encode([
  127. 'retry' => 60,
  128. 'refresh' => 60,
  129. ]));
  130. Event::fake();
  131. Event::assertNotDispatched(MaintenanceModeDisabled::class);
  132. $this->artisan(UpCommand::class);
  133. Event::assertDispatched(MaintenanceModeDisabled::class);
  134. }
  135. }