diff --git a/app/Exceptions/WhoopsBookStackPrettyHandler.php b/app/Exceptions/WhoopsBookStackPrettyHandler.php index 4e92b1d84..22a49e04a 100644 --- a/app/Exceptions/WhoopsBookStackPrettyHandler.php +++ b/app/Exceptions/WhoopsBookStackPrettyHandler.php @@ -12,18 +12,15 @@ class WhoopsBookStackPrettyHandler extends Handler */ public function handle() { - // TODO - Assistance View - // Docs links - // Discord Links - // Github Issue Links (With pre-filled search?) - $exception = $this->getException(); + echo view('errors.debug', [ 'error' => $exception->getMessage(), 'errorClass' => get_class($exception), 'trace' => $exception->getTraceAsString(), 'environment' => $this->getEnvironment(), ])->render(); + return Handler::QUIT; } diff --git a/tests/DebugViewTest.php b/tests/DebugViewTest.php new file mode 100644 index 000000000..3485b4598 --- /dev/null +++ b/tests/DebugViewTest.php @@ -0,0 +1,54 @@ +<?php + +namespace Tests; + +use BookStack\Auth\Access\SocialAuthService; + +class DebugViewTest extends TestCase +{ + public function test_debug_view_shows_expected_details() + { + config()->set('app.debug', true); + $resp = $this->getDebugViewForException(new \InvalidArgumentException('An error occurred during testing')); + + // Error message + $resp->assertSeeText('An error occurred during testing'); + // Exception Class + $resp->assertSeeText('InvalidArgumentException'); + // Stack trace + $resp->assertSeeText('#0'); + $resp->assertSeeText('#1'); + // Warning message + $resp->assertSeeText('WARNING: Application is in debug mode. This mode has the potential to leak'); + // PHP version + $resp->assertSeeText('PHP Version: ' . phpversion()); + // BookStack version + $resp->assertSeeText('BookStack Version: ' . trim(file_get_contents(base_path('version')))); + // Dynamic help links + $resp->assertElementExists('a[href*="q=' . urlencode('BookStack An error occurred during testing') . '"]'); + $resp->assertElementExists('a[href*="?q=is%3Aissue+' . urlencode('An error occurred during testing') . '"]'); + } + + public function test_debug_view_only_shows_when_debug_mode_is_enabled() + { + config()->set('app.debug', true); + $resp = $this->getDebugViewForException(new \InvalidArgumentException('An error occurred during testing')); + $resp->assertSeeText('Stack Trace'); + $resp->assertDontSeeText('An unknown error occurred'); + + config()->set('app.debug', false); + $resp = $this->getDebugViewForException(new \InvalidArgumentException('An error occurred during testing')); + $resp->assertDontSeeText('Stack Trace'); + $resp->assertSeeText('An unknown error occurred'); + } + + + protected function getDebugViewForException(\Exception $exception): TestResponse + { + // Fake an error via social auth service used on login page + $mockService = $this->mock(SocialAuthService::class); + $mockService->shouldReceive('getActiveDrivers')->andThrow($exception); + return $this->get('/login'); + } + +} \ No newline at end of file