diff options
author | winh <winnie@gitlab.com> | 2017-05-15 14:06:07 +0200 |
---|---|---|
committer | winh <winnie@gitlab.com> | 2017-05-18 20:04:30 +0200 |
commit | c45c74fdac5a3b23a54541b4937501fffe3ca632 (patch) | |
tree | 23eae8d111ef49357c9ab3e232b5fb1adda1e129 | |
parent | 7fb996979f8b399c4a72d65c50fe071c2f7190e1 (diff) | |
download | gitlab-ce-winh-frontend-api-users.tar.gz |
Add users endpoint to frontend API class (!11374)winh-frontend-api-users
-rw-r--r-- | app/assets/javascripts/api.js | 26 | ||||
-rw-r--r-- | spec/javascripts/api_spec.js | 25 |
2 files changed, 51 insertions, 0 deletions
diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js index 506b2cd6fe2..6680834a8d1 100644 --- a/app/assets/javascripts/api.js +++ b/app/assets/javascripts/api.js @@ -137,6 +137,18 @@ const Api = { .error(callback); }, + users(query, options) { + const url = Api.buildUrl(this.usersPath); + return Api.wrapAjaxCall({ + url, + data: Object.assign({ + search: query, + per_page: 20, + }, options), + dataType: 'json', + }); + }, + buildUrl(url) { let urlRoot = ''; if (gon.relative_url_root != null) { @@ -144,6 +156,20 @@ const Api = { } return urlRoot + url.replace(':version', gon.api_version); }, + + wrapAjaxCall(options) { + return new Promise((resolve, reject) => { + // jQuery 2 is not Promises/A+ compatible (missing catch) + $.ajax(options) // eslint-disable-line promise/catch-or-return + .then(data => resolve(data), + (jqXHR, textStatus, errorThrown) => { + const error = new Error(`${options.url}: ${errorThrown}`); + error.textStatus = textStatus; + reject(error); + }, + ); + }); + }, }; export default Api; diff --git a/spec/javascripts/api_spec.js b/spec/javascripts/api_spec.js index 1b2ec24fd29..867322ce8ae 100644 --- a/spec/javascripts/api_spec.js +++ b/spec/javascripts/api_spec.js @@ -253,4 +253,29 @@ describe('Api', () => { }); }); }); + + describe('users', () => { + it('fetches users', (done) => { + const query = 'dummy query'; + const options = { unused: 'option' }; + const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/users.json`; + const expectedData = Object.assign({ + search: query, + per_page: 20, + }, options); + spyOn(jQuery, 'ajax').and.callFake((request) => { + expect(request.url).toEqual(expectedUrl); + expect(request.dataType).toEqual('json'); + expect(request.data).toEqual(expectedData); + return sendDummyResponse(); + }); + + Api.users(query, options) + .then((response) => { + expect(response).toBe(dummyResponse); + }) + .then(done) + .catch(done.fail); + }); + }); }); |