¶Pendahuluan
Pada artikel kali ini, kita akan sama - sama membuat sebuah module register yang kita bagi menjadi beberapa langkah diatanya sebagai berikut :
- Membuat Controller Register
- Membuat Route Register
- Membuat Test Register
- 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.
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 :
-
test_user_can_register
-
test_user_cannot_register_with_existing_email
-
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
.

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"
}

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