diff --git a/Makefile b/Makefile index 007d308a..73e8a6d3 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,11 @@ db: sqlite3 database/testing.sqlite "" php artisan migrate +unittest-db: + rm -f database/unittest.sqlite + sqlite3 database/unittest.sqlite "" + php artisan migrate:refresh --seed --env unittest + reset-db: rm database/testing.sqlite make db diff --git a/app/Http/Controllers/Admin/AircraftClassController.php b/app/Http/Controllers/Admin/AircraftClassController.php new file mode 100644 index 00000000..781f7218 --- /dev/null +++ b/app/Http/Controllers/Admin/AircraftClassController.php @@ -0,0 +1,155 @@ +aircraftClassRepository = $aircraftClassRepo; + } + + /** + * Display a listing of the AircraftClass. + * + * @param Request $request + * @return Response + */ + public function index(Request $request) + { + $this->aircraftClassRepository->pushCriteria(new RequestCriteria($request)); + $aircraftClasses = $this->aircraftClassRepository->all(); + + return view('admin.aircraft_classes.index') + ->with('aircraftClasses', $aircraftClasses); + } + + /** + * Show the form for creating a new AircraftClass. + * + * @return Response + */ + public function create() + { + return view('admin.aircraft_classes.create'); + } + + /** + * Store a newly created AircraftClass in storage. + * + * @param CreateAircraftClassRequest $request + * + * @return Response + */ + public function store(CreateAircraftClassRequest $request) + { + $input = $request->all(); + + $aircraftClass = $this->aircraftClassRepository->create($input); + + Flash::success('Aircraft Class saved successfully.'); + + return redirect(route('admin.aircraftClasses.index')); + } + + /** + * Display the specified AircraftClass. + * + * @param int $id + * + * @return Response + */ + public function show($id) + { + $aircraftClass = $this->aircraftClassRepository->findWithoutFail($id); + + if (empty($aircraftClass)) { + Flash::error('Aircraft Class not found'); + + return redirect(route('admin.aircraftClasses.index')); + } + + return view('admin.aircraft_classes.show')->with('aircraftClass', $aircraftClass); + } + + /** + * Show the form for editing the specified AircraftClass. + * + * @param int $id + * + * @return Response + */ + public function edit($id) + { + $aircraftClass = $this->aircraftClassRepository->findWithoutFail($id); + + if (empty($aircraftClass)) { + Flash::error('Aircraft Class not found'); + + return redirect(route('admin.aircraftClasses.index')); + } + + return view('admin.aircraft_classes.edit')->with('aircraftClass', $aircraftClass); + } + + /** + * Update the specified AircraftClass in storage. + * + * @param int $id + * @param UpdateAircraftClassRequest $request + * + * @return Response + */ + public function update($id, UpdateAircraftClassRequest $request) + { + $aircraftClass = $this->aircraftClassRepository->findWithoutFail($id); + + if (empty($aircraftClass)) { + Flash::error('Aircraft Class not found'); + + return redirect(route('admin.aircraftClasses.index')); + } + + $aircraftClass = $this->aircraftClassRepository->update($request->all(), $id); + + Flash::success('Aircraft Class updated successfully.'); + + return redirect(route('admin.aircraftClasses.index')); + } + + /** + * Remove the specified AircraftClass from storage. + * + * @param int $id + * + * @return Response + */ + public function destroy($id) + { + $aircraftClass = $this->aircraftClassRepository->findWithoutFail($id); + + if (empty($aircraftClass)) { + Flash::error('Aircraft Class not found'); + + return redirect(route('admin.aircraftClasses.index')); + } + + $this->aircraftClassRepository->delete($id); + + Flash::success('Aircraft Class deleted successfully.'); + + return redirect(route('admin.aircraftClasses.index')); + } +} diff --git a/app/Http/Requests/CreateAircraftClassRequest.php b/app/Http/Requests/CreateAircraftClassRequest.php new file mode 100644 index 00000000..4ca0a397 --- /dev/null +++ b/app/Http/Requests/CreateAircraftClassRequest.php @@ -0,0 +1,30 @@ + 'required', 'full_name' => 'required', 'registration' => 'required', + 'active' => 'default:1' ]; + + /** + * foreign key + */ + public function class() + { + return $this->belongsTo( + 'App\Models\AircraftClass', + 'aircraft_class_id' + ); + } } diff --git a/app/Models/AircraftClass.php b/app/Models/AircraftClass.php new file mode 100644 index 00000000..4afd5373 --- /dev/null +++ b/app/Models/AircraftClass.php @@ -0,0 +1,47 @@ + 'string', + 'name' => 'string', + 'notes' => 'string' + ]; + + /** + * Validation rules + * + * @var array + */ + public static $rules = [ + 'code' => 'required', + 'name' => 'required' + ]; +} diff --git a/app/Repositories/AircraftClassRepository.php b/app/Repositories/AircraftClassRepository.php new file mode 100644 index 00000000..dbd104bc --- /dev/null +++ b/app/Repositories/AircraftClassRepository.php @@ -0,0 +1,26 @@ + [ - 'testing' => [ - 'driver' => 'sqlite', - 'database' => database_path('testing.sqlite'), - 'prefix' => '', - ], - 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), @@ -66,6 +60,24 @@ return [ 'engine' => null, ], + 'local' => [ + 'driver' => 'sqlite', + 'database' => database_path('testing.sqlite'), + 'prefix' => '', + ], + + 'unittest' => [ + 'driver' => 'sqlite', + 'database' => database_path('unittest.sqlite'), + 'prefix' => '', + ], + + 'testing' => [ + 'driver' => 'sqlite', + 'database' => ':memory:', + 'prefix' => '', + ], + ], /* diff --git a/database/factories/AircraftClassFactory.php b/database/factories/AircraftClassFactory.php new file mode 100644 index 00000000..cb943f06 --- /dev/null +++ b/database/factories/AircraftClassFactory.php @@ -0,0 +1,10 @@ +define(App\Models\AircraftClass::class, function (Faker\Generator $faker) { + return [ + 'id' => 1, + 'code' => 'H', + 'name' => 'Heavy', + 'notes' => 'Heavy aircraft', + ]; +}); diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index 59951643..e376e12e 100755 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -1,16 +1,5 @@ define(App\User::class, function (Faker\Generator $faker) { static $password; diff --git a/database/migrations/2017_06_09_010621_create_aircrafts_table.php b/database/migrations/2017_06_09_010621_create_aircrafts_table.php index 8dcb6629..bd0496e8 100644 --- a/database/migrations/2017_06_09_010621_create_aircrafts_table.php +++ b/database/migrations/2017_06_09_010621_create_aircrafts_table.php @@ -9,18 +9,37 @@ class CreateAircraftsTable extends Migration { Schema::create('aircraft', function (Blueprint $table) { $table->increments('id'); + $table->integer('aircraft_class_id')->unsigned(); $table->string('icao'); $table->string('name'); $table->string('full_name')->nullable(); $table->string('registration')->nullable(); - $table->boolean('active'); + $table->string('tail_number')->nullable(); + $table->string('cargo_capacity')->nullable(); + $table->string('fuel_capacity')->nullable(); + $table->boolean('active')->default(true); $table->timestamps(); $table->softDeletes(); + + $table->index('icao'); + $table->unique('registration'); + }); + + Schema::create('aircraft_classes', function (Blueprint $table) { + $table->increments('id'); + $table->string('code'); + $table->string('name'); + $table->string('notes')->nullable(); + $table->timestamps(); + $table->softDeletes(); + + $table->index('code'); }); } public function down() { Schema::drop('aircraft'); + Schema::drop('aircraft_classes'); } } diff --git a/database/schema/aircraft.json b/database/schema/aircraft.json deleted file mode 100644 index d14fce49..00000000 --- a/database/schema/aircraft.json +++ /dev/null @@ -1,56 +0,0 @@ -[ - { - "name": "id", - "dbType": "increments", - "htmlType": "", - "validations": "", - "searchable": false, - "fillable": false, - "primary": true, - "inForm": false, - "inIndex": false - }, - { - "name": "icao", - "dbType": "string", - "htmlType": "text", - "validations": "required|max:4", - "searchable": true - }, - { - "name": "name", - "dbType": "string", - "htmlType": "text", - "validations": "required", - "searchable": true - }, - { - "name": "enabled", - "dbType": "boolean", - "htmlType": "checkbox", - "validations": "", - "searchable": false - }, - { - "name": "created_at", - "dbType": "timestamp", - "htmlType": "", - "validations": "", - "searchable": false, - "fillable": false, - "primary": false, - "inForm": false, - "inIndex": false - }, - { - "name": "updated_at", - "dbType": "timestamp", - "htmlType": "", - "validations": "", - "searchable": false, - "fillable": false, - "primary": false, - "inForm": false, - "inIndex": false - } -] diff --git a/database/schema/airlines.json b/database/schema/airlines.json deleted file mode 100644 index 3af8026c..00000000 --- a/database/schema/airlines.json +++ /dev/null @@ -1,56 +0,0 @@ -[ - { - "name": "id", - "dbType": "increments", - "htmlType": "", - "validations": "", - "searchable": false, - "fillable": false, - "primary": true, - "inForm": false, - "inIndex": false - }, - { - "name": "code", - "dbType": "string", - "htmlType": "text", - "validations": "required", - "searchable": true - }, - { - "name": "name", - "dbType": "string", - "htmlType": "text", - "validations": "required", - "searchable": true - }, - { - "name": "enabled", - "dbType": "boolean", - "htmlType": "checkbox", - "validations": "", - "searchable": false - }, - { - "name": "created_at", - "dbType": "timestamp", - "htmlType": "", - "validations": "", - "searchable": false, - "fillable": false, - "primary": false, - "inForm": false, - "inIndex": false - }, - { - "name": "updated_at", - "dbType": "timestamp", - "htmlType": "", - "validations": "", - "searchable": false, - "fillable": false, - "primary": false, - "inForm": false, - "inIndex": false - } -] diff --git a/database/seeds/AircraftClassesSeeder.php b/database/seeds/AircraftClassesSeeder.php new file mode 100644 index 00000000..f0f86634 --- /dev/null +++ b/database/seeds/AircraftClassesSeeder.php @@ -0,0 +1,18 @@ +call(UsersTableSeeder::class); +// $this->call(AircraftClassesSeeder::class); } } diff --git a/phpunit.xml b/phpunit.xml index d06de2e8..126811b7 100755 --- a/phpunit.xml +++ b/phpunit.xml @@ -22,6 +22,7 @@ + diff --git a/public/img/bg.jpg b/public/img/bg.jpg new file mode 100644 index 00000000..f1aebb79 Binary files /dev/null and b/public/img/bg.jpg differ diff --git a/public/img/bg2.jpg b/public/img/bg2.jpg new file mode 100644 index 00000000..1595e8f6 Binary files /dev/null and b/public/img/bg2.jpg differ diff --git a/resources/views/admin/aircraft_classes/create.blade.php b/resources/views/admin/aircraft_classes/create.blade.php new file mode 100644 index 00000000..820e9e5e --- /dev/null +++ b/resources/views/admin/aircraft_classes/create.blade.php @@ -0,0 +1,24 @@ +@extends('admin.app') + +@section('content') +
+

+ Aircraft Classes +

+
+
+ @include('adminlte-templates::common.errors') +
+ +
+
+ {!! Form::open(['route' => 'admin.aircraftClasses.store']) !!} + + @include('admin.aircraft_classes.fields') + + {!! Form::close() !!} +
+
+
+
+@endsection diff --git a/resources/views/admin/aircraft_classes/edit.blade.php b/resources/views/admin/aircraft_classes/edit.blade.php new file mode 100644 index 00000000..f4e33f04 --- /dev/null +++ b/resources/views/admin/aircraft_classes/edit.blade.php @@ -0,0 +1,23 @@ +@extends('layouts.app') + +@section('content') +
+

+ Aircraft Class +

+
+
+ @include('adminlte-templates::common.errors') +
+
+
+ {!! Form::model($aircraftClass, ['route' => ['admin.aircraftClasses.update', $aircraftClass->id], 'method' => 'patch']) !!} + + @include('admin.aircraft_classes.fields') + + {!! Form::close() !!} +
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/admin/aircraft_classes/fields.blade.php b/resources/views/admin/aircraft_classes/fields.blade.php new file mode 100644 index 00000000..5a6cf041 --- /dev/null +++ b/resources/views/admin/aircraft_classes/fields.blade.php @@ -0,0 +1,7 @@ + + + +
+ {!! Form::submit('Save', ['class' => 'btn btn-primary']) !!} + Cancel +
diff --git a/resources/views/admin/aircraft_classes/index.blade.php b/resources/views/admin/aircraft_classes/index.blade.php new file mode 100644 index 00000000..86905a4e --- /dev/null +++ b/resources/views/admin/aircraft_classes/index.blade.php @@ -0,0 +1,23 @@ +@extends('layouts.app') + +@section('content') +
+

Aircraft Classes

+

+ Add New +

+
+
+
+ + @include('flash::message') + +
+
+
+ @include('admin.aircraft_classes.table') +
+
+
+@endsection + diff --git a/resources/views/admin/aircraft_classes/show.blade.php b/resources/views/admin/aircraft_classes/show.blade.php new file mode 100644 index 00000000..1e7edc24 --- /dev/null +++ b/resources/views/admin/aircraft_classes/show.blade.php @@ -0,0 +1,19 @@ +@extends('layouts.app') + +@section('content') +
+

+ Aircraft Class +

+
+
+
+
+
+ @include('admin.aircraft_classes.show_fields') + Back +
+
+
+
+@endsection diff --git a/resources/views/admin/aircraft_classes/show_fields.blade.php b/resources/views/admin/aircraft_classes/show_fields.blade.php new file mode 100644 index 00000000..0c6328ed --- /dev/null +++ b/resources/views/admin/aircraft_classes/show_fields.blade.php @@ -0,0 +1,36 @@ + +
+ {!! Form::label('id', 'Id:') !!} +

{!! $aircraftClass->id !!}

+
+ + +
+ {!! Form::label('class', 'Class:') !!} +

{!! $aircraftClass->class !!}

+
+ + +
+ {!! Form::label('name', 'Name:') !!} +

{!! $aircraftClass->name !!}

+
+ + +
+ {!! Form::label('notes', 'Notes:') !!} +

{!! $aircraftClass->notes !!}

+
+ + +
+ {!! Form::label('created_at', 'Created At:') !!} +

{!! $aircraftClass->created_at !!}

+
+ + +
+ {!! Form::label('updated_at', 'Updated At:') !!} +

{!! $aircraftClass->updated_at !!}

+
+ diff --git a/resources/views/admin/aircraft_classes/table.blade.php b/resources/views/admin/aircraft_classes/table.blade.php new file mode 100644 index 00000000..b7228f95 --- /dev/null +++ b/resources/views/admin/aircraft_classes/table.blade.php @@ -0,0 +1,26 @@ + + + + + + + + + @foreach($aircraftClasses as $aircraftClass) + + + + + + + @endforeach + +
ClassNameNotesAction
{!! $aircraftClass->class !!}{!! $aircraftClass->name !!}{!! $aircraftClass->notes !!} + {!! Form::open(['route' => ['admin.aircraftClasses.destroy', $aircraftClass->id], 'method' => 'delete']) !!} +
+ + + {!! Form::button('', ['type' => 'submit', 'class' => 'btn btn-danger btn-xs', 'onclick' => "return confirm('Are you sure?')"]) !!} +
+ {!! Form::close() !!} +
\ No newline at end of file diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index 9eaf5d25..57272079 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -5,7 +5,7 @@ - Laravel + phpvms4 @@ -19,6 +19,11 @@ font-weight: 100; height: 100vh; margin: 0; + background: url(img/bg2.jpg) no-repeat center center fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; } .full-height { diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php new file mode 100644 index 00000000..9f5346fb --- /dev/null +++ b/resources/views/layouts/app.blade.php @@ -0,0 +1,87 @@ + + + + + + + + + + + {{ config('app.name', 'Laravel') }} + + + + + + + + +
+ + + @yield('content') +
+ + + + + diff --git a/routes/admin.php b/routes/admin.php index 2bbd90ed..d4c0eb8c 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -14,4 +14,5 @@ Route::group([ ], function () { Route::resource('airlines', 'AirlinesController'); Route::resource('aircraft', 'AircraftController'); + Route::resource('aircraftclasses', 'AircraftClassController'); }); diff --git a/routes/web.php b/routes/web.php index 1efb7f22..9d75bb12 100755 --- a/routes/web.php +++ b/routes/web.php @@ -24,3 +24,13 @@ Route::group([ Route::resource('dashboard', 'DashboardController'); }); + + +Route::get('admin/aircraftClasses', ['as'=> 'admin.aircraftClasses.index', 'uses' => 'AircraftClassController@index']); +Route::post('admin/aircraftClasses', ['as'=> 'admin.aircraftClasses.store', 'uses' => 'AircraftClassController@store']); +Route::get('admin/aircraftClasses/create', ['as'=> 'admin.aircraftClasses.create', 'uses' => 'AircraftClassController@create']); +Route::put('admin/aircraftClasses/{aircraftClasses}', ['as'=> 'admin.aircraftClasses.update', 'uses' => 'AircraftClassController@update']); +Route::patch('admin/aircraftClasses/{aircraftClasses}', ['as'=> 'admin.aircraftClasses.update', 'uses' => 'AircraftClassController@update']); +Route::delete('admin/aircraftClasses/{aircraftClasses}', ['as'=> 'admin.aircraftClasses.destroy', 'uses' => 'AircraftClassController@destroy']); +Route::get('admin/aircraftClasses/{aircraftClasses}', ['as'=> 'admin.aircraftClasses.show', 'uses' => 'AircraftClassController@show']); +Route::get('admin/aircraftClasses/{aircraftClasses}/edit', ['as'=> 'admin.aircraftClasses.edit', 'uses' => 'AircraftClassController@edit']); diff --git a/tests/AircraftTest.php b/tests/AircraftTest.php index b95a7eb5..c717db92 100644 --- a/tests/AircraftTest.php +++ b/tests/AircraftTest.php @@ -1,26 +1,33 @@ repo = $this->createRepository('AircraftRepository'); + $this->aircraft = $this->createRepository('AircraftRepository'); + $this->aircraft_class = $this->createRepository('AircraftClassRepository'); } - /** - * A basic test example. - * - * @return void - */ - public function testRepository() + + public function testAircraftClasses() { - print_r($this->repo->model()); + factory(App\Models\AircraftClass::class)->create(); + + $this->aircraft->create([ + 'aircraft_class_id' => 1, + 'icao' => 'B744', + 'name' => 'Boeing 747', + ]); + + $aircraft = App\Models\Aircraft::where('icao', 'B744')->first(); + $this->assertEquals('B744', $aircraft->icao, 'ICAO matching'); + $this->assertEquals('H', $aircraft->class->code, 'Check belongsTo relationship'); } } diff --git a/tests/TestCase.php b/tests/TestCase.php index 219e0299..7912b95d 100755 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -9,11 +9,25 @@ abstract class TestCase extends Illuminate\Foundation\Testing\TestCase */ protected $app; protected $baseUrl = 'http://localhost'; + protected $connectionsToTransact = ['testing']; public function __construct($name = null, array $data = [], $dataName = '') { parent::__construct($name, $data, $dataName); } + protected function reset_db(){ + exec('make -f ' . __DIR__ . '/../Makefile unittest-db'); + } + + public function setUp() { + parent::setUp(); + $this->reset_db(); + /* + Artisan::call('migrate'); + Artisan::call('db:seed'); + */ + } + /** * Creates the application. * @@ -23,11 +37,12 @@ abstract class TestCase extends Illuminate\Foundation\Testing\TestCase { $app = require __DIR__.'/../bootstrap/app.php'; $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap(); + //$app['config']->set('database.default','testing'); return $app; } public function createRepository($repo_name) { $app = $this->createApplication(); - return $app->make('App\Repositories\\' + $repo_name); + return $app->make('App\Repositories\\' . $repo_name); } }