Tutorial Laravel Rest API - #3 - Membuat Module Register

Artikel ini merupakan series dari Tutorial Authentication Dengan Laravel Sanctum dan Unit Testing, disini kita belajar membuat module registrasi selain membuat rest api kita juga menuliskan sebuah unit test untuk module tersebut.

Rafi Taufiqurrahman
Dipublish 19/10/2024

Pendahuluan

Pada artikel kali ini, kita akan sama - sama membuat sebuah module register yang kita bagi menjadi beberapa langkah diatanya sebagai berikut :

  1. Membuat Controller Register
  2. Membuat Route Register
  3. Membuat Test Register
  4. Uji Coba Restapi Register

Membuat Controller Register

Silahkan teman - teman buka terminal-nya, kemudian jalankan perintah berikut ini :

Terminal
php artisan make:controller Api/RegisterController -i

Jika perintah diatas berhasil dijalankan, maka kita akan mendapatkan sebuah file yang terletak di app/Http/Controllers/Api dengan nama RegisterController.php, kemudian dari perintah artisan diatas kita menambahkan sebuah flag -i yang artinya pada RegisterController.php kita hanya akan memiliki sebuah method __invoke didalamnya, selanjutnya silahkan buka file tersebut kemudian tambahkan kodenya menjadi seperti berikut ini.

RegisterController.php
<?php

namespace App\Http\Controllers\Api;

use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;

class RegisterController extends Controller
{
    /**
     * Handle the incoming request.
     */
    public function __invoke(Request $request)
    {
        // validate request
        $request->validate([
          'name' => 'required|string|max:255',
          'email' => 'required|string|email|max:255|unique:users',
          'password'=> 'required|string|min:8',
        ]);

        // create new user
        $user = User::create([
          'name' => $request->name,
          'email' => $request->email,
          'password' => Hash::make($request->password),
        ]);

        // create token
        $token = $user->createToken('auth_token')->plainTextToken;

        // return response
        return response()->json([
            'access_token' => $token,
            'token_type' => 'Bearer',
        ]);
    }
}

Dari kode diatas, pertama kita lakukan import model User.

RegisterController.php
use App\Models\User;

Kemudian kita membuat validasi data terlebih dahulu sebelum melakukan insert data kedalam database menggunakan method validate.

RegisterController.php
// validate request
$request->validate([
    'name' => 'required|string|max:255',
    'email' => 'required|string|email|max:255|unique:users',
    'password'=> 'required|string|min:8',
]);

Selanjutnya jika request yang kita kirimkan sudah sesuai dengan kriteria validasi yang kita definisikan, maka kita akan melakukan proses insert data baru kedalam tabel users menggunakan method create.

RegisterController.php
// create new user
$user = User::create([
    'name' => $request->name,
    'email' => $request->email,
    'password' => Hash::make($request->password),
]);

Setelah berhasil menambahkan data baru, kita memanfaat method createToken untuk mengenerate token untuk user yang baru saja kita daftarkan.

RegisterController.php
// create token
$token = $user->createToken('auth_token')->plainTextToken;

Terakhir, kita tampilkan data dalam bentuk format Json.

RegisterController.php
// return response
return response()->json([
    'access_token' => $token,
    'token_type' => 'Bearer',
]);

Membuat Route Register

Setelah berhasil membuat sebuah controller Register, sekarang kita akan lanjutkan untuk pembuatan route-nya, silahkan teman - teman buka file routes/api.php, kemudian ubah kode-nya menjadi seperti berikut ini.

api.php
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\RegisterController;

Route::post('/register', RegisterController::class);

Route::get('/user', function (Request $request) {
    return $request->user();
})->middleware('auth:sanctum');

Pada kode diatas, kita menambahkan sebuah route baru dengan method post yang kita arahkan ke url api/register, untuk memastikan route yang kita buat telah berfungsi, teman - teman bisa jalankan perintah berikut ini pada terminal-nya.

Terminal
php artisan r:l

Setelah perintah artisan diatas dijalankan, maka kita akan mendapatkan output, kurang lebih seperti berikut ini.

