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);
+ }
}