diff --git a/example/index.html b/example/index.html index 5dc0416..234eff2 100644 --- a/example/index.html +++ b/example/index.html @@ -11,7 +11,14 @@ diff --git a/src/amazonGeotarget.js b/src/amazonGeotarget.js index e055119..80827c9 100644 --- a/src/amazonGeotarget.js +++ b/src/amazonGeotarget.js @@ -2,6 +2,10 @@ import amazon from 'geo-amazon'; import GeolocateService from './geolocate'; class AmazonGeotargetService { + constructor(defaultStore) { + this.defaultStore = defaultStore || 'www.amazon.com'; + } + static async whereabout({ provider = 0, ip } = { provider: 0 }) { if (provider > 1) { return Promise.reject(new Error('Service is not available')); @@ -21,19 +25,19 @@ class AmazonGeotargetService { return response; } - static amazonAffiliateURL(countryCode = 'US') { + amazonAffiliateURL(countryCode = 'US') { let amazonURL; try { amazonURL = amazon.store(countryCode); } catch (err) { - return 'www.amazon.com'; + return this.defaultStore; } - return amazonURL.includes('amazon') ? amazonURL : 'www.amazon.com'; + return amazonURL.includes('amazon') ? amazonURL : this.defaultStore; } - static async amazonGeotarget(ip) { + async amazonGeotarget(ip) { const response = await AmazonGeotargetService.whereabout({ ip }) - .catch(() => 'www.amazon.com'); + .catch(() => this.defaultStore); let countryCode; if (typeof response === 'object') { if (response.country_code) { @@ -43,9 +47,9 @@ class AmazonGeotargetService { countryCode = response; } if (!countryCode) { - return 'www.amazon.com'; + return this.defaultStore; } - return AmazonGeotargetService.amazonAffiliateURL(countryCode); + return this.amazonAffiliateURL(countryCode); } } @@ -53,6 +57,6 @@ export default AmazonGeotargetService; if (typeof window !== 'undefined' && typeof window.amazonGeotarget === 'undefined') { - window.amazonGeotarget = AmazonGeotargetService.amazonGeotarget; + window.AmazonGeotargetService = AmazonGeotargetService; window.whereabout = AmazonGeotargetService.whereabout; } diff --git a/tests/amazonGeotarget.test.js b/tests/amazonGeotarget.test.js index e5bf574..9043819 100644 --- a/tests/amazonGeotarget.test.js +++ b/tests/amazonGeotarget.test.js @@ -163,46 +163,91 @@ describe('fn whereabout', () => { }); describe('fn amazonAffiliateURL', () => { - it('amazonAffiliateURL should return www.amazon.com when no country specified', () => { - const response = AmazonGeotargetService.amazonAffiliateURL() - assert.strictEqual(response, 'www.amazon.com'); - assert.isString(response, 'amazonAffiliateURL returns www.amazon.com'); - expect(response).to.be.a('string'); - }); + describe('not using amazon stub', () => { + let amazonGeotargetService; - it('amazonAffiliateURL should return www.amazon.com when non-existent country specified', () => { - const response = AmazonGeotargetService.amazonAffiliateURL('ABC') - assert.strictEqual(response, 'www.amazon.com'); - assert.isString(response, 'amazonAffiliateURL returns www.amazon.com'); - expect(response).to.be.a('string'); - }); + beforeEach(() => { + amazonGeotargetService = new AmazonGeotargetService(); + }); - it('amazonAffiliateURL should return www.amazon.co.uk when GB specified', () => { - const response = AmazonGeotargetService.amazonAffiliateURL('GB') - assert.strictEqual(response, 'www.amazon.co.uk'); - assert.isString(response, 'amazonAffiliateURL returns www.amazon.co.uk'); - expect(response).to.be.a('string'); - }); + it('amazonAffiliateURL should return www.amazon.com when no country specified', () => { + const response = amazonGeotargetService.amazonAffiliateURL(); + assert.strictEqual(response, 'www.amazon.com'); + assert.isString(response, 'amazonAffiliateURL returns www.amazon.com'); + expect(response).to.be.a('string'); + }); + + it('amazonAffiliateURL should return www.amazon.com when non-existent country specified', () => { + const response = amazonGeotargetService.amazonAffiliateURL('ABC'); + assert.strictEqual(response, 'www.amazon.com'); + assert.isString(response, 'amazonAffiliateURL returns www.amazon.com'); + expect(response).to.be.a('string'); + }); + + it('amazonAffiliateURL should return default store if it is set when non-existent country specified', () => { + const defaultStore = 'www.amazon.co.uk'; + amazonGeotargetService = new AmazonGeotargetService(defaultStore); + const response = amazonGeotargetService.amazonAffiliateURL('amazon'); + assert.strictEqual(response, defaultStore); + assert.isString(response, `amazonAffiliateURL returns ${defaultStore}`); + expect(response).to.be.a('string'); + }); + + it('amazonAffiliateURL should return www.amazon.co.uk when GB specified', () => { + const response = amazonGeotargetService.amazonAffiliateURL('GB'); + assert.strictEqual(response, 'www.amazon.co.uk'); + assert.isString(response, 'amazonAffiliateURL returns www.amazon.co.uk'); + expect(response).to.be.a('string'); + }); + + it('amazonAffiliateURL should return www.amazon.co.jp when JP specified', () => { + const response = amazonGeotargetService.amazonAffiliateURL('JP'); + assert.strictEqual(response, 'www.amazon.co.jp'); + assert.isString(response, 'amazonAffiliateURL returns www.amazon.co.jp'); + expect(response).to.be.a('string'); + }); - it('amazonAffiliateURL should return www.amazon.co.jp when JP specified', () => { - const response = AmazonGeotargetService.amazonAffiliateURL('JP') - assert.strictEqual(response, 'www.amazon.co.jp'); - assert.isString(response, 'amazonAffiliateURL returns www.amazon.co.jp'); - expect(response).to.be.a('string'); + it('amazonAffiliateURL should return www.amazon.de when DE specified', () => { + const response = amazonGeotargetService.amazonAffiliateURL('DE'); + assert.strictEqual(response, 'www.amazon.de'); + assert.isString(response, 'amazonAffiliateURL returns www.amazon.de'); + expect(response).to.be.a('string'); + }); }); - it('amazonAffiliateURL should return www.amazon.de when DE specified', () => { - const response = AmazonGeotargetService.amazonAffiliateURL('DE') - assert.strictEqual(response, 'www.amazon.de'); - assert.isString(response, 'amazonAffiliateURL returns www.amazon.de'); - expect(response).to.be.a('string'); + describe('stub amazon plugin', () => { + let amazonStoreStub; + + beforeEach(() => { + amazonStoreStub = stub(amazon, 'store').returns('ABC'); + }); + + it('amazonAffiliateURL should return www.amazon.com when non-existent country specified', () => { + const amazonGeotargetService = new AmazonGeotargetService(); + const response = amazonGeotargetService.amazonAffiliateURL('US'); + assert.strictEqual(response, 'www.amazon.com'); + assert.isString(response, 'amazonAffiliateURL returns www.amazon.com'); + expect(response).to.be.a('string'); + amazonStoreStub.restore(); + }); + + it('amazonAffiliateURL should return default store if it is set when non-existent country specified', () => { + const defaultStore = 'www.amazon.co.uk'; + const amazonGeotargetService = new AmazonGeotargetService(defaultStore); + const response = amazonGeotargetService.amazonAffiliateURL('US'); + assert.strictEqual(response, defaultStore); + assert.isString(response, 'amazonAffiliateURL returns default store'); + expect(response).to.be.a('string'); + amazonStoreStub.restore(); + }); }); -}) +}); describe('fn amazonGeotarget', () => { describe('real service', () => { it('amazonGeotarget real service should return US Amazon store URL using IP 199.87.228.66', async () => { - const response = await AmazonGeotargetService.amazonGeotarget('199.87.228.66').catch((err) => { + const amazonGeotargetService = new AmazonGeotargetService(); + const response = await amazonGeotargetService.amazonGeotarget('199.87.228.66').catch((err) => { throw err; }); assert.isString(response, 'amazonGeotarget returns Amazon store URL'); @@ -212,9 +257,15 @@ describe('fn amazonGeotarget', () => { }); describe('stub geolocate', () => { - it('amazonGeotarget should return US Amazon store URL using non-existent IP', async () => { + let amazonGeotargetService; + + beforeEach(() => { + amazonGeotargetService = new AmazonGeotargetService(); + }); + + it('amazonGeotarget should return US Amazon store URL when using non-existent IP', async () => { const geolocateIpapiStub = stub(GeolocateService, 'geolocateIPAPI').resolves('Undefined'); - const response = await AmazonGeotargetService.amazonGeotarget('1234567').catch((err) => { + const response = await amazonGeotargetService.amazonGeotarget('1234567').catch((err) => { throw err; }); expect(geolocateIpapiStub.calledOnce).to.equal(true); @@ -224,9 +275,23 @@ describe('fn amazonGeotarget', () => { geolocateIpapiStub.restore(); }); + it('amazonGeotarget should return default store URL if it is set when using non-existent IP', async () => { + const geolocateIpapiStub = stub(GeolocateService, 'geolocateIPAPI').resolves('Undefined'); + const defaultStore = 'www.amazon.ca'; + amazonGeotargetService.defaultStore = defaultStore; + const response = await amazonGeotargetService.amazonGeotarget('1234567').catch((err) => { + throw err; + }); + expect(geolocateIpapiStub.calledOnce).to.equal(true); + assert.isString(response, 'amazonGeotarget returns default store URL'); + assert.strictEqual(response, defaultStore); + expect(response).to.be.a('string'); + geolocateIpapiStub.restore(); + }); + it('amazonGeotarget should return US Amazon if user is in US', async () => { const geolocateIpapiStub = stub(GeolocateService, 'geolocateIPAPI').resolves('US'); - const response = await AmazonGeotargetService.amazonGeotarget().catch((err) => { + const response = await amazonGeotargetService.amazonGeotarget().catch((err) => { throw err; }); expect(geolocateIpapiStub.calledOnce).to.equal(true); @@ -237,38 +302,54 @@ describe('fn amazonGeotarget', () => { }); }); - describe('stub whereabout and geolocate ', () => { + describe('stub amazonStore and whereabout ', () => { let amazonStoreStub; let whereaboutStub; + let amazonGeotargetService; + const amazonUS = 'www.amazon.com'; - before(() => { - amazonStoreStub = stub(amazon, 'store').returns('ABC'); - whereaboutStub = stub(AmazonGeotargetService, 'whereabout').resolves('JP'); + beforeEach(() => { + amazonGeotargetService = new AmazonGeotargetService(); }); it('amazonGeotarget should return www.amazon.com when amazon.store returns non Amazon URL', async () => { - const response = await AmazonGeotargetService.amazonGeotarget('199.87.228.66'); + amazonStoreStub = stub(amazon, 'store').returns('ABC'); + whereaboutStub = stub(AmazonGeotargetService, 'whereabout').resolves('US'); + const response = await amazonGeotargetService.amazonGeotarget(); expect(whereaboutStub.calledOnce).to.equal(true); expect(amazonStoreStub.calledOnce).to.equal(true); - assert.strictEqual(response, 'www.amazon.com'); + assert.strictEqual(response, amazonUS); assert.isString(response, 'amazonAffiliateURL returns www.amazon.com'); expect(response).to.be.a('string'); amazonStoreStub.restore(); whereaboutStub.restore(); }); - }); - describe('stub amazonStore and whereabout ', () => { - let amazonStoreStub; - let whereaboutStub; + it('amazonGeotarget should return default store if it is set when amazon.store returns non Amazon URL', async () => { + amazonStoreStub = stub(amazon, 'store').returns('www.google.com'); + whereaboutStub = stub(AmazonGeotargetService, 'whereabout').resolves('US'); + const defaultStore = 'www.amazon.ca'; + amazonGeotargetService = new AmazonGeotargetService(defaultStore); + const response = await amazonGeotargetService.amazonGeotarget(); + expect(whereaboutStub.calledOnce).to.equal(true); + expect(amazonStoreStub.calledOnce).to.equal(true); + assert.strictEqual(response, defaultStore); + assert.isString(response, 'amazonAffiliateURL returns default store'); + expect(response).to.be.a('string'); + amazonStoreStub.restore(); + whereaboutStub.restore(); + }); - it('amazonGeotarget should return www.amazon.com when amazon.store returns non Amazon URL', async () => { - amazonStoreStub = stub(amazon, 'store').returns('ABC'); + it('amazonGeotarget\'s default store has to be set at instantiation', async () => { + amazonStoreStub = stub(amazon, 'store').returns('www.google.com'); whereaboutStub = stub(AmazonGeotargetService, 'whereabout').resolves('US'); - const response = await AmazonGeotargetService.amazonGeotarget(); + const defaultStore = 'www.amazon.ca'; + AmazonGeotargetService.defaultStore = defaultStore; + const response = await amazonGeotargetService.amazonGeotarget(); expect(whereaboutStub.calledOnce).to.equal(true); expect(amazonStoreStub.calledOnce).to.equal(true); - assert.strictEqual(response, 'www.amazon.com'); + assert.notEqual(response, defaultStore); + assert.strictEqual(response, amazonUS); assert.isString(response, 'amazonAffiliateURL returns www.amazon.com'); expect(response).to.be.a('string'); amazonStoreStub.restore(); @@ -278,14 +359,29 @@ describe('fn amazonGeotarget', () => { it('amazonGeotarget should return www.amazon.com when whereabout returns undefined', async () => { amazonStoreStub = stub(amazon, 'store').returns('ABC'); whereaboutStub = stub(AmazonGeotargetService, 'whereabout').resolves(undefined); - const response = await AmazonGeotargetService.amazonGeotarget(); + const response = await amazonGeotargetService.amazonGeotarget(); expect(whereaboutStub.calledOnce).to.equal(true); expect(amazonStoreStub.notCalled).to.equal(true); - assert.strictEqual(response, 'www.amazon.com'); + assert.strictEqual(response, amazonUS); assert.isString(response, 'amazonAffiliateURL returns www.amazon.com'); expect(response).to.be.a('string'); amazonStoreStub.restore(); whereaboutStub.restore(); }); + + it('amazonGeotarget should return default store if it is set when whereabout returns undefined', async () => { + amazonStoreStub = stub(amazon, 'store').returns('ABC'); + const defaultStore = 'www.amazon.co.jp'; + amazonGeotargetService = new AmazonGeotargetService(defaultStore); + whereaboutStub = stub(AmazonGeotargetService, 'whereabout').resolves(undefined); + const response = await amazonGeotargetService.amazonGeotarget(); + expect(whereaboutStub.calledOnce).to.equal(true); + expect(amazonStoreStub.notCalled).to.equal(true); + assert.strictEqual(response, defaultStore); + assert.isString(response, 'amazonAffiliateURL returns default store'); + expect(response).to.be.a('string'); + amazonStoreStub.restore(); + whereaboutStub.restore(); + }); }); });