UNPKG

@intocode-io/fireliff-cli

Version:

Command line interface for building LIFF app on Firebase

254 lines (213 loc) 6.94 kB
import { FLIFF } from '../lib/fliff'; import { FLIFFError } from '../lib/fliff-error'; import { FunctionsConfig } from '../lib/functions-config'; import { LIFFConfig } from '../lib/liff-config'; import { LIFFDeleteRequest } from '../lib/liff-delete-request'; jest.mock('../lib/liff-delete-request'); describe('fliff delete', () => { const fakeConfig = { line: { access_token: 'testAccessToken', channel_id: 'testChannelId', channel_secret: 'testChannelSecret', }, views: { test1: 'abcde', test2: '12345', }, }; const request = { send: () => Promise.resolve(true), }; let fliff = new FLIFF(); beforeAll(() => { FunctionsConfig.config = fakeConfig; LIFFDeleteRequest.mockImplementation(() => request); }); afterAll(() => { delete FunctionsConfig.config; LIFFDeleteRequest.mockRestore(); }); describe('when missing id and name options', () => { it('reject with error', async () => { await expect(fliff.delete({})).rejects.toEqual( new FLIFFError(FLIFF.ErrorMessages.DeleteRequiredIdOrName) ); }); }); describe('when name option is provided', () => { let options = { name: 'testName', }; describe('and id option is not provided', () => { describe('and name is never set before', () => { let rsDelete; beforeAll(async () => { jest.spyOn(LIFFConfig, 'getViewIdByName').mockResolvedValue(null); await fliff .delete(options) .catch((errDelete) => (rsDelete = errDelete)); }); afterAll(() => { LIFFConfig.getViewIdByName.mockRestore(); }); it('try to get id from name', () => { expect(LIFFConfig.getViewIdByName).toHaveBeenCalled(); }); it('reject with error', () => { expect(rsDelete).toEqual( new FLIFFError(FLIFF.ErrorMessages.FailedToRetrieveIdUsingName) ); }); }); }); }); describe('when id option is provided', () => { let options = { id: 'abcde', }; describe('and name option is not provided', () => { describe('and id is never set before', () => { let rsDelete; beforeAll(async () => { jest.spyOn(LIFFConfig, 'getViewNameById').mockResolvedValue(null); await fliff .delete(options) .catch((errDelete) => (rsDelete = errDelete)); }); afterAll(() => { LIFFConfig.getViewNameById.mockRestore(); }); it('try to get name from id', () => { expect(LIFFConfig.getViewNameById).toHaveBeenCalled(); }); it('reject with error', () => { expect(rsDelete).toEqual( new FLIFFError(FLIFF.ErrorMessages.FailedToRetrieveNameUsingId) ); }); }); }); }); describe('when all options provided', () => { const options = { id: 'abcde', name: 'test1', type: 'full', url: 'https://www.facebook.com/intocode', description: 'testDesc', ble: 'False', }; const expectedData = ['test1']; describe('and able to send', () => { const fakeSentResult = { response: 'something' }; let rsSend; describe('and able to unset view', () => { beforeAll(async () => { jest.spyOn(request, 'send').mockResolvedValue(fakeSentResult); jest .spyOn(LIFFConfig, 'unsetView') .mockImplementation((name) => Promise.resolve(name)); jest.spyOn(LIFFConfig, 'getViewNamesById'); rsSend = await fliff.delete(options); }); afterAll(() => { request.send.mockRestore(); LIFFConfig.unsetView.mockRestore(); LIFFConfig.getViewNamesById.mockRestore(); }); it('send with correct data', () => { expect(request.send).toHaveBeenCalledWith(options.id); }); it('return correct result', () => { expect(rsSend).toEqual(expectedData); }); }); describe('and fail to unset view', () => { const fakeError = new Error('some unset error'); beforeAll(async () => { jest.spyOn(request, 'send').mockResolvedValue(fakeSentResult); jest.spyOn(LIFFConfig, 'unsetView').mockImplementation(() => { throw Error(fakeError); }); }); afterAll(() => { request.send.mockRestore(); LIFFConfig.unsetView.mockRestore(); }); it('reject with error', async () => { await expect(fliff.delete(options)).rejects.toThrow( new FLIFFError(FLIFF.ErrorMessages.FailedToUnsetViews) ); }); }); }); describe('and not able to send', () => { describe('and error is not found', () => { const fakeError = { response: { data: { message: 'not found', }, }, }; let rsDelete; beforeAll(async () => { jest.spyOn(request, 'send').mockRejectedValue(fakeError); jest .spyOn(LIFFConfig, 'unsetView') .mockImplementation((name) => Promise.resolve(name)); jest.spyOn(LIFFConfig, 'getViewNamesById'); rsDelete = await fliff.delete(options); }); afterAll(() => { request.send.mockRestore(); LIFFConfig.unsetView.mockRestore(); LIFFConfig.getViewNamesById.mockRestore(); }); it('try to unset view', async () => { expect(LIFFConfig.getViewNamesById).toHaveBeenCalledWith( options.id, fakeConfig ); expect(LIFFConfig.unsetView).toHaveBeenCalled(); }); it('result contains view names', () => { expect(rsDelete).toEqual(expectedData); }); }); describe('and error has response message in data', () => { const fakeError = { response: { data: { error: 'Test error message', }, }, }; beforeAll(async () => { jest.spyOn(request, 'send').mockRejectedValue(fakeError); }); afterAll(() => { request.send.mockRestore(); }); it('reject with error', async () => { await expect(fliff.delete(options)).rejects.toEqual( fakeError.response.data.error ); }); }); describe('and error is something else', () => { const fakeError = 'any'; beforeAll(async () => { jest.spyOn(request, 'send').mockRejectedValue(fakeError); }); afterAll(() => { request.send.mockRestore(); }); it('reject with error', async () => { await expect(fliff.delete(options)).rejects.toEqual(fakeError); }); }); }); }); });