Terminal
GET|HEAD   / ................................................................................................................................................ 
POST       api/register .............................................................................................................. Api\RegisterController
GET|HEAD   api/user ......................................................................................................................................... 
GET|HEAD   sanctum/csrf-cookie ............................................................ sanctum.csrf-cookie › Laravel\Sanctum › CsrfCookieController@show
GET|HEAD   storage/{path} ..................................................................................................................... storage.local
GET|HEAD   up ............................................................................................................................................... 

Membuat Test Register

Setelah berhasil membuat route Register, sekarang kita akan lanjutkan untuk pembuatan test-nya, disini kita akan menggunakan PHPUnit untuk membuat test-nya. Silahkan teman - teman buka terminal-nya, kemudian jalankan perintah berikut ini :

Terminal
php artisan make:test RegisterControllerTest

Jika perintah diatas berhasil dijalankan, maka kita akan mendapatkan sebuah file yang terletak di tests/Feature dengan nama RegisterControllerTest.php, selanjutnya silahkan buka file tersebut kemudian tambahkan kodenya menjadi seperti berikut ini.

RegisterControllerTest.php
<?php

namespace Tests\Feature;

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

class RegisterControllerTest extends TestCase
{
    use RefreshDatabase;

    public function test_user_can_register()
    {
        // send json post request to register a new user
        $response = $this->postJson('/api/register', [
            'name' => 'Test User',
            'email' => 'test@dev.com',
            'password' => 'password',
            'password_confirmation' => 'password',
        ]);

        // assert that the response is a 200 with a json structure containing an access token and a token type
        $response->assertStatus(200)
            ->assertJsonStructure([
                'access_token',
                'token_type',
            ]);

        // assert that the user was created in the database
        $this->assertDatabaseHas('users', [
            'email' => 'test@dev.com',
        ]);
    }

    public function test_user_cannot_register_with_existing_email()
    {
        // create a user with factory
        User::factory()->create(['email' => 'test@dev.com']);

        // send json post request to register a new user with an existing email
        $response = $this->postJson('/api/register', [
            'name' => 'Another User',
            'email' => 'test@dev.com',
            'password' => 'password',
            'password_confirmation' => 'password',
        ]);

        // assert that the response is a 422 with json validation errors for the email
        $response->assertStatus(422)
                 ->assertJsonValidationErrors(['email']);
    }

    public function test_user_cannot_register_with_invalid_data()
    {
        // send json post request to register a new user with invalid type data
        $response = $this->postJson('/api/register', [
            'name' => '',
            'email' => 'not-an-email',
            'password' => 'short',
            'password_confirmation' => 'different',
        ]);

        // assert that the response is a 422 with json validation errors for the name, email, and password
        $response->assertStatus(422)
                 ->assertJsonValidationErrors(['name', 'email', 'password']);
    }
}

Didalam class RegisterControllerTest, kita membuat 3 buah method baru diantaranya sebagai berikut :

  1. test_user_can_register
  2. test_user_cannot_register_with_existing_email
  3. test_user_cannot_register_with_invalid_data

Dari kode diatas, pertama kita lakukan import model user.

RegisterControllerTest.php
use App\Models\User;

Selanjutnya kita import juga sebuah trait yang akan kita gunakan, disini kita menggunakan trait RefreshDatabase;.

RegisterControllerTest.php
use Illuminate\Foundation\Testing\RefreshDatabase;

untuk penggunaan trait tersebut kita menggunakan method use.

RegisterControllerTest.php
use RefreshDatabase;

Method test_user_can_register

Method ini kita gunakan untuk memastikan bahwa kita bisa melakukan insert data baru kedalam tabel users.

RegisterControllerTest.php
public function test_user_can_register()
{
    // send json post request to register a new user
    $response = $this->postJson('/api/register', [
        'name' => 'Test User',
        'email' => 'test@dev.com',
        'password' => 'password',
        'password_confirmation' => 'password',
    ]);

    // assert that the response is a 200 with a json structure containing an access token and a token type
    $response->assertStatus(200)
        ->assertJsonStructure([
            'access_token',
            'token_type',
        ]);

    // assert that the user was created in the database
    $this->assertDatabaseHas('users', [
        'email' => 'test@dev.com',
    ]);
}

