2017-12-26 05:19:34 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
use App\Models\Enums\PirepState;
|
|
|
|
use App\Models\Enums\PirepStatus;
|
2018-02-21 03:28:53 +08:00
|
|
|
use App\Repositories\SettingRepository;
|
2017-12-26 05:19:34 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Test API calls and authentication, etc
|
|
|
|
*/
|
|
|
|
class AcarsTest extends TestCase
|
|
|
|
{
|
2018-02-21 03:28:53 +08:00
|
|
|
protected $settingsRepo;
|
|
|
|
|
2019-05-12 23:50:38 +08:00
|
|
|
public function setUp(): void
|
2017-12-26 05:19:34 +08:00
|
|
|
{
|
|
|
|
parent::setUp();
|
|
|
|
$this->addData('base');
|
2018-02-21 03:28:53 +08:00
|
|
|
|
|
|
|
$this->settingsRepo = app(SettingRepository::class);
|
2017-12-26 05:19:34 +08:00
|
|
|
}
|
|
|
|
|
2018-01-05 09:33:23 +08:00
|
|
|
/**
|
|
|
|
* @param $route
|
|
|
|
* @param $points
|
|
|
|
* @param array $addtl_fields
|
|
|
|
*/
|
2018-08-27 02:50:08 +08:00
|
|
|
protected function allPointsInRoute($route, $points, array $addtl_fields = [])
|
2018-01-05 09:33:23 +08:00
|
|
|
{
|
2018-03-14 23:34:41 +08:00
|
|
|
if (empty($addtl_fields)) {
|
2018-01-05 09:33:23 +08:00
|
|
|
$addtl_fields = [];
|
|
|
|
}
|
|
|
|
|
2018-03-14 23:34:41 +08:00
|
|
|
$fields = array_merge(
|
|
|
|
[
|
|
|
|
'name',
|
|
|
|
'order',
|
|
|
|
'lat',
|
|
|
|
'lon',
|
|
|
|
],
|
|
|
|
$addtl_fields
|
|
|
|
);
|
2018-01-05 09:33:23 +08:00
|
|
|
|
2018-08-27 02:50:08 +08:00
|
|
|
$this->assertCount(\count($route), $points);
|
2018-03-14 23:34:41 +08:00
|
|
|
foreach ($route as $idx => $point) {
|
2018-01-07 07:18:30 +08:00
|
|
|
$this->assertHasKeys($points[$idx], $fields);
|
2018-03-14 23:34:41 +08:00
|
|
|
foreach ($fields as $f) {
|
|
|
|
if ($f === 'lat' || $f === 'lon') {
|
2018-01-07 07:15:33 +08:00
|
|
|
continue;
|
2018-01-05 10:19:49 +08:00
|
|
|
}
|
|
|
|
|
2018-01-05 09:33:23 +08:00
|
|
|
$this->assertEquals($point[$f], $points[$idx][$f]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-26 05:19:34 +08:00
|
|
|
protected function getPirep($pirep_id)
|
|
|
|
{
|
2018-03-14 23:34:41 +08:00
|
|
|
$resp = $this->get('/api/pireps/'.$pirep_id);
|
2017-12-26 05:19:34 +08:00
|
|
|
$resp->assertStatus(200);
|
2018-03-14 23:34:41 +08:00
|
|
|
|
2018-02-11 07:34:46 +08:00
|
|
|
return $resp->json()['data'];
|
2017-12-26 05:19:34 +08:00
|
|
|
}
|
|
|
|
|
2018-01-24 01:46:26 +08:00
|
|
|
/**
|
2018-01-24 05:48:30 +08:00
|
|
|
* Test some prefile error conditions
|
2018-01-24 01:46:26 +08:00
|
|
|
*/
|
|
|
|
public function testPrefileErrors()
|
|
|
|
{
|
|
|
|
$this->user = factory(App\Models\User::class)->create();
|
|
|
|
|
|
|
|
$airport = factory(App\Models\Airport::class)->create();
|
|
|
|
$airline = factory(App\Models\Airline::class)->create();
|
|
|
|
$aircraft = factory(App\Models\Aircraft::class)->create();
|
|
|
|
|
2018-01-24 05:48:30 +08:00
|
|
|
/**
|
|
|
|
* INVALID AIRLINE_ID FIELD
|
|
|
|
*/
|
2018-01-24 01:46:26 +08:00
|
|
|
$uri = '/api/pireps/prefile';
|
|
|
|
$pirep = [
|
2018-08-27 00:40:04 +08:00
|
|
|
'_airline_id' => $airline->id,
|
|
|
|
'aircraft_id' => $aircraft->id,
|
|
|
|
'dpt_airport_id' => $airport->icao,
|
|
|
|
'arr_airport_id' => $airport->icao,
|
|
|
|
'flight_number' => '6000',
|
|
|
|
'level' => 38000,
|
2018-01-24 01:46:26 +08:00
|
|
|
'planned_flight_time' => 120,
|
2018-08-27 00:40:04 +08:00
|
|
|
'route' => 'POINTA POINTB',
|
2018-01-24 01:46:26 +08:00
|
|
|
];
|
|
|
|
|
|
|
|
$response = $this->post($uri, $pirep);
|
|
|
|
$response->assertStatus(400);
|
|
|
|
}
|
|
|
|
|
2018-03-31 00:08:53 +08:00
|
|
|
/**
|
|
|
|
* Make sure an error is thrown if the pilot is not at the current airport
|
|
|
|
*/
|
|
|
|
public function testPilotNotAtAirport(): void
|
|
|
|
{
|
|
|
|
$this->settingsRepo->store('pilots.only_flights_from_current', true);
|
|
|
|
$this->settingsRepo->store('pireps.restrict_aircraft_to_rank', false);
|
|
|
|
|
|
|
|
$this->user = factory(App\Models\User::class)->create([
|
|
|
|
'curr_airport_id' => 'KJFK',
|
|
|
|
]);
|
|
|
|
|
|
|
|
$airport = factory(App\Models\Airport::class)->create();
|
|
|
|
$airline = factory(App\Models\Airline::class)->create();
|
|
|
|
$aircraft = factory(App\Models\Aircraft::class)->create();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* INVALID AIRLINE_ID FIELD
|
|
|
|
*/
|
|
|
|
$uri = '/api/pireps/prefile';
|
|
|
|
$pirep = [
|
|
|
|
'airline_id' => $airline->id,
|
|
|
|
'aircraft_id' => $aircraft->id,
|
|
|
|
'dpt_airport_id' => $airport->icao,
|
|
|
|
'arr_airport_id' => $airport->icao,
|
|
|
|
'flight_number' => '6000',
|
|
|
|
'level' => 38000,
|
|
|
|
'planned_flight_time' => 120,
|
|
|
|
'route' => 'POINTA POINTB',
|
|
|
|
'source_name' => 'phpunit',
|
|
|
|
];
|
|
|
|
|
|
|
|
$response = $this->post($uri, $pirep);
|
|
|
|
$response->assertStatus(400);
|
|
|
|
$body = $response->json();
|
|
|
|
$this->assertEquals(\App\Exceptions\UserNotAtAirport::MESSAGE, $body['error']['message']);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Make sure an error is thrown if the pilot is not at the current airport
|
|
|
|
*/
|
|
|
|
public function testAircraftNotAtAirport(): void
|
|
|
|
{
|
|
|
|
$this->settingsRepo->store('pireps.only_aircraft_at_dpt_airport', true);
|
|
|
|
$this->settingsRepo->store('pireps.restrict_aircraft_to_rank', false);
|
|
|
|
$this->settingsRepo->store('pireps.restrict_aircraft_to_rank', false);
|
|
|
|
|
|
|
|
$this->user = factory(App\Models\User::class)->create([
|
|
|
|
'curr_airport_id' => 'KJFK',
|
|
|
|
]);
|
|
|
|
|
|
|
|
$airport = factory(App\Models\Airport::class)->create();
|
|
|
|
$airline = factory(App\Models\Airline::class)->create();
|
|
|
|
$aircraft = factory(App\Models\Aircraft::class)->create([
|
2018-08-27 00:40:04 +08:00
|
|
|
'airport_id' => 'KAUS',
|
2018-03-31 00:08:53 +08:00
|
|
|
]);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* INVALID AIRLINE_ID FIELD
|
|
|
|
*/
|
|
|
|
$uri = '/api/pireps/prefile';
|
|
|
|
$pirep = [
|
|
|
|
'airline_id' => $airline->id,
|
|
|
|
'aircraft_id' => $aircraft->id,
|
|
|
|
'dpt_airport_id' => $airport->icao,
|
|
|
|
'arr_airport_id' => $airport->icao,
|
|
|
|
'flight_number' => '6000',
|
|
|
|
'level' => 38000,
|
|
|
|
'planned_flight_time' => 120,
|
|
|
|
'route' => 'POINTA POINTB',
|
|
|
|
'source_name' => 'phpunit',
|
|
|
|
];
|
|
|
|
|
|
|
|
$response = $this->post($uri, $pirep);
|
|
|
|
$response->assertStatus(400);
|
|
|
|
$body = $response->json();
|
|
|
|
$this->assertEquals(\App\Exceptions\AircraftNotAtAirport::MESSAGE, $body['error']['message']);
|
|
|
|
}
|
|
|
|
|
2017-12-26 05:19:34 +08:00
|
|
|
/**
|
|
|
|
* Post a PIREP into a PREFILE state and post ACARS
|
|
|
|
*/
|
2018-03-14 23:34:41 +08:00
|
|
|
public function testPrefileAndUpdates()
|
2017-12-26 05:19:34 +08:00
|
|
|
{
|
2018-02-21 02:59:49 +08:00
|
|
|
$subfleet = $this->createSubfleetWithAircraft(2);
|
|
|
|
$rank = $this->createRank(10, [$subfleet['subfleet']->id]);
|
2018-03-14 23:34:41 +08:00
|
|
|
$fare = factory(App\Models\Fare::class)->create();
|
2018-02-21 02:59:49 +08:00
|
|
|
|
2018-03-14 23:34:41 +08:00
|
|
|
$this->user = factory(App\Models\User::class)->create(
|
|
|
|
[
|
|
|
|
'rank_id' => $rank->id,
|
|
|
|
]
|
|
|
|
);
|
2018-01-05 11:05:26 +08:00
|
|
|
|
2017-12-26 05:19:34 +08:00
|
|
|
$airport = factory(App\Models\Airport::class)->create();
|
|
|
|
$airline = factory(App\Models\Airline::class)->create();
|
2018-02-21 02:59:49 +08:00
|
|
|
$aircraft = $subfleet['aircraft']->random();
|
2017-12-26 05:19:34 +08:00
|
|
|
|
2017-12-29 05:02:59 +08:00
|
|
|
$uri = '/api/pireps/prefile';
|
2017-12-26 05:19:34 +08:00
|
|
|
$pirep = [
|
2018-08-27 00:40:04 +08:00
|
|
|
'airline_id' => $airline->id,
|
|
|
|
'aircraft_id' => $aircraft->id,
|
|
|
|
'dpt_airport_id' => $airport->icao,
|
|
|
|
'arr_airport_id' => $airport->icao,
|
|
|
|
'flight_number' => '6000',
|
|
|
|
'level' => 38000,
|
|
|
|
'planned_distance' => 400,
|
2017-12-26 05:19:34 +08:00
|
|
|
'planned_flight_time' => 120,
|
2018-08-27 00:40:04 +08:00
|
|
|
'route' => 'POINTA POINTB',
|
|
|
|
'source_name' => 'UnitTest',
|
|
|
|
'fields' => [
|
2018-02-07 03:59:40 +08:00
|
|
|
'custom_field' => 'custom_value',
|
2018-03-14 23:34:41 +08:00
|
|
|
],
|
|
|
|
'fares' => [
|
|
|
|
[
|
2018-08-27 00:40:04 +08:00
|
|
|
'id' => $fare->id,
|
2018-03-14 23:34:41 +08:00
|
|
|
'count' => $fare->capacity,
|
|
|
|
],
|
|
|
|
],
|
|
|
|
];
|
|
|
|
|
|
|
|
$response = $this->post($uri, $pirep);
|
|
|
|
$response->assertStatus(201);
|
|
|
|
$pirep = $response->json('data');
|
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// See that the fields and fares were set
|
2018-03-14 23:34:41 +08:00
|
|
|
$fares = \App\Models\PirepFare::where('pirep_id', $pirep['id'])->get();
|
|
|
|
$this->assertCount(1, $fares);
|
|
|
|
$saved_fare = $fares->first();
|
|
|
|
|
|
|
|
$this->assertEquals($fare->id, $saved_fare['fare_id']);
|
|
|
|
$this->assertEquals($fare->capacity, $saved_fare['count']);
|
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Check saved fields
|
2018-07-13 10:20:10 +08:00
|
|
|
$saved_fields = \App\Models\PirepFieldValue::where('pirep_id', $pirep['id'])->get();
|
2018-03-14 23:34:41 +08:00
|
|
|
$this->assertCount(1, $saved_fields);
|
|
|
|
$field = $saved_fields->first();
|
|
|
|
|
|
|
|
$this->assertEquals('custom_field', $field['name']);
|
|
|
|
$this->assertEquals('custom_value', $field['value']);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Try to update fields
|
|
|
|
*/
|
|
|
|
$uri = '/api/pireps/'.$pirep['id'].'/update';
|
|
|
|
$update = [
|
|
|
|
'fares' => [
|
|
|
|
[
|
2018-08-27 00:40:04 +08:00
|
|
|
'id' => $fare->id,
|
2018-03-14 23:34:41 +08:00
|
|
|
'count' => $fare->capacity,
|
|
|
|
],
|
|
|
|
],
|
|
|
|
];
|
|
|
|
|
|
|
|
$response = $this->post($uri, $update);
|
|
|
|
$response->assertStatus(200);
|
|
|
|
$updated_pirep = $response->json('data');
|
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Make sure there are no duplicates
|
2018-03-14 23:34:41 +08:00
|
|
|
$fares = \App\Models\PirepFare::where('pirep_id', $pirep['id'])->get();
|
|
|
|
$this->assertCount(1, $fares);
|
|
|
|
$saved_fare = $fares->first();
|
|
|
|
|
|
|
|
$this->assertEquals($fare->id, $saved_fare['fare_id']);
|
|
|
|
$this->assertEquals($fare->capacity, $saved_fare['count']);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Post a PIREP into a PREFILE state and post ACARS
|
|
|
|
*/
|
|
|
|
public function testAcarsUpdates()
|
|
|
|
{
|
|
|
|
$subfleet = $this->createSubfleetWithAircraft(2);
|
|
|
|
$rank = $this->createRank(10, [$subfleet['subfleet']->id]);
|
|
|
|
|
|
|
|
$this->user = factory(App\Models\User::class)->create(
|
|
|
|
[
|
|
|
|
'rank_id' => $rank->id,
|
2018-02-07 03:59:40 +08:00
|
|
|
]
|
2018-03-14 23:34:41 +08:00
|
|
|
);
|
|
|
|
|
|
|
|
$airport = factory(App\Models\Airport::class)->create();
|
|
|
|
$airline = factory(App\Models\Airline::class)->create();
|
|
|
|
$aircraft = $subfleet['aircraft']->random();
|
|
|
|
|
|
|
|
$uri = '/api/pireps/prefile';
|
2019-07-16 03:14:40 +08:00
|
|
|
$pirep_create = [
|
2018-08-27 00:40:04 +08:00
|
|
|
'airline_id' => $airline->id,
|
|
|
|
'aircraft_id' => $aircraft->id,
|
|
|
|
'dpt_airport_id' => $airport->icao,
|
|
|
|
'arr_airport_id' => $airport->icao,
|
|
|
|
'flight_number' => '6000',
|
|
|
|
'level' => 38000,
|
|
|
|
'planned_distance' => 400,
|
2018-03-14 23:34:41 +08:00
|
|
|
'planned_flight_time' => 120,
|
2018-08-27 00:40:04 +08:00
|
|
|
'route' => 'POINTA POINTB',
|
|
|
|
'source_name' => 'AcarsTest::testAcarsUpdates',
|
|
|
|
'fields' => [
|
2018-03-14 23:34:41 +08:00
|
|
|
'custom_field' => 'custom_value',
|
|
|
|
],
|
2017-12-26 05:19:34 +08:00
|
|
|
];
|
|
|
|
|
2019-07-16 03:14:40 +08:00
|
|
|
$response = $this->post($uri, $pirep_create);
|
2017-12-26 05:19:34 +08:00
|
|
|
$response->assertStatus(201);
|
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Get the PIREP ID
|
2018-01-05 11:21:51 +08:00
|
|
|
$body = $response->json();
|
2018-02-11 07:34:46 +08:00
|
|
|
$pirep_id = $body['data']['id'];
|
2018-01-05 11:21:51 +08:00
|
|
|
|
2018-02-11 07:34:46 +08:00
|
|
|
$this->assertHasKeys($body['data'], ['airline', 'arr_airport', 'dpt_airport', 'position']);
|
2017-12-26 05:19:34 +08:00
|
|
|
$this->assertNotNull($pirep_id);
|
2018-02-11 07:34:46 +08:00
|
|
|
$this->assertEquals($body['data']['user_id'], $this->user->id);
|
2017-12-26 05:19:34 +08:00
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Check the PIREP state and status
|
2017-12-26 05:19:34 +08:00
|
|
|
$pirep = $this->getPirep($pirep_id);
|
|
|
|
$this->assertEquals(PirepState::IN_PROGRESS, $pirep['state']);
|
2018-04-02 09:18:12 +08:00
|
|
|
$this->assertEquals(PirepStatus::INITIATED, $pirep['status']);
|
2017-12-26 05:19:34 +08:00
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
/*
|
2018-02-07 03:59:40 +08:00
|
|
|
* Check the fields
|
|
|
|
*/
|
|
|
|
$this->assertHasKeys($pirep, ['fields']);
|
2018-05-10 01:45:24 +08:00
|
|
|
$this->assertEquals('custom_value', $pirep['fields']['custom_field']);
|
2019-07-16 03:14:40 +08:00
|
|
|
$this->assertEquals($pirep_create['planned_distance'], $pirep['planned_distance']['nmi']);
|
2018-02-11 12:49:08 +08:00
|
|
|
$this->assertHasKeys($pirep['planned_distance'], ['mi', 'nmi', 'km']);
|
2018-02-11 12:30:42 +08:00
|
|
|
|
2018-02-07 03:59:40 +08:00
|
|
|
/**
|
|
|
|
* Update the custom field
|
|
|
|
*/
|
2018-03-14 23:34:41 +08:00
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/update';
|
2018-05-10 01:45:24 +08:00
|
|
|
$this->post($uri, [
|
|
|
|
'fields' => [
|
|
|
|
'custom_field' => 'custom_value_changed',
|
|
|
|
],
|
|
|
|
]);
|
2018-02-07 03:59:40 +08:00
|
|
|
|
|
|
|
$pirep = $this->getPirep($pirep_id);
|
2018-05-10 01:45:24 +08:00
|
|
|
$this->assertEquals('custom_value_changed', $pirep['fields']['custom_field']);
|
2018-02-07 03:59:40 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Add some position updates
|
|
|
|
*/
|
2018-03-14 23:34:41 +08:00
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/acars/position';
|
2018-01-05 09:33:23 +08:00
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Test missing positions field
|
|
|
|
// Post an ACARS update
|
2018-01-05 09:33:23 +08:00
|
|
|
$update = [];
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $update);
|
2018-01-05 09:33:23 +08:00
|
|
|
$response->assertStatus(400);
|
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Post an ACARS update
|
2018-05-04 04:36:26 +08:00
|
|
|
$acars = factory(App\Models\Acars::class)->make(['pirep_id' => $pirep_id])->toArray();
|
|
|
|
|
|
|
|
$acars = $this->transformData($acars);
|
2018-01-05 10:08:22 +08:00
|
|
|
|
2018-01-05 09:33:23 +08:00
|
|
|
$update = ['positions' => [$acars]];
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $update);
|
2018-01-05 10:08:22 +08:00
|
|
|
$response->assertStatus(200)->assertJson(['count' => 1]);
|
2017-12-26 05:19:34 +08:00
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Read that if the ACARS record posted
|
2018-02-11 07:34:46 +08:00
|
|
|
$acars_data = $this->get($uri)->json()['data'][0];
|
2018-01-29 01:21:31 +08:00
|
|
|
$this->assertEquals(round($acars['lat'], 2), round($acars_data['lat'], 2));
|
|
|
|
$this->assertEquals(round($acars['lon'], 2), round($acars_data['lon'], 2));
|
2018-01-29 01:12:13 +08:00
|
|
|
$this->assertEquals($acars['log'], $acars_data['log']);
|
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Make sure PIREP state moved into ENROUTE
|
2017-12-26 05:19:34 +08:00
|
|
|
$pirep = $this->getPirep($pirep_id);
|
|
|
|
$this->assertEquals(PirepState::IN_PROGRESS, $pirep['state']);
|
2018-04-02 09:18:12 +08:00
|
|
|
$this->assertEquals(PirepStatus::AIRBORNE, $pirep['status']);
|
2017-12-26 05:19:34 +08:00
|
|
|
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->get($uri);
|
2017-12-26 05:19:34 +08:00
|
|
|
$response->assertStatus(200);
|
2018-02-11 07:34:46 +08:00
|
|
|
$body = $response->json()['data'];
|
2018-01-05 09:33:23 +08:00
|
|
|
|
|
|
|
$this->assertNotNull($body);
|
|
|
|
$this->assertCount(1, $body);
|
2018-01-05 10:16:29 +08:00
|
|
|
$this->assertEquals(round($acars['lat'], 2), round($body[0]['lat'], 2));
|
|
|
|
$this->assertEquals(round($acars['lon'], 2), round($body[0]['lon'], 2));
|
2018-01-24 01:46:26 +08:00
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Update fields standalone
|
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/fields';
|
2018-05-10 01:45:24 +08:00
|
|
|
$response = $this->post($uri, [
|
|
|
|
'fields' => [
|
|
|
|
'Departure Gate' => 'G26',
|
|
|
|
],
|
|
|
|
]);
|
|
|
|
|
|
|
|
$response->assertStatus(200);
|
|
|
|
$body = $response->json('data');
|
|
|
|
$this->assertEquals('G26', $body['Departure Gate']);
|
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// File the PIREP now
|
2018-01-24 01:46:26 +08:00
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/file';
|
|
|
|
$response = $this->post($uri, []);
|
2018-02-11 06:10:19 +08:00
|
|
|
$response->assertStatus(400); // missing field
|
2018-01-24 01:46:26 +08:00
|
|
|
|
|
|
|
$response = $this->post($uri, ['flight_time' => '1:30']);
|
|
|
|
$response->assertStatus(400); // invalid flight time
|
|
|
|
|
2018-05-10 01:45:24 +08:00
|
|
|
$response = $this->post($uri, [
|
|
|
|
'flight_time' => 130,
|
2018-08-27 00:40:04 +08:00
|
|
|
'fuel_used' => 8000.19,
|
|
|
|
'distance' => 400,
|
2018-05-10 01:45:24 +08:00
|
|
|
]);
|
2018-01-31 02:06:46 +08:00
|
|
|
|
2018-01-29 01:12:13 +08:00
|
|
|
$response->assertStatus(200);
|
2018-02-11 07:34:46 +08:00
|
|
|
$body = $response->json();
|
2018-01-24 11:40:34 +08:00
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Add a comment
|
2018-01-24 11:40:34 +08:00
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/comments';
|
|
|
|
$response = $this->post($uri, ['comment' => 'A comment']);
|
|
|
|
$response->assertStatus(201);
|
|
|
|
|
|
|
|
$response = $this->get($uri);
|
|
|
|
$response->assertStatus(200);
|
|
|
|
$comments = $response->json();
|
|
|
|
|
|
|
|
$this->assertCount(1, $comments);
|
2018-01-05 09:33:23 +08:00
|
|
|
}
|
|
|
|
|
2018-04-05 02:03:10 +08:00
|
|
|
/**
|
|
|
|
* Post a PIREP into a PREFILE state and post ACARS
|
|
|
|
*/
|
|
|
|
public function testFilePirepApi(): void
|
|
|
|
{
|
|
|
|
$subfleet = $this->createSubfleetWithAircraft(2);
|
|
|
|
$rank = $this->createRank(10, [$subfleet['subfleet']->id]);
|
|
|
|
|
|
|
|
$this->user = factory(App\Models\User::class)->create([
|
|
|
|
'rank_id' => $rank->id,
|
|
|
|
]);
|
|
|
|
|
|
|
|
$airport = factory(App\Models\Airport::class)->create();
|
|
|
|
$airline = factory(App\Models\Airline::class)->create();
|
|
|
|
$aircraft = $subfleet['aircraft']->random();
|
|
|
|
|
|
|
|
$uri = '/api/pireps/prefile';
|
|
|
|
$pirep = [
|
2018-08-27 00:40:04 +08:00
|
|
|
'airline_id' => $airline->id,
|
|
|
|
'aircraft_id' => $aircraft->id,
|
|
|
|
'dpt_airport_id' => $airport->icao,
|
|
|
|
'arr_airport_id' => $airport->icao,
|
|
|
|
'flight_number' => '6000',
|
|
|
|
'level' => 38000,
|
|
|
|
'source_name' => 'AcarsTest::testFilePirepApi',
|
2018-04-05 02:03:10 +08:00
|
|
|
];
|
|
|
|
|
|
|
|
$response = $this->post($uri, $pirep);
|
|
|
|
$response->assertStatus(201);
|
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Get the PIREP ID
|
2018-04-05 02:03:10 +08:00
|
|
|
$body = $response->json();
|
|
|
|
$pirep_id = $body['data']['id'];
|
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// File the PIREP now
|
2018-04-05 02:03:10 +08:00
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/file';
|
|
|
|
|
|
|
|
$response = $this->post($uri, [
|
|
|
|
'flight_time' => 130,
|
|
|
|
'fuel_used' => 8000.19,
|
|
|
|
'distance' => 400,
|
|
|
|
]);
|
|
|
|
|
|
|
|
$response->assertStatus(200);
|
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Check the block_off_time and block_on_time being set
|
2018-04-05 02:03:10 +08:00
|
|
|
$body = $this->get('/api/pireps/'.$pirep_id)->json('data');
|
|
|
|
$this->assertNotNull($body['block_off_time']);
|
|
|
|
$this->assertNotNull($body['block_on_time']);
|
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// make sure the time matches up
|
2018-05-02 11:52:31 +08:00
|
|
|
/*$block_on = new Carbon($body['block_on_time'], 'UTC');
|
2018-04-05 02:03:10 +08:00
|
|
|
$block_off = new Carbon($body['block_off_time'], 'UTC');
|
2018-05-02 11:52:31 +08:00
|
|
|
$this->assertEquals($block_on->subMinutes($body['flight_time']), $block_off);*/
|
2018-04-05 02:03:10 +08:00
|
|
|
}
|
|
|
|
|
2018-02-21 02:59:49 +08:00
|
|
|
/**
|
|
|
|
* Test aircraft is allowed
|
|
|
|
*/
|
|
|
|
public function testAircraftAllowed()
|
|
|
|
{
|
|
|
|
$this->settingsRepo->store('pireps.restrict_aircraft_to_rank', true);
|
|
|
|
|
|
|
|
$airport = factory(App\Models\Airport::class)->create();
|
|
|
|
$airline = factory(App\Models\Airline::class)->create();
|
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Add subfleets and aircraft, but also add another set of subfleets
|
2018-02-21 02:59:49 +08:00
|
|
|
$subfleetA = $this->createSubfleetWithAircraft(1);
|
|
|
|
|
|
|
|
// User not allowed aircraft from this subfleet
|
|
|
|
$subfleetB = $this->createSubfleetWithAircraft(1);
|
|
|
|
|
|
|
|
$rank = $this->createRank(10, [$subfleetA['subfleet']->id]);
|
|
|
|
|
2018-03-14 23:34:41 +08:00
|
|
|
$this->user = factory(App\Models\User::class)->create(
|
|
|
|
[
|
|
|
|
'rank_id' => $rank->id,
|
|
|
|
]
|
|
|
|
);
|
2018-02-21 02:59:49 +08:00
|
|
|
|
|
|
|
$uri = '/api/pireps/prefile';
|
|
|
|
$pirep = [
|
2018-08-27 00:40:04 +08:00
|
|
|
'airline_id' => $airline->id,
|
|
|
|
'aircraft_id' => $subfleetB['aircraft']->random()->id,
|
|
|
|
'dpt_airport_id' => $airport->icao,
|
|
|
|
'arr_airport_id' => $airport->icao,
|
|
|
|
'flight_number' => '6000',
|
|
|
|
'level' => 38000,
|
2018-02-21 02:59:49 +08:00
|
|
|
'planned_flight_time' => 120,
|
2018-08-27 00:40:04 +08:00
|
|
|
'route' => 'POINTA POINTB',
|
|
|
|
'source_name' => 'Unit test',
|
2018-02-21 02:59:49 +08:00
|
|
|
];
|
|
|
|
|
|
|
|
$response = $this->post($uri, $pirep);
|
|
|
|
$response->assertStatus(400);
|
|
|
|
|
|
|
|
// Try refiling with a valid aircraft
|
|
|
|
$pirep['aircraft_id'] = $subfleetA['aircraft']->random()->id;
|
|
|
|
$response = $this->post($uri, $pirep);
|
2018-02-21 03:28:53 +08:00
|
|
|
$response->assertStatus(201);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test aircraft permissions being ignored
|
|
|
|
*/
|
|
|
|
public function testIgnoreAircraftAllowed()
|
|
|
|
{
|
|
|
|
$this->settingsRepo->store('pireps.restrict_aircraft_to_rank', false);
|
|
|
|
|
|
|
|
$airport = factory(App\Models\Airport::class)->create();
|
|
|
|
$airline = factory(App\Models\Airline::class)->create();
|
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Add subfleets and aircraft, but also add another set of subfleets
|
2018-02-21 03:28:53 +08:00
|
|
|
$subfleetA = $this->createSubfleetWithAircraft(1);
|
|
|
|
|
|
|
|
// User not allowed aircraft from this subfleet
|
|
|
|
$subfleetB = $this->createSubfleetWithAircraft(1);
|
|
|
|
|
|
|
|
$rank = $this->createRank(10, [$subfleetA['subfleet']->id]);
|
|
|
|
|
2018-03-14 23:34:41 +08:00
|
|
|
$this->user = factory(App\Models\User::class)->create(
|
|
|
|
[
|
|
|
|
'rank_id' => $rank->id,
|
|
|
|
]
|
|
|
|
);
|
2018-02-21 03:28:53 +08:00
|
|
|
|
|
|
|
$uri = '/api/pireps/prefile';
|
|
|
|
$pirep = [
|
2018-08-27 00:40:04 +08:00
|
|
|
'airline_id' => $airline->id,
|
|
|
|
'aircraft_id' => $subfleetB['aircraft']->random()->id,
|
|
|
|
'dpt_airport_id' => $airport->icao,
|
|
|
|
'arr_airport_id' => $airport->icao,
|
|
|
|
'flight_number' => '6000',
|
|
|
|
'level' => 38000,
|
2018-02-21 03:28:53 +08:00
|
|
|
'planned_flight_time' => 120,
|
2018-08-27 00:40:04 +08:00
|
|
|
'route' => 'POINTA POINTB',
|
|
|
|
'source_name' => 'Unit test',
|
2018-02-21 03:28:53 +08:00
|
|
|
];
|
|
|
|
|
|
|
|
$response = $this->post($uri, $pirep);
|
2018-02-21 02:59:49 +08:00
|
|
|
$response->assertStatus(201);
|
|
|
|
}
|
|
|
|
|
2018-01-05 09:33:23 +08:00
|
|
|
/**
|
|
|
|
* Test publishing multiple, batched updates
|
2018-08-27 02:51:47 +08:00
|
|
|
*
|
2018-08-27 02:50:08 +08:00
|
|
|
* @throws Exception
|
2018-01-05 09:33:23 +08:00
|
|
|
*/
|
|
|
|
public function testMultipleAcarsPositionUpdates()
|
|
|
|
{
|
2018-02-21 02:59:49 +08:00
|
|
|
$pirep = $this->createPirep()->toArray();
|
2018-01-05 09:33:23 +08:00
|
|
|
|
|
|
|
$uri = '/api/pireps/prefile';
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $pirep);
|
2018-01-05 09:33:23 +08:00
|
|
|
$response->assertStatus(201);
|
|
|
|
|
2018-02-11 07:34:46 +08:00
|
|
|
$pirep_id = $response->json()['data']['id'];
|
2018-01-05 09:33:23 +08:00
|
|
|
|
2018-03-14 23:34:41 +08:00
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/acars/position';
|
2017-12-26 05:19:34 +08:00
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// Post an ACARS update
|
2018-01-22 02:51:42 +08:00
|
|
|
$acars_count = \random_int(2, 10);
|
2018-03-14 23:34:41 +08:00
|
|
|
$acars = factory(App\Models\Acars::class, $acars_count)->make(['id' => ''])->toArray();
|
2018-01-05 09:33:23 +08:00
|
|
|
|
|
|
|
$update = ['positions' => $acars];
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $update);
|
2018-01-05 10:08:22 +08:00
|
|
|
$response->assertStatus(200)->assertJson(['count' => $acars_count]);
|
2018-01-05 09:33:23 +08:00
|
|
|
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->get($uri);
|
2018-02-11 07:34:46 +08:00
|
|
|
$response->assertStatus(200)->assertJsonCount($acars_count, 'data');
|
2017-12-26 05:19:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
public function testNonExistentPirepGet()
|
|
|
|
{
|
2018-01-07 02:07:22 +08:00
|
|
|
$this->user = factory(App\Models\User::class)->create();
|
2018-01-05 11:05:26 +08:00
|
|
|
|
2017-12-29 05:02:59 +08:00
|
|
|
$uri = '/api/pireps/DOESNTEXIST/acars';
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->get($uri);
|
2017-12-26 05:19:34 +08:00
|
|
|
$response->assertStatus(404);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testNonExistentPirepStore()
|
|
|
|
{
|
2018-01-07 02:07:22 +08:00
|
|
|
$this->user = factory(App\Models\User::class)->create();
|
2018-01-05 11:05:26 +08:00
|
|
|
|
2018-01-05 09:33:23 +08:00
|
|
|
$uri = '/api/pireps/DOESNTEXIST/acars/position';
|
2017-12-26 05:19:34 +08:00
|
|
|
$acars = factory(App\Models\Acars::class)->make()->toArray();
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $acars);
|
2017-12-26 05:19:34 +08:00
|
|
|
$response->assertStatus(404);
|
|
|
|
}
|
2017-12-26 08:10:24 +08:00
|
|
|
|
|
|
|
public function testAcarsIsoDate()
|
|
|
|
{
|
2018-02-21 02:59:49 +08:00
|
|
|
$pirep = $this->createPirep()->toArray();
|
2018-01-05 09:33:23 +08:00
|
|
|
|
2017-12-29 05:02:59 +08:00
|
|
|
$uri = '/api/pireps/prefile';
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $pirep);
|
2018-02-11 07:34:46 +08:00
|
|
|
$pirep_id = $response->json()['data']['id'];
|
2017-12-26 08:10:24 +08:00
|
|
|
|
|
|
|
$dt = date('c');
|
2018-03-14 23:34:41 +08:00
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/acars/position';
|
|
|
|
$acars = factory(App\Models\Acars::class)->make(
|
|
|
|
[
|
|
|
|
'sim_time' => $dt,
|
|
|
|
]
|
|
|
|
)->toArray();
|
2017-12-26 08:10:24 +08:00
|
|
|
|
2018-01-05 09:33:23 +08:00
|
|
|
$update = ['positions' => [$acars]];
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $update);
|
2018-01-05 09:33:23 +08:00
|
|
|
$response->assertStatus(200);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test the validation
|
|
|
|
*/
|
|
|
|
public function testAcarsInvalidRoutePost()
|
|
|
|
{
|
2018-02-21 02:59:49 +08:00
|
|
|
$pirep = $this->createPirep()->toArray();
|
2018-01-05 09:33:23 +08:00
|
|
|
|
|
|
|
$uri = '/api/pireps/prefile';
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $pirep);
|
2018-02-11 07:34:46 +08:00
|
|
|
$pirep_id = $response->json()['data']['id'];
|
2018-01-05 09:33:23 +08:00
|
|
|
|
2018-08-20 22:20:03 +08:00
|
|
|
// Missing lat/lon
|
2018-01-05 09:33:23 +08:00
|
|
|
$post_route = ['order' => 1, 'name' => 'NAVPOINT'];
|
2018-03-14 23:34:41 +08:00
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/route';
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $post_route);
|
2018-01-05 09:33:23 +08:00
|
|
|
$response->assertStatus(400);
|
|
|
|
|
|
|
|
$post_route = [
|
2018-03-14 23:34:41 +08:00
|
|
|
['order' => 1, 'name' => 'NAVPOINT', 'lat' => 'notanumber', 'lon' => 34.11],
|
2018-01-05 09:33:23 +08:00
|
|
|
];
|
|
|
|
|
2018-03-14 23:34:41 +08:00
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/route';
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $post_route);
|
2018-01-05 09:33:23 +08:00
|
|
|
$response->assertStatus(400);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testAcarsLogPost()
|
|
|
|
{
|
2018-02-21 02:59:49 +08:00
|
|
|
$pirep = $this->createPirep()->toArray();
|
2018-01-05 09:33:23 +08:00
|
|
|
|
|
|
|
$uri = '/api/pireps/prefile';
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $pirep);
|
2018-02-11 07:34:46 +08:00
|
|
|
$pirep_id = $response->json()['data']['id'];
|
2018-01-05 09:33:23 +08:00
|
|
|
|
|
|
|
$acars = factory(App\Models\Acars::class)->make();
|
|
|
|
$post_log = [
|
2018-01-05 10:08:22 +08:00
|
|
|
'logs' => [
|
2018-03-14 23:34:41 +08:00
|
|
|
['log' => $acars->log],
|
|
|
|
],
|
2018-01-05 09:33:23 +08:00
|
|
|
];
|
|
|
|
|
2018-03-14 23:34:41 +08:00
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/acars/logs';
|
2018-01-31 02:06:46 +08:00
|
|
|
$response = $this->post($uri, $post_log);
|
|
|
|
$response->assertStatus(200);
|
|
|
|
$body = $response->json();
|
|
|
|
|
|
|
|
$this->assertEquals(1, $body['count']);
|
|
|
|
|
|
|
|
$acars = factory(App\Models\Acars::class)->make();
|
|
|
|
$post_log = [
|
|
|
|
'events' => [
|
2018-03-14 23:34:41 +08:00
|
|
|
['event' => $acars->log],
|
|
|
|
],
|
2018-01-31 02:06:46 +08:00
|
|
|
];
|
|
|
|
|
2018-03-14 23:34:41 +08:00
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/acars/events';
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $post_log);
|
2018-01-05 10:08:22 +08:00
|
|
|
$response->assertStatus(200);
|
|
|
|
$body = $response->json();
|
|
|
|
|
|
|
|
$this->assertEquals(1, $body['count']);
|
2018-01-05 09:33:23 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
public function testAcarsRoutePost()
|
|
|
|
{
|
2018-02-21 02:59:49 +08:00
|
|
|
$pirep = $this->createPirep()->toArray();
|
2018-01-05 09:33:23 +08:00
|
|
|
|
|
|
|
$uri = '/api/pireps/prefile';
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $pirep);
|
2018-02-11 07:34:46 +08:00
|
|
|
$pirep_id = $response->json()['data']['id'];
|
2017-12-26 08:10:24 +08:00
|
|
|
|
2018-01-05 09:33:23 +08:00
|
|
|
$order = 1;
|
|
|
|
$post_route = [];
|
2018-01-20 21:54:40 +08:00
|
|
|
$route_count = \random_int(2, 10);
|
2018-01-05 09:33:23 +08:00
|
|
|
|
|
|
|
$route = factory(App\Models\Navdata::class, $route_count)->create();
|
2018-03-14 23:34:41 +08:00
|
|
|
foreach ($route as $position) {
|
2018-01-05 09:33:23 +08:00
|
|
|
$post_route[] = [
|
|
|
|
'order' => $order,
|
2018-08-27 00:40:04 +08:00
|
|
|
'id' => $position->id,
|
|
|
|
'name' => $position->id,
|
|
|
|
'lat' => $position->lat,
|
|
|
|
'lon' => $position->lon,
|
2018-01-05 09:33:23 +08:00
|
|
|
];
|
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
$order++;
|
2018-01-05 09:33:23 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/route';
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, ['route' => $post_route]);
|
2018-02-11 08:17:38 +08:00
|
|
|
$response->assertStatus(200)->assertJson(['count' => $route_count]);
|
2018-01-05 09:33:23 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get
|
|
|
|
*/
|
2018-03-14 23:34:41 +08:00
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/route';
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->get($uri);
|
2018-02-11 08:17:38 +08:00
|
|
|
$response->assertStatus(200)->assertJsonCount($route_count, 'data');
|
|
|
|
|
|
|
|
$body = $response->json()['data'];
|
2018-01-05 09:33:23 +08:00
|
|
|
$this->allPointsInRoute($post_route, $body);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Delete and then recheck
|
|
|
|
*/
|
2018-03-14 23:34:41 +08:00
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/route';
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->delete($uri);
|
2017-12-26 08:10:24 +08:00
|
|
|
$response->assertStatus(200);
|
|
|
|
|
2018-03-14 23:34:41 +08:00
|
|
|
$uri = '/api/pireps/'.$pirep_id.'/route';
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->get($uri);
|
2018-02-11 08:17:38 +08:00
|
|
|
$response->assertStatus(200)->assertJsonCount(0, 'data');
|
2017-12-26 08:10:24 +08:00
|
|
|
}
|
2018-01-03 04:31:00 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Try to refile the same PIREP
|
|
|
|
*/
|
|
|
|
public function testDuplicatePirep()
|
|
|
|
{
|
2018-02-21 02:59:49 +08:00
|
|
|
$pirep = $this->createPirep()->toArray();
|
2018-01-05 11:05:26 +08:00
|
|
|
|
2018-01-03 04:31:00 +08:00
|
|
|
$uri = '/api/pireps/prefile';
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $pirep);
|
2018-01-03 04:31:00 +08:00
|
|
|
$response->assertStatus(201);
|
2018-02-11 08:17:38 +08:00
|
|
|
$pirep_id = $response->json()['data']['id'];
|
2018-01-03 04:31:00 +08:00
|
|
|
|
2018-08-27 00:40:04 +08:00
|
|
|
// try readding
|
2018-01-07 02:07:22 +08:00
|
|
|
$response = $this->post($uri, $pirep);
|
2018-01-03 04:31:00 +08:00
|
|
|
$response->assertStatus(200);
|
2018-02-11 08:17:38 +08:00
|
|
|
$dupe_pirep_id = $response->json()['data']['id'];
|
|
|
|
|
|
|
|
$this->assertEquals($pirep_id, $dupe_pirep_id);
|
2018-01-03 04:31:00 +08:00
|
|
|
}
|
2017-12-26 05:19:34 +08:00
|
|
|
}
|