From 08a1e4454144a40bf170f5cb2165e90363c194e9 Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Sat, 9 Jul 2016 13:45:55 +0800 Subject: [PATCH] Update 2016-07-09.13.19 Add project features with TDD Add and fix Payment test --- app/Entities/Payments/PaymentsRepository.php | 2 +- app/Entities/Projects/Feature.php | 17 +++ app/Entities/Projects/FeaturesRepository.php | 6 +- app/Entities/Projects/ProjectsRepository.php | 5 + .../Controllers/Projects/FeaturesController.php | 18 +-- .../Controllers/Projects/ProjectsController.php | 3 +- app/Http/Requests/Features/CreateRequest.php | 36 ++++++ app/Http/Requests/Features/DeleteRequest.php | 34 ++++++ app/Http/Requests/Features/UpdateRequest.php | 36 ++++++ app/Http/routes/projects.php | 4 +- app/Providers/AuthServiceProvider.php | 5 + database/factories/ModelFactory.php | 40 ++++-- resources/lang/id/feature.php | 3 +- resources/views/features/create.blade.php | 17 ++- resources/views/features/delete.blade.php | 25 ++-- resources/views/features/edit.blade.php | 32 +++-- .../views/features/partials/feature-show.blade.php | 18 +++ resources/views/features/show.blade.php | 25 ++-- resources/views/masters/delete.blade.php | 4 +- resources/views/masters/show.blade.php | 2 +- resources/views/payments/index.blade.php | 8 +- resources/views/projects/edit.blade.php | 2 +- resources/views/projects/features.blade.php | 27 ++++- .../views/projects/partials/breadcrumb.blade.php | 2 +- .../views/projects/partials/project-show.blade.php | 2 +- tests/ManageFeaturesTest.php | 135 +++++++++++++++++++++ tests/ManagePaymentsTest.php | 38 ++++++ 27 files changed, 462 insertions(+), 84 deletions(-) create mode 100644 app/Http/Requests/Features/CreateRequest.php create mode 100644 app/Http/Requests/Features/DeleteRequest.php create mode 100644 app/Http/Requests/Features/UpdateRequest.php create mode 100644 resources/views/features/partials/feature-show.blade.php create mode 100644 tests/ManageFeaturesTest.php diff --git a/app/Entities/Payments/PaymentsRepository.php b/app/Entities/Payments/PaymentsRepository.php index 4f957db..ee42f92 100755 --- a/app/Entities/Payments/PaymentsRepository.php +++ b/app/Entities/Payments/PaymentsRepository.php @@ -18,7 +18,7 @@ class PaymentsRepository extends BaseRepository public function getAll($q) { - return $this->model->latest() + return $this->model->orderBy('date','desc') ->paginate($this->_paginate); } } \ No newline at end of file diff --git a/app/Entities/Projects/Feature.php b/app/Entities/Projects/Feature.php index ab7eaa8..5bb4cfa 100755 --- a/app/Entities/Projects/Feature.php +++ b/app/Entities/Projects/Feature.php @@ -3,6 +3,8 @@ namespace App\Entities\Projects; use App\Entities\Projects\FeaturePresenter; +use App\Entities\Projects\Project; +use App\Entities\Users\User; use Illuminate\Database\Eloquent\Model; use Laracasts\Presenter\PresentableTrait; @@ -13,4 +15,19 @@ class Feature extends Model { protected $presenter = FeaturePresenter::class; protected $guarded = ['id','created_at','updated_at']; + public function project() + { + return $this->belongsTo(Project::class, 'project_id'); + } + + public function worker() + { + return $this->belongsTo(User::class, 'worker_id'); + } + + public function tasks() + { + return $this->hasMany(Task::class); + } + } diff --git a/app/Entities/Projects/FeaturesRepository.php b/app/Entities/Projects/FeaturesRepository.php index 5e484bf..c4ff837 100755 --- a/app/Entities/Projects/FeaturesRepository.php +++ b/app/Entities/Projects/FeaturesRepository.php @@ -3,6 +3,7 @@ namespace App\Entities\Projects; use App\Entities\BaseRepository; +use App\Entities\Projects\Project; /** * Features Repository Class @@ -21,10 +22,9 @@ class FeaturesRepository extends BaseRepository return Project::findOrFail($projectId); } - public function create($featureData) + public function createFeature($featureData, $projectId) { - dd($featureData); - $featureData['feature_value'] = $featureData['proposal_value']; + $featureData['project_id'] = $projectId; return $this->storeArray($featureData); } } \ No newline at end of file diff --git a/app/Entities/Projects/ProjectsRepository.php b/app/Entities/Projects/ProjectsRepository.php index 48a2f10..bdc78a7 100755 --- a/app/Entities/Projects/ProjectsRepository.php +++ b/app/Entities/Projects/ProjectsRepository.php @@ -77,4 +77,9 @@ class ProjectsRepository extends BaseRepository return $project->delete(); } + + public function getProjectFeatures($projectId) + { + return Feature::whereProjectId($projectId)->with('worker')->get(); + } } \ No newline at end of file diff --git a/app/Http/Controllers/Projects/FeaturesController.php b/app/Http/Controllers/Projects/FeaturesController.php index 1fd7f54..25d10d7 100755 --- a/app/Http/Controllers/Projects/FeaturesController.php +++ b/app/Http/Controllers/Projects/FeaturesController.php @@ -26,11 +26,11 @@ class FeaturesController extends Controller { return view('features.create',compact('project','workers')); } - public function store(CreateRequest $req) + public function store(CreateRequest $req, $projectId) { - $feature = $this->repo->create($req->except('_token')); + $feature = $this->repo->createFeature($req->except('_token'), $projectId); flash()->success(trans('feature.created')); - return redirect()->route('features.show', $feature->id); + return redirect()->route('projects.features', $feature->project_id); } public function show($featureId) @@ -42,14 +42,15 @@ class FeaturesController extends Controller { public function edit($featureId) { $feature = $this->repo->requireById($featureId); - return view('features.edit',compact('feature')); + $workers = $this->repo->getWorkersList(); + return view('features.edit',compact('feature','workers')); } public function update(UpdateRequest $req, $featureId) { $feature = $this->repo->update($req->except(['_method','_token']), $featureId); flash()->success(trans('feature.updated')); - return redirect()->route('features.edit', $featureId); + return redirect()->route('projects.features', $feature->project_id); } public function delete($featureId) @@ -60,15 +61,18 @@ class FeaturesController extends Controller { public function destroy(DeleteRequest $req, $featureId) { + $feature = $this->repo->requireById($featureId); + $projectId = $feature->project_id; if ($featureId == $req->get('feature_id')) { - $this->repo->delete($featureId); + // $feature->tasks()->delete(); + $feature->delete(); flash()->success(trans('feature.deleted')); } else flash()->error(trans('feature.undeleted')); - return redirect()->route('features.index'); + return redirect()->route('projects.features', $projectId); } public function tasks($featureId) diff --git a/app/Http/Controllers/Projects/ProjectsController.php b/app/Http/Controllers/Projects/ProjectsController.php index 9284492..2c1f472 100755 --- a/app/Http/Controllers/Projects/ProjectsController.php +++ b/app/Http/Controllers/Projects/ProjectsController.php @@ -87,7 +87,8 @@ class ProjectsController extends Controller { public function features($projectId) { $project = $this->repo->requireById($projectId); - return view('projects.features', compact('project')); + $features = $this->repo->getProjectFeatures($projectId); + return view('projects.features', compact('project','features')); } public function payments($projectId) diff --git a/app/Http/Requests/Features/CreateRequest.php b/app/Http/Requests/Features/CreateRequest.php new file mode 100644 index 0000000..1c2cbbb --- /dev/null +++ b/app/Http/Requests/Features/CreateRequest.php @@ -0,0 +1,36 @@ +segment(2)); + return auth()->user()->can('manage_features', $project); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'name' => 'required|max:60', + 'worker_id' => 'required|numeric', + 'price' => 'required|numeric', + 'description' => 'max:255', + ]; + } + +} diff --git a/app/Http/Requests/Features/DeleteRequest.php b/app/Http/Requests/Features/DeleteRequest.php new file mode 100644 index 0000000..4ed539e --- /dev/null +++ b/app/Http/Requests/Features/DeleteRequest.php @@ -0,0 +1,34 @@ +get('project_id')); + return auth()->user()->can('manage_features', $project); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'feature_id' => 'required', + 'project_id' => 'required', + ]; + } + +} diff --git a/app/Http/Requests/Features/UpdateRequest.php b/app/Http/Requests/Features/UpdateRequest.php new file mode 100644 index 0000000..f03bc7f --- /dev/null +++ b/app/Http/Requests/Features/UpdateRequest.php @@ -0,0 +1,36 @@ +get('project_id')); + return auth()->user()->can('manage_features', $project); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'name' => 'required|max:60', + 'worker_id' => 'required|numeric', + 'price' => 'required|numeric', + 'description' => 'max:255', + ]; + } + +} diff --git a/app/Http/routes/projects.php b/app/Http/routes/projects.php index ecd139c..862e97f 100644 --- a/app/Http/routes/projects.php +++ b/app/Http/routes/projects.php @@ -13,5 +13,7 @@ Route::group(['middleware' => ['web','role:admin'], 'namespace' => 'Projects'], * Features Routes */ Route::get('projects/{id}/features/create', ['as'=>'features.create', 'uses'=>'FeaturesController@create']); - Route::resource('features','FeaturesController',['except' => ['index','create']]); + Route::post('projects/{id}/features', ['as'=>'features.store', 'uses'=>'FeaturesController@store']); + Route::get('features/{id}/delete', ['as'=>'features.delete', 'uses'=>'FeaturesController@delete']); + Route::resource('features','FeaturesController',['except' => ['index','create','store']]); }); diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 7941c57..c659e00 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -34,6 +34,11 @@ class AuthServiceProvider extends ServiceProvider }); } + $gate->define('manage_features', function ($user, $project) { + return $user->id == $project->owner_id; + }); + + } /** diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index c3f8680..7b6ffb0 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -1,6 +1,7 @@ define(User::class, function (Faker\Generator $faker) { }); $factory->define(Project::class, function (Faker\Generator $faker) { + $proposalDate = $faker->dateTimeBetween('-1 year', '-1 month')->format('Y-m-d'); $startDate = Carbon::parse($proposalDate)->addDays(10); $endDate = $startDate->addDays(rand(1,13) * 7); + $owner = factory(User::class)->create(); + $owner->assignRole('admin'); $customer = factory(User::class)->create(); $customer->assignRole('customer'); return [ - 'name' => $faker->sentence, + 'name' => $faker->sentence(3), 'description' => $faker->paragraph, 'proposal_date' => $proposalDate, 'start_date' => $startDate->format('Y-m-d'), @@ -42,29 +46,28 @@ $factory->define(Project::class, function (Faker\Generator $faker) { 'project_value' => $projectValue = rand(1,10) * 500000, 'proposal_value' => $projectValue, 'status_id' => rand(1,6), + 'owner_id' => $owner->id, 'customer_id' => $customer->id ]; }); $factory->define(Payment::class, function (Faker\Generator $faker) { - $projectId = factory(Project::class)->create()->id; - - $customer = factory(User::class)->create(); - $customer->assignRole('customer'); - $customerId = $customer->id; return [ - 'project_id' => $projectId, + 'project_id' => function() { + return factory(Project::class)->create()->id; + }, 'amount' => rand(1,5) * 500000, 'type' => rand(0,1), 'date' => $faker->dateTimeBetween('-1 year', '-1 month')->format('Y-m-d'), 'description' => $faker->paragraph, - 'customer_id' => $customerId, + 'customer_id' => function() { + return factory(User::class)->create()->id; + }, ]; }); $factory->define(Subscription::class, function (Faker\Generator $faker) { - $projectId = factory(Project::class)->create()->id; $customer = factory(User::class)->create(); $customer->assignRole('customer'); @@ -72,7 +75,9 @@ $factory->define(Subscription::class, function (Faker\Generator $faker) { $startDate = Carbon::parse($faker->dateTimeBetween('-1 year', '-1 month')->format('Y-m-d')); return [ - 'project_id' => $projectId, + 'project_id' => function() { + return factory(Project::class)->create()->id; + }, 'domain_name' => 'www.' . str_random(10) . '.com', 'domain_price' => 125000, 'epp_code' => str_random(10), @@ -83,4 +88,19 @@ $factory->define(Subscription::class, function (Faker\Generator $faker) { 'remark' => $faker->paragraph, 'customer_id' => $customerId, ]; +}); + +$factory->define(Feature::class, function (Faker\Generator $faker) { + + return [ + 'project_id' => function() { + return factory(Project::class)->create()->id; + }, + 'name' => $faker->sentence(3), + 'price' => rand(1,10) * 100000, + 'description' => $faker->paragraph, + 'worker_id' => function() { + return factory(User::class)->create()->id; + }, + ]; }); \ No newline at end of file diff --git a/resources/lang/id/feature.php b/resources/lang/id/feature.php index 3a3bce5..fd51704 100644 --- a/resources/lang/id/feature.php +++ b/resources/lang/id/feature.php @@ -6,7 +6,7 @@ return [ 'name' => 'Nama Fitur', 'create' => 'Input Fitur Baru', 'created' => 'Input Fitur baru telah berhasil.', - 'show' => 'Edit Fitur', + 'show' => 'Detail Fitur', 'edit' => 'Edit Fitur', 'update' => 'Update Fitur', 'updated' => 'Update data Fitur telah berhasil.', @@ -21,6 +21,7 @@ return [ 'progress' => 'Progress', 'worker' => 'Pekerja', 'price' => 'Nilai Fitur', + 'price_total' => 'Nilai Fitur Total', 'empty' => 'Belum ada Fitur', 'back_to_index' => 'Kembali ke daftar Fitur', ]; \ No newline at end of file diff --git a/resources/views/features/create.blade.php b/resources/views/features/create.blade.php index 9519e6d..7d017d3 100755 --- a/resources/views/features/create.blade.php +++ b/resources/views/features/create.blade.php @@ -6,15 +6,21 @@ @include('projects.partials.breadcrumb',['title' => trans('feature.create')])
-
- {!! Form::open(['route'=>'features.store']) !!} +
+ {!! Form::open(['route'=>['features.store', $project->id]]) !!}

{{ trans('feature.create') }}

{!! FormField::text('name',['label'=> trans('feature.name')]) !!} {!! FormField::textarea('description',['label'=> trans('feature.description')]) !!} - {!! FormField::price('price', ['label'=> trans('feature.price')]) !!} - {!! FormField::select('worker_id', $workers, ['label'=> trans('feature.worker')]) !!} +
+
+ {!! FormField::price('price', ['label'=> trans('feature.price')]) !!} +
+
+ {!! FormField::select('worker_id', $workers, ['label'=> trans('feature.worker'),'value' => 1]) !!} +
+
{!! Form::close() !!}
+
+ @include('projects.partials.project-show') +
@endsection \ No newline at end of file diff --git a/resources/views/features/delete.blade.php b/resources/views/features/delete.blade.php index 41491b0..5d90b78 100755 --- a/resources/views/features/delete.blade.php +++ b/resources/views/features/delete.blade.php @@ -1,28 +1,25 @@ @extends('layouts.app') -@section('title', trans('master.delete')) +@section('title', trans('feature.delete')) @section('content')

- {!! delete_button(['route'=>['masters.destroy',$master->id]], trans('app.delete_confirm_button'), ['class'=>'btn btn-danger'], ['master_id'=>$master->id]) !!} + {!! FormField::delete([ + 'route'=>['features.destroy',$feature->id]], + trans('app.delete_confirm_button'), + ['class'=>'btn btn-danger'], + [ + 'feature_id'=>$feature->id, + 'project_id'=>$feature->project_id, + ]) !!}
{{ trans('app.delete_confirm') }} - {!! link_to_route('masters.show', trans('app.cancel'), [$master->id], ['class' => 'btn btn-default']) !!} + {!! link_to_route('features.show', trans('app.cancel'), [$feature->id], ['class' => 'btn btn-default']) !!}

-
-

{{ trans('master.masters') }} Detail

-
- - - - - -
{{ trans('app.name') }}{{ $master->name }}
{{ trans('app.description') }}{{ $master->description }}
-
-
+ @include('features.partials.feature-show')
@endsection \ No newline at end of file diff --git a/resources/views/features/edit.blade.php b/resources/views/features/edit.blade.php index 6b7c800..8f1a6d1 100755 --- a/resources/views/features/edit.blade.php +++ b/resources/views/features/edit.blade.php @@ -1,26 +1,38 @@ @extends('layouts.app') -@section('title', trans('master.edit')) +@section('title', trans('feature.edit')) @section('content')

-
- {!! Form::model($master, ['route'=>['masters.update', $master->id], 'method' => 'patch']) !!} +
+ {!! Form::model($feature, ['route'=>['features.update', $feature->id], 'method' => 'patch']) !!}
-

{{ $master->name }} {{ trans('master.edit') }}

+

{{ $feature->name }} {{ trans('feature.edit') }}

- {!! FormField::text('name',['label'=> trans('app.name')]) !!} - {!! FormField::textarea('description',['label'=> trans('app.description')]) !!} + {!! FormField::text('name',['label'=> trans('feature.name')]) !!} + {!! FormField::textarea('description',['label'=> trans('feature.description')]) !!} +
+
+ {!! FormField::price('price', ['label'=> trans('feature.price')]) !!} +
+
+ {!! FormField::select('worker_id', $workers, ['label'=> trans('feature.worker'),'value' => 1]) !!} +
+
{!! Form::close() !!}
+
+ @include('projects.partials.project-show', ['project' => $feature->project]) +
@endsection \ No newline at end of file diff --git a/resources/views/features/partials/feature-show.blade.php b/resources/views/features/partials/feature-show.blade.php new file mode 100644 index 0000000..9cec5f4 --- /dev/null +++ b/resources/views/features/partials/feature-show.blade.php @@ -0,0 +1,18 @@ +
+

{{ trans('feature.show') }}

+
+ + + + + + + + +
{{ trans('feature.name') }}{{ $feature->name }}
{{ trans('feature.price') }}{{ formatRp($feature->price) }}
{{ trans('feature.tasks_count') }}10
{{ trans('feature.progress') }}100%
{{ trans('feature.worker') }}{{ $feature->worker->name }}
+
+ +
\ No newline at end of file diff --git a/resources/views/features/show.blade.php b/resources/views/features/show.blade.php index 040e9b4..029c83e 100755 --- a/resources/views/features/show.blade.php +++ b/resources/views/features/show.blade.php @@ -1,26 +1,15 @@ @extends('layouts.app') -@section('title', trans('master.show')) +@section('title', trans('feature.show')) @section('content') -

{{ $master->name }} {{ trans('master.show') }}

+

{{ $feature->name }} {{ trans('feature.show') }}

-
-
-

{{ trans('master.show') }}

-
- - - - - -
{{ trans('app.name') }}{{ $master->name }}
{{ trans('app.description') }}{{ $master->description }}
-
- -
+
+ @include('features.partials.feature-show') +
+
+ @include('projects.partials.project-show', ['project' => $feature->project])
@endsection \ No newline at end of file diff --git a/resources/views/masters/delete.blade.php b/resources/views/masters/delete.blade.php index 41491b0..8290daa 100755 --- a/resources/views/masters/delete.blade.php +++ b/resources/views/masters/delete.blade.php @@ -13,11 +13,11 @@
-

{{ trans('master.masters') }} Detail

+

{{ trans('master.show') }}

- +
{{ trans('app.name') }}{{ $master->name }}
{{ trans('master.name') }}{{ $master->name }}
{{ trans('app.description') }}{{ $master->description }}
diff --git a/resources/views/masters/show.blade.php b/resources/views/masters/show.blade.php index 040e9b4..3a93991 100755 --- a/resources/views/masters/show.blade.php +++ b/resources/views/masters/show.blade.php @@ -11,7 +11,7 @@
- +
{{ trans('app.name') }}{{ $master->name }}
{{ trans('master.name') }}{{ $master->name }}
{{ trans('app.description') }}{{ $master->description }}
diff --git a/resources/views/payments/index.blade.php b/resources/views/payments/index.blade.php index 8e9c61e..80a9042 100755 --- a/resources/views/payments/index.blade.php +++ b/resources/views/payments/index.blade.php @@ -20,8 +20,9 @@ {{ trans('payment.project') }} {{ trans('app.date') }} {{ trans('payment.amount') }} - {{ trans('payment.description') }} - {{ trans('app.action') }} + {{ trans('payment.description') }} + {{ trans('payment.customer') }} + {{ trans('app.action') }} @forelse($payments as $key => $payment) @@ -31,8 +32,9 @@ {{ $payment->date }} {{ formatRp($payment->amount) }} {{ $payment->description }} + {{ $payment->customer->name }} - {!! link_to_route('payments.show',trans('app.show'),[$payment->id],['class'=>'btn btn-info btn-xs']) !!} + {!! link_to_route('payments.show','Lihat',[$payment->id],['class'=>'btn btn-info btn-xs']) !!} {!! link_to_route('payments.edit',trans('app.edit'),[$payment->id],['class'=>'btn btn-warning btn-xs']) !!} diff --git a/resources/views/projects/edit.blade.php b/resources/views/projects/edit.blade.php index d660dee..983ffef 100755 --- a/resources/views/projects/edit.blade.php +++ b/resources/views/projects/edit.blade.php @@ -46,7 +46,7 @@
diff --git a/resources/views/projects/features.blade.php b/resources/views/projects/features.blade.php index 8f799d7..2b26faa 100755 --- a/resources/views/projects/features.blade.php +++ b/resources/views/projects/features.blade.php @@ -14,20 +14,37 @@ {{ trans('app.table_no') }} {{ trans('feature.name') }} - {{ trans('feature.tasks_count') }} - {{ trans('feature.progress') }} + {{ trans('feature.tasks_count') }} + {{ trans('feature.progress') }} + {{ trans('feature.price') }} + {{ trans('feature.worker') }} {{ trans('app.action') }} - @forelse($project->features as $feature) + @forelse($features as $key => $feature) + {{ 1 + $key }} {{ $feature->name }} + {{ $feature->tasks_count = rand(3, 7) }} + {{ $feature->progress = rand(70, 100) }} % + {{ formatRp($feature->price) }} + {{ $feature->worker->name }} + {!! link_to_route('features.show', trans('app.show'),[$feature->id],['class' => 'btn btn-info btn-xs']) !!} @empty - {{ trans('feature.empty') }} + {{ trans('feature.empty') }} @endforelse - {!! html_link_to_route('features.create', trans('feature.create'), [$project->id], ['class' => 'btn btn-primary','icon' => 'plus']) !!} + + + Total + {{ $features->sum('tasks_count') }} + {{ formatDecimal($features->avg('progress')) }} % + {{ formatRp($features->sum('price')) }} + + + {!! html_link_to_route('features.create', trans('feature.create'), [$project->id], ['class' => 'btn btn-primary','icon' => 'plus']) !!} +
@endsection \ No newline at end of file diff --git a/resources/views/projects/partials/breadcrumb.blade.php b/resources/views/projects/partials/breadcrumb.blade.php index df69945..b74e08c 100644 --- a/resources/views/projects/partials/breadcrumb.blade.php +++ b/resources/views/projects/partials/breadcrumb.blade.php @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/resources/views/projects/partials/project-show.blade.php b/resources/views/projects/partials/project-show.blade.php index ca2bd81..9fb0883 100644 --- a/resources/views/projects/partials/project-show.blade.php +++ b/resources/views/projects/partials/project-show.blade.php @@ -24,6 +24,6 @@
\ No newline at end of file diff --git a/tests/ManageFeaturesTest.php b/tests/ManageFeaturesTest.php new file mode 100644 index 0000000..f86173c --- /dev/null +++ b/tests/ManageFeaturesTest.php @@ -0,0 +1,135 @@ +create(); + $user->assignRole('admin'); + $this->actingAs($user); + + $project = factory(Project::class)->create(['owner_id' => $user->id]); + + $worker = factory(User::class)->create(); + $worker->assignRole('worker'); + + $this->visit('projects/' . $project->id . '/features'); + $this->seePageIs('projects/' . $project->id . '/features'); + $this->see(trans('project.features')); + $this->click(trans('feature.create')); + $this->seePageIs('projects/' . $project->id . '/features/create'); + + // Fill Form + $this->type('Nama Fitur Baru','name'); + $this->type(100000,'price'); + $this->select($worker->id, 'worker_id'); + $this->type('Similique, eligendi fuga animi? Ipsam magnam laboriosam distinctio officia facere sapiente eius corporis','description'); + $this->press(trans('feature.create')); + + $this->seePageIs('projects/' . $project->id . '/features'); + $this->see(trans('feature.created')); + $this->seeInDatabase('features', [ + 'name' => 'Nama Fitur Baru', + 'price' => 100000, + 'worker_id' => $worker->id, + 'project_id' => $project->id + ]); + } + + /** @test */ + public function admin_can_edit_feature_data() + { + $user = factory(User::class, 3)->create(); + $user[0]->assignRole('admin'); + $user[1]->assignRole('worker'); + $user[2]->assignRole('worker'); + $this->actingAs($user[0]); + + $project = factory(Project::class)->create(['owner_id' => $user[0]->id]); + + $feature = factory(Feature::class)->create(['worker_id' => $user[1]->id, 'project_id' => $project->id]); + + $this->visit('features/' . $feature->id . '/edit'); + $this->seePageIs('features/' . $feature->id . '/edit'); + + // Fill Form + $this->type('Nama Fitur Edit','name'); + $this->type(33333,'price'); + $this->select($user[2]->id,'worker_id'); + $this->press(trans('feature.update')); + + $this->seePageIs('projects/' . $project->id . '/features'); + $this->see(trans('feature.updated')); + $this->seeInDatabase('features', [ + 'name' => 'Nama Fitur Edit', + 'price' => 33333, + 'worker_id' => $user[2]->id, + 'project_id' => $project->id + ]); + } + + /** @test */ + public function admin_can_delete_a_feature() + { + $user = factory(User::class)->create(); + $user->assignRole('admin'); + $this->actingAs($user); + + $project = factory(Project::class)->create(['owner_id' => $user->id]); + $feature = factory(Feature::class)->create(['project_id' => $project->id]); + + $this->visit('projects/' . $feature->project_id . '/features'); + $this->click(trans('app.show')); + $this->click(trans('app.edit')); + $this->click(trans('feature.delete')); + $this->press(trans('app.delete_confirm_button')); + $this->seePageIs('projects/' . $project->id . '/features'); + $this->see(trans('feature.deleted')); + } + + /** @test */ + public function admin_can_see_a_feature() + { + $user = factory(User::class)->create(); + $user->assignRole('admin'); + $this->actingAs($user); + + $project = factory(Project::class)->create(['owner_id' => $user->id]); + $feature = factory(Feature::class)->create(['project_id' => $project->id]); + + $this->visit('projects/' . $project->id . '/features'); + $this->click(trans('app.show')); + $this->seePageIs('features/' . $feature->id); + $this->see(trans('feature.show')); + $this->see($feature->name); + $this->see(formatRp($feature->price)); + $this->see($feature->worker->name); + } + + /** @test */ + public function admin_can_see_all_features() + { + $user = factory(User::class)->create(); + $user->assignRole('admin'); + $this->actingAs($user); + + $project = factory(Project::class)->create(['owner_id' => $user->id]); + $features = factory(Feature::class, 10)->create(['project_id' => $project->id]); + $this->assertEquals(10, $features->count()); + + $this->visit('projects/' . $project->id . '/features'); + $this->see($features[1]->name); + $this->see($features[1]->worker->name); + $this->see(formatRp($features[1]->price)); + } +} diff --git a/tests/ManagePaymentsTest.php b/tests/ManagePaymentsTest.php index 1166b43..505e365 100644 --- a/tests/ManagePaymentsTest.php +++ b/tests/ManagePaymentsTest.php @@ -87,4 +87,42 @@ class ManagePaymentsTest extends TestCase $this->seePageIs('payments'); $this->see(trans('payment.deleted')); } + + /** @test */ + public function admin_can_see_a_payment() + { + $user = factory(User::class)->create(); + $user->assignRole('admin'); + $this->actingAs($user); + + $project = factory(Project::class)->create(['owner_id' => $user->id]); + $payment = factory(Payment::class)->create(['project_id' => $project->id]); + + $this->visit('/payments'); + $this->click('Lihat'); + $this->seePageIs('payments/' . $payment->id); + $this->see(trans('payment.show')); + $this->see($payment->date); + $this->see(formatRp($payment->amount)); + $this->see($payment->description); + $this->see($payment->customer->name); + } + + /** @test */ + public function admin_can_see_all_payments() + { + $user = factory(User::class)->create(); + $user->assignRole('admin'); + $this->actingAs($user); + + $payments = factory(Payment::class, 10)->create(); + $this->assertEquals(10, $payments->count()); + + $this->visit('/payments'); + $this->see($payments[9]->project->name); + $this->see($payments[9]->date); + $this->see(formatRp($payments[9]->amount)); + $this->see($payments[9]->description); + $this->see($payments[9]->customer->name); + } }