Skip to content

Commit 4f5889e

Browse files
author
Simen Li
committed
feature: create specific Error Classes for remote responses and invalid received CheckMaValue.
1 parent d3a3d86 commit 4f5889e

16 files changed

Lines changed: 554 additions & 186 deletions

src/__tests__/Error.test.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//@ts-nocheck
2+
import { QueryError, ActionError, CheckMacValueError } from '../feature/Error';
3+
4+
describe('QueryError: Check QueryError', () => {
5+
test('Must throw with code 100 and name ECPayReturnedQueryError', () => {
6+
try {
7+
throw new QueryError('Test Error', 100, { foo: 'bar' });
8+
} catch (err) {
9+
expect(err.name).toBe('ECPayReturnedQueryError');
10+
expect(err.code).toBe(100);
11+
expect(err.message).toBe('Test Error');
12+
}
13+
});
14+
});
15+
16+
describe('QueryError: Check ActionError', () => {
17+
test('Must throw with code 100 and name ECPayReturnedActionError', () => {
18+
try {
19+
throw new ActionError('Test Error', 100, { foo: 'bar' });
20+
} catch (err) {
21+
expect(err.name).toBe('ECPayReturnedActionError');
22+
expect(err.code).toBe(100);
23+
expect(err.message).toBe('Test Error');
24+
}
25+
});
26+
});
27+
28+
describe('QueryError: Check CheckMacValueError', () => {
29+
test('Must throw with name CheckMacValueError', () => {
30+
try {
31+
throw new CheckMacValueError('Test Error', { foo: 'bar' });
32+
} catch (err) {
33+
expect(err.name).toBe('CheckMacValueError');
34+
expect(err.message).toBe('Test Error');
35+
}
36+
});
37+
});

src/__tests__/actions/CreditCardPeriodAction.test.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,18 @@ describe('CreditCardPeriodAction: Remote Actions', () => {
5959
Action: 'Cancel',
6060
});
6161

