4.7 KiB
Testing Guidelines - Feature Tests
Dokumentasi ini merangkum aturan dan pola standard dalam pembuatan feature test di proyek ini. Semua test baru (misal: module Order) harus mengikuti struktur ini untuk menjaga konsistensi.
1. Teknologi & Lokasi
- Framework: Pest PHP
- Lokasi:
tests/Feature/Admin/Master/(atau folder yang relevan sesuai grouping menu). - Penamaan File:
[Name]Test.php(Contoh:OrderTest.php).
2. Struktur Dasar (Describe Blocks)
Setiap file test harus dibagi menjadi minimal 3 blok describe:
A. Authorization
Digunakan untuk mengetes akses dasar (apakah sudah login dan apakah punya izin minimal untuk melihat index).
describe('Order Module - Authorization', function () {
it('redirects to login when accessing order index unauthenticated', function () {
get(route('order.index'))->assertRedirect(route('login'));
});
it('returns 403 when user has no permission to view orders', function () {
actingAs(createUnauthorizedUser())
->get(route('order.index'))
->assertStatus(403);
});
});
B. Authorized Actions
Blok utama untuk mengetes fitur CRUD dan fitur spesifik lainnya. Gunakan beforeEach untuk setup user dengan permissions lengkap.
describe('Order Module - Authorized Actions', function () {
beforeEach(function () {
$user = createAuthorizedUser([
'View:Order',
'Create:Order',
'Edit:Order',
'Delete:Order',
'DeleteAny:Order',
'ToggleStatus:Order', // Jika ada status
]);
actingAs($user);
});
// Test cases go here...
});
C. Unauthorized Actions
Mengetes restriksi akses untuk user yang sudah login tapi tidak punya permission spesifik untuk aksi tertentu.
describe('Order Module - Unauthorized Actions', function () {
beforeEach(function () {
actingAs(createUnauthorizedUser());
});
it('cannot store an order without permission', function () {
postJson(route('order.store'), [])->assertStatus(403);
});
// ... dst untuk update, delete, toggleStatus
});
3. Pola Testing Fitur Standard
Page Visits (Inertia)
Gunakan assertInertia untuk mengecek komponen dan ketersediaan data (props).
it('can access order index page', function () {
get(route('order.index'))
->assertOk()
->assertInertia(fn ($page) => $page
->component('admin/transaction/order/index') // path component
->has('orders') // mengecek prop data
);
});
Store / Update
- Gunakan
postJsonataupatchJson. - Cek redirect, session success, dan keberadaan data di database.
it('can store a new order', function () {
$data = [ /* dummy data */ ];
postJson(route('order.store'), $data)
->assertRedirect()
->assertSessionHas('success');
assertDatabaseHas('orders', ['field' => 'value']);
});
Validation
Tes skenario input kosong atau salah format untuk memastikan Request bekerja.
it('validates order creation', function () {
postJson(route('order.store'), [])
->assertStatus(422)
->assertJsonValidationErrors(['required_field']);
});
Delete & Bulk Delete
- Pastikan menggunakan
assertSoftDeletedjika model menggunakan SoftDeletes. - Untuk bulk, kirim array
ids.
it('can delete orders in bulk', function () {
$ids = Order::factory()->count(3)->create()->pluck('id')->toArray();
deleteJson(route('order.bulkDestroy'), ['ids' => $ids])
->assertRedirect()
->assertSessionHas('success');
foreach ($ids as $id) {
assertSoftDeleted('orders', ['id' => $id]);
}
});
Toggle Status
Cek perubahan nilai di database setelah request.
it('can toggle order status', function () {
$order = Order::factory()->create(['is_active' => true]);
patchJson(route('order.toggleStatus', $order))->assertRedirect();
expect($order->fresh()->is_active)->toBeFalse();
});
4. Fitur Spesifik Module (Aturan Tambahan)
Jika module memiliki fitur unik (seperti Order yang mungkin punya stok atau perhitungan subtotal), tambahkan test case khusus namun tetap ikuti style yang sama:
- Relasi: Jika menyimpan data ke tabel relasi (seperti
OrderItems), gunakanassertDatabaseHasuntuk tabel tersebut. - File Upload: Gunakan
Storage::fake()danUploadedFile::fake(). - Logic Bisnis: Jika ada logic otomatis (misal: stok berkurang), cek kondisi database sebelum dan sesudah aksi.
5. Helper Functions (Tersedia di tests/Pest.php)
createAuthorizedUser(array $permissions): Membuat user dan memberikan permissions.createUnauthorizedUser(): Membuat user tanpa permissions tambahan.