Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(user): add UserController for managing user operations #73

Merged
merged 7 commits into from
Dec 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions app/Http/Controllers/UserController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?php

namespace App\Http\Controllers;

use App\Http\Responses\ApiSuccessResponse;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

class UserController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
$users = User::paginate(
request()->has('size') ? request()->size : 15
);

return new ApiSuccessResponse($users);
}

/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email',
'password' => 'required|string|min:8|confirmed',
]);

$user = User::create($validated);

return new ApiSuccessResponse($user, Response::HTTP_CREATED);
}

/**
* Display the specified resource.
*/
public function show(User $user)
{
return new ApiSuccessResponse($user);
}

/**
* Update the specified resource in storage.
*/
public function update(Request $request, User $user)
{
$validated = $request->validate([
'name' => 'required|string',
'email' => 'required|email|unique:users,email',
'password' => 'sometimes|required|min:8|confirmed',
]);

$user->update($validated);

return new ApiSuccessResponse($user);
}

/**
* Remove the specified resource from storage.
*/
public function destroy(User $user)
{
$user->delete();

return new ApiSuccessResponse("User deleted successfully.");
}
}
1 change: 1 addition & 0 deletions routes/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@
*/
Route::group(['prefix' => 'v1'], function () {
require __DIR__ . '/api/v1/auth.php';
require __DIR__ . '/api/v1/user.php';
});
12 changes: 12 additions & 0 deletions routes/api/v1/user.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;

Route::group(['middleware' => 'auth:sanctum'], function () {
Route::get('/users', [UserController::class, 'index'])->name('api.v1.users.index');
Route::post('/users', [UserController::class, 'store'])->name('api.v1.users.store');
Route::get('/users/{user}', [UserController::class, 'show'])->name('api.v1.users.show');
Route::put('/users/{user}', [UserController::class, 'update'])->name('api.v1.users.update');
Route::delete('/users/{user}', [UserController::class, 'destroy'])->name('api.v1.users.destroy');
});
143 changes: 143 additions & 0 deletions tests/Feature/Http/Controllers/UserControllerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
<?php

namespace Tests\Feature\Http\Controllers;

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Laravel\Sanctum\Sanctum;
use Tests\TestCase;

class UserControllerTest extends TestCase
{
use RefreshDatabase;

/**
* Test the index method.
*/
public function test_users_index(): void
{
// Create some dummy users
User::factory()->count(10)->create();

Sanctum::actingAs(
User::factory()->create()
);

// Send a GET request to the index endpoint
$response = $this->get('/api/v1/users');

// Assert that the response has a successful status code
$response->assertStatus(200);

// Assert that the response contains the paginated users
$response->assertJsonFragment(User::paginate(15)->toArray());
}

/**
* Test the store method.
*/
public function test_create_user(): void
{
Sanctum::actingAs(
User::factory()->create()
);

$userData = [
'name' => 'John Doe',
'email' => '[email protected]',
'password' => 'password',
'password_confirmation' => 'password',
];

// Send a POST request to the store endpoint
$response = $this->post('/api/v1/users', $userData);

// Assert that the response has a successful status code
$response->assertStatus(201);

// Assert that the database has the user
$this->assertDatabaseHas('users', [
'name' => $userData['name'],
'email' => $userData['email'],
]);

// Assert that the response contains the user data
$response->assertJsonFragment([
'name' => $userData['name'],
'email' => $userData['email'],
]);
}

/**
* Test the show method.
*/
public function test_users_show(): void
{
Sanctum::actingAs(
User::factory()->create()
);

$user = User::factory()->create();

// Send a GET request to the show endpoint
$response = $this->get('/api/v1/users/' . $user->id);

// Assert that the response has a successful status code
$response->assertStatus(200);

// Assert that the response contains the user data
$response->assertJsonFragment($user->toArray());
}

/**
* Test the update method.
*/
public function test_users_update(): void
{
Sanctum::actingAs(
User::factory()->create()
);

$user = User::factory()->create();

$userData = [
'name' => 'Updated Name',
'email' => '[email protected]',
];

// Send a PATCH request to the update endpoint
$response = $this->put('/api/v1/users/' . $user->id, $userData);

// Assert that the response has a successful status code
$response->assertStatus(200);

$this->assertDatabaseHas('users', [
'name' => $userData['name'],
'email' => $userData['email'],
]);

// Assert that the response contains the updated user data
$response->assertJsonFragment($userData);
}

/**
* Test the destroy method.
*/
public function test_users_destroy(): void
{
Sanctum::actingAs(
User::factory()->create()
);

$user = User::factory()->create();

// Send a DELETE request to the destroy endpoint
$response = $this->delete('/api/v1/users/' . $user->id);

// Assert that the response has a successful status code
$response->assertStatus(200);

// Assert that the response contains the success message
$response->assertJsonFragment(['data' => 'User deleted successfully.']);
}
}