Pada kode diatas, kita menggunakan method postJson untuk melakukan request dengan method POST ke sebuah route /api/register dengan body sesuai data yang diperlukan untuk registrasi, seperti name, email, password, dan password_confirmation.

RegisterControllerTest.php
// send json post request to register a new user
$response = $this->postJson('/api/register', [
    'name' => 'Test User',
    'email' => 'test@dev.com',
    'password' => 'password',
    'password_confirmation' => 'password',
]);

Setelah request dikirim, kita menggunakan method assertStatus untuk memastikan bahwa respons dari request tersebut memiliki status kode 200, yang berarti request berhasil dilakukan. Selain itu, kita juga menggunakan method assertJsonStructure untuk memverifikasi bahwa respons Json yang kita terima, memiki struktur yang sesuai dengan response yang kita definiskan di controller. disini kita mendefinisikannya dengan key access_token dan token_type.

RegisterControllerTest.php
// assert that the response is a 200 with a json structure containing an access token and a token type
$response->assertStatus(200)
    ->assertJsonStructure([
        'access_token',
        'token_type',
    ]);

Terakhir, kita menggunakan method assertDatabaseHas untuk memastikan bahwa user dengan email 'test@dev.com' benar-benar telah tersimpan di tabel users .

RegisterControllerTest.php
// assert that the user was created in the database
$this->assertDatabaseHas('users', [
    'email' => 'test@dev.com',
]);

Method test_user_cannot_register_with_existing_email

Method ini kita gunakan untuk memastikan bahwa kita tidak bisa melakukan penambahan user baru dengan email yang sama.

RegisterControllerTest.php
public function test_user_cannot_register_with_existing_email()
{
    // create a user with factory
    User::factory()->create(['email' => 'test@dev.com']);

    // send json post request to register a new user with an existing email
    $response = $this->postJson('/api/register', [
        'name' => 'Another User',
        'email' => 'test@dev.com',
        'password' => 'password',
        'password_confirmation' => 'password',
    ]);

    // assert that the response is a 422 with json validation errors for the email
    $response->assertStatus(422)
             ->assertJsonValidationErrors(['email']);
}

Pada kode diatas, pertama - tama kita mendaftarkan user baru dengan sebuah factory yang telah disediakan oleh laravel, disini kita set email dari user tersebut adalah test@dev.com.

RegisterControllerTest.php
// create a user with factory
User::factory()->create(['email' => 'test@dev.com']);

Selanjutnya, kita menggunakan method postJson untuk melakukan request dengan method POST ke sebuah route /api/register dengan body yang sesuai dengan data yang diperlukan untuk registrasi, seperti name, email, password, dan password_confirmation. Di sini, kita mengatur email dengan nilai yang sama seperti email dari pengguna yang telah dibuat menggunakan factory sebelumnya.

RegisterControllerTest.php
// send json post request to register a new user with an existing email
$response = $this->postJson('/api/register', [
    'name' => 'Another User',
    'email' => 'test@dev.com',
    'password' => 'password',
    'password_confirmation' => 'password',
]);

Setelah request dikirim, kita menggunakan method assertStatus untuk memastikan bahwa respons dari request tersebut memiliki status kode 422, yang menunjukkan bahwa ada kesalahan validasi. Selain itu, kita juga menggunakan method assertJsonValidationErrors untuk memverifikasi bahwa respons Json kita menampilkan sebuah kesalahan validasi untuk kolom email.

RegisterControllerTest.php
// assert that the response is a 422 with json validation errors for the email
$response->assertStatus(422)
         ->assertJsonValidationErrors(['email']);

Method test_user_cannot_register_with_invalid_data

Method ini kita gunakan untuk memastikan bahwa kita tidak bisa melakukan penambahan user baru dengan data yang tidak valid.

