167 lines
5.3 KiB
JavaScript
167 lines
5.3 KiB
JavaScript
|
|
const request = require('supertest');
|
||
|
|
const mongoose = require('mongoose');
|
||
|
|
const {app} = require('../app');
|
||
|
|
const packages = require('../package.json');
|
||
|
|
const connectDB = require('../src/config/database');
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
describe("Pengujian konfigurasi aplikasi", () => {
|
||
|
|
it("Harus memiliki paket-paket development yang diperlukan", (done) => {
|
||
|
|
try {
|
||
|
|
expect(packages.devDependencies).toHaveProperty("jest");
|
||
|
|
} catch (error) {
|
||
|
|
throw new Error('Paket "jest" tidak ditemukan di devDependencies. Jalankan "npm i jest --save-dev".');
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
expect(packages.devDependencies).toHaveProperty("nodemon");
|
||
|
|
} catch (error) {
|
||
|
|
throw new Error('Paket "nodemon" tidak ditemukan di devDependencies. Jalankan "npm i nodemon --save-dev".');
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
expect(packages.devDependencies).toHaveProperty("supertest");
|
||
|
|
} catch (error) {
|
||
|
|
throw new Error('Paket "supertest" tidak ditemukan di devDependencies. Jalankan "npm i supertest --save-dev".');
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
expect(packages.devDependencies).toHaveProperty("cross-env");
|
||
|
|
} catch (error) {
|
||
|
|
throw new Error('Paket "cross-env" tidak ditemukan di devDependencies. Jalankan "npm i cross-env --save-dev".');
|
||
|
|
}
|
||
|
|
done();
|
||
|
|
});
|
||
|
|
|
||
|
|
it("Harus memiliki paket-paket production yang diperlukan", (done) => {
|
||
|
|
try {
|
||
|
|
expect(packages.dependencies).toHaveProperty("dotenv");
|
||
|
|
} catch (error) {
|
||
|
|
throw new Error('Paket "dotenv" tidak ditemukan di dependencies. Jalankan "npm i dotenv --save".');
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
expect(packages.dependencies).toHaveProperty("express");
|
||
|
|
} catch (error) {
|
||
|
|
throw new Error('Paket "express" tidak ditemukan di dependencies. Jalankan "npm i express --save".');
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
expect(packages.dependencies).toHaveProperty("mongoose");
|
||
|
|
} catch (error) {
|
||
|
|
throw new Error('Paket "mongoose" tidak ditemukan di dependencies. Jalankan "npm i mongoose --save".');
|
||
|
|
}
|
||
|
|
done();
|
||
|
|
});
|
||
|
|
|
||
|
|
it("Harus memiliki nama yang benar", (done) => {
|
||
|
|
try {
|
||
|
|
expect(packages.name).toBe("restaurant-reservation");
|
||
|
|
} catch (error) {
|
||
|
|
throw new Error(`Nama aplikasi harus "restaurant-reservation", tetapi ditemukan "${packages.name}".`);
|
||
|
|
}
|
||
|
|
done();
|
||
|
|
});
|
||
|
|
|
||
|
|
it("Harus memiliki variabel lingkungan yang benar", (done) => {
|
||
|
|
try {
|
||
|
|
expect(process.env).toHaveProperty("MONGODB_URL");
|
||
|
|
} catch (error) {
|
||
|
|
throw new Error('Variabel lingkungan "MONGODB_URL" tidak ditemukan. Periksa file .env');
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
expect(process.env).toHaveProperty("PORT");
|
||
|
|
} catch (error) {
|
||
|
|
throw new Error('Variabel lingkungan "PORT" tidak ditemukan. Periksa file .env');
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
expect(process.env).toHaveProperty("MONGODB_URL_TEST");
|
||
|
|
} catch (error) {
|
||
|
|
throw new Error('Variabel lingkungan "MONGODB_URL_TEST" tidak ditemukan. Periksa file .env');
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
expect(process.env).toHaveProperty("NODE_ENV");
|
||
|
|
} catch (error) {
|
||
|
|
throw new Error('Variabel lingkungan "NODE_ENV" tidak ditemukan. Periksa file .env');
|
||
|
|
}
|
||
|
|
done();
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe("Pengujian Middleware Aplikasi", () => {
|
||
|
|
it("Harus memiliki middleware yang diperlukan", (done) => {
|
||
|
|
let application_stack = [];
|
||
|
|
app._router.stack.forEach((element) => {
|
||
|
|
application_stack.push(element.name);
|
||
|
|
});
|
||
|
|
|
||
|
|
// Test for JSON middleware
|
||
|
|
expect(application_stack).toContain("jsonParser");
|
||
|
|
if (!application_stack.includes("jsonParser")) {
|
||
|
|
throw new Error("Aplikasi tidak menggunakan format JSON. Periksa file app.js");
|
||
|
|
}
|
||
|
|
|
||
|
|
// Test for Express middleware
|
||
|
|
expect(application_stack).toContain("expressInit");
|
||
|
|
if (!application_stack.includes("expressInit")) {
|
||
|
|
throw new Error("Aplikasi tidak menggunakan express framework. Periksa file app.js");
|
||
|
|
}
|
||
|
|
|
||
|
|
// Test for URL-encoded middleware
|
||
|
|
expect(application_stack).toContain("urlencodedParser");
|
||
|
|
if (!application_stack.includes("urlencodedParser")) {
|
||
|
|
throw new Error("Aplikasi tidak menggunakan format urlencoded. Periksa file app.js");
|
||
|
|
}
|
||
|
|
|
||
|
|
done();
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('Pengujian Koneksi Database', () => {
|
||
|
|
it('Harus berhasil terhubung ke database MongoDB', async () => {
|
||
|
|
try {
|
||
|
|
const state = mongoose.connection.readyState;
|
||
|
|
expect(state).toBe(1);
|
||
|
|
} catch (error) {
|
||
|
|
throw new Error(`Gagal terhubung ke database: ${error.message}`);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('Pengujian API Utama', () => {
|
||
|
|
it('Harus mengembalikan pesan yang sesuai', async () => {
|
||
|
|
try {
|
||
|
|
const res = await request(app).get('/test');
|
||
|
|
expect(res.statusCode).toBe(200);
|
||
|
|
expect(res.body).toHaveProperty('status', 'success');
|
||
|
|
expect(res.body).toHaveProperty('message', 'Welcome to Restaurant Reservation API');
|
||
|
|
expect(res.body).toHaveProperty('version', '1.0.0');
|
||
|
|
} catch (error) {
|
||
|
|
throw new Error(`Terjadi kesalahan pada pengujian GET /: ${error.message}`);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
|
||
|
|
async function disconnectDB() {
|
||
|
|
await mongoose.connection.close();
|
||
|
|
}
|
||
|
|
|
||
|
|
beforeAll(async () => {
|
||
|
|
try {
|
||
|
|
await connectDB();
|
||
|
|
dbConnected = true;
|
||
|
|
} catch (error) {
|
||
|
|
console.warn('⚠️ Gagal terhubung ke database:', error.message);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
|
||
|
|
afterAll(async () => {
|
||
|
|
await disconnectDB();
|
||
|
|
});
|