UNPKG

messaging-api-line

Version:
716 lines (617 loc) 18 kB
import MockAdapter from 'axios-mock-adapter'; import LinePay from '../LinePay'; const CHANNEL_ID = '1234567890'; const CHANNEL_SECRET = 'so-secret'; const createMock = (): { client: LinePay; mock: MockAdapter; } => { const client = new LinePay({ channelId: CHANNEL_ID, channelSecret: CHANNEL_SECRET, }); const mock = new MockAdapter(client.axios); return { client, mock }; }; describe('connect', () => { let axios; let _create; beforeEach(() => { axios = require('axios'); _create = axios.create; }); afterEach(() => { axios.create = _create; }); it('create axios with LINE PAY API', () => { axios.create = jest.fn(); LinePay.connect({ channelId: CHANNEL_ID, channelSecret: CHANNEL_SECRET, }); expect(axios.create).toBeCalledWith({ baseURL: 'https://api-pay.line.me/v2/', headers: { 'Content-Type': 'application/json', 'X-LINE-ChannelId': CHANNEL_ID, 'X-LINE-ChannelSecret': CHANNEL_SECRET, }, }); }); }); describe('constructor', () => { let axios; let _create; beforeEach(() => { axios = require('axios'); _create = axios.create; }); afterEach(() => { axios.create = _create; }); it('create axios with LINE PAY API', () => { axios.create = jest.fn(); // eslint-disable-next-line no-new new LinePay({ channelId: CHANNEL_ID, channelSecret: CHANNEL_SECRET, }); expect(axios.create).toBeCalledWith({ baseURL: 'https://api-pay.line.me/v2/', headers: { 'Content-Type': 'application/json', 'X-LINE-ChannelId': CHANNEL_ID, 'X-LINE-ChannelSecret': CHANNEL_SECRET, }, }); }); it('support sandbox', () => { axios.create = jest.fn(); // eslint-disable-next-line no-new new LinePay({ channelId: CHANNEL_ID, channelSecret: CHANNEL_SECRET, sandbox: true, }); expect(axios.create).toBeCalledWith({ baseURL: 'https://sandbox-api-pay.line.me/v2/', headers: { 'Content-Type': 'application/json', 'X-LINE-ChannelId': CHANNEL_ID, 'X-LINE-ChannelSecret': CHANNEL_SECRET, }, }); }); it('support origin', () => { axios.create = jest.fn(); // eslint-disable-next-line no-new new LinePay({ channelId: CHANNEL_ID, channelSecret: CHANNEL_SECRET, origin: 'https://mydummytestserver.com', }); expect(axios.create).toBeCalledWith({ baseURL: 'https://mydummytestserver.com/v2/', headers: { 'Content-Type': 'application/json', 'X-LINE-ChannelId': CHANNEL_ID, 'X-LINE-ChannelSecret': CHANNEL_SECRET, }, }); }); }); describe('#axios', () => { it('should return underlying http client', () => { const client = new LinePay({ channelId: CHANNEL_ID, channelSecret: CHANNEL_SECRET, }); expect(client.axios.get).toBeDefined(); expect(client.axios.post).toBeDefined(); expect(client.axios.put).toBeDefined(); expect(client.axios.delete).toBeDefined(); }); }); describe('#getPayments', () => { const reply = { returnCode: '0000', returnMessage: 'success', info: [ { transactionId: 1020140728100001997, transactionDate: '2014-07-28T09:48:43Z', transactionType: 'PARTIAL_REFUND', amount: -5, productName: '', currency: 'USD', orderId: '20140101123123123', originalTransactionId: 1020140728100001999, }, ], }; it('should work with transactionId and orderId', async () => { const { client, mock } = createMock(); mock .onGet('/payments?transactionId=20140101123123123&orderId=1002045572') .reply(200, reply); const result = await client.getPayments({ transactionId: '20140101123123123', orderId: '1002045572', }); expect(result).toEqual(reply.info); }); it('should work with only transactionId', async () => { const { client, mock } = createMock(); mock.onGet('/payments?transactionId=20140101123123123').reply(200, reply); const result = await client.getPayments({ transactionId: '20140101123123123', }); expect(result).toEqual(reply.info); }); it('should work with only orderId', async () => { const { client, mock } = createMock(); mock.onGet('/payments?orderId=1002045572').reply(200, reply); const result = await client.getPayments({ orderId: '1002045572', }); expect(result).toEqual(reply.info); }); it('should throw without any id', async () => { const { client } = createMock(); await expect(() => client.getPayments()).toThrow( /One of `transactionId` or `orderId` must be provided/ ); }); it('should throw when not success', async () => { const { client, mock } = createMock(); mock.onGet('/payments?orderId=1002045572').reply(200, { returnCode: '1104', returnMessage: 'merchant not found', }); return expect( client.getPayments({ orderId: '1002045572', }) ).rejects.toThrow('LINE PAY API - 1104 merchant not found'); }); }); describe('#getAuthorizations', () => { const reply = { returnCode: '0000', returnMessage: 'success', info: [ { transactionId: 201612312312333401, transactionDate: '2014-07-28T09:48:43Z', transactionType: 'PAYMENT', payInfo: [ { method: 'BALANCE', amount: 10, }, { method: 'DISCOUNT', amount: 10, }, ], productName: 'tes production', currency: 'USD', orderId: '20140101123123123', payStatus: 'AUTHORIZATION', authorizationExpireDate: '2014-07-28T09:48:43Z', }, ], }; it('should work with transactionId and orderId', async () => { const { client, mock } = createMock(); mock .onGet( '/payments/authorizations?transactionId=20140101123123123&orderId=1002045572' ) .reply(200, reply); const result = await client.getAuthorizations({ transactionId: '20140101123123123', orderId: '1002045572', }); expect(result).toEqual(reply.info); }); it('should work with only transactionId', async () => { const { client, mock } = createMock(); mock .onGet('/payments/authorizations?transactionId=20140101123123123') .reply(200, reply); const result = await client.getAuthorizations({ transactionId: '20140101123123123', }); expect(result).toEqual(reply.info); }); it('should work with only orderId', async () => { const { client, mock } = createMock(); mock.onGet('/payments/authorizations?orderId=1002045572').reply(200, reply); const result = await client.getAuthorizations({ orderId: '1002045572', }); expect(result).toEqual(reply.info); }); it('should throw without any id', async () => { const { client } = createMock(); await expect(() => client.getAuthorizations()).toThrow( /One of `transactionId` or `orderId` must be provided/ ); }); it('should throw when not success', async () => { const { client, mock } = createMock(); mock.onGet('/payments/authorizations?orderId=1002045572').reply(200, { returnCode: '1104', returnMessage: 'merchant not found', }); return expect( client.getAuthorizations({ orderId: '1002045572', }) ).rejects.toThrow('LINE PAY API - 1104 merchant not found'); }); }); describe('#reserve', () => { it('should call reserve api', async () => { const { client, mock } = createMock(); const reply = { returnCode: '0000', returnMessage: 'OK', info: { transactionId: 123123123123, paymentUrl: { web: 'http://web-pay.line.me/web/wait?transactionReserveId=blahblah', app: 'line://pay/payment/blahblah', }, paymentAccessToken: '187568751124', }, }; mock .onPost('/payments/request', { productName: 'test product', productImageUrl: 'http://testst.com', amount: 10, currency: 'USD', mid: 'os89dufgoiw8yer9021384rdfeq', orderId: '20140101123456789', confirmUrl: 'naversearchapp://inappbrowser?url=http%3A%2F%2FtestMall.com%2FcheckResult.nhn%3ForderId%3D20140101123456789', cancelUrl: 'naversearchapp://inappbrowser?url=http%3A%2F%2FtestMall.com%2ForderSheet.nhn%3ForderId%3D20140101123456789', capture: true, confirmUrlType: 'CLIENT', extras: { addFriends: [ { type: 'LINE_AT', idList: ['@aaa', '@bbb'], }, ], branchName: 'test_branch_1', }, }) .reply(200, reply); const result = await client.reserve({ productName: 'test product', productImageUrl: 'http://testst.com', amount: 10, currency: 'USD', mid: 'os89dufgoiw8yer9021384rdfeq', orderId: '20140101123456789', confirmUrl: 'naversearchapp://inappbrowser?url=http%3A%2F%2FtestMall.com%2FcheckResult.nhn%3ForderId%3D20140101123456789', cancelUrl: 'naversearchapp://inappbrowser?url=http%3A%2F%2FtestMall.com%2ForderSheet.nhn%3ForderId%3D20140101123456789', capture: true, confirmUrlType: 'CLIENT', extras: { addFriends: [ { type: 'LINE_AT', idList: ['@aaa', '@bbb'], }, ], branchName: 'test_branch_1', }, }); expect(result).toEqual({ transactionId: 123123123123, paymentUrl: { web: 'http://web-pay.line.me/web/wait?transactionReserveId=blahblah', app: 'line://pay/payment/blahblah', }, paymentAccessToken: '187568751124', }); }); it('should throw when not success', async () => { const { client, mock } = createMock(); const reply = { returnCode: '1104', returnMessage: 'merchant not found', info: { transactionId: 123123123123, paymentUrl: { web: 'http://web-pay.line.me/web/wait?transactionReserveId=blahblah', app: 'line://pay/payment/blahblah', }, paymentAccessToken: '187568751124', }, }; mock .onPost('/payments/request', { productName: 'test product', productImageUrl: 'http://testst.com', amount: 10, currency: 'USD', mid: 'os89dufgoiw8yer9021384rdfeq', orderId: '20140101123456789', confirmUrl: 'naversearchapp://inappbrowser?url=http%3A%2F%2FtestMall.com%2FcheckResult.nhn%3ForderId%3D20140101123456789', cancelUrl: 'naversearchapp://inappbrowser?url=http%3A%2F%2FtestMall.com%2ForderSheet.nhn%3ForderId%3D20140101123456789', capture: true, confirmUrlType: 'CLIENT', extras: { addFriends: [ { type: 'LINE_AT', idList: ['@aaa', '@bbb'], }, ], branchName: 'test_branch_1', }, }) .reply(200, reply); return expect( client.reserve({ productName: 'test product', productImageUrl: 'http://testst.com', amount: 10, currency: 'USD', mid: 'os89dufgoiw8yer9021384rdfeq', orderId: '20140101123456789', confirmUrl: 'naversearchapp://inappbrowser?url=http%3A%2F%2FtestMall.com%2FcheckResult.nhn%3ForderId%3D20140101123456789', cancelUrl: 'naversearchapp://inappbrowser?url=http%3A%2F%2FtestMall.com%2ForderSheet.nhn%3ForderId%3D20140101123456789', capture: true, confirmUrlType: 'CLIENT', extras: { addFriends: [ { type: 'LINE_AT', idList: ['@aaa', '@bbb'], }, ], branchName: 'test_branch_1', }, }) ).rejects.toThrow('LINE PAY API - 1104 merchant not found'); }); }); describe('#confirm', () => { it('should call confirm api', async () => { const { client, mock } = createMock(); const reply = { returnCode: '0000', returnMessage: 'OK', info: { orderId: 'order_210124213', transactionId: 20140101123123123, payInfo: [ { method: 'BALANCE', amount: 10, }, { method: 'DISCOUNT', amount: 10, }, ], }, }; mock .onPost('/payments/sdhqiwouehrafdasrqoi123as/confirm', { amount: 1000, currency: 'TWD', }) .reply(200, reply); const result = await client.confirm('sdhqiwouehrafdasrqoi123as', { amount: 1000, currency: 'TWD', }); expect(result).toEqual({ orderId: 'order_210124213', transactionId: 20140101123123123, payInfo: [ { method: 'BALANCE', amount: 10, }, { method: 'DISCOUNT', amount: 10, }, ], }); }); it('should throw when not success', async () => { const { client, mock } = createMock(); const reply = { returnCode: '1104', returnMessage: 'merchant not found', info: { orderId: 'order_210124213', transactionId: 20140101123123123, payInfo: [ { method: 'BALANCE', amount: 10, }, { method: 'DISCOUNT', amount: 10, }, ], }, }; mock .onPost('/payments/sdhqiwouehrafdasrqoi123as/confirm', { amount: 1000, currency: 'TWD', }) .reply(200, reply); return expect( client.confirm('sdhqiwouehrafdasrqoi123as', { amount: 1000, currency: 'TWD', }) ).rejects.toThrow('LINE PAY API - 1104 merchant not found'); }); }); describe('#capture', () => { it('should call capture api', async () => { const { client, mock } = createMock(); const reply = { returnCode: '0000', returnMessage: 'OK', info: { transactionId: 20140101123123123, orderId: 'order_210124213', payInfo: [ { method: 'BALANCE', amount: 10, }, { method: 'DISCOUNT', amount: 10, }, ], }, }; mock .onPost('/payments/authorizations/sdhqiwouehrafdasrqoi123as/capture', { amount: 1000, currency: 'TWD', }) .reply(200, reply); const result = await client.capture('sdhqiwouehrafdasrqoi123as', { amount: 1000, currency: 'TWD', }); expect(result).toEqual({ transactionId: 20140101123123123, orderId: 'order_210124213', payInfo: [ { method: 'BALANCE', amount: 10, }, { method: 'DISCOUNT', amount: 10, }, ], }); }); it('should throw when not success', async () => { const { client, mock } = createMock(); const reply = { returnCode: '1104', returnMessage: 'merchant not found', info: { transactionId: 20140101123123123, orderId: 'order_210124213', payInfo: [ { method: 'BALANCE', amount: 10, }, { method: 'DISCOUNT', amount: 10, }, ], }, }; mock .onPost('/payments/authorizations/sdhqiwouehrafdasrqoi123as/capture', { amount: 1000, currency: 'TWD', }) .reply(200, reply); return expect( client.capture('sdhqiwouehrafdasrqoi123as', { amount: 1000, currency: 'TWD', }) ).rejects.toThrow('LINE PAY API - 1104 merchant not found'); }); }); describe('#void', () => { it('should call void api', async () => { const { client, mock } = createMock(); const reply = { returnCode: '0000', returnMessage: 'OK', }; mock .onPost('/payments/authorizations/sdhqiwouehrafdasrqoi123as/void') .reply(200, reply); const result = await client.void('sdhqiwouehrafdasrqoi123as'); expect(result).toBeUndefined(); }); it('should throw when not success', async () => { const { client, mock } = createMock(); const reply = { returnCode: '1104', returnMessage: 'merchant not found', }; mock .onPost('/payments/authorizations/sdhqiwouehrafdasrqoi123as/void') .reply(200, reply); return expect(client.void('sdhqiwouehrafdasrqoi123as')).rejects.toThrow( 'LINE PAY API - 1104 merchant not found' ); }); }); describe('#refund', () => { it('should call refund api', async () => { const { client, mock } = createMock(); const reply = { returnCode: '0000', returnMessage: 'success', info: { refundTransactionId: 123123123123, refundTransactionDate: '2014-01-01T06:17:41Z', }, }; mock.onPost('/payments/sdhqiwouehrafdasrqoi123as/refund').reply(200, reply); const result = await client.refund('sdhqiwouehrafdasrqoi123as', { refundAmount: 500, }); expect(result).toEqual({ refundTransactionId: 123123123123, refundTransactionDate: '2014-01-01T06:17:41Z', }); }); it('should throw when not success', async () => { const { client, mock } = createMock(); const reply = { returnCode: '1104', returnMessage: 'merchant not found', info: { refundTransactionId: 123123123123, refundTransactionDate: '2014-01-01T06:17:41Z', }, }; mock.onPost('/payments/sdhqiwouehrafdasrqoi123as/refund').reply(200, reply); return expect( client.refund('sdhqiwouehrafdasrqoi123as', { refundAmount: 500, }) ).rejects.toThrow('LINE PAY API - 1104 merchant not found'); }); });