diff --git a/src/FakeIdServiceProvider.php b/src/FakeIdServiceProvider.php index 1c08258..1f88c49 100644 --- a/src/FakeIdServiceProvider.php +++ b/src/FakeIdServiceProvider.php @@ -69,7 +69,11 @@ protected function registerRouterMacro() // Decode FakeId first if applicable. if (in_array('Propaganistas\LaravelFakeId\FakeIdTrait', class_uses_recursive($class))) { - $value = $this->container->make('fakeid')->decode($value); + try { + $value = $this->container->make('fakeid')->decode($value); + } catch (\InvalidArgumentException $e) { + throw config('app.debug') ? $e : new NotFoundHttpException; + } } if ($model = $instance->where($instance->getRouteKeyName(), $value)->first()) { diff --git a/tests/Entities/Fake.php b/tests/Entities/Fake.php new file mode 100644 index 0000000..b93b9b6 --- /dev/null +++ b/tests/Entities/Fake.php @@ -0,0 +1,10 @@ +configureDatabase(); - Route::model('real', 'Propaganistas\LaravelFakeId\Tests\Real'); - Route::fakeIdModel('fake', 'Propaganistas\LaravelFakeId\Tests\Fake'); + // add middleware for support version laravel >= 5.3 + $middlewareBindings = version_compare($this->app->version(), '5.3.0') >= 0 ? 'Illuminate\Routing\Middleware\SubstituteBindings' : null; + + Route::model('real', 'Propaganistas\LaravelFakeId\Tests\Entities\Real'); + Route::fakeIdModel('fake', 'Propaganistas\LaravelFakeId\Tests\Entities\Fake'); Route::get('real/{real}', ['as' => 'real', function ($real) { - return 'real'; - }]); + return $real->id; + }, 'middleware' => $middlewareBindings]); Route::get('fake/{fake}', ['as' => 'fake', function ($fake) { - return 'fake'; - }]); + return $fake->id; + }, 'middleware' => $middlewareBindings]); } protected function configureDatabase() @@ -90,13 +89,83 @@ public function testFakeIdModelBindingWorks() $this->assertEquals($expected, $actual); } -} -class Real extends Model -{ -} + /** + * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException + */ + public function testResponseNotFoundWhenDecodeFailAndDebugOff() + { + $this->app['config']->set('app.debug', false); -class Fake extends Model -{ - use FakeIdTrait; -} + $response = $this->call('get', route('fake', ['fake' => 'not-number'])); + + $this->throwErrorFromResponse($response); + + //$this->assertEquals(404, $response->getStatusCode()); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testResponseErrorWhenDecodeFailDebugOn() + { + $this->app['config']->set('app.debug', true); + + $response = $this->call('get', route('fake', ['fake' => 'not-number'])); + + $this->app['config']->set('app.debug', false); + + $this->throwErrorFromResponse($response); + + //$this->assertEquals(500, $response->getStatusCode()); + } + + public function testResponseFineWhenPassFakeModel() + { + $model = Fake::create([]); + + $response = $this->call('get', route('fake', ['fake' => $model])); + + $this->assertContains((string)$model->id, $response->getContent()); + $this->assertEquals(200, $response->getStatusCode()); + } + + public function testResponseFineWhenPassNormalModel() + { + $model = Real::create([]); + + $response = $this->call('get', route('real', ['real' => $model])); + + $this->assertContains((string)$model->id, $response->getContent()); + + $this->assertEquals(200, $response->getStatusCode()); + } + + /** + * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException + */ + public function testResponseFailWhenPassModelId() + { + $model = Fake::create([]); + + $response = $this->call('get', route('fake', ['fake' => $model->id])); + + $this->throwErrorFromResponse($response); + + //$this->assertEquals(404, $response->getStatusCode()); + } + + protected function throwErrorFromResponse($response) + { + if (isset($response->exception)) { // throw error manual if app use error handler of laravel to render error as html content + throw $response->exception; + } + } + + protected function getPackageProviders($app) + { + return [ + 'Propaganistas\LaravelFakeId\FakeIdServiceProvider', + ]; + } +} \ No newline at end of file