Skip to content

Commit

Permalink
add UserController
Browse files Browse the repository at this point in the history
Signed-off-by: Valentin Sickert <[email protected]>
  • Loading branch information
Lapotor committed Dec 13, 2023
1 parent 5e7c657 commit 506002b
Show file tree
Hide file tree
Showing 2 changed files with 213 additions and 0 deletions.
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' => 'sometimes|required|string',
'email' => "sometimes|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.");
}
}
140 changes: 140 additions & 0 deletions tests/Feature/Http/Controllers/UserControllerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
<?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]',
];

$newUserData = array_merge($user->toArray(), $userData);

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

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

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

/**
* 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.']);
}
}

0 comments on commit 506002b

Please sign in to comment.