diff --git a/app/Database/factories/AcarsFactory.php b/app/Database/factories/AcarsFactory.php index 34f212bd..30be5731 100644 --- a/app/Database/factories/AcarsFactory.php +++ b/app/Database/factories/AcarsFactory.php @@ -4,8 +4,8 @@ use Faker\Generator as Faker; $factory->define(App\Models\Acars::class, function (Faker $faker) { return [ - 'id' => substr($faker->unique()->sha1, 28, 12), - 'pirep_id' => '', # fill this out by + 'id' => null, + 'pirep_id' => null, 'log' => $faker->text(200), 'lat' => $faker->latitude, 'lon' => $faker->longitude, diff --git a/app/Database/factories/PirepFactory.php b/app/Database/factories/PirepFactory.php index 1f5dcf27..c606ceee 100644 --- a/app/Database/factories/PirepFactory.php +++ b/app/Database/factories/PirepFactory.php @@ -11,7 +11,7 @@ $factory->define(App\Models\Pirep::class, function (Faker $faker) { static $raw_data; return [ - 'id' => substr($faker->unique()->sha1, 28, 12), + 'id' => null, 'airline_id' => function () { # OVERRIDE THIS IF NEEDED return factory(App\Models\Airline::class)->create()->id; }, diff --git a/app/Http/Controllers/Api/PirepController.php b/app/Http/Controllers/Api/PirepController.php index dad213c4..5c34be1d 100644 --- a/app/Http/Controllers/Api/PirepController.php +++ b/app/Http/Controllers/Api/PirepController.php @@ -2,14 +2,20 @@ namespace App\Http\Controllers\Api; -use App\Models\PirepComment; -use Log; use Auth; -use Illuminate\Database\Eloquent\ModelNotFoundException; +use Log; use Illuminate\Http\Request; +use App\Http\Requests\Acars\CommentRequest; +use App\Http\Requests\Acars\FileRequest; +use App\Http\Requests\Acars\LogRequest; +use App\Http\Requests\Acars\PositionRequest; +use App\Http\Requests\Acars\PrefileRequest; +use App\Http\Requests\Acars\RouteRequest; + use App\Models\Acars; use App\Models\Pirep; +use App\Models\PirepComment; use App\Models\Enums\AcarsType; use App\Models\Enums\PirepState; @@ -52,6 +58,22 @@ class PirepController extends RestController $this->pirepSvc = $pirepSvc; } + /** + * Check if a PIREP is cancelled + * @param $pirep + * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException + */ + protected function checkCancelled(Pirep $pirep) + { + if (!$pirep->allowedUpdates()) { + throw new BadRequestHttpException('PIREP has been cancelled, comments can\'t be posted'); + } + } + + /** + * @param $id + * @return PirepResource + */ public function get($id) { PirepResource::withoutWrapping(); @@ -63,35 +85,17 @@ class PirepController extends RestController * Once ACARS updates are being processed, then it can go into an 'ENROUTE' * status, and whatever other statuses may be defined * - * TODO: Allow extra fields, etc to be set. Aircraft, etc - * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException + * @param PrefileRequest $request + * @return PirepResource */ - public function prefile(Request $request) + public function prefile(PrefileRequest $request) { - Log::info('PIREP Prefile, user '.Auth::user()->id, $request->post()); + Log::info('PIREP Prefile, user '.Auth::id(), $request->post()); - $prefile_rules = [ - 'airline_id' => 'required|exists:airlines,id', - 'aircraft_id' => 'required|exists:aircraft,id', - 'dpt_airport_id' => 'required', - 'arr_airport_id' => 'required', - 'flight_id' => 'nullable', - 'flight_number' => 'required', - 'route_code' => 'nullable', - 'route_leg' => 'nullable', - 'flight_time' => ['nullable', 'integer'], - 'planned_flight_time' => ['nullable', 'integer'], - 'level' => 'required|integer', - 'route' => 'nullable', - 'notes' => 'nullable', - 'created_at' => 'nullable|date', - ]; - - $attrs = $this->getFromReq($request, $prefile_rules, [ - 'user_id' => Auth::user()->id, - 'state' => PirepState::IN_PROGRESS, - 'status' => PirepStatus::PREFILE, - ]); + $attrs = $request->post(); + $attrs['user_id'] = Auth::id(); + $attrs['state'] = PirepState::IN_PROGRESS; + $attrs['status'] = PirepStatus::PREFILE; $pirep = new Pirep($attrs); @@ -113,47 +117,22 @@ class PirepController extends RestController /** * File the PIREP * @param $id - * @param Request $request + * @param FileRequest $request * @return PirepResource * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException * @throws \Illuminate\Database\Eloquent\ModelNotFoundException */ - public function file($id, Request $request) + public function file($id, FileRequest $request) { - Log::info('PIREP file, user ' . Auth::user()->id, $request->post()); - - $pirep = $this->pirepRepo->find($id); - if (empty($pirep)) { - throw new ModelNotFoundException('PIREP not found'); - } + Log::info('PIREP file, user ' . Auth::id(), $request->post()); # Check if the status is cancelled... - if($pirep->state === PirepState::CANCELLED) { - throw new BadRequestHttpException('PIREP has been cancelled, updates can\'t be posted'); - } + $pirep = $this->pirepRepo->find($id); + $this->checkCancelled($pirep); - $file_rules = [ - # actual flight time is required - 'flight_time' => ['required', 'integer'], - 'flight_number' => 'nullable', - 'dpt_airport_id' => 'nullable', - 'arr_airport_id' => 'nullable', - 'airline_id' => 'nullable|exists:airlines,id', - 'aircraft_id' => 'nullable|exists:aircraft,id', - 'flight_id' => 'nullable', - 'route_code' => 'nullable', - 'route_leg' => 'nullable', - 'planned_flight_time' => ['nullable', 'integer'], - 'level' => 'nullable', - 'route' => 'nullable', - 'notes' => 'nullable', - 'created_at' => 'nullable|date', - ]; - - $attrs = $this->getFromReq($request, $file_rules, [ - 'state' => PirepState::PENDING, - 'status' => PirepStatus::ARRIVED, - ]); + $attrs = $request->post(); + $attrs['state'] = PirepState::PENDING; + $attrs['status'] = PirepStatus::ARRIVED; $pirep_fields = []; if($request->filled('fields')) { @@ -176,20 +155,15 @@ class PirepController extends RestController * @param $id * @param Request $request * @return PirepResource + * @throws \Prettus\Validator\Exceptions\ValidatorException */ public function cancel($id, Request $request) { - Log::info('PIREP Cancel, user ' . Auth::user()->pilot_id, $request->post()); + Log::info('PIREP Cancel, user ' . Auth::id(), $request->post()); - $attrs = [ + $pirep = $this->pirepRepo->update([ 'state' => PirepState::CANCELLED, - ]; - - try { - $pirep = $this->pirepRepo->update($attrs, $id); - } catch (\Exception $e) { - Log::error($e); - } + ], $id); PirepResource::withoutWrapping(); return new PirepResource($pirep); @@ -231,58 +205,32 @@ class PirepController extends RestController /** * Post ACARS updates for a PIREP * @param $id - * @param Request $request + * @param PositionRequest $request * @return \Illuminate\Http\JsonResponse * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException */ - public function acars_store($id, Request $request) + public function acars_store($id, PositionRequest $request) { - $pirep = $this->pirepRepo->find($id); - # Check if the status is cancelled... - if ($pirep->state === PirepState::CANCELLED) { - throw new BadRequestHttpException('PIREP has been cancelled, updates can\'t be posted'); - } + $pirep = $this->pirepRepo->find($id); + $this->checkCancelled($pirep); Log::info( 'Posting ACARS update (user: '.Auth::user()->pilot_id.', pirep id :'.$id.'): ', $request->post() ); - $this->validate($request, ['positions' => 'required']); - $positions = $request->post('positions'); - - $acars_rules = [ - 'lat' => 'required|numeric', - 'lon' => 'required|numeric', - 'altitude' => 'nullable', - 'level' => 'nullable', - 'heading' => 'nullable', - 'vs' => 'nullable', - 'gs' => 'nullable', - 'transponder' => 'nullable', - 'autopilot' => 'nullable', - 'fuel_flow' => 'nullable', - 'log' => 'nullable', - 'created_at' => 'nullable|date', - ]; - $count = 0; + $positions = $request->post('positions'); foreach($positions as $position) { - try { - $attrs = $this->getFromReq( - $position, - $acars_rules, - ['pirep_id' => $id, 'type' => AcarsType::FLIGHT_PATH] - ); + $position['pirep_id'] = $id; + $position['type'] = AcarsType::FLIGHT_PATH; - $update = Acars::create($attrs); - $update->save(); - ++$count; - } catch (\Exception $e) { - Log::error($e); - } + $update = Acars::create($position); + $update->save(); + + ++$count; } # Change the PIREP status @@ -296,36 +244,26 @@ class PirepController extends RestController * Post ACARS LOG update for a PIREP. These updates won't show up on the map * But rather in a log file. * @param $id - * @param Request $request + * @param LogRequest $request * @return \Illuminate\Http\JsonResponse * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException */ - public function acars_log($id, Request $request) + public function acars_log($id, LogRequest $request) { - $pirep = $this->pirepRepo->find($id); - # Check if the status is cancelled... - if ($pirep->state === PirepState::CANCELLED) { - throw new BadRequestHttpException('PIREP has been cancelled, updates can\'t be posted'); - } + $pirep = $this->pirepRepo->find($id); + $this->checkCancelled($pirep); - Log::info('Posting ACARS log', $request->toArray()); - - $this->validate($request, ['logs' => 'required']); - $logs = $request->post('logs'); - - $rules = [ - 'log' => 'required', - 'lat' => 'nullable', - 'lon' => 'nullable', - 'created_at' => 'nullable|date', - ]; + Log::info('Posting ACARS log, PIREP: '.$id, $request->post()); $count = 0; + $logs = $request->post('logs'); foreach($logs as $log) { - $attrs = $this->getFromReq($log, $rules, ['pirep_id' => $id, 'type' => AcarsType::LOG]); - $acars = Acars::create($attrs); + $log['pirep_id'] = $id; + $log['type'] = AcarsType::LOG; + + $acars = Acars::create($log); $acars->save(); ++$count; } @@ -348,24 +286,20 @@ class PirepController extends RestController /** * Add a new comment * @param $id - * @param Request $request + * @param CommentRequest $request * @return PirepCommentResource - * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException */ - public function comments_post($id, Request $request) + public function comments_post($id, CommentRequest $request) { $pirep = $this->pirepRepo->find($id); - if ($pirep->state === PirepState::CANCELLED) { - throw new BadRequestHttpException('PIREP has been cancelled, comments can\'t be posted'); - } + $this->checkCancelled($pirep); - # validation - $this->validate($request, ['comment' => 'required']); + Log::info('Posting comment, PIREP: '.$id, $request->post()); # Add it $comment = new PirepComment($request->post()); $comment->pirep_id = $id; - $comment->user_id = Auth::user()->id; + $comment->user_id = Auth::id(); $comment->save(); return new PirepCommentResource($comment); @@ -390,52 +324,25 @@ class PirepController extends RestController /** * Post the ROUTE for a PIREP, can be done from the ACARS log * @param $id - * @param Request $request + * @param RouteRequest $request * @return AcarsRouteResource * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException */ - public function route_post($id, Request $request) + public function route_post($id, RouteRequest $request) { - $pirep = $this->pirepRepo->find($id); - # Check if the status is cancelled... - if ($pirep->state === PirepState::CANCELLED) { - throw new BadRequestHttpException('PIREP has been cancelled, updates can\'t be posted'); - } + $pirep = $this->pirepRepo->find($id); + $this->checkCancelled($pirep); - Log::info('Posting ACARS ROUTE', $request->toArray()); - - $this->validate($request, ['route' => 'required']); - - $this->validate($request, [ - 'route.*.name' => 'required', - 'route.*.order' => 'required|int', - 'route.*.nav_type' => 'nullable|int', - 'route.*.lat' => 'required|numeric', - 'route.*.lon' => 'required|numeric', - ]); + Log::info('Posting ROUTE, PIREP: '.$id, $request->post()); $route = $request->post('route', []); foreach($route as $position) { - $attrs = [ - 'pirep_id' => $id, - 'type' => AcarsType::ROUTE, - 'name' => $position['name'], - 'order' => $position['order'], - 'lat' => $position['lat'], - 'lon' => $position['lon'], - ]; + $position['pirep_id'] = $id; + $position['type'] = AcarsType::ROUTE; - if(array_key_exists('nav_type', $position)) { - $attrs['nav_type'] = $position['nav_type']; - } - - try { - $acars = Acars::create($attrs); - $acars->save(); - } catch (\Exception $e) { - Log::error($e); - } + $acars = Acars::create($position); + $acars->save(); } return $this->route_get($id, $request); diff --git a/app/Http/Requests/Acars/CommentRequest.php b/app/Http/Requests/Acars/CommentRequest.php new file mode 100644 index 00000000..94bae9ab --- /dev/null +++ b/app/Http/Requests/Acars/CommentRequest.php @@ -0,0 +1,27 @@ + 'required', + 'created_at' => 'nullable|date', + ]; + + return $rules; + } +} diff --git a/app/Http/Requests/Acars/FileRequest.php b/app/Http/Requests/Acars/FileRequest.php new file mode 100644 index 00000000..82acf0ea --- /dev/null +++ b/app/Http/Requests/Acars/FileRequest.php @@ -0,0 +1,42 @@ +route('pirep_id'), ['user_id']); + return $pirep->user_id === Auth::id(); + } + + public function rules() + { + $rules = [ + 'flight_time' => 'required|integer', + 'flight_number' => 'nullable', + 'dpt_airport_id' => 'nullable', + 'arr_airport_id' => 'nullable', + 'airline_id' => 'nullable|exists:airlines,id', + 'aircraft_id' => 'nullable|exists:aircraft,id', + 'flight_id' => 'nullable', + 'route_code' => 'nullable', + 'route_leg' => 'nullable', + 'planned_flight_time' => 'nullable|integer', + 'level' => 'nullable', + 'route' => 'nullable', + 'notes' => 'nullable', + 'created_at' => 'nullable|date', + ]; + + return $rules; + } +} diff --git a/app/Http/Requests/Acars/LogRequest.php b/app/Http/Requests/Acars/LogRequest.php new file mode 100644 index 00000000..431fc120 --- /dev/null +++ b/app/Http/Requests/Acars/LogRequest.php @@ -0,0 +1,33 @@ +route('pirep_id'), ['user_id']); + return $pirep->user_id === Auth::id(); + } + + public function rules() + { + $rules = [ + 'logs' => 'required|array', + 'logs.*.log' => 'required', + 'logs.*.lat' => 'nullable|numeric', + 'logs.*.lon' => 'nullable|numeric', + 'logs.*.created_at' => 'nullable|date', + ]; + + return $rules; + } +} diff --git a/app/Http/Requests/Acars/PositionRequest.php b/app/Http/Requests/Acars/PositionRequest.php new file mode 100644 index 00000000..26e90a82 --- /dev/null +++ b/app/Http/Requests/Acars/PositionRequest.php @@ -0,0 +1,40 @@ +route('pirep_id'), ['user_id']); + return $pirep->user_id === Auth::id(); + } + + public function rules() + { + $rules = [ + 'positions' => 'required|array', + 'positions.*.lat' => 'required|numeric', + 'positions.*.lon' => 'required|numeric', + 'positions.*.altitude' => 'nullable|numeric', + 'positions.*.heading' => 'nullable|integer|between:0,360', + 'positions.*.vs' => 'nullable', + 'positions.*.gs' => 'nullable', + 'positions.*.transponder' => 'nullable', + 'positions.*.autopilot' => 'nullable', + 'positions.*.fuel_flow' => 'nullable', + 'positions.*.log' => 'nullable', + 'positions.*.created_at' => 'nullable|date', + ]; + + return $rules; + } +} diff --git a/app/Http/Requests/Acars/PrefileRequest.php b/app/Http/Requests/Acars/PrefileRequest.php new file mode 100644 index 00000000..597674c3 --- /dev/null +++ b/app/Http/Requests/Acars/PrefileRequest.php @@ -0,0 +1,39 @@ + 'required|exists:airlines,id', + 'aircraft_id' => 'required|exists:aircraft,id', + 'dpt_airport_id' => 'required', + 'arr_airport_id' => 'required', + 'flight_id' => 'nullable', + 'flight_number' => 'required', + 'route_code' => 'nullable', + 'route_leg' => 'nullable', + 'flight_time' => 'nullable|integer', + 'planned_flight_time' => 'nullable|integer', + 'level' => 'required|integer', + 'route' => 'nullable', + 'notes' => 'nullable', + 'created_at' => 'nullable|date', + ]; + + return $rules; + } +} diff --git a/app/Http/Requests/Acars/RouteRequest.php b/app/Http/Requests/Acars/RouteRequest.php new file mode 100644 index 00000000..f38b1adf --- /dev/null +++ b/app/Http/Requests/Acars/RouteRequest.php @@ -0,0 +1,34 @@ +route('pirep_id'), ['user_id']); + return $pirep->user_id === Auth::id(); + } + + public function rules() + { + $rules = [ + 'route' => 'required|array', + 'route.*.name' => 'required', + 'route.*.order' => 'required|int', + 'route.*.nav_type' => 'nullable|int', + 'route.*.lat' => 'required|numeric', + 'route.*.lon' => 'required|numeric', + ]; + + return $rules; + } +} diff --git a/app/Http/Resources/Pirep.php b/app/Http/Resources/Pirep.php index 8e23d332..b5c76766 100644 --- a/app/Http/Resources/Pirep.php +++ b/app/Http/Resources/Pirep.php @@ -21,6 +21,12 @@ class Pirep extends Resource $pirep['arr_airport'] = new Airport($this->arr_airport); $pirep['position'] = new Acars($this->position); $pirep['comments'] = PirepComment::collection($this->comments); + $pirep['user'] = [ + 'id' => $this->user->id, + 'name' => $this->user->name, + 'home_airport_id' => $this->user->home_airport_id, + 'curr_airport_id' => $this->user->curr_airport_id, + ]; return $pirep; } diff --git a/app/Models/Acars.php b/app/Models/Acars.php index c0a4249c..960c5fbe 100644 --- a/app/Models/Acars.php +++ b/app/Models/Acars.php @@ -37,7 +37,7 @@ class Acars extends BaseModel 'lat' => 'float', 'lon' => 'float', 'heading' => 'integer', - 'altitude' => 'integer', + 'altitude' => 'float', 'vs' => 'float', 'gs' => 'float', 'transponder' => 'integer', diff --git a/app/Models/Pirep.php b/app/Models/Pirep.php index a1d20fd4..774a2b70 100644 --- a/app/Models/Pirep.php +++ b/app/Models/Pirep.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Models\Enums\AcarsType; +use App\Models\Enums\PirepState; use App\Models\Traits\HashId; use Illuminate\Database\Eloquent\SoftDeletes; @@ -45,6 +46,7 @@ class Pirep extends BaseModel ]; protected $casts = [ + 'user_id' => 'integer', 'flight_time' => 'integer', 'planned_flight_time' => 'integer', 'level' => 'integer', @@ -86,6 +88,20 @@ class Pirep extends BaseModel return $flight_id; } + /** + * Check if this PIREP is allowed to be updated + * @return bool + */ + public function allowedUpdates() + { + if ($this->state === PirepState::CANCELLED) { + return false; + } + + return true; + } + + /** * Foreign Keys */ diff --git a/app/Routes/api.php b/app/Routes/api.php index 615228b4..aa1405fc 100755 --- a/app/Routes/api.php +++ b/app/Routes/api.php @@ -22,11 +22,11 @@ Route::group([], function() Route::get('flights/search', 'FlightController@search'); Route::get('flights/{id}', 'FlightController@get'); - Route::get('pireps/{id}', 'PirepController@get'); - Route::get('pireps/{id}/route', 'PirepController@route_get'); - Route::get('pireps/{id}/acars/position', 'PirepController@acars_get'); - Route::get('pireps/{id}/acars/geojson', 'PirepController@acars_geojson'); - Route::get('pireps/{id}/comments', 'PirepController@comments_get'); + Route::get('pireps/{pirep_id}', 'PirepController@get'); + Route::get('pireps/{pirep_id}/route', 'PirepController@route_get'); + Route::get('pireps/{pirep_id}/acars/position', 'PirepController@acars_get'); + Route::get('pireps/{pirep_id}/acars/geojson', 'PirepController@acars_geojson'); + Route::get('pireps/{pirep_id}/comments', 'PirepController@comments_get'); Route::get('status', 'StatusController@status'); Route::get('version', 'StatusController@status'); @@ -38,19 +38,19 @@ Route::group([], function() Route::group(['middleware' => ['api.auth']], function () { Route::post('pireps/prefile', 'PirepController@prefile'); - Route::post('pireps/{id}/file', 'PirepController@file'); - Route::delete('pireps/{id}/cancel', 'PirepController@cancel'); + Route::post('pireps/{pirep_id}/file', 'PirepController@file'); + Route::delete('pireps/{pirep_id}/cancel', 'PirepController@cancel'); - Route::post('pireps/{id}/acars/position', 'PirepController@acars_store'); - Route::post('pireps/{id}/acars/positions', 'PirepController@acars_store'); + Route::post('pireps/{pirep_id}/acars/position', 'PirepController@acars_store'); + Route::post('pireps/{pirep_id}/acars/positions', 'PirepController@acars_store'); - Route::post('pireps/{id}/acars/log', 'PirepController@acars_log'); - Route::post('pireps/{id}/acars/logs', 'PirepController@acars_log'); + Route::post('pireps/{pirep_id}/acars/log', 'PirepController@acars_log'); + Route::post('pireps/{pirep_id}/acars/logs', 'PirepController@acars_log'); - Route::post('pireps/{id}/comments', 'PirepController@comments_post'); + Route::post('pireps/{pirep_id}/comments', 'PirepController@comments_post'); - Route::post('pireps/{id}/route', 'PirepController@route_post'); - Route::delete('pireps/{id}/route', 'PirepController@route_delete'); + Route::post('pireps/{pirep_id}/route', 'PirepController@route_post'); + Route::delete('pireps/{pirep_id}/route', 'PirepController@route_delete'); Route::get('settings', 'SettingsController@index'); diff --git a/tests/AcarsTest.php b/tests/AcarsTest.php index da7b5a84..94c17984 100644 --- a/tests/AcarsTest.php +++ b/tests/AcarsTest.php @@ -47,7 +47,6 @@ class AcarsTest extends TestCase protected function getPirep($pirep_id) { - $this->user = factory(App\Models\User::class)->create(); $resp = $this ->get('/api/pireps/' . $pirep_id); $resp->assertStatus(200); return $resp->json(); @@ -116,6 +115,7 @@ class AcarsTest extends TestCase $this->assertHasKeys($body, ['airline', 'arr_airport', 'dpt_airport', 'position']); $this->assertNotNull($pirep_id); + $this->assertEquals($body['user_id'], $this->user->id); # Check the PIREP state and status $pirep = $this->getPirep($pirep_id); @@ -131,13 +131,20 @@ class AcarsTest extends TestCase $response->assertStatus(400); # Post an ACARS update - $acars = factory(App\Models\Acars::class)->make()->toArray(); - unset($acars['id']); + $acars = factory(App\Models\Acars::class)->make([ + 'id' => null + ])->toArray(); $update = ['positions' => [$acars]]; $response = $this->post($uri, $update); $response->assertStatus(200)->assertJson(['count' => 1]); + # Read that if the ACARS record posted + $acars_data = $this->get($uri)->json()[0]; + $this->assertEquals($acars['lat'], $acars_data['lat']); + $this->assertEquals($acars['lon'], $acars_data['lon']); + $this->assertEquals($acars['log'], $acars_data['log']); + # Make sure PIREP state moved into ENROUTE $pirep = $this->getPirep($pirep_id); $this->assertEquals(PirepState::IN_PROGRESS, $pirep['state']); @@ -161,7 +168,7 @@ class AcarsTest extends TestCase $response->assertStatus(400); // invalid flight time $response = $this->post($uri, ['flight_time' => '130']); - $response->assertStatus(200); // invalid flight time + $response->assertStatus(200); # Add a comment $uri = '/api/pireps/'.$pirep_id.'/comments'; diff --git a/tests/PIREPTest.php b/tests/PIREPTest.php index 97aa488f..68135da0 100644 --- a/tests/PIREPTest.php +++ b/tests/PIREPTest.php @@ -199,6 +199,9 @@ class PIREPTest extends TestCase $this->assertFalse($dupe_pirep); } + /** + * + */ public function testCancelViaAPI() { $this->user = factory(App\Models\User::class)->create(); @@ -223,7 +226,10 @@ class PIREPTest extends TestCase # Should get a 400 when posting an ACARS update $uri = '/api/pireps/' . $pirep_id . '/acars/position'; - $acars = factory(App\Models\Acars::class)->make()->toArray(); + $acars = factory(App\Models\Acars::class)->make([ + 'pirep_id' => null + ])->toArray(); + $response = $this->post($uri, $acars); $response->assertStatus(400); } diff --git a/tests/TestCase.php b/tests/TestCase.php index 022c9895..feb52ae3 100755 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -1,13 +1,11 @@ $user->api_key, - ]; + if($user !== null) { + $headers['x-api-key'] = $user->api_key; + } else { + if($this->user !== null) { + $headers['x-api-key'] = $this->user->api_key; + } + } + + return $headers; } /** @@ -81,7 +90,7 @@ abstract class TestCase extends Illuminate\Foundation\Testing\TestCase public function addData($file) { - $svc = app('\App\Services\DatabaseService'); + $svc = app(DatabaseService::class); $file_path = base_path('tests/data/' . $file . '.yml'); try { $svc->seed_from_yaml_file($file_path); @@ -91,7 +100,6 @@ abstract class TestCase extends Illuminate\Foundation\Testing\TestCase public function fillableFields(\Illuminate\Database\Eloquent\Model $model) { - //$klass = new $model(); return $model->fillable; } @@ -116,18 +124,9 @@ abstract class TestCase extends Illuminate\Foundation\Testing\TestCase */ public function get($uri, array $headers=[], $user=null): \Illuminate\Foundation\Testing\TestResponse { - if($this->user !== null) { - $headers = $this->headers($this->user); - } - - if($user !== null) { - $headers['x-api-key'] = $user->api_key; - } - - $req = parent::get($uri, $headers); + $req = parent::get($uri, $this->headers($user, $headers)); if($req->isClientError() || $req->isServerError()) { - Log::error('Error on '.$uri); - Log::error($req->json()); + Log::error('GET Error: ' . $uri, $req->json()); } return $req; @@ -138,17 +137,17 @@ abstract class TestCase extends Illuminate\Foundation\Testing\TestCase * @param string $uri * @param array $data * @param array $headers + * @param null $user * @return \Illuminate\Foundation\Testing\TestResponse */ - public function post($uri, array $data = [], array $headers = []) + public function post($uri, array $data = [], array $headers = [], $user=null) { - if (empty($headers)) { - if ($this->user !== null) { - $headers = $this->headers($this->user); - } + $req = parent::post($uri, $data, $this->headers($user, $headers)); + if ($req->isClientError() || $req->isServerError()) { + Log::error('POST Error: ' . $uri, $req->json()); } - return parent::post($uri, $data, $headers); + return $req; } /** @@ -156,16 +155,16 @@ abstract class TestCase extends Illuminate\Foundation\Testing\TestCase * @param string $uri * @param array $data * @param array $headers + * @param null $user * @return \Illuminate\Foundation\Testing\TestResponse */ - public function delete($uri, array $data = [], array $headers = []) + public function delete($uri, array $data = [], array $headers = [], $user=null) { - if (empty($headers)) { - if ($this->user !== null) { - $headers = $this->headers($this->user); - } + $req = parent::delete($uri, $data, $this->headers($user, $headers)); + if ($req->isClientError() || $req->isServerError()) { + Log::error('DELETE Error: ' . $uri, $req->json()); } - return parent::delete($uri, $data, $headers); + return $req; } }