RegisterControllerTest.php
public function test_user_cannot_register_with_invalid_data()
{
    // send json post request to register a new user with invalid type data
    $response = $this->postJson('/api/register', [
        'name' => '',
        'email' => 'not-an-email',
        'password' => 'short',
        'password_confirmation' => 'different',
    ]);

    // assert that the response is a 422 with json validation errors for the name, email, and password
    $response->assertStatus(422)
             ->assertJsonValidationErrors(['name', 'email', 'password']);
}

Pada kode di atas, kita menggunakan method postJson untuk melakukan request dengan method POST ke route /api/register, tetapi kali ini kita mengirimkan data yang tidak valid. Kita mengatur kolom name menjadi string kosong, kolom email dengan format yang tidak valid not-an-email, serta kolom password dan kolom pasword_confirmation memiliki data yang berbeda.

RegisterControllerTest.php
// send json post request to register a new user with invalid type data
$response = $this->postJson('/api/register', [
    'name' => '',
    'email' => 'not-an-email',
    'password' => 'short',
    'password_confirmation' => 'different',
]);

Setelah request dikirim, kita menggunakan method assertStatus untuk memastikan bahwa respons dari request tersebut memiliki status kode 422, yang menunjukkan bahwa ada kesalahan validasi. Selain itu kita juga menggunakan method assertJsonValidationErrors untuk memverifikasi bahwa respons Json kita menampilkan sebuah kesalahan validasi untuk kolom name, email dan password.

RegisterControllerTest.php
// assert that the response is a 422 with json validation errors for the name, email, and password
$response->assertStatus(422)
         ->assertJsonValidationErrors(['name', 'email', 'password']);

Menjalankan Test

Setelah berhasil menuliskan Unit Test, disini kitakan akan menjalankan test yang telah kita tulis. Silahkan teman - teman buka terminal-nya, kemudian jalankan perintah berikut ini:

Terminal
php artisan test tests/Feature/RegisterControllerTest.php

Pada kode diatas, kita menjalankan sebuah test secara spesifik dengan memasukan nama file beserta foldernya.

Terminal
tests/Feature/RegisterControllerTest.php

jika perintah diatas, berhasil dijalankan kita akan menerima output kurang lebih berikut ini, yang menandakan semua test yang kita buat berhasil tanpa ada error.

Terminal
PASS  Tests\Feature\RegisterControllerTest
✓ user can register                                                                                                                                     0.24s  
✓ user cannot register with existing email                                                                                                              0.02s  
✓ user cannot register with invalid data                                                                                                                0.01s  

Tests:    3 passed (12 assertions)
Duration: 0.33s

Uji Coba Rest Api Register

Setelah berhasil membuat test dan menjalankannya, disini kita akan lanjutkan melakukan uji coba rest api tersebut menggunakan Postman. Silahkan teman - teman buka aplikasi Postman, kemudian masukan url http://localhost:8000/api/register dan method-nya silahkan di set menjadi POST.

register-request

Kemudian silahkan teman - teman masuk tab Body dan pilih form-data, kemudian silahkan masukan key dan value seperti contoh dibawah ini.

Key Value
name rafi
email raf@dev.com
password password

Selanjutnya, silahkan teman - teman klik tombol send, jika request berhasil dilakukan maka kita akan mendapatkan response seperti berikut ini.

Postman
{
    "access_token": "1|AJ7RHMYbK4CQugjf7nKkA2lgE6Y3HvpzEK4iWvM53233febe",
    "token_type": "Bearer"
}

register-success

Penutup

Setelah berhasil menyelesaikan pembuatan module register, pada artikel berikutnya kita akan lanjutkan untuk pembuatan module login, semoga bermanfaat terimakasih :)

Artikel Lainnya

Beberapa artikel rekomendasi lainnya untuk menambah pengetahuan.

JurnalKoding

Mulai asah skill dengan berbagai macam teknologi - teknologi terbaru seperti Laravel, React, Vue, Inertia, Tailwind CSS, dan masih banyak lagi.

© 2025 JurnalKoding, Inc. All rights reserved.