UNPKG

@vtmap/vtmap-sdk-js

Version:

JS SDK for accessing Viettelmaps APIs

318 lines (299 loc) 8.12 kB
'use strict'; const MapiRequest = require('../mapi-request'); const tu = require('../../../test/test-utils'); function createMockClient() { return { sendRequest: jest.fn(() => Promise.resolve({ body: 'mock' })), abortRequest: jest.fn(), origin: 'mockClientOrigin' }; } test('errors without a client', () => { tu.expectError( () => { new MapiRequest(); }, error => { expect(error.message).toMatch(/client/); } ); }); test('has unique id', () => { const client = createMockClient(); const requestA = new MapiRequest(client, { path: 'mockUrl', method: 'MOCK_METHOD' }); expect(typeof requestA.id).toBe('number'); const requestB = new MapiRequest(client, { path: 'mockUrl', method: 'MOCK_METHOD' }); expect(typeof requestB.id).toBe('number'); expect(requestA.id).not.toBe(requestB.id); }); test('sets instance fields, minimal options', () => { const client = createMockClient(); const request = new MapiRequest(client, { path: 'mockUrl', method: 'MOCK_METHOD' }); expect(request).toMatchObject({ client, path: 'mockUrl', method: 'MOCK_METHOD', headers: {} }); }); test('sets instance fields, all options', () => { const client = createMockClient(); const mockHeaders = { accept: 'nothing' }; const mockBody = { foo: 'bar' }; const mockFile = {}; const request = new MapiRequest(client, { path: 'mockUrl', origin: 'mockClientOrigin', method: 'MOCK_METHOD', headers: mockHeaders, body: mockBody, file: mockFile }); expect(request).toMatchObject({ client, path: 'mockUrl', origin: 'mockClientOrigin', method: 'MOCK_METHOD', headers: { 'content-type': 'application/json', accept: 'nothing' }, body: { foo: 'bar' }, file: mockFile }); }); describe('MapiRequest#send', () => { test('success', () => { const client = createMockClient(); const expectedResponse = {}; client.sendRequest.mockReturnValue(Promise.resolve(expectedResponse)); const request = new MapiRequest(client, { path: 'mockUrl', method: 'MOCK_METHOD' }); return request.send().then(response => { expect(response).toBe(expectedResponse); }); }); test('catching an error', () => { const client = createMockClient(); const expectedError = new Error('error-message'); client.sendRequest.mockReturnValue(Promise.reject(expectedError)); const request = new MapiRequest(client, { path: 'mockUrl', method: 'MOCK_METHOD' }); return tu.expectRejection(request.send(), error => { expect(error).toBe(expectedError); }); }); }); describe('MapiRequest#eachPage', () => { test('one page', done => { const client = createMockClient(); const mockResponses = [ { page: 1, nextPage: () => null } ]; let responseIndex = -1; const send = () => { responseIndex += 1; return Promise.resolve(mockResponses[responseIndex]); }; client.sendRequest = send; const request = new MapiRequest(client, { path: 'mockUrl', method: 'MOCK_METHOD' }); expect.hasAssertions(); let pagesChecked = 0; const checkPage = (error, response, callback) => { pagesChecked += 1; expect(error).toBeNull(); expect(response).toHaveProperty('page', pagesChecked); callback(); }; request.eachPage(checkPage); process.nextTick(() => { expect(pagesChecked).toBe(1); done(); }); }); test('three pages', done => { const client = createMockClient(); const mockResponses = [ { page: 1, nextPage: () => ({ send: () => Promise.resolve(mockResponses[1]) }) }, { page: 2, nextPage: () => ({ send: () => Promise.resolve(mockResponses[2]) }) }, { page: 3, nextPage: () => null } ]; let responseIndex = -1; const send = () => { responseIndex += 1; return Promise.resolve(mockResponses[responseIndex]); }; client.sendRequest = send; const request = new MapiRequest(client, { path: 'mockUrl', method: 'MOCK_METHOD' }); expect.hasAssertions(); let pagesChecked = 0; const checkPage = (error, response, callback) => { pagesChecked += 1; expect(error).toBeNull(); expect(response).toHaveProperty('page', pagesChecked); callback(); }; request.eachPage(checkPage); process.nextTick(() => { expect(pagesChecked).toBe(3); done(); }); }); test('passes errors through', done => { const client = createMockClient(); const expectedError = new Error(); const mockResponses = [ { page: 1, nextPage: () => ({ send: () => Promise.resolve(mockResponses[1]) }) }, { page: 2, nextPage: () => ({ send: () => Promise.reject(expectedError) }) }, { page: 3, nextPage: () => null } ]; let responseIndex = -1; client.sendRequest = () => { responseIndex += 1; return Promise.resolve(mockResponses[responseIndex]); }; const request = new MapiRequest(client, { path: 'mockUrl', method: 'MOCK_METHOD' }); expect.hasAssertions(); let pagesChecked = 0; const checkPage = (error, response, callback) => { pagesChecked += 1; if (pagesChecked === 3) { expect(error).toBe(expectedError); expect(response).toBeNull(); } else { expect(error).toBeNull(); expect(response).toHaveProperty('page', pagesChecked); callback(); } }; request.eachPage(checkPage); process.nextTick(() => { expect(pagesChecked).toBe(3); done(); }); }); }); describe('MapiRequest#abort', () => { test("calls client's abort method", () => { const client = createMockClient(); const request = new MapiRequest(client, { path: 'mockUrl', method: 'MOCK_METHOD' }); request.send(); request.abort(); expect(client.abortRequest).toHaveBeenCalled(); }); test("sets request's aborted property", () => { const client = createMockClient(); const request = new MapiRequest(client, { path: 'mockUrl', method: 'MOCK_METHOD' }); request.send(); expect(request.aborted).toBe(false); request.abort(); expect(request.aborted).toBe(true); }); test('if there is a next page request, cancels it', () => { // This assumes that eachPage is corrrectly assigning // request.nextPageRequest. const client = createMockClient(); const request = new MapiRequest(client, { path: 'mockUrl', method: 'MOCK_METHOD' }); request.send(); const nextPageRequestAbort = jest.fn(); request._nextPageRequest = { abort: nextPageRequestAbort }; request.abort(); expect(nextPageRequestAbort).toHaveBeenCalled(); expect(request).not.toHaveProperty('nextPageRequest'); }); }); describe('MapiRequest#url', () => { test('works without an access token, appending query, interpolating route params, prepending origin', () => { const client = createMockClient(); const request = new MapiRequest(client, { path: '/foo/:a/:b/bar', method: 'MOCK_METHOD', params: { a: 'yep', b: 'nope' }, query: { fish: 'tuna' } }); expect(request.url()).toBe('mockClientOrigin/foo/yep/nope/bar?fish=tuna'); }); test('works with an access token, appending query, interpolating route params, prepending origin', () => { const client = createMockClient(); const request = new MapiRequest(client, { path: '/foo/:a/:b/bar', method: 'MOCK_METHOD', params: { a: 'yep', b: 'nope' }, query: { fish: 'tuna' } }); const token = tu.mockToken(); expect(request.url(token)).toBe( `mockClientOrigin/foo/yep/nope/bar?fish=tuna&access_token=${token}` ); }); });