ExceptionSolutionTest.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. namespace Facade\Ignition\Tests;
  3. use Facade\Ignition\SolutionProviders\BadMethodCallSolutionProvider;
  4. use Facade\Ignition\SolutionProviders\MissingAppKeySolutionProvider;
  5. use Facade\Ignition\SolutionProviders\SolutionProviderRepository;
  6. use Facade\Ignition\Tests\Exceptions\AlwaysFalseSolutionProvider;
  7. use Facade\Ignition\Tests\Exceptions\AlwaysTrueSolutionProvider;
  8. use Facade\IgnitionContracts\BaseSolution;
  9. use Illuminate\Foundation\Auth\User;
  10. use RuntimeException;
  11. class ExceptionSolutionTest extends TestCase
  12. {
  13. /** @test */
  14. public function it_returns_possible_solutions()
  15. {
  16. $repository = new SolutionProviderRepository();
  17. $repository->registerSolutionProvider(AlwaysTrueSolutionProvider::class);
  18. $repository->registerSolutionProvider(AlwaysFalseSolutionProvider::class);
  19. $solutions = $repository->getSolutionsForThrowable(new \Exception());
  20. $this->assertNotNull($solutions);
  21. $this->assertCount(1, $solutions);
  22. $this->assertTrue($solutions[0] instanceof BaseSolution);
  23. }
  24. /** @test */
  25. public function it_returns_possible_solutions_when_registered_together()
  26. {
  27. $repository = new SolutionProviderRepository();
  28. $repository->registerSolutionProviders([
  29. AlwaysTrueSolutionProvider::class,
  30. AlwaysFalseSolutionProvider::class,
  31. ]);
  32. $solutions = $repository->getSolutionsForThrowable(new \Exception());
  33. $this->assertNotNull($solutions);
  34. $this->assertCount(1, $solutions);
  35. $this->assertTrue($solutions[0] instanceof BaseSolution);
  36. }
  37. /** @test */
  38. public function it_can_ignore_solution_providers()
  39. {
  40. $this->app->make('config')->set('ignition.ignored_solution_providers', [
  41. AlwaysTrueSolutionProvider::class,
  42. ]);
  43. $repository = new SolutionProviderRepository();
  44. $repository->registerSolutionProvider(AlwaysTrueSolutionProvider::class);
  45. $repository->registerSolutionProvider(AlwaysFalseSolutionProvider::class);
  46. $solutions = $repository->getSolutionsForThrowable(new \Exception());
  47. $this->assertNotNull($solutions);
  48. $this->assertCount(0, $solutions);
  49. }
  50. /** @test */
  51. public function it_can_suggest_bad_method_call_exceptions()
  52. {
  53. if (version_compare($this->app->version(), '5.6.3', '<')) {
  54. $this->markTestSkipped('Laravel version < 5.6.3 do not support bad method call solutions');
  55. }
  56. try {
  57. collect([])->faltten();
  58. } catch (\Exception $exception) {
  59. $solution = new BadMethodCallSolutionProvider();
  60. $this->assertTrue($solution->canSolve($exception));
  61. }
  62. }
  63. /** @test */
  64. public function it_can_propose_a_solution_for_bad_method_call_exceptions_on_collections()
  65. {
  66. if (version_compare($this->app->version(), '5.6.3', '<')) {
  67. $this->markTestSkipped('Laravel version < 5.6.3 do not support bad method call solutions');
  68. }
  69. try {
  70. collect([])->frist(function ($item) {
  71. });
  72. } catch (\Exception $exception) {
  73. $solution = new BadMethodCallSolutionProvider();
  74. $this->assertSame('Did you mean Illuminate\Support\Collection::first() ?', $solution->getSolutions($exception)[0]->getSolutionDescription());
  75. }
  76. }
  77. /** @test */
  78. public function it_can_propose_a_solution_for_bad_method_call_exceptions_on_models()
  79. {
  80. if (version_compare($this->app->version(), '5.7', '<')) {
  81. $this->markTestSkipped('Laravel version < 5.7.0 does not provide the actual called class for model exceptions.');
  82. }
  83. try {
  84. $user = new User();
  85. $user->sarve();
  86. } catch (\Exception $exception) {
  87. $solution = new BadMethodCallSolutionProvider();
  88. $this->assertSame('Did you mean Illuminate\Foundation\Auth\User::save() ?', $solution->getSolutions($exception)[0]->getSolutionDescription());
  89. }
  90. }
  91. /** @test */
  92. public function it_can_propose_a_solution_for_missing_app_key_exceptions()
  93. {
  94. $exception = new RuntimeException(
  95. 'No application encryption key has been specified.'
  96. );
  97. $solution = new MissingAppKeySolutionProvider();
  98. $this->assertSame('Generate your application encryption key using `php artisan key:generate`.', $solution->getSolutions($exception)[0]->getSolutionActionDescription());
  99. }
  100. }