From 0d2500fccd6ca1d349d3f2ecefc23969e9a30555 Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Sat, 28 Oct 2017 18:55:37 +0800 Subject: [PATCH] User can update profile data and agency data --- app/Entities/Agencies/Agency.php | 5 ++ app/Entities/Users/User.php | 5 ++ app/Http/Controllers/Users/AgencyController.php | 24 ++++++++ app/Http/Controllers/Users/ProfileController.php | 31 ++++++++++ database/factories/AgencyFactory.php | 15 +++++ resources/views/users/profile/edit.blade.php | 26 +++++++++ routes/web/account.php | 38 +++++++++--- routes/web/pages.php | 6 +- tests/Feature/{ => Users}/ManageUsersTest.php | 2 +- tests/Feature/Users/UserProfileTest.php | 74 ++++++++++++++++++++++++ tests/TestCase.php | 8 +++ tests/Unit/Models/AgencyTest.php | 17 ++++++ tests/Unit/Models/UserTest.php | 21 +++++-- 13 files changed, 255 insertions(+), 17 deletions(-) create mode 100644 app/Http/Controllers/Users/AgencyController.php create mode 100644 app/Http/Controllers/Users/ProfileController.php create mode 100644 database/factories/AgencyFactory.php create mode 100644 resources/views/users/profile/edit.blade.php rename tests/Feature/{ => Users}/ManageUsersTest.php (98%) create mode 100644 tests/Feature/Users/UserProfileTest.php create mode 100644 tests/Unit/Models/AgencyTest.php diff --git a/app/Entities/Agencies/Agency.php b/app/Entities/Agencies/Agency.php index d0eda06..c31ba27 100644 --- a/app/Entities/Agencies/Agency.php +++ b/app/Entities/Agencies/Agency.php @@ -7,4 +7,9 @@ use Illuminate\Database\Eloquent\Model; class Agency extends Model { protected $fillable = ['name', 'email', 'address', 'phone', 'website', 'owner_id']; + + public function owner() + { + return $this->belongsTo('App\Entities\Users\User'); + } } diff --git a/app/Entities/Users/User.php b/app/Entities/Users/User.php index c72d6af..afaba08 100644 --- a/app/Entities/Users/User.php +++ b/app/Entities/Users/User.php @@ -95,4 +95,9 @@ class User extends Authenticatable $q->whereIn('name', $roleNameArray); }); } + + public function agency() + { + return $this->hasOne('App\Entities\Agencies\Agency', 'owner_id'); + } } diff --git a/app/Http/Controllers/Users/AgencyController.php b/app/Http/Controllers/Users/AgencyController.php new file mode 100644 index 0000000..13fd1a4 --- /dev/null +++ b/app/Http/Controllers/Users/AgencyController.php @@ -0,0 +1,24 @@ +user()->agency; + + $agency->name = request('name'); + $agency->email = request('email'); + $agency->website = request('website'); + $agency->address = request('address'); + $agency->phone = request('phone'); + $agency->save(); + + flash(trans('agency.updated'), 'success'); + + return back(); + } +} diff --git a/app/Http/Controllers/Users/ProfileController.php b/app/Http/Controllers/Users/ProfileController.php new file mode 100644 index 0000000..72c9a65 --- /dev/null +++ b/app/Http/Controllers/Users/ProfileController.php @@ -0,0 +1,31 @@ +user(); + } + + public function edit() + { + return view('users.profile.edit'); + } + + public function update() + { + $user = auth()->user(); + + $user->name = request('name'); + $user->email = request('email'); + $user->save(); + + flash(trans('auth.profile_updated'), 'success'); + + return back(); + } +} diff --git a/database/factories/AgencyFactory.php b/database/factories/AgencyFactory.php new file mode 100644 index 0000000..745846e --- /dev/null +++ b/database/factories/AgencyFactory.php @@ -0,0 +1,15 @@ +define(Agency::class, function (Faker $faker) { + return [ + 'name' => $faker->company, + 'email' => $faker->safeEmail, + 'owner_id' => function () { + return factory(User::class)->create()->id; + }, + ]; +}); diff --git a/resources/views/users/profile/edit.blade.php b/resources/views/users/profile/edit.blade.php new file mode 100644 index 0000000..05ecef4 --- /dev/null +++ b/resources/views/users/profile/edit.blade.php @@ -0,0 +1,26 @@ +@extends('layouts.app') + +@section('content') + +
+
+ {{ Form::model(auth()->user(), ['route' => 'users.profile.update', 'method' => 'patch']) }} + {!! FormField::text('name') !!} + {!! FormField::email('email') !!} + {{ Form::submit(trans('auth.update_profile'), ['class' => 'btn btn-info']) }} + {{ Form::close() }} +
+
+ user()->agency;?> + {{ Form::model($agency, ['route' => 'users.agency.update', 'method' => 'patch']) }} + {!! FormField::text('name') !!} + {!! FormField::email('email') !!} + {!! FormField::text('website') !!} + {!! FormField::textarea('address') !!} + {!! FormField::text('phone') !!} + {{ Form::submit(trans('agency.update'), ['class' => 'btn btn-info']) }} + {{ Form::close() }} +
+
+ +@endsection diff --git a/routes/web/account.php b/routes/web/account.php index 353c3de..426a347 100644 --- a/routes/web/account.php +++ b/routes/web/account.php @@ -2,9 +2,9 @@ /** * Account Routes */ -Route::group(['middleware' => 'web','as'=>'auth.'], function() { - Route::get('register', ['as'=>'register', 'uses' => 'AuthController@getRegister']); - Route::post('register', ['as'=>'register', 'uses' => 'AuthController@postRegister']); +Route::group(['middleware' => 'web', 'as' => 'auth.'], function () { + Route::get('register', ['as' => 'register', 'uses' => 'AuthController@getRegister']); + Route::post('register', ['as' => 'register', 'uses' => 'AuthController@postRegister']); }); // Authentication Routes... @@ -12,10 +12,6 @@ Route::get('login', 'Auth\LoginController@showLoginForm')->name('auth.login'); Route::post('login', 'Auth\LoginController@login'); Route::get('logout', 'Auth\LoginController@logout')->name('auth.logout'); -// User Profile Routes... -Route::get('profile', ['uses' => 'Auth\ProfileController@show'])->name('auth.profile'); -Route::patch('profile', ['uses' => 'Auth\ProfileController@update'])->name('auth.profile'); - // Change Password Routes... Route::get('change-password', 'Auth\ChangePasswordController@show')->name('auth.change-password'); Route::patch('change-password', 'Auth\ChangePasswordController@update')->name('auth.change-password'); @@ -24,4 +20,30 @@ Route::patch('change-password', 'Auth\ChangePasswordController@update')->name('a Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('auth.reset-request'); Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('auth.reset-email'); Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset'); -Route::post('password/reset', 'Auth\ResetPasswordController@reset')->name('reset-password'); \ No newline at end of file +Route::post('password/reset', 'Auth\ResetPasswordController@reset')->name('reset-password'); + +// User's Profile routes + +Route::get('profile', [ + 'as' => 'users.profile.show', + 'uses' => 'Users\ProfileController@show', + 'middleware' => ['web', 'auth'], +]); + +Route::get('profile/edit', [ + 'as' => 'users.profile.edit', + 'uses' => 'Users\ProfileController@edit', + 'middleware' => ['web', 'auth'], +]); + +Route::patch('profile/update', [ + 'as' => 'users.profile.update', + 'uses' => 'Users\ProfileController@update', + 'middleware' => ['web', 'auth'], +]); + +Route::patch('agency/update', [ + 'as' => 'users.agency.update', + 'uses' => 'Users\AgencyController@update', + 'middleware' => ['web', 'auth'], +]); diff --git a/routes/web/pages.php b/routes/web/pages.php index 61c8402..7521833 100644 --- a/routes/web/pages.php +++ b/routes/web/pages.php @@ -3,6 +3,6 @@ /** * Pages Routes */ -Route::get('/', function () { return redirect()->route('home'); }); -Route::get('about', ['as'=>'about', 'uses' => 'PagesController@about', 'middleware'=>['web']]); -Route::get('home', ['as'=>'home', 'uses' => 'PagesController@home', 'middleware'=>['web','auth']]); \ No newline at end of file +Route::get('/', function () {return redirect()->route('home');}); +Route::get('about', ['as' => 'about', 'uses' => 'PagesController@about', 'middleware' => ['web']]); +Route::get('home', ['as' => 'home', 'uses' => 'PagesController@home', 'middleware' => ['web', 'auth']]); diff --git a/tests/Feature/ManageUsersTest.php b/tests/Feature/Users/ManageUsersTest.php similarity index 98% rename from tests/Feature/ManageUsersTest.php rename to tests/Feature/Users/ManageUsersTest.php index 576d5f9..45cb10e 100644 --- a/tests/Feature/ManageUsersTest.php +++ b/tests/Feature/Users/ManageUsersTest.php @@ -1,6 +1,6 @@ userSigningIn(); + $this->visit(route('users.profile.show')); + $this->seePageIs(route('users.profile.show')); + } + + /** @test */ + public function a_user_can_visit_their_profile_edit_page() + { + $user = $this->userSigningIn(); + $this->visit(route('users.profile.edit')); + $this->seePageIs(route('users.profile.edit')); + } + + /** @test */ + public function a_user_can_update_their_profile() + { + $user = $this->userSigningIn(); + $this->visit(route('users.profile.edit')); + + $this->submitForm(trans('auth.update_profile'), [ + 'name' => 'Nama Saya', + 'email' => 'me@domain.com', + ]); + + $this->see(trans('auth.profile_updated')); + $this->seePageIs(route('users.profile.edit')); + + $this->seeInDatabase('users', [ + 'id' => $user->id, + 'name' => 'Nama Saya', + 'email' => 'me@domain.com', + ]); + } + + /** @test */ + public function a_user_can_update_their_agency_data() + { + $user = $this->userSigningIn(); + $agency = factory(Agency::class)->create(['owner_id' => $user]); + $this->visit(route('users.profile.edit')); + + $this->submitForm(trans('agency.update'), [ + 'name' => 'Nama Agensi Saya', + 'email' => 'nama_agensi@domain.com', + 'address' => 'Jln. Kalimantan, No. 20, Kota', + 'phone' => '081234567890', + 'website' => 'https://example.com', + ]); + + $this->see(trans('agency.updated')); + $this->seePageIs(route('users.profile.edit')); + + $this->seeInDatabase('agencies', [ + 'id' => $agency->id, + 'name' => 'Nama Agensi Saya', + 'email' => 'nama_agensi@domain.com', + 'address' => 'Jln. Kalimantan, No. 20, Kota', + 'phone' => '081234567890', + 'website' => 'https://example.com', + ]); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php index 0f1d68c..b04f597 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -28,6 +28,14 @@ abstract class TestCase extends BaseTestCase return $user; } + protected function userSigningIn() + { + $user = factory(User::class)->create(); + $this->actingAs($user); + + return $user; + } + protected function createUser($role = 'admin') { $user = factory(User::class)->create(); diff --git a/tests/Unit/Models/AgencyTest.php b/tests/Unit/Models/AgencyTest.php new file mode 100644 index 0000000..f33f7df --- /dev/null +++ b/tests/Unit/Models/AgencyTest.php @@ -0,0 +1,17 @@ +create(); + $this->assertTrue($agency->owner instanceof User); + } +} diff --git a/tests/Unit/Models/UserTest.php b/tests/Unit/Models/UserTest.php index 23ed9f8..83aab0c 100644 --- a/tests/Unit/Models/UserTest.php +++ b/tests/Unit/Models/UserTest.php @@ -2,13 +2,14 @@ namespace Tests\Unit\Models; +use App\Entities\Agencies\Agency; use App\Entities\Users\User; use Tests\TestCase; class UserTest extends TestCase { /** @test */ - public function it_has_name_link_method() + public function user_has_name_link_method() { $user = factory(User::class)->create(); @@ -18,7 +19,7 @@ class UserTest extends TestCase } /** @test */ - public function it_can_assigned_to_a_role() + public function user_can_assigned_to_a_role() { $user = factory(User::class)->create(); $user->assignRole('admin'); @@ -27,7 +28,7 @@ class UserTest extends TestCase } /** @test */ - public function it_has_many_roles() + public function user_has_many_roles() { $user = factory(User::class)->create(); $user->assignRole('admin'); @@ -37,7 +38,7 @@ class UserTest extends TestCase } /** @test */ - public function it_can_be_removed_from_a_role() + public function user_can_be_removed_from_a_role() { $user = factory(User::class)->create(); $user->assignRole('admin'); @@ -50,11 +51,21 @@ class UserTest extends TestCase } /** @test */ - public function it_can_queried_by_roles() + public function user_can_queried_by_roles() { $user = factory(User::class)->create(); $user->assignRole('worker'); $this->assertCount(1, User::orderBy('name')->hasRoles(['worker'])->get()); } + + /** @test */ + public function user_can_owns_one_agency() + { + $user = factory(User::class)->create(); + $agency = factory(Agency::class)->create(['owner_id' => $user->id]); + + $this->assertTrue($user->agency instanceof Agency); + $this->assertEquals($user->agency->id, $agency->id); + } }