Selamat datang di dunia pengujian aplikasi POS! Mengapa pengujian itu penting? Bayangkan kalau aplikasi POS kamu digunakan untuk memproses transaksi di toko pakaian, dan tiba-tiba ada error saat kasir mencoba memproses pembayaran. Bisa bikin stres!
Jangan khawatir! Di artikel ini, kita akan membahas bagaimana melakukan pengujian unit untuk aplikasi POS berbasis Express.js dan PostgreSQL. Kita akan menggunakan Mocha dan Chai untuk memastikan bahwa API CRUD (produk dan transaksi) berjalan lancar, serta bagaimana menguji middleware seperti autentikasi dan validasi.
1. Menyiapkan Pengujian Unit dengan Mocha dan Chai
1.1. Instalasi Mocha dan Chai
Mocha adalah framework pengujian yang sangat terkenal di dunia JavaScript. Sementara Chai adalah assertion library yang memungkinkan kita untuk menulis pengujian dengan sintaks yang lebih alami. Untuk memulai, kita perlu menginstal keduanya:
npm install mocha chai supertest --save-dev
- Mocha: Framework untuk menjalankan pengujian.
- Chai: Untuk melakukan assertion (verifikasi hasil).
- Supertest: Untuk menguji HTTP endpoints (API).
1.2. Struktur Pengujian
Mari buat struktur folder untuk pengujian yang lebih terorganisir:
├── tests
│ ├── product.test.js
│ ├── transaction.test.js
│ └── auth.test.js
Setelah ini, kita siap menulis pengujian!
2. Pengujian API Endpoints: CRUD Produk dan Transaksi
2.1. Pengujian CRUD Produk
Misalnya kita memiliki API untuk menambah produk dan mengambil daftar produk. Kita akan menulis pengujian unit menggunakan Supertest untuk menguji endpoint tersebut.
// tests/product.test.js
const chai = require('chai');
const expect = chai.expect;
const supertest = require('supertest');
const app = require('../app'); // Pastikan file app.js ada
describe('CRUD Produk', () => {
it('Harus menambahkan produk baru', async () => {
const res = await supertest(app)
.post('/products')
.send({ name: 'T-shirt', price: 100000, stock: 50 });
expect(res.status).to.equal(201);
expect(res.body).to.have.property('name', 'T-shirt');
expect(res.body).to.have.property('price', 100000);
});
it('Harus mendapatkan daftar produk', async () => {
const res = await supertest(app).get('/products');
expect(res.status).to.equal(200);
expect(res.body).to.be.an('array');
});
});
Penjelasan:
supertest(app)
: Mengirim request ke aplikasi Express.js..post('/products')
: Mengirim POST request untuk menambahkan produk baru..get('/products')
: Mengambil daftar produk.
2.2. Pengujian CRUD Transaksi
Selain produk, kita juga perlu menguji API transaksi. Misalnya, API untuk menambahkan transaksi dan mengambil riwayat transaksi:
// tests/transaction.test.js
const chai = require('chai');
const expect = chai.expect;
const supertest = require('supertest');
const app = require('../app');
describe('CRUD Transaksi', () => {
it('Harus menambahkan transaksi baru', async () => {
const res = await supertest(app)
.post('/transactions')
.send({ productId: 1, quantity: 2, total: 200000 });
expect(res.status).to.equal(201);
expect(res.body).to.have.property('total', 200000);
});
it('Harus mengambil riwayat transaksi', async () => {
const res = await supertest(app).get('/transactions');
expect(res.status).to.equal(200);
expect(res.body).to.be.an('array');
});
});
Penjelasan:
- Endpoint untuk menambahkan transaksi dan mengambil riwayat transaksi diuji dengan cara yang serupa dengan pengujian produk.
3. Pengujian Middleware (Autentikasi, Validasi, dll)
Aplikasi POS membutuhkan middleware untuk autentikasi pengguna dan validasi input. Mari kita uji middleware ini untuk memastikan semuanya berfungsi dengan baik.
3.1. Pengujian Middleware Autentikasi
Kita telah membahas tentang JWT authentication sebelumnya. Sekarang, mari kita buat pengujian untuk middleware autentikasi kita.
// tests/auth.test.js
const chai = require('chai');
const expect = chai.expect;
const supertest = require('supertest');
const app = require('../app');
describe('Middleware Autentikasi', () => {
it('Harus menolak akses tanpa token', async () => {
const res = await supertest(app).get('/transactions');
expect(res.status).to.equal(401);
expect(res.body).to.have.property('message', 'Akses ditolak! Token tidak ada');
});
it('Harus mengizinkan akses dengan token yang valid', async () => {
const token = 'valid.jwt.token'; // Gantilah dengan token yang valid
const res = await supertest(app)
.get('/transactions')
.set('Authorization', `Bearer ${token}`);
expect(res.status).to.equal(200);
});
});
Penjelasan:
- Pengujian ini memastikan bahwa hanya pengguna dengan token valid yang bisa mengakses endpoint yang dilindungi.
3.2. Pengujian Middleware Validasi Input
Untuk memastikan input yang diberikan pengguna valid, kita perlu melakukan validasi. Mari kita uji middleware validasi ini.
// tests/product.test.js
describe('Validasi Input Produk', () => {
it('Harus menolak produk dengan harga negatif', async () => {
const res = await supertest(app)
.post('/products')
.send({ name: 'Jacket', price: -50000, stock: 10 });
expect(res.status).to.equal(400);
expect(res.body).to.have.property('message', 'Harga tidak valid');
});
});
Penjelasan:
- Pengujian ini memastikan bahwa API menolak produk dengan harga negatif.
4. Menangani Pengujian Error dan Edge Cases
Dalam pengujian, kita juga harus memikirkan error handling dan edge cases untuk memastikan aplikasi POS kita tahan banting!
4.1. Pengujian Error 500 (Server Error)
Misalnya, kita ingin memastikan aplikasi menangani kesalahan server dengan benar:
it('Harus menangani error server dengan benar', async () => {
const res = await supertest(app).get('/nonexistent-endpoint');
expect(res.status).to.equal(500);
expect(res.body).to.have.property('message', 'Server error');
});
4.2. Pengujian Edge Case:
Misalnya, kita ingin menguji transaksi yang jumlahnya lebih besar dari stok produk:
it('Harus menolak transaksi jika jumlah melebihi stok', async () => {
const res = await supertest(app)
.post('/transactions')
.send({ productId: 1, quantity: 1000, total: 10000000 });
expect(res.status).to.equal(400);
expect(res.body).to.have.property('message', 'Stok tidak mencukupi');
});
Kesimpulan
Pengujian aplikasi POS sangat penting untuk memastikan bahwa sistem berfungsi dengan baik dan tahan banting! Dengan menggunakan Mocha, Chai, dan Supertest, kita dapat menguji semua aspek aplikasi POS, mulai dari API CRUD produk dan transaksi, middleware autentikasi, hingga penanganan error dan edge cases.
Kenapa pengujian itu penting? Karena kamu tidak ingin aplikasi POS kamu menghebohkan dunia bisnis dengan bug! Semoga artikel ini memberi kamu pemahaman yang jelas dan lucu (karena kita percaya bahwa pengujian bisa menyenangkan) tentang pengujian aplikasi POS menggunakan Express.js dan PostgreSQL!
0 Comments