doku-nodejs-library
Version:
248 lines (230 loc) • 11.2 kB
JavaScript
const Snap = require("../_modules/snap");
const VaService = require('../_services/vaService'); // Ganti dengan path yang sesuai
const TokenController = require('../_controllers/tokenController'); // Ganti dengan path yang sesuai
const VaController = require('../_controllers/vaController'); // Ganti dengan path yang sesuai
jest.mock('../_controllers/tokenController');
jest.mock('../_controllers/vaController');
describe('Validate request create va', () => {
const param = {
"partnerServiceId": " 1899",
"trxId": "INV_CIMB_"+Date.now(),
"virtualAccountTrxType": "1",
"totalAmount": {
"value": "12500.00",
"currency": "IDR"
},
"feeAmount": {
"value": "1000.00",
"currency": "IDR"
},
"expiredDate": "2024-04-22T09:54:04+07:00",
"virtualAccountName": "T_"+Date.now(),
"virtualAccountEmail": "test.bnc."+Date.now()+"@test.com",
"virtualAccountPhone": "628"+Date.now(),
"billDetails": [
{
"billCode": "01",
"billNo": `${Date.now()}`,
"billName": "Bill A for Jan",
"billShortName": "Bill A",
"billDescription": {
"english": "Maintenance",
"indonesia": "Pemeliharaan"
},
"billSubCompany": "00001",
"billAmount": {
"value": "10000.00",
"currency": "IDR"
},
"additionalInfo": {}
}
],
"freeTexts": [
{
"english": "Free text",
"indonesia": "Tulisan bebas"
}
],
"additionalInfo": {
"channel": "VIRTUAL_ACCOUNT_BANK_CIMB",
"virtualAccountConfig": {
"reusableStatus": false
}
}
}
beforeEach(() => {
snap = new Snap();
});
describe('validate request', () => {
test('validateVirtualAccountName', () => {
expect(param).toHaveProperty('virtualAccountName');
expect(param.virtualAccountName).not.toBeNull();
expect(typeof param.virtualAccountName).toBe('string');
expect(param.virtualAccountName.length).toBeGreaterThanOrEqual(1);
expect(param.virtualAccountName.length).toBeLessThanOrEqual(255);
const virtualAccountNameRegex = /^[a-zA-Z0-9.\\/+,_:'@% -]*$/;
expect(param.virtualAccountName).toMatch(/^[a-zA-Z0-9.\\/+,_:'@% -]*$/);
});
test('validateVirtualAccountEmail', () => {
if (param.virtualAccountEmail) {
expect(param).toHaveProperty('virtualAccountEmail');
expect(typeof param.virtualAccountEmail).toBe('string');
expect(param.virtualAccountEmail.length).toBeGreaterThanOrEqual(1);
expect(param.virtualAccountEmail.length).toBeLessThanOrEqual(255);
const virtualAccountEmailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
expect(param.virtualAccountEmail).toMatch(virtualAccountEmailRegex);
}
});
test('validateCustomerNo', () => {
if (param.customerNo) {
expect(param).toHaveProperty('customerNo');
expect(typeof param.virtualAccountEmail).toBe('string');
expect(param.virtualAccountEmail.length).toBeGreaterThanOrEqual(1);
expect(param.virtualAccountEmail.length).toBeLessThanOrEqual(20);
const regex = /^\d+$/;
expect(param.virtualAccountEmail).toMatch(regex);
}
});
test('validateVirtualAccountPhone', () => {
if (param.virtualAccountPhone) {
expect(param).toHaveProperty('virtualAccountPhone');
expect(typeof param.virtualAccountPhone).toBe('string');
expect(param.virtualAccountPhone.length).toBeGreaterThanOrEqual(9);
expect(param.virtualAccountPhone.length).toBeLessThanOrEqual(30);
const regex = /62[0-9]+$/;
expect(param.virtualAccountPhone).toMatch(regex);
}
});
test('validatTrxId', () => {
expect(param).toHaveProperty('trxId');
expect(typeof param.trxId).toBe('string');
expect(param.trxId.length).toBeGreaterThanOrEqual(1);
expect(param.trxId.length).toBeLessThanOrEqual(64);
});
test('validateTotalAmountValue', () => {
expect(param.totalAmount).toHaveProperty('value');
expect(typeof param.totalAmount.value).toBe('string');
expect(param.totalAmount.value.length).toBeGreaterThanOrEqual(4);
expect(param.totalAmount.value.length).toBeLessThanOrEqual(19);
});
test('validateCurrency', () => {
expect(param.totalAmount).toHaveProperty('currency', 'IDR');
expect(typeof param.totalAmount.currency).toBe('string');
});
test('validateExpiredDate', () => {
expect(param).toHaveProperty('expiredDate');
expect(typeof param.expiredDate).toBe('string');
const dateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:[+\-]\d{2}:\d{2})?$/;
expect(param.expiredDate).toMatch(dateRegex);
});
test('validateVirtualAccountTrxType', () => {
expect(param).toHaveProperty('virtualAccountTrxType');
expect(typeof param.virtualAccountTrxType).toBe('string');
expect(param.virtualAccountTrxType.length).toBeGreaterThanOrEqual(1);
expect(param.virtualAccountTrxType.length).toBeLessThanOrEqual(2);
});
test('validateChannel', () => {
expect(param.additionalInfo).toHaveProperty('channel');
expect(typeof param.additionalInfo.channel).toBe('string');
expect(param.additionalInfo.channel.length).toBeGreaterThanOrEqual(1);
expect(param.additionalInfo.channel.length).toBeLessThanOrEqual(30);
});
test('validateReusableStatus', () => {
expect(param.additionalInfo.virtualAccountConfig).toHaveProperty('reusableStatus');
expect(typeof param.additionalInfo.virtualAccountConfig.reusableStatus).toBe('boolean');
});
});
});
describe('Create Va', () => {
let snapInstance;
let privateKey = `-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCvuA0S+R8RGEoT
xZYfksdNam3/iNrKzY/RqGbN4Gf0juIN8XnUM8dGv4DVqmXQwRMMeQ3N/Y26pMDJ
1v/i6E5BwWasBAveSk7bmUBQYMURzxrvBbvfRNvIwtYDa+cx39HamfiYYOHq4hZV
S6G2m8SqDEhONxhHQmEP9FPHSOjPQWKSlgxrT3BKI9ESpQofcxKRX3hyfh6MedWT
lZpXUJrI9bd6Azg3Fd5wpfHQlLcKSR8Xr2ErH7dNS4I21DTHR+6qx02Tocv5D30O
DamA6yG9hxnFERLVE+8GnJE52Yjjsm5otGRwjHS4ngSShc/Ak1ZyksaCTFl0xEwT
J1oeESffAgMBAAECggEAHv9fxw4NTe2z+6LqZa113RE+UEqrFgWHLlv/rqe8jua5
t+32KNnteGyF5KtHhLjajGO6bLEi1F8F51U3FKcYTv84BnY8Rb1kBdcWAlffy9F2
Fd40EyHJh7PfHwFk6mZqVZ69vNuyXsX9XJSX9WerHLhH9QxBCykJiE/4i3owH4dF
Cd/7ervsP32ukGY3rs/mdcO8ThAWffF5QyGd/A3NMf8jRCZ3FwYfEPrgaj9IHV2f
UrwgVc7JqQaCJTvvjrm4Epjp+1mca036eoDj40H+ImF9qQ80jZee/vvqRXjfU5Qx
ys/MHD6S2aGEG5N5VnEuHLHvT51ytTpKA+mAY/armQKBgQDrQVtS8dlfyfnPLRHy
p8snF/hpqQQF2k1CDBJTaHfNXG37HlccGzo0vreFapyyeSakCdA3owW7ET8DBiO5
WN2Qgb7Vab/7vEiGltK4YU/62+g4F0LjWPp25wnbVj81XXW95QrWKjytjU/tgO2p
h47qr8C+3HqMPj1pQ5tcKpJXCwKBgQC/Nrkn0kT+u4KOxXix5RkRDxwfdylCvuKc
3EfMHFs4vELi1kOhwXEbVTIsbFpTmsXclofqZvjkhepeu9CM6PN2T852hOaI+1Wo
4v57UTW/nkpyo8FZ09PtBvOau5B6FpQU0uaKWrZ0dX/f0aGbQKUxJnFOq++7e7mi
IBfX1QCm/QKBgHtVWkFT1XgodTSuFji2ywSFxo/uMdO3rMUxevILVLNu/6GlOFnd
1FgOnDvvtpLCfQWGt4hTiQ+XbQdy0ou7EP1PZ/KObD3XadZVf8d2DO4hF89AMqrp
3PU1Dq/UuXKKus2BJHs+zWzXJs4Gx5IXJU/YMB5fjEe14ZAsB2j8UJgdAoGANjuz
MFQ3NXjBgvUHUo2EGo6Kj3IgxcmWRJ9FzeKNDP54ihXzgMF47yOu42KoC+ZuEC6x
xg4Gseo5mzzx3cWEqB3ilUMEj/2ZQhl/zEIwWHTw8Kr5gBzQkv3RwiVIyRf2UCGx
ObSY41cgOb8fcwVW1SXuJT4m9KoW8KDholnLoZECgYEAiNpTvvIGOoP/QT8iGQkk
r4GK50j9BoPSJhiM6k236LSc5+iZRKRVUCFEfyMPx6AY+jD2flfGxUv2iULp92XG
2eE1H6V1gDZ4JJw3s5847z4MNW3dj9nIi2bpFssnmoS5qP2IpmJW0QQmRmJZ8j2j
OrzKGlO90/6sNzIDd2DbRSM=
-----END PRIVATE KEY-----`
let clientID = 'BRN-0221-1693209567392'
let publicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr7gNEvkfERhKE8WWH5LHTWpt/4jays2P0ahmzeBn9I7iDfF51DPHRr+A1apl0METDHkNzf2NuqTAydb/4uhOQcFmrAQL3kpO25lAUGDFEc8a7wW730TbyMLWA2vnMd/R2pn4mGDh6uIWVUuhtpvEqgxITjcYR0JhD/RTx0joz0FikpYMa09wSiPREqUKH3MSkV94cn4ejHnVk5WaV1CayPW3egM4NxXecKXx0JS3CkkfF69hKx+3TUuCNtQ0x0fuqsdNk6HL+Q99Dg2pgOshvYcZxRES1RPvBpyROdmI47JuaLRkcIx0uJ4EkoXPwJNWcpLGgkxZdMRMEydaHhEn3wIDAQAB
-----END PUBLIC KEY-----`
let secretKey = 'SK-tDzY6MSLBWlNXy3qCsUU';
beforeEach(() => {
// Setup instance Snap sebelum setiap test
snapInstance = new Snap({
isProduction: false,
privateKey: privateKey,
clientID: clientID,
publicKey: publicKey,
issuer: "issuer",
secretKey: secretKey
});
});
afterEach(() => {
jest.clearAllMocks(); // Clear mocks setelah setiap test
});
test('should create VA successfully when token is valid', async () => {
// Setup mock untuk TokenController
TokenController.prototype.isTokenInvalid.mockReturnValue(false);
// Setup mock untuk VaController
VaController.prototype.createVa.mockResolvedValue({ success: true });
const createVARequestDto = {
validateVaRequestDto: jest.fn(),
validateSimulator: jest.fn(),
// Tambahkan properti dan metode lain jika diperlukan
};
const result = await snapInstance.createVa(createVARequestDto);
expect(createVARequestDto.validateVaRequestDto).toHaveBeenCalled();
expect(createVARequestDto.validateSimulator).toHaveBeenCalled();
expect(result).toEqual({ success: true });
});
test('should refresh token and create VA when token is invalid', async () => {
// Setup mock untuk TokenController
TokenController.prototype.isTokenInvalid.mockReturnValue(true);
TokenController.prototype.getTokenB2B.mockResolvedValue({
accessToken: 'newAccessToken',
expiresIn: 900
});
// Setup mock untuk VaController
VaController.prototype.createVa.mockResolvedValue({ success: true });
const createVARequestDto = {
validateVaRequestDto: jest.fn(),
validateSimulator: jest.fn(),
// Tambahkan properti dan metode lain jika diperlukan
};
const result = await snapInstance.createVa(createVARequestDto);
expect(createVARequestDto.validateVaRequestDto).toHaveBeenCalled();
expect(createVARequestDto.validateSimulator).toHaveBeenCalled();
expect(TokenController.prototype.getTokenB2B).toHaveBeenCalled();
expect(VaController.prototype.createVa).toHaveBeenCalledWith(
createVARequestDto,
snapInstance.privateKey,
snapInstance.clientId,
'newAccessToken',
snapInstance.isProduction,
snapInstance.secretKey
);
expect(result).toEqual({ success: true });
});
});