e3ef01932f
no-issue This refactors the members-api module so that it is easier to test going forward, as well as easier to understand & navigate. The Stripe API no longer contains storage code, this is all handled via the member repository. And we have dedicated services for webhooks, and stripe plans initialisation.
78 lines
2.9 KiB
JavaScript
78 lines
2.9 KiB
JavaScript
const nock = require('nock');
|
|
const GeolocationService = require('../../../lib/services/geolocation');
|
|
|
|
const RESPONSE = {
|
|
longitude: '-2.2417',
|
|
city: 'Kidderminster',
|
|
timezone: 'Europe/London',
|
|
accuracy: 200,
|
|
asn: 8468,
|
|
region: 'England',
|
|
organization_name: 'Entanet',
|
|
organization: 'AS8468 Entanet',
|
|
country_code: 'GB',
|
|
ip: '188.39.113.90',
|
|
latitude: '52.375',
|
|
area_code: '0',
|
|
continent_code: 'EU',
|
|
country: 'United Kingdom',
|
|
country_code3: 'GBR'
|
|
};
|
|
|
|
const service = new GeolocationService();
|
|
|
|
describe('lib/geolocation', function () {
|
|
describe('getGeolocationFromIP', function () {
|
|
afterEach(function () {
|
|
nock.abortPendingRequests();
|
|
nock.cleanAll();
|
|
});
|
|
|
|
it('fetches from geojs.io with IPv4 address', async function () {
|
|
const scope = nock('https://get.geojs.io')
|
|
.get('/v1/ip/geo/188.39.113.90.json')
|
|
.reply(200, RESPONSE);
|
|
|
|
const result = await service.getGeolocationFromIP('188.39.113.90');
|
|
|
|
scope.isDone().should.eql(true, 'request was not made');
|
|
should.exist(result, 'nothing was returned');
|
|
result.should.deepEqual(RESPONSE, 'result didn\'t match expected response');
|
|
});
|
|
|
|
it('fetches from geojs.io with IPv6 address', async function () {
|
|
const scope = nock('https://get.geojs.io')
|
|
.get('/v1/ip/geo/2a01%3A4c8%3A43a%3A13c9%3A8d6%3A128e%3A1fd5%3A6aad.json')
|
|
.reply(200, RESPONSE);
|
|
|
|
const result = await service.getGeolocationFromIP('2a01:4c8:43a:13c9:8d6:128e:1fd5:6aad');
|
|
|
|
scope.isDone().should.eql(true, 'request was not made');
|
|
should.exist(result, 'nothing was returned');
|
|
result.should.deepEqual(RESPONSE, 'result didn\'t match expected response');
|
|
});
|
|
|
|
it('handles non-IP addresses', async function () {
|
|
let scope = nock('https://get.geojs.io').get('/v1/ip/geo/.json').reply(200, {test: true});
|
|
let result = await service.getGeolocationFromIP('');
|
|
scope.isDone().should.eql(false);
|
|
should.equal(undefined, result);
|
|
|
|
scope = nock('https://get.geojs.io').get('/v1/ip/geo/null.json').reply(200, {test: true});
|
|
result = await service.getGeolocationFromIP(null);
|
|
scope.isDone().should.eql(false);
|
|
should.equal(undefined, result);
|
|
|
|
scope = nock('https://get.geojs.io').get('/v1/ip/geo/undefined.json').reply(200, {test: true});
|
|
result = await service.getGeolocationFromIP(undefined);
|
|
scope.isDone().should.eql(false);
|
|
should.equal(undefined, result);
|
|
|
|
scope = nock('https://get.geojs.io').get('/v1/ip/geo/test.json').reply(200, {test: true});
|
|
result = await service.getGeolocationFromIP('test');
|
|
scope.isDone().should.eql(false);
|
|
should.equal(undefined, result);
|
|
});
|
|
});
|
|
});
|