From d4518e237c0740f09726ef50e0ac39c92abfd9cc Mon Sep 17 00:00:00 2001 From: Justin Date: Tue, 5 Jun 2018 21:15:46 -0400 Subject: [PATCH 1/3] Adding tests and updating pagination properties --- README.md | 5 +- src/infrastructure/RequestHelper.js | 15 ++- test/tests/infrastructure/RequestHelper.js | 136 +++++++++++++++++++++ 3 files changed, 150 insertions(+), 6 deletions(-) create mode 100644 test/tests/infrastructure/RequestHelper.js diff --git a/README.md b/README.md index b8ced9aa..f52876d7 100644 --- a/README.md +++ b/README.md @@ -360,11 +360,12 @@ data: [ ... ], pagination: { + total: 20, next: 4, current: 2, - perPage: 3, previous: 1, - total: 3, + perPage: 3, + totalPages: 3, } ``` diff --git a/src/infrastructure/RequestHelper.js b/src/infrastructure/RequestHelper.js index 45055319..7f8847b0 100644 --- a/src/infrastructure/RequestHelper.js +++ b/src/infrastructure/RequestHelper.js @@ -22,12 +22,16 @@ function defaultRequest( }; if (body) params.body = Humps.decamelizeKeys(body); + if (qs) { if (useXMLHttpRequest) { // The xhr package doesn't have a way of passing in a qs object until v3 params.url = URLJoin(params.url, `?${QS.stringify(Humps.decamelizeKeys(qs))}`); - } else params.qs = Humps.decamelizeKeys(qs); + } else { + params.qs = Humps.decamelizeKeys(qs); + } } + if (formData) params.formData = formData; params.resolveWithFullResponse = resolveWithFullResponse; @@ -61,24 +65,27 @@ async function getPaginated(service, endpoint, options = {}) { const page = response.headers['x-page']; const underMaxPageLimit = maxPages ? page < maxPages : true; let more = []; + let data; // If not looking for a singular page and still under the max pages limit // AND their is a next page, paginate if (!queryOptions.page && underMaxPageLimit && links.next) { more = await getPaginated(service, links.next.url.replace(service.url, ''), options); + data = [...response.body, ...more]; + }else { + data = response.body; } - const data = [...response.body, ...more]; - if (queryOptions.page && showPagination) { return { data, pagination: { + total: response.headers['x-total'] perPage: response.headers['x-per-page'], next: response.headers['x-next-page'], current: response.headers['x-page'], previous: response.headers['x-prev-page'], - total: response.headers['x-total-pages'], + totalPages: response.headers['x-total-pages'], }, }; } diff --git a/test/tests/infrastructure/RequestHelper.js b/test/tests/infrastructure/RequestHelper.js new file mode 100644 index 00000000..818e5ea3 --- /dev/null +++ b/test/tests/infrastructure/RequestHelper.js @@ -0,0 +1,136 @@ +import { RequestHelper } from '../../../src/infrastructure'; + +const mockService = { + url: 'testing', + headers: {}, + requester: { + get: () => ({ + body: { + prop1: 5, + prop2: 'test property' + }, + headers: { + 'X-Page': 1, + 'X-Total-Pages': 1 + } + }) + } +}; + +const mockService2 = { + url: 'testing', + headers: {}, + requester: { + get: ({url, qs}) => { + if(qs.page) url+=`page=${qs.page}`; + + const page1 = { + body: [{ + prop1: 1, + prop2: 'test property1' + }, + { + prop1: 2, + prop2: 'test property2' + }], + headers: { + link: `<'https://www.test.com/api/v3/projects/8?page=2&per_page=2>; rel="next", <'https://www.test.com/api/v3/projects/8?page=1&per_page=2>; rel="first", <'https://www.test.com/api/v3/projects/8?page=2&per_page=2>; rel="last"`, + 'x-next-page': 2, + 'x-page': 1, + 'x-per-page': 2, + 'x-prev-page': '', + 'x-total': 4, + 'x-total-pages': 2, + } + } + + const page2 = { + body: [{ + prop1: 3, + prop2: 'test property3' + }, + { + prop1: 4, + prop2: 'test property4' + }], + headers: { + link: `<'https://www.test.com/api/v3/projects/8?page=1&per_page=2>; rel="prev", <'https://www.test.com/api/v3/projects/8?page=1&per_page=2>; rel="first", <'https://www.test.com/api/v3/projects/8?page=2&per_page=2>; rel="last"`, + 'x-next-page': '', + 'x-page': 2, + 'x-per-Page': 2, + 'x-prev-Page': 1, + 'x-total': 4, + 'x-total-Pages': 2, + } + } + + if(url.includes('page=2')) return page2; + + return page1; + } + } +}; + +describe('RequestHelper.get()', () => { + it('Should respond with an object', async () => { + const response = await RequestHelper.get(mockService, 'https://www.test.com'); + + expect(response.prop1).toBe(5); + expect(response.prop2).toBe('test property'); + }); + + it('Should be paginated when links are present', async () => { + const response = await RequestHelper.get(mockService2, 'https://www.test.com'); + + response.forEach((l, index) => { + expect(l.prop1).toBe(1 + index ) + expect(l.prop2).toBe(`test property${1 + index}`) + }) + }); + + it('Should be paginated but limited by the maxPages option', async () => { + const response = await RequestHelper.get(mockService2, 'https://www.test.com', { maxPages: 1 }); + + expect(response.length).toBe(2); + expect(response[0].prop1).toBe(1); + + response.forEach((l, index) => { + expect(l.prop1).toBe(1 + index ) + expect(l.prop2).toBe(`test property${1 + index}`) + }) + }); + + it('Should be paginated but limited by the page option', async () => { + const response = await RequestHelper.get(mockService2, 'https://www.test.com', { page: 2 }); + + expect(response.length).toBe(2); + expect(response[0].prop1).toBe(3); + + response.forEach((l, index) => { + expect(l.prop1).toBe(3 + index) + expect(l.prop2).toBe(`test property${3 + index}`) + }) + }); + + it('Should show the pagination information when the page option is given', async () => { + const response = await RequestHelper.get(mockService2, 'https://www.test.com', { page: 2, showPagination: true}); + + expect(response.data).toBeDefined(); + expect(response.data.length).toBe(2); + expect(response.data[0].prop1).toBe(3); + + response.data.forEach((l, index) => { + expect(l.prop1).toBe(3 + index) + expect(l.prop2).toBe(`test property${3 + index}`) + }) + + expect(response.pagination).toMatchObject({ + total: 4, + previous: 1, + current: 2, + next: '', + perPage: 2, + totalPages: 2 + }) + }); +}); From 20ce703a2eb2a88bc83e6e5a3460ca4e08807ef7 Mon Sep 17 00:00:00 2001 From: Justin Date: Tue, 5 Jun 2018 21:49:34 -0400 Subject: [PATCH 2/3] Updating tests --- src/infrastructure/RequestHelper.js | 8 ++++---- test/tests/infrastructure/RequestHelper.js | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/infrastructure/RequestHelper.js b/src/infrastructure/RequestHelper.js index 7f8847b0..a9ebe3c8 100644 --- a/src/infrastructure/RequestHelper.js +++ b/src/infrastructure/RequestHelper.js @@ -80,11 +80,11 @@ async function getPaginated(service, endpoint, options = {}) { return { data, pagination: { - total: response.headers['x-total'] + total: response.headers['x-total'], + next: response.headers['x-next-page'] || null, + current: response.headers['x-page'] || null, + previous: response.headers['x-prev-page'] || null, perPage: response.headers['x-per-page'], - next: response.headers['x-next-page'], - current: response.headers['x-page'], - previous: response.headers['x-prev-page'], totalPages: response.headers['x-total-pages'], }, }; diff --git a/test/tests/infrastructure/RequestHelper.js b/test/tests/infrastructure/RequestHelper.js index 818e5ea3..edfd47f8 100644 --- a/test/tests/infrastructure/RequestHelper.js +++ b/test/tests/infrastructure/RequestHelper.js @@ -57,10 +57,10 @@ const mockService2 = { link: `<'https://www.test.com/api/v3/projects/8?page=1&per_page=2>; rel="prev", <'https://www.test.com/api/v3/projects/8?page=1&per_page=2>; rel="first", <'https://www.test.com/api/v3/projects/8?page=2&per_page=2>; rel="last"`, 'x-next-page': '', 'x-page': 2, - 'x-per-Page': 2, - 'x-prev-Page': 1, + 'x-per-page': 2, + 'x-prev-page': 1, 'x-total': 4, - 'x-total-Pages': 2, + 'x-total-pages': 2, } } @@ -128,7 +128,7 @@ describe('RequestHelper.get()', () => { total: 4, previous: 1, current: 2, - next: '', + next: null, perPage: 2, totalPages: 2 }) From fd79421e5a572b98faad3dd7d6f8b7b9f60c3724 Mon Sep 17 00:00:00 2001 From: Justin Date: Tue, 5 Jun 2018 22:19:52 -0400 Subject: [PATCH 3/3] Remove some white space --- src/infrastructure/RequestHelper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/infrastructure/RequestHelper.js b/src/infrastructure/RequestHelper.js index a9ebe3c8..16b7583d 100644 --- a/src/infrastructure/RequestHelper.js +++ b/src/infrastructure/RequestHelper.js @@ -75,7 +75,7 @@ async function getPaginated(service, endpoint, options = {}) { }else { data = response.body; } - + if (queryOptions.page && showPagination) { return { data,