62-
const data = await action.execute();
63-
expect(data.MerchantTradeNo).toEqual(QTN.CreditPeriod);
64-
expect(data).toHaveProperty('MerchantID');
65-
expect(data).toHaveProperty('MerchantTradeNo');
66-
expect(data).toHaveProperty('RtnCode');
67-
expect(data).toHaveProperty('RtnMsg');
68-
62+
try {
63+
const data = await action.execute();
64+
expect(data.MerchantTradeNo).toEqual(QTN.CreditPeriod);
65+
expect(data).toHaveProperty('MerchantID');
66+
expect(data).toHaveProperty('MerchantTradeNo');
67+
expect(data).toHaveProperty('RtnCode');
68+
expect(data).toHaveProperty('RtnMsg');
69+
} catch (err) {
70+
expect(err.name).toBe('ECPayReturnedActionError');
71+
expect(err.code).toBe(90100149);
72+
expect(err.message).toBe('該訂單狀態為停用中');
73+
}
6974
/*
7075
// Example: Verify Error
7176
{
@@ -116,7 +121,11 @@ describe('CreditCardPeriodAction: Remote Actions', () => {
116121
return result;
117122
};
118123

119-
const data = await action.execute();
120-
}).rejects.toThrowError('invalid CheckMacValue');
124+
try {
125+
const data = await action.execute();
126+
} catch (err) {
127+
expect(err.name).toBe('CheckMacValueError');
128+
}
129+
});
121130
});
122131
});

src/__tests__/payments/ATMPayment.test.ts

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,9 @@ describe('ATMPayment: html', () => {
9191

9292
test('Checkout with ', async () => {
9393
const payment = merchant.createPayment(ATMPayment, baseParams, {
94-
// ChooseSubPayment: 'FIRST',
94+
ClientRedirectURL:
95+
'https://payment-stage.ecpay.com.tw/PaymentRule/ATMPaymentInfo',
96+
ChooseSubPayment: 'BOT',
9597
ExpireDate: 7,
9698
});
9799
const html = await payment.checkout();
@@ -107,6 +109,44 @@ describe('ATMPayment: html', () => {
107109
// InvoiceRemark: '測試發票備註',
108110
// CustomerPhone: '0911111111',
109111
// });
110-
console.log(html);
112+
// console.log(html);
111113
});
112114
});
115+
116+
// describe('ATMPayment: placeOrder', () => {
117+
// const merchant = new Merchant('Test', {
118+
// MerchantID: '2000132',
119+
// HashKey: '5294y06JbISpM5x9',
120+
// HashIV: 'v77hoKGq4kWxNNIS',
121+
// ReturnURL: 'https://api.test.com/our/hook',
122+
// });
123+
124+
// const baseParams: BasePaymentParams = {
125+
// MerchantTradeNo: `nea${getCurrentTaipeiTimeString({ format: 'Serial' })}`,
126+
// MerchantTradeDate: getCurrentTaipeiTimeString(),
127+
// TotalAmount: 500,
128+
// TradeDesc: 'node-ecpay-aio testing order for ATMPayment',
129+
// ItemName: 'test item name',
130+
// };
131+
132+
// test('Placed Order with ', async () => {
133+
// const payment = merchant.createPayment(ATMPayment, baseParams, {
134+
// ExpireDate: 3,
135+
// });
136+
137+
// const rsp = await payment.placeOrder({
138+
// RelateNumber: 'rl-no-1',
139+
// TaxType: '1',
140+
// Donation: '0',
141+
// Print: '0',
142+
// InvoiceItemName: 'item1|item2',
143+
// InvoiceItemCount: '2|5',
144+
// InvoiceItemWord: '台|張',
145+
// InvoiceItemPrice: '100|50',
146+
// InvoiceRemark: '測試發票備註',
147+
// CustomerPhone: '0911111111',
148+
// });
149+
150+
// console.log(rsp);
151+
// });
152+
// });

src/__tests__/payments/CreditPeriodPayment.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,6 @@ describe('CreditPeriodPayment: html', () => {
368368
// InvoiceRemark: '測試發票備註',
369369
// CustomerPhone: '0911111111',
370370
// });
371-
console.log(html);
371+
// console.log(html);
372372
});
373373
});

src/__tests__/queries/CreditCardPeriodInfoQuery.test.ts

Lines changed: 47 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,15 @@ describe('CreditCardPeriodInfoQuery: Remote Query', () => {
9292
const query = merchant.createQuery(CreditCardPeriodInfoQuery, {
9393
MerchantTradeNo: QTN.CreditOneTime,
9494
});
95-
const data = await query.read();
9695

97-
expect(data.MerchantTradeNo).toBeFalsy();
98-
expect(data.TradeNo).toBeFalsy();
99-
expect(data.RtnCode).toBe(10200047); // Cant not find the trade data.
96+
try {
97+
const data = await query.read();
98+
} catch (err) {
99+
expect(err.name).toBe('ECPayReturnedQueryError');
100+
expect(err.code).toBe(10200047);
101+
// err.response:
102+
// {"ExecStatus":null,"MerchantID":"0","MerchantTradeNo":null,"TradeNo":null,"RtnCode":10200047,"PeriodType":null,"Frequency":0,"ExecTimes":0,"PeriodAmount":0,"amount":0,"gwsr":0,"process_date":null,"auth_code":null,"card4no":null,"card6no":null,"TotalSuccessTimes":0,"TotalSuccessAmount":0,"ExecLog":null}
103+
}
100104

101105
/*
102106
// Example
@@ -127,59 +131,74 @@ describe('CreditCardPeriodInfoQuery: Remote Query', () => {
127131
const query = merchant.createQuery(CreditCardPeriodInfoQuery, {
128132
MerchantTradeNo: QTN.CreditDivide,
129133
});
130-
const data = await query.read();
131-
expect(data.MerchantTradeNo).toBeFalsy();
132-
expect(data.TradeNo).toBeFalsy();
133-
expect(data.RtnCode).toBe(10200047);
134+
135+
try {
136+
const data = await query.read();
137+
} catch (err) {
138+
expect(err.name).toBe('ECPayReturnedQueryError');
139+
expect(err.code).toBe(10200047);
140+
}
134141
});
135142

136143
test(`Query CreditFlexible trade: ${QTN.CreditFlexible}: Must return RtnCode 10200047 because trade data not found.`, async () => {
137144
const query = merchant.createQuery(CreditCardPeriodInfoQuery, {
138145
MerchantTradeNo: QTN.CreditFlexible,
139146
});
140-
const data = await query.read();
141-
expect(data.MerchantTradeNo).toBeFalsy();
142-
expect(data.TradeNo).toBeFalsy();
143-
expect(data.RtnCode).toBe(10200047);
147+
try {
148+
const data = await query.read();
149+
} catch (err) {
150+
expect(err.name).toBe('ECPayReturnedQueryError');
151+
expect(err.code).toBe(10200047);
152+
}
144153
});
145154

146155
test(`Query ATM trade: ${QTN.ATM}: Must return RtnCode 10200047 because trade data not found.`, async () => {
147156
const query = merchant.createQuery(CreditCardPeriodInfoQuery, {
148157
MerchantTradeNo: QTN.ATM,
149158
});
150-
const data = await query.read();
151-
expect(data.MerchantTradeNo).toBeFalsy();
152-
expect(data.TradeNo).toBeFalsy();
153-
expect(data.RtnCode).toBe(10200047);
159+
try {
160+
const data = await query.read();
161+
} catch (err) {
162+
expect(err.name).toBe('ECPayReturnedQueryError');
163+
expect(err.code).toBe(10200047);
164+
}
154165
});
155166

156167
test(`Query WebATM trade: ${QTN.WebATM}: Must return RtnCode 10200047 because trade data not found.`, async () => {
157168
const query = merchant.createQuery(CreditCardPeriodInfoQuery, {
158169
MerchantTradeNo: QTN.WebATM,
159170
});
160-
const data = await query.read();
161-
expect(data.MerchantTradeNo).toBeFalsy();
162-
expect(data.TradeNo).toBeFalsy();
163-
expect(data.RtnCode).toBe(10200047);
171+
172+
try {
173+
const data = await query.read();
174+
} catch (err) {
175+
expect(err.name).toBe('ECPayReturnedQueryError');
176+
expect(err.code).toBe(10200047);
177+
}
164178
});
165179

166180
test(`Query CVS trade: ${QTN.CVS}: Must return RtnCode 10200047 because trade data not found.`, async () => {
167181
const query = merchant.createQuery(CreditCardPeriodInfoQuery, {
168182
MerchantTradeNo: QTN.CVS,
169183
});
170-
const data = await query.read();
171-
expect(data.MerchantTradeNo).toBeFalsy();
172-
expect(data.TradeNo).toBeFalsy();
173-
expect(data.RtnCode).toBe(10200047);
184+
185+
try {
186+
const data = await query.read();
187+
} catch (err) {
188+
expect(err.name).toBe('ECPayReturnedQueryError');
189+
expect(err.code).toBe(10200047);
190+
}
174191
});
175192

176193
test(`Query BARCODE trade: ${QTN.BARCODE}: Must return RtnCode 10200047 because trade data not found.`, async () => {
177194
const query = merchant.createQuery(CreditCardPeriodInfoQuery, {
178195
MerchantTradeNo: QTN.BARCODE,
179196
});
180-
const data = await query.read();
181-
expect(data.MerchantTradeNo).toBeFalsy();
182-
expect(data.TradeNo).toBeFalsy();
183-
expect(data.RtnCode).toBe(10200047);
197+
try {
198+
const data = await query.read();
199+
} catch (err) {
200+
expect(err.name).toBe('ECPayReturnedQueryError');
201+
expect(err.code).toBe(10200047);
202+
}
184203
});
185204
});

src/__tests__/queries/PaymentInfoQuery.test.ts

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ describe('PaymentInfoQuery: Remote Query Async PaymentInfo of ATM, CVS and BARCO
3232
expect(data).toHaveProperty('TradeNo');
3333
expect(data).toHaveProperty('vAccount');
3434
expect(data).toHaveProperty('RtnCode');
35+
3536
/*
3637
// Example
3738
{
@@ -151,8 +152,12 @@ describe('PaymentInfoQuery: Remote Query Async PaymentInfo of ATM, CVS and BARCO
151152
return result;
152153
};
153154

154-
const data = await query.read();
155-
}).rejects.toThrowError('invalid CheckMacValue');
155+
try {
156+
const data = await query.read();
157+
} catch (err) {
158+
expect(err.name).toBe('CheckMacValueError');
159+
}
160+
});
156161
});
157162
});
158163

@@ -163,44 +168,60 @@ describe('PaymentInfoQuery: Remote Query Sync PaymentInfo of CreditCard and WebA
163168
const query = merchant.createQuery(PaymentInfoQuery, {
164169
MerchantTradeNo: QTN.CreditOneTime,
165170
});
166-
const data = await query.read();
167-
expect(data.RtnCode).toBe(10200047);
168-
expect(data.RtnMsg).toContain('Cant not find');
171+
172+
try {
173+
const data = await query.read();
174+
} catch (err) {
175+
expect(err.name).toBe('ECPayReturnedQueryError');
176+
expect(err.code).toBe(10200047);
177+
}
169178
});
170179

171180
test(`Query sync payment CreditDivide ${QTN.CreditDivide}: Must return RtnCode 10200047 because trade data not found.`, async () => {
172181
const query = merchant.createQuery(PaymentInfoQuery, {
173182
MerchantTradeNo: QTN.CreditDivide,
174183
});
175-
const data = await query.read();
176-
expect(data.RtnCode).toBe(10200047);
177-
expect(data.RtnMsg).toContain('Cant not find');
184+
try {
185+
const data = await query.read();
186+
} catch (err) {
187+
expect(err.name).toBe('ECPayReturnedQueryError');
188+
expect(err.code).toBe(10200047);
189+
}
178190
});
179191

180192
test(`Query sync payment CreditPeriod ${QTN.CreditPeriod}: Must return RtnCode 10200047 because trade data not found.`, async () => {
181193
const query = merchant.createQuery(PaymentInfoQuery, {
182194
MerchantTradeNo: QTN.CreditPeriod,
183195
});
184-
const data = await query.read();
185-
expect(data.RtnCode).toBe(10200047);
186-
expect(data.RtnMsg).toContain('Cant not find');
196+
try {
197+
const data = await query.read();
198+
} catch (err) {
199+
expect(err.name).toBe('ECPayReturnedQueryError');
200+
expect(err.code).toBe(10200047);
201+
}
187202
});
188203

189204
test(`Query sync payment CreditFlexible ${QTN.CreditFlexible}: Must return RtnCode 10200047 because trade data not found.`, async () => {
190205
const query = merchant.createQuery(PaymentInfoQuery, {
191206
MerchantTradeNo: QTN.CreditFlexible,
192207
});
193-
const data = await query.read();
194-
expect(data.RtnCode).toBe(10200047);
195-
expect(data.RtnMsg).toContain('Cant not find');
208+
try {
209+
const data = await query.read();
210+
} catch (err) {
211+
expect(err.name).toBe('ECPayReturnedQueryError');
212+
expect(err.code).toBe(10200047);
213+
}
196214
});
197215

198216
test(`Query sync payment WebATM ${QTN.WebATM}: Must return RtnCode 10200047 because trade data not found.`, async () => {
199217
const query = merchant.createQuery(PaymentInfoQuery, {
200218
MerchantTradeNo: QTN.WebATM,
201219
});
202-
const data = await query.read();
203-
expect(data.RtnCode).toBe(10200047);
204-
expect(data.RtnMsg).toContain('Cant not find');
220+
try {
221+
const data = await query.read();
222+
} catch (err) {
223+
expect(err.name).toBe('ECPayReturnedQueryError');
224+
expect(err.code).toBe(10200047);
225+
}
205226
});
206227
});

src/__tests__/queries/TradeInfoQuery.test.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -428,10 +428,14 @@ describe('TradeInfoQuery: Remote Query Trades', () => {
428428
const query = merchant.createQuery(TradeInfoQuery, {
429429
MerchantTradeNo: 'nulltrade',
430430
});
431-
const data = await query.read();
432431

433-
expect(data.MerchantTradeNo).toEqual('nulltrade');
434-
expect(data.TradeStatus).toBe('10200047');
432+
try {
433+
const data = await query.read();
434+
} catch (err) {
435+
expect(err.name).toEqual('ECPayReturnedQueryError');
436+
expect(err.code).toBe(10200047);
437+
}
438+
435439
/*
436440
// Example
437441
{
@@ -466,7 +470,11 @@ describe('TradeInfoQuery: Remote Query Trades', () => {
466470
return result;
467471
};
468472

469-
const data = await query.read();
470-
}).rejects.toThrowError('invalid CheckMacValue');
473+
try {
474+
const data = await query.read();
475+
} catch (err) {
476+
expect(err.name).toBe('CheckMacValueError');
477+
}
478+
});
471479
});
472480
});

0 commit comments

Comments
 (0)