| 'use strict' |
| |
| const test = require('ava') |
| const BaseOperation = require('../../lib/base_operation') |
| |
| test('should throw errors for HTTP response failures', t => { |
| const base_operation = new BaseOperation({api_key: true, api: true}) |
| t.throws(() => base_operation.handle_errors({statusCode: 401}), /authentication failed/) |
| t.throws(() => base_operation.handle_errors({statusCode: 403}), /authentication failed/) |
| t.throws(() => base_operation.handle_errors({statusCode: 404}), /HTTP 404/) |
| t.throws(() => base_operation.handle_errors({statusCode: 408}), /timed out/) |
| t.throws(() => base_operation.handle_errors({statusCode: 409}), /Conflict/) |
| t.throws(() => base_operation.handle_errors({statusCode: 500, error: {}}), /API call failed/) |
| t.throws(() => base_operation.handle_errors({statusCode: 500, error: {response: {result: {error: 'custom'}}}}), /custom/) |
| }) |
| |
| test('should throw error when missing API key option.', t => { |
| t.throws(() => new BaseOperation({api: true}), /Missing api_key parameter./) |
| }) |
| |
| test('should throw error when missing both API and API Host options.', t => { |
| t.throws(() => new BaseOperation({api_key: true}), /Missing either api or apihost parameters/) |
| }) |
| |
| test('should set options.api from options.apihost with hostname only', t => { |
| const base_operation = new BaseOperation({api_key: true, apihost: 'my_host'}) |
| t.true(base_operation.options.hasOwnProperty('api')) |
| t.is(base_operation.options.api, 'https://my_host/api/v1/') |
| }) |
| |
| test('should set options.api from options.apihost with hostname and https port', t => { |
| const base_operation = new BaseOperation({api_key: true, apihost: 'my_host:443'}) |
| t.true(base_operation.options.hasOwnProperty('api')) |
| t.is(base_operation.options.api, 'https://my_host:443/api/v1/') |
| }) |
| |
| test('should set options.api from options.apihost with hostname and https port', t => { |
| const base_operation = new BaseOperation({api_key: true, apihost: 'my_host:80'}) |
| t.true(base_operation.options.hasOwnProperty('api')) |
| t.is(base_operation.options.api, 'http://my_host:80/api/v1/') |
| }) |
| |
| test('should throw errors for non-HTTP response failures', t => { |
| const base_operation = new BaseOperation({api_key: true, api: true}) |
| t.throws(() => base_operation.handle_errors({message: 'error message'}), /error message/) |
| }) |
| |
| test('should generate auth header from API key', t => { |
| const api_key = 'some sample api key' |
| const base_operation = new BaseOperation({api: true, api_key: api_key}) |
| t.is(base_operation.auth_header(), `Basic ${new Buffer(api_key).toString('base64')}`) |
| }) |
| |
| test('should extract available query string parameters', t => { |
| const base_operation = new BaseOperation({api_key: true, api: true}) |
| t.deepEqual(base_operation.qs({}, ['a', 'b', 'c']), {}) |
| t.deepEqual(base_operation.qs({a: 1}, ['a', 'b', 'c']), {a: 1}) |
| t.deepEqual(base_operation.qs({a: 1, c: 2}, ['a', 'b', 'c']), {a: 1, c: 2}) |
| t.deepEqual(base_operation.qs({a: 1, c: 2, d: 3}, ['a', 'b', 'c']), {a: 1, c: 2}) |
| }) |
| |
| test('should return provided namespace', t => { |
| let base_operation = new BaseOperation({api_key: true, api: true}) |
| t.is(base_operation.namespace({namespace: 'provided'}), 'provided') |
| base_operation = new BaseOperation({api_key: true, api: true, namespace: 'default'}) |
| t.is(base_operation.namespace({namespace: 'provided'}), 'provided') |
| }) |
| |
| test('should return default namespace', t => { |
| const base_operation = new BaseOperation({api_key: true, api: true, namespace: 'default'}) |
| t.is(base_operation.namespace(), 'default') |
| }) |
| |
| test('should throw for missing namespace', t => { |
| const base_operation = new BaseOperation({api_key: true, api: true}) |
| t.throws(() => base_operation.namespace({}), /Missing namespace/) |
| t.throws(() => base_operation.namespace({namespace: null}), /Missing namespace/) |
| t.throws(() => base_operation.namespace({namespace: undefined}), /Missing namespace/) |
| }) |
| |
| test('should return request parameters from path', t => { |
| const base_operation = new BaseOperation({api: 'https://api.com/api/v1/', api_key: 'default'}) |
| const params = base_operation.params('method', 'some/path') |
| t.is(params.url, 'https://api.com/api/v1/some/path') |
| t.is(params.method, 'method') |
| t.true(params.json, true) |
| t.true(params.headers.hasOwnProperty('Authorization')) |
| }) |
| |
| test('should return request parameters from path without ending forward slash', t => { |
| const base_operation = new BaseOperation({api: 'https://api.com/api/v1', api_key: 'default'}) |
| const params = base_operation.params('method', 'some/path') |
| t.is(params.url, 'https://api.com/api/v1/some/path') |
| t.is(params.method, 'method') |
| t.true(params.json, true) |
| t.true(params.headers.hasOwnProperty('Authorization')) |
| }) |
| |
| test('should url encode namespace parameter', t => { |
| const options = {api_key: true, api: true, namespace: 'sample@path'} |
| let base_operation = new BaseOperation(options) |
| |
| t.is(base_operation.namespace(), `sample%40path`) |
| t.is(base_operation.namespace({namespace: 'sample path'}), `sample%20path`) |
| }) |