diff --git a/Envoy.blade.php b/Envoy.blade.php new file mode 100644 index 0000000..c139dfd --- /dev/null +++ b/Envoy.blade.php @@ -0,0 +1,75 @@ +@servers(['prod' => 'ubuntu@172.26.12.217', 'dev' => 'ubuntu@smgdev.top']) + +@setup +$repository = 'git@172.26.1.255:SMG_DEV/ERP-API.git'; +$releases_dir = '/var/www/erp-api/releases'; +$app_dir = '/var/www/erp-api'; +$release = date('YmdHis'); +$branch = 'production'; +$new_release_dir = $releases_dir .'/'. $release; +@endsetup + +@task('clone_repository') +echo 'Cloning repository' +[ -d {{ $releases_dir }} ] || mkdir {{ $releases_dir }} +git clone --depth 1 --single-branch --branch {{ $branch }} {{ $repository }} {{ $new_release_dir }} +cd {{ $new_release_dir }} +@endtask + +@task('run_composer') +echo "Starting deployment ({{ $release }})" +cd {{ $new_release_dir }} +composer install --prefer-dist --no-scripts -q -o +@endtask + +@task('update_symlinks') +echo "Linking storage directory" +rm -rf {{ $new_release_dir }}/storage +ln -nfs {{ $app_dir }}/storage {{ $new_release_dir }}/storage + +echo 'Linking .env file' +ln -nfs {{ $app_dir }}/.env {{ $new_release_dir }}/.env + +echo 'Linking current release' +ln -nfs {{ $new_release_dir }} {{ $app_dir }}/current +@endtask + +@task('setup_laravel') +cd {{ $app_dir }}/current +php artisan migrate --force +php artisan storage:link +php artisan db:seed --class PermissionSeeder --force +@endtask + +@task('clean_old_releases') + # This lists our releases by modification time and delete all but the 3 most recent. + purging=$(ls -dt {{ $releases_dir }}/* | tail -n +5); + + if [ "{{ $releases_dir }}" != "" ]; then + + if [ "$purging" != "" ]; then + echo Purging old releases: $purging; + rm -rf $purging; + else + echo "No releases found for purging at this time"; + fi + + fi +@endtask + +@story('deploy',["on" => "prod"]) +clone_repository +run_composer +update_symlinks +setup_laravel +clean_old_releases +@endstory + + +@story('deploy-dev',["on" => "dev"]) +clone_repository +run_composer +update_symlinks +setup_laravel +clean_old_releases +@endstory diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..2544f94 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,29 @@ +pipeline { + agent any + stages + { + stage("Deploy Dev"){ + when { + branch 'development' + } + steps { + sshagent(credentials: ['dev-id_rsa']) { + sh "composer install" + sh "./vendor/bin/envoy run deploy-dev" + } + } + } + + stage("Deploy Prod"){ + when { + branch 'production' + } + steps { + sshagent(credentials: ['dev-id_rsa']) { + sh "composer install" + sh "./vendor/bin/envoy run deploy" + } + } + } + } +} diff --git a/app/Http/Controllers/Auth/Role/DeleteController.php b/app/Http/Controllers/Auth/Role/DeleteController.php new file mode 100644 index 0000000..d3480bc --- /dev/null +++ b/app/Http/Controllers/Auth/Role/DeleteController.php @@ -0,0 +1,24 @@ +delete($user); + return response()->json([ + "success" => true + ]); + } +} diff --git a/app/Http/Controllers/Auth/Role/ListController.php b/app/Http/Controllers/Auth/Role/ListController.php new file mode 100644 index 0000000..4c30f30 --- /dev/null +++ b/app/Http/Controllers/Auth/Role/ListController.php @@ -0,0 +1,22 @@ +validated(); + $data = $repository->list($params); + return ListResource::collection($data); + } +} diff --git a/app/Http/Controllers/Auth/Role/StoreController.php b/app/Http/Controllers/Auth/Role/StoreController.php new file mode 100644 index 0000000..2d02299 --- /dev/null +++ b/app/Http/Controllers/Auth/Role/StoreController.php @@ -0,0 +1,22 @@ +validated(); + $data = $repository->create($params); + return RowResource::make($data); + } +} diff --git a/app/Http/Controllers/Auth/Role/UpdateController.php b/app/Http/Controllers/Auth/Role/UpdateController.php new file mode 100644 index 0000000..b18351a --- /dev/null +++ b/app/Http/Controllers/Auth/Role/UpdateController.php @@ -0,0 +1,23 @@ +validated(); + $data = $repository->update($user, $params); + return RowResource::make($data); + } +} diff --git a/app/Http/Controllers/Auth/User/DeleteController.php b/app/Http/Controllers/Auth/User/DeleteController.php new file mode 100644 index 0000000..9d0188f --- /dev/null +++ b/app/Http/Controllers/Auth/User/DeleteController.php @@ -0,0 +1,24 @@ +delete($user); + return response()->json([ + "success" => true + ]); + } +} diff --git a/app/Http/Controllers/Auth/User/ListController.php b/app/Http/Controllers/Auth/User/ListController.php index 3deb69f..653d884 100644 --- a/app/Http/Controllers/Auth/User/ListController.php +++ b/app/Http/Controllers/Auth/User/ListController.php @@ -4,14 +4,19 @@ namespace App\Http\Controllers\Auth\User; use App\Http\Controllers\Controller; use Illuminate\Http\Request; +use App\Http\Requests\Auth\User\ListRequest; +use App\Http\Resources\Auth\User\ListResource; +use App\Repositories\Auth\UserRepository; class ListController extends Controller { /** * Handle the incoming request. */ - public function __invoke(Request $request) + public function __invoke(ListRequest $request, UserRepository $repository) { - // + $params = $request->validated(); + $data = $repository->list($params); + return ListResource::collection($data); } } diff --git a/app/Http/Controllers/Auth/User/StoreController.php b/app/Http/Controllers/Auth/User/StoreController.php new file mode 100644 index 0000000..58e3d24 --- /dev/null +++ b/app/Http/Controllers/Auth/User/StoreController.php @@ -0,0 +1,22 @@ +validated(); + $data = $repository->create($params); + return RowResource::make($data); + } +} diff --git a/app/Http/Controllers/Auth/User/UpdateController.php b/app/Http/Controllers/Auth/User/UpdateController.php new file mode 100644 index 0000000..c97032b --- /dev/null +++ b/app/Http/Controllers/Auth/User/UpdateController.php @@ -0,0 +1,23 @@ +validated(); + $data = $repository->update($user, $params); + return RowResource::make($data); + } +} diff --git a/app/Http/Requests/Auth/Role/DeleteRequest.php b/app/Http/Requests/Auth/Role/DeleteRequest.php new file mode 100644 index 0000000..07a31f6 --- /dev/null +++ b/app/Http/Requests/Auth/Role/DeleteRequest.php @@ -0,0 +1,27 @@ +user()->checkPermission("auth.role:delete"); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + ]; + } +} diff --git a/app/Http/Requests/Auth/Role/ListRequest.php b/app/Http/Requests/Auth/Role/ListRequest.php new file mode 100644 index 0000000..016a05d --- /dev/null +++ b/app/Http/Requests/Auth/Role/ListRequest.php @@ -0,0 +1,39 @@ +user()->checkPermission("auth.role:read"); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'limit' => 'nullable', + 'offset' => 'nullable', + 'search' => 'nullable', + + 'filter' => 'nullable|array', + 'filter.*.column' => 'required|in:name,email', + 'filter.*.operator' => 'nullable|in:eq,in', + 'filter.*.query' => 'required', + + 'sort' => 'nullable|array', + 'sort.column' => 'nullable|in:name,email', + 'sort.dir' => 'nullable', + ]; + } +} diff --git a/app/Http/Requests/Auth/Role/StoreRequest.php b/app/Http/Requests/Auth/Role/StoreRequest.php new file mode 100644 index 0000000..a775745 --- /dev/null +++ b/app/Http/Requests/Auth/Role/StoreRequest.php @@ -0,0 +1,31 @@ +user()->checkPermission("auth.user:create"); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'name' => 'required|string', + 'email' => 'required|string', + 'role_ids' => 'nullable|array', + 'role_ids.*' => 'nullable|integer' + ]; + } +} diff --git a/app/Http/Requests/Auth/Role/UpdateRequest.php b/app/Http/Requests/Auth/Role/UpdateRequest.php new file mode 100644 index 0000000..2827ffb --- /dev/null +++ b/app/Http/Requests/Auth/Role/UpdateRequest.php @@ -0,0 +1,31 @@ +user()->checkPermission("auth.role:update"); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'name' => 'required|string', + 'email' => 'required|string', + 'role_ids' => 'nullable|array', + 'role_ids.*' => 'nullable|integer' + ]; + } +} diff --git a/app/Http/Requests/Auth/User/DeleteRequest.php b/app/Http/Requests/Auth/User/DeleteRequest.php new file mode 100644 index 0000000..3be7d80 --- /dev/null +++ b/app/Http/Requests/Auth/User/DeleteRequest.php @@ -0,0 +1,27 @@ +user()->checkPermission("auth.user:delete"); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + ]; + } +} diff --git a/app/Http/Requests/Auth/User/ListRequest.php b/app/Http/Requests/Auth/User/ListRequest.php index 01603d8..b1cb7c5 100644 --- a/app/Http/Requests/Auth/User/ListRequest.php +++ b/app/Http/Requests/Auth/User/ListRequest.php @@ -11,10 +11,7 @@ class ListRequest extends FormRequest */ public function authorize(): bool { - $user = auth()->user(); - $user->load("roles"); - - return false; + return auth()->user()->checkPermission("auth.user:read"); } /** @@ -25,7 +22,18 @@ class ListRequest extends FormRequest public function rules(): array { return [ - // + 'limit' => 'nullable', + 'offset' => 'nullable', + 'search' => 'nullable', + + 'filter' => 'nullable|array', + 'filter.*.column' => 'required|in:name,email', + 'filter.*.operator' => 'nullable|in:eq,in', + 'filter.*.query' => 'required', + + 'sort' => 'nullable|array', + 'sort.column' => 'nullable|in:name,email', + 'sort.dir' => 'nullable', ]; } } diff --git a/app/Http/Requests/Auth/User/StoreRequest.php b/app/Http/Requests/Auth/User/StoreRequest.php new file mode 100644 index 0000000..0845b12 --- /dev/null +++ b/app/Http/Requests/Auth/User/StoreRequest.php @@ -0,0 +1,31 @@ +user()->checkPermission("auth.user:create"); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'name' => 'required|string', + 'email' => 'required|string', + 'role_ids' => 'nullable|array', + 'role_ids.*' => 'nullable|integer' + ]; + } +} diff --git a/app/Http/Requests/Auth/User/UpdateRequest.php b/app/Http/Requests/Auth/User/UpdateRequest.php new file mode 100644 index 0000000..81bc83d --- /dev/null +++ b/app/Http/Requests/Auth/User/UpdateRequest.php @@ -0,0 +1,31 @@ +user()->checkPermission("auth.user:update"); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'name' => 'required|string', + 'email' => 'required|string', + 'role_ids' => 'nullable|array', + 'role_ids.*' => 'nullable|integer' + ]; + } +} diff --git a/app/Http/Resources/Auth/Role/ListResource.php b/app/Http/Resources/Auth/Role/ListResource.php new file mode 100644 index 0000000..5d318a8 --- /dev/null +++ b/app/Http/Resources/Auth/Role/ListResource.php @@ -0,0 +1,22 @@ + + */ + public function toArray(Request $request): array + { + return [ + "id" => $this->id, + "name" => $this->name, + ]; + } +} diff --git a/app/Http/Resources/Auth/User/ListResource.php b/app/Http/Resources/Auth/User/ListResource.php new file mode 100644 index 0000000..6677c5a --- /dev/null +++ b/app/Http/Resources/Auth/User/ListResource.php @@ -0,0 +1,25 @@ + + */ + public function toArray(Request $request): array + { + return [ + "id" => $this->id, + "name" => $this->name, + "email" => $this->email, + "roles" => RoleResource::collection($this->roles) + ]; + } +} diff --git a/app/Models/Role.php b/app/Models/Role.php index 66217bf..4e6894a 100644 --- a/app/Models/Role.php +++ b/app/Models/Role.php @@ -10,6 +10,6 @@ class Role extends Model use HasFactory; public function permissions(){ - return $this->hasMany(Permission::class); + return $this->belongsToMany(Permission::class,"role_permission"); } } diff --git a/app/Models/User.php b/app/Models/User.php index f61f74b..3ace172 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; +use Cache; class User extends Authenticatable { @@ -44,6 +45,23 @@ class User extends Authenticatable ]; public function roles(){ - return $this->hasMany(Role::class)->with("permissions"); + return $this->belongsToMany(Role::class,'user_role')->with("permissions"); + } + + public function getPermission(){ + $user = $this; + return Cache::rememberForever("permission_".$this->id, function() use ($user){ + return $user->roles->flatMap(function($role){ + return $role->permissions->map(function($permission){ + return $permission->code; + }); + }); + }); + } + + public function checkPermission($code){ + $permissions = $this->getPermission(); + $code_arr = explode(":",$code); + return $permissions->contains($code) || $permissions->contains($code_arr[0].":*"); } } diff --git a/app/Repositories/Auth/RoleRepository.php b/app/Repositories/Auth/RoleRepository.php new file mode 100644 index 0000000..ecded6d --- /dev/null +++ b/app/Repositories/Auth/RoleRepository.php @@ -0,0 +1,51 @@ +orderBy($sortColumn, $sortDir) + + ->when(@$params["filter"], function ($query) use ($params) { + foreach ($params["filter"] as $filter) { + $query->where($filter["column"], $filter["query"]); + } + }) + ->paginate($limit); + } + + public function create($params){ + + $params["password"] = "-"; + $model = Role::create($params); + if (@$params["role_ids"]){ + $model->roles()->sync($params["role_ids"]); + } + return $model; + } + + public function update($model, $params){ + + $model->update($params); + if (@$params["role_ids"]){ + $model->roles()->sync($params["role_ids"]); + } + return $model; + } + + public function delete($model){ + + $model->delete(); + } +} diff --git a/app/Repositories/Auth/UserRepository.php b/app/Repositories/Auth/UserRepository.php new file mode 100644 index 0000000..f79dd76 --- /dev/null +++ b/app/Repositories/Auth/UserRepository.php @@ -0,0 +1,51 @@ +orderBy($sortColumn, $sortDir) + + ->when(@$params["filter"], function ($query) use ($params) { + foreach ($params["filter"] as $filter) { + $query->where($filter["column"], $filter["query"]); + } + }) + ->paginate($limit); + } + + public function create($params){ + + $params["password"] = "-"; + $user = User::create($params); + if (@$params["role_ids"]){ + $user->roles()->sync($params["role_ids"]); + } + return $user; + } + + public function update($user, $params){ + + $user->update($params); + if (@$params["role_ids"]){ + $user->roles()->sync($params["role_ids"]); + } + return $user; + } + + public function delete($user){ + + $user->delete(); + } +} diff --git a/database/factories/RoleFactory.php b/database/factories/RoleFactory.php new file mode 100644 index 0000000..401b17f --- /dev/null +++ b/database/factories/RoleFactory.php @@ -0,0 +1,23 @@ + + */ +class RoleFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + ]; + } +} diff --git a/database/seeders/PermissionSeeder.php b/database/seeders/PermissionSeeder.php index 3194903..d456044 100644 --- a/database/seeders/PermissionSeeder.php +++ b/database/seeders/PermissionSeeder.php @@ -4,6 +4,7 @@ namespace Database\Seeders; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; +use DB; class PermissionSeeder extends Seeder { @@ -13,6 +14,21 @@ class PermissionSeeder extends Seeder public function run(): void { $permissions = file_get_contents(__DIR__ . "/permissions.csv"); + $permissions = explode("\n", $permissions); + $data = []; + foreach($permissions as $permission){ + if ($permission == "") + continue; + $row = explode(",", $permission); + $data[] = [ + "module" => $row[0], + "feature" => $row[1], + "action" => $row[2], + "code" => $row[3], + "name" => $row[4] + ]; + } + DB::table("permissions")->insertOrIgnore($data); } } diff --git a/database/seeders/permissions.csv b/database/seeders/permissions.csv index 8835e78..f37aabc 100644 --- a/database/seeders/permissions.csv +++ b/database/seeders/permissions.csv @@ -1,5 +1,10 @@ -Auth,User,*,auth.user.*,All operation data user -Auth,User,*,auth.user.read,Show list data user -Auth,User,*,auth.user.create,Create data user -Auth,User,*,auth.user.update,Update data user -Auth,User,*,auth.user.delete,Delete data user +Auth,User,*,auth.user:*,All operation data user +Auth,User,*,auth.user:read,Show list data user +Auth,User,*,auth.user:create,Create data user +Auth,User,*,auth.user:update,Update data user +Auth,User,*,auth.user:delete,Delete data user +Auth,Role,*,auth.role:*,All operation data role +Auth,Role,*,auth.role:read,Show list data role +Auth,Role,*,auth.role:create,Create data role +Auth,Role,*,auth.role:update,Update data role +Auth,Role,*,auth.role:delete,Delete data role diff --git a/routes/auth.php b/routes/auth.php index 41c19cf..f8c3dc7 100644 --- a/routes/auth.php +++ b/routes/auth.php @@ -9,4 +9,15 @@ Route::get('current', 'CurrentController')->middleware("auth:sanctum"); Route::group(["namespace" => "User", "prefix" => "user", "middleware" => "auth:sanctum"], function () { Route::get('/', 'ListController')->middleware("auth:sanctum"); + Route::post('/', 'StoreController')->middleware("auth:sanctum"); + Route::post('/{user}', 'UpdateController')->middleware("auth:sanctum"); + Route::post('/{user}/delete', 'DeleteController')->middleware("auth:sanctum"); +}); + +Route::group(["namespace" => "Role", "prefix" => "role", "middleware" => "auth:sanctum"], function () { + + Route::get('/', 'ListController')->middleware("auth:sanctum"); + Route::post('/', 'StoreController')->middleware("auth:sanctum"); + Route::post('/{role}', 'UpdateController')->middleware("auth:sanctum"); + Route::post('/{role}/delete', 'DeleteController')->middleware("auth:sanctum"); }); diff --git a/tests/Feature/Auth/Role/DeleteTest.php b/tests/Feature/Auth/Role/DeleteTest.php new file mode 100644 index 0000000..b25e3b6 --- /dev/null +++ b/tests/Feature/Auth/Role/DeleteTest.php @@ -0,0 +1,40 @@ +first(); + $role = Role::factory()->create(); + $role->permissions()->attach($permission->id); + $user = User::factory()->create(); + $user->roles()->attach($role->id); + + Sanctum::actingAs($user); + + $data = User::factory()->create(); + + $response = $this->post('/auth/user/'.$data->id.'/delete'); + + $response->assertStatus(200); + } +} diff --git a/tests/Feature/Auth/Role/ListTest.php b/tests/Feature/Auth/Role/ListTest.php new file mode 100644 index 0000000..87dcf3f --- /dev/null +++ b/tests/Feature/Auth/Role/ListTest.php @@ -0,0 +1,46 @@ +first(); + $role = Role::factory()->create(); + $role->permissions()->attach($permission->id); + $user = User::factory()->create(); + $user->roles()->attach($role->id); + + Sanctum::actingAs($user); + + $response = $this->get('/auth/role/'); + + $response->assertStatus(200); + $response->assertJson([ + "data" => [ + [ + "id" => $role->id, + "name" => $role->name + ] + ] + ]); + } +} diff --git a/tests/Feature/Auth/Role/StoreTest.php b/tests/Feature/Auth/Role/StoreTest.php new file mode 100644 index 0000000..c24bb7b --- /dev/null +++ b/tests/Feature/Auth/Role/StoreTest.php @@ -0,0 +1,87 @@ +first(); + $role = Role::factory()->create(); + $role->permissions()->attach($permission->id); + $user = User::factory()->create(); + $user->roles()->attach($role->id); + + Sanctum::actingAs($user); + + $response = $this->post('/auth/user/',[ + "name" => "new user", + "email" => "user@gmail.com" + ]); + + $response->assertStatus(201); + $response->assertJson([ + "data" => [ + "name" => "new user", + "email" => "user@gmail.com" + ] + ]); + } + + + /** + * A basic feature test example. + */ + public function test_with_roles_success(): void + { + $permission = Permission::where("code","auth.user:create")->first(); + $role = Role::factory()->create(); + $role->permissions()->attach($permission->id); + $user = User::factory()->create(); + $user->roles()->attach($role->id); + + $role2 = Role::factory()->create(); + + + Sanctum::actingAs($user); + + $response = $this->post('/auth/user/',[ + "name" => "new user", + "email" => "user@gmail.com", + "role_ids" => [$role->id, $role2->id] + ]); + + $response->assertStatus(201); + $response->assertJson([ + "data" => [ + "name" => "new user", + "email" => "user@gmail.com", + "roles" => [ + [ + "id" => $role->id + ], + [ + "id" => $role2->id + ], + ] + ] + ]); + } +} diff --git a/tests/Feature/Auth/Role/UpdateTest.php b/tests/Feature/Auth/Role/UpdateTest.php new file mode 100644 index 0000000..f988c1e --- /dev/null +++ b/tests/Feature/Auth/Role/UpdateTest.php @@ -0,0 +1,91 @@ +first(); + $role = Role::factory()->create(); + $role->permissions()->attach($permission->id); + $user = User::factory()->create(); + $user->roles()->attach($role->id); + + Sanctum::actingAs($user); + + $data = User::factory()->create(); + + $response = $this->post('/auth/user/'.$data->id,[ + "name" => "update user", + "email" => "user_update@gmail.com" + ]); + + $response->assertStatus(200); + $response->assertJson([ + "data" => [ + "name" => "update user", + "email" => "user_update@gmail.com" + ] + ]); + } + + + /** + * A basic feature test example. + */ + public function test_with_roles_success(): void + { + $permission = Permission::where("code","auth.user:update")->first(); + $role = Role::factory()->create(); + $role->permissions()->attach($permission->id); + $user = User::factory()->create(); + $user->roles()->attach($role->id); + + Sanctum::actingAs($user); + + $data = User::factory()->create(); + $role2 = Role::factory()->create(); + + $response = $this->post('/auth/user/'.$data->id,[ + "name" => "update user", + "email" => "user_update@gmail.com", + "role_ids" => [ + $role->id, $role2->id + ] + ]); + + $response->assertStatus(200); + $response->assertJson([ + "data" => [ + "name" => "update user", + "email" => "user_update@gmail.com", + "roles" => [ + [ + "id" => $role->id + ], + [ + "id" => $role2->id + ], + ] + ] + ]); + } +} diff --git a/tests/Feature/Auth/User/DeleteTest.php b/tests/Feature/Auth/User/DeleteTest.php new file mode 100644 index 0000000..59a9f84 --- /dev/null +++ b/tests/Feature/Auth/User/DeleteTest.php @@ -0,0 +1,40 @@ +first(); + $role = Role::factory()->create(); + $role->permissions()->attach($permission->id); + $user = User::factory()->create(); + $user->roles()->attach($role->id); + + Sanctum::actingAs($user); + + $data = User::factory()->create(); + + $response = $this->post('/auth/user/'.$data->id.'/delete'); + + $response->assertStatus(200); + } +} diff --git a/tests/Feature/Auth/User/ListTest.php b/tests/Feature/Auth/User/ListTest.php index 4c5b5fd..1485913 100644 --- a/tests/Feature/Auth/User/ListTest.php +++ b/tests/Feature/Auth/User/ListTest.php @@ -12,18 +12,42 @@ use App\Models\Permission; use App\Models\User; use Laravel\Sanctum\Sanctum; +use Illuminate\Foundation\Testing\DatabaseTransactions; + class ListTest extends TestCase { + use DatabaseTransactions; + /** * A basic feature test example. */ public function test_success(): void { + $permission = Permission::where("code","auth.user:read")->first(); + $role = Role::factory()->create(); + $role->permissions()->attach($permission->id); $user = User::factory()->create(); + $user->roles()->attach($role->id); + Sanctum::actingAs($user); $response = $this->get('/auth/user/'); $response->assertStatus(200); + $response->assertJson([ + "data" => [ + [ + "id" => $user->id, + "name" => $user->name, + "email" => $user->email, + "roles" => [ + [ + "id" => $role->id, + "name" => $role->name + ] + ] + ] + ] + ]); } } diff --git a/tests/Feature/Auth/User/StoreTest.php b/tests/Feature/Auth/User/StoreTest.php new file mode 100644 index 0000000..ffc7ef0 --- /dev/null +++ b/tests/Feature/Auth/User/StoreTest.php @@ -0,0 +1,87 @@ +first(); + $role = Role::factory()->create(); + $role->permissions()->attach($permission->id); + $user = User::factory()->create(); + $user->roles()->attach($role->id); + + Sanctum::actingAs($user); + + $response = $this->post('/auth/user/',[ + "name" => "new user", + "email" => "user@gmail.com" + ]); + + $response->assertStatus(201); + $response->assertJson([ + "data" => [ + "name" => "new user", + "email" => "user@gmail.com" + ] + ]); + } + + + /** + * A basic feature test example. + */ + public function test_with_roles_success(): void + { + $permission = Permission::where("code","auth.user:create")->first(); + $role = Role::factory()->create(); + $role->permissions()->attach($permission->id); + $user = User::factory()->create(); + $user->roles()->attach($role->id); + + $role2 = Role::factory()->create(); + + + Sanctum::actingAs($user); + + $response = $this->post('/auth/user/',[ + "name" => "new user", + "email" => "user@gmail.com", + "role_ids" => [$role->id, $role2->id] + ]); + + $response->assertStatus(201); + $response->assertJson([ + "data" => [ + "name" => "new user", + "email" => "user@gmail.com", + "roles" => [ + [ + "id" => $role->id + ], + [ + "id" => $role2->id + ], + ] + ] + ]); + } +} diff --git a/tests/Feature/Auth/User/UpdateTest.php b/tests/Feature/Auth/User/UpdateTest.php new file mode 100644 index 0000000..fbd6835 --- /dev/null +++ b/tests/Feature/Auth/User/UpdateTest.php @@ -0,0 +1,91 @@ +first(); + $role = Role::factory()->create(); + $role->permissions()->attach($permission->id); + $user = User::factory()->create(); + $user->roles()->attach($role->id); + + Sanctum::actingAs($user); + + $data = User::factory()->create(); + + $response = $this->post('/auth/user/'.$data->id,[ + "name" => "update user", + "email" => "user_update@gmail.com" + ]); + + $response->assertStatus(200); + $response->assertJson([ + "data" => [ + "name" => "update user", + "email" => "user_update@gmail.com" + ] + ]); + } + + + /** + * A basic feature test example. + */ + public function test_with_roles_success(): void + { + $permission = Permission::where("code","auth.user:update")->first(); + $role = Role::factory()->create(); + $role->permissions()->attach($permission->id); + $user = User::factory()->create(); + $user->roles()->attach($role->id); + + Sanctum::actingAs($user); + + $data = User::factory()->create(); + $role2 = Role::factory()->create(); + + $response = $this->post('/auth/user/'.$data->id,[ + "name" => "update user", + "email" => "user_update@gmail.com", + "role_ids" => [ + $role->id, $role2->id + ] + ]); + + $response->assertStatus(200); + $response->assertJson([ + "data" => [ + "name" => "update user", + "email" => "user_update@gmail.com", + "roles" => [ + [ + "id" => $role->id + ], + [ + "id" => $role2->id + ], + ] + ] + ]); + } +}