diff --git a/README.md b/README.md index 49f00c01f..410419d5f 100644 --- a/README.md +++ b/README.md @@ -46,8 +46,7 @@ window.mParticle = { }; //load the SDK -(function(e){window.mParticle=window.mParticle||{};window.mParticle.EventType={Unknown:0,Navigation:1,Location:2,Search:3,Transaction:4,UserContent:5,UserPreference:6,Social:7,Other:8,Media:9};window.mParticle.eCommerce={Cart:{}};window.mParticle.Identity={};window.mParticle.Rokt={};window.mParticle.config=window.mParticle.config||{};window.mParticle.config.rq=[];window.mParticle.config.snippetVersion=2.5;window.mParticle.ready=function(e){window.mParticle.config.rq.push(e)};var t=["endSession","logError","logBaseEvent","logEvent","logForm","logLink","logPageView","setSessionAttribute","setAppName","setAppVersion","setOptOut","setPosition","startNewSession","startTrackingLocation","stopTrackingLocation"];var i=["setCurrencyCode","logCheckout"];var n=["identify","login","logout","modify"];var o=["selectPlacements","hashAttributes","setExtensionData"];t.forEach(function(e){window.mParticle[e]=r(e)});i.forEach(function(e){window.mParticle.eCommerce[e]=r(e,"eCommerce")});n.forEach(function(e){window.mParticle.Identity[e]=r(e,"Identity")});o.forEach(function(e){window.mParticle.Rokt[e]=r(e,"Rokt")});function r(t,i){return function(){if(i){t=i+"."+t}var e=Array.prototype.slice.call(arguments);e.unshift(t);window.mParticle.config.rq.push(e)}}var c,a,s=window.mParticle.config,l=s.isDevelopmentMode?1:0,w="?env="+l,d=window.mParticle.config.dataPlan;if(d){c=d.planId;a=d.planVersion;if(c){if(a&&(a<1||a>1e3)){a=null}w+="&plan_id="+c+(a?"&plan_version="+a:"")}}var m=window.mParticle.config.versions;var f=[];if(m){Object.keys(m).forEach(function(e){f.push(e+"="+m[e])})}var p=document.createElement("script");p.type="text/javascript";p.async=true;p.src=("https:"==document.location.protocol?"https://jssdkcdns":"http://jssdkcdn")+".mparticle.com/js/v2/"+e+"/mparticle.js"+w+"&"+f.join("&");var P=document.getElementsByTagName("script")[0];P.parentNode.insertBefore(p,P)})("REPLACE WITH API KEY"); - +(function(e){window.mParticle=window.mParticle||{};window.mParticle.EventType={Unknown:0,Navigation:1,Location:2,Search:3,Transaction:4,UserContent:5,UserPreference:6,Social:7,Other:8,Media:9};window.mParticle.eCommerce={Cart:{}};window.mParticle.Identity={};window.mParticle.Rokt={};window.mParticle.config=window.mParticle.config||{};window.mParticle.config.rq=[];window.mParticle.config.snippetVersion=2.7;window.mParticle.ready=function(e){window.mParticle.config.rq.push(e)};var t=["endSession","logError","logBaseEvent","logEvent","logForm","logLink","logPageView","setSessionAttribute","setAppName","setAppVersion","setOptOut","setPosition","startNewSession","startTrackingLocation","stopTrackingLocation"];var i=["setCurrencyCode","logCheckout"];var n=["identify","login","logout","modify"];var o=["selectPlacements","hashAttributes","setExtensionData","use","getVersion","terminate"];t.forEach(function(e){window.mParticle[e]=r(e)});i.forEach(function(e){window.mParticle.eCommerce[e]=r(e,"eCommerce")});n.forEach(function(e){window.mParticle.Identity[e]=r(e,"Identity")});o.forEach(function(e){window.mParticle.Rokt[e]=r(e,"Rokt")});function r(t,i){return function(){if(i){t=i+"."+t}var e=Array.prototype.slice.call(arguments);e.unshift(t);window.mParticle.config.rq.push(e)}}var a,c,s=window.mParticle.config,l=s.isDevelopmentMode?1:0,w="?env="+l,d=window.mParticle.config.dataPlan;if(d){a=d.planId;c=d.planVersion;if(a){if(c&&(c<1||c>1e3)){c=null}w+="&plan_id="+a+(c?"&plan_version="+c:"")}}var m=window.mParticle.config.versions;var f=[];if(m){Object.keys(m).forEach(function(e){f.push(e+"="+m[e])})}var p=document.createElement("script");p.type="text/javascript";p.async=true;p.src=("https:"==document.location.protocol?"https://jssdkcdns":"http://jssdkcdn")+".mparticle.com/js/v2/"+e+"/mparticle.js"+w+"&"+f.join("&");var P=document.getElementsByTagName("script")[0];P.parentNode.insertBefore(p,P)})("REPLACE WITH API KEY"); ``` You can then log events, for example, as follows: diff --git a/snippet.js b/snippet.js index c8c3112fa..0fbe70c2b 100644 --- a/snippet.js +++ b/snippet.js @@ -19,7 +19,7 @@ window.mParticle.Rokt = {}; window.mParticle.config = window.mParticle.config || {}; window.mParticle.config.rq = []; - window.mParticle.config.snippetVersion = 2.5; + window.mParticle.config.snippetVersion = 2.7; window.mParticle.ready = function(f) { window.mParticle.config.rq.push(f); }; @@ -49,6 +49,9 @@ 'selectPlacements', 'hashAttributes', 'setExtensionData', + 'use', + 'getVersion', + 'terminate', ]; // iterates through methods above to create stubs diff --git a/snippet.min.js b/snippet.min.js index 18a002388..c217982ee 100644 --- a/snippet.min.js +++ b/snippet.min.js @@ -1 +1 @@ -(function(e){window.mParticle=window.mParticle||{};window.mParticle.EventType={Unknown:0,Navigation:1,Location:2,Search:3,Transaction:4,UserContent:5,UserPreference:6,Social:7,Other:8,Media:9};window.mParticle.eCommerce={Cart:{}};window.mParticle.Identity={};window.mParticle.Rokt={};window.mParticle.config=window.mParticle.config||{};window.mParticle.config.rq=[];window.mParticle.config.snippetVersion=2.5;window.mParticle.ready=function(e){window.mParticle.config.rq.push(e)};var t=["endSession","logError","logBaseEvent","logEvent","logForm","logLink","logPageView","setSessionAttribute","setAppName","setAppVersion","setOptOut","setPosition","startNewSession","startTrackingLocation","stopTrackingLocation"];var i=["setCurrencyCode","logCheckout"];var n=["identify","login","logout","modify"];var o=["selectPlacements","hashAttributes","setExtensionData"];t.forEach(function(e){window.mParticle[e]=r(e)});i.forEach(function(e){window.mParticle.eCommerce[e]=r(e,"eCommerce")});n.forEach(function(e){window.mParticle.Identity[e]=r(e,"Identity")});o.forEach(function(e){window.mParticle.Rokt[e]=r(e,"Rokt")});function r(t,i){return function(){if(i){t=i+"."+t}var e=Array.prototype.slice.call(arguments);e.unshift(t);window.mParticle.config.rq.push(e)}}var c,a,s=window.mParticle.config,l=s.isDevelopmentMode?1:0,w="?env="+l,d=window.mParticle.config.dataPlan;if(d){c=d.planId;a=d.planVersion;if(c){if(a&&(a<1||a>1e3)){a=null}w+="&plan_id="+c+(a?"&plan_version="+a:"")}}var m=window.mParticle.config.versions;var f=[];if(m){Object.keys(m).forEach(function(e){f.push(e+"="+m[e])})}var p=document.createElement("script");p.type="text/javascript";p.async=true;p.src=("https:"==document.location.protocol?"https://jssdkcdns":"http://jssdkcdn")+".mparticle.com/js/v2/"+e+"/mparticle.js"+w+"&"+f.join("&");var P=document.getElementsByTagName("script")[0];P.parentNode.insertBefore(p,P)})("REPLACE WITH API KEY"); \ No newline at end of file +(function(e){window.mParticle=window.mParticle||{};window.mParticle.EventType={Unknown:0,Navigation:1,Location:2,Search:3,Transaction:4,UserContent:5,UserPreference:6,Social:7,Other:8,Media:9};window.mParticle.eCommerce={Cart:{}};window.mParticle.Identity={};window.mParticle.Rokt={};window.mParticle.config=window.mParticle.config||{};window.mParticle.config.rq=[];window.mParticle.config.snippetVersion=2.7;window.mParticle.ready=function(e){window.mParticle.config.rq.push(e)};var t=["endSession","logError","logBaseEvent","logEvent","logForm","logLink","logPageView","setSessionAttribute","setAppName","setAppVersion","setOptOut","setPosition","startNewSession","startTrackingLocation","stopTrackingLocation"];var i=["setCurrencyCode","logCheckout"];var n=["identify","login","logout","modify"];var o=["selectPlacements","hashAttributes","setExtensionData","use","getVersion","terminate"];t.forEach(function(e){window.mParticle[e]=r(e)});i.forEach(function(e){window.mParticle.eCommerce[e]=r(e,"eCommerce")});n.forEach(function(e){window.mParticle.Identity[e]=r(e,"Identity")});o.forEach(function(e){window.mParticle.Rokt[e]=r(e,"Rokt")});function r(t,i){return function(){if(i){t=i+"."+t}var e=Array.prototype.slice.call(arguments);e.unshift(t);window.mParticle.config.rq.push(e)}}var a,c,s=window.mParticle.config,l=s.isDevelopmentMode?1:0,w="?env="+l,d=window.mParticle.config.dataPlan;if(d){a=d.planId;c=d.planVersion;if(a){if(c&&(c<1||c>1e3)){c=null}w+="&plan_id="+a+(c?"&plan_version="+c:"")}}var m=window.mParticle.config.versions;var f=[];if(m){Object.keys(m).forEach(function(e){f.push(e+"="+m[e])})}var p=document.createElement("script");p.type="text/javascript";p.async=true;p.src=("https:"==document.location.protocol?"https://jssdkcdns":"http://jssdkcdn")+".mparticle.com/js/v2/"+e+"/mparticle.js"+w+"&"+f.join("&");var P=document.getElementsByTagName("script")[0];P.parentNode.insertBefore(p,P)})("REPLACE WITH API KEY"); \ No newline at end of file diff --git a/snippet.rokt.js b/snippet.rokt.js index a4155927a..aa66583f0 100644 --- a/snippet.rokt.js +++ b/snippet.rokt.js @@ -19,7 +19,7 @@ window.mParticle.Rokt = {}; window.mParticle.config = window.mParticle.config || {}; window.mParticle.config.rq = []; - window.mParticle.config.snippetVersion = 2.6; + window.mParticle.config.snippetVersion = 2.7; window.mParticle.ready = function(f) { window.mParticle.config.rq.push(f); }; @@ -49,6 +49,9 @@ 'selectPlacements', 'hashAttributes', 'setExtensionData', + 'use', + 'getVersion', + 'terminate', ]; // iterates through methods above to create stubs diff --git a/snippet.rokt.min.js b/snippet.rokt.min.js index 6132dea65..e2c8c1f4d 100644 --- a/snippet.rokt.min.js +++ b/snippet.rokt.min.js @@ -1 +1 @@ -(function(e){window.mParticle=window.mParticle||{};window.mParticle.EventType={Unknown:0,Navigation:1,Location:2,Search:3,Transaction:4,UserContent:5,UserPreference:6,Social:7,Other:8,Media:9};window.mParticle.eCommerce={Cart:{}};window.mParticle.Identity={};window.mParticle.Rokt={};window.mParticle.config=window.mParticle.config||{};window.mParticle.config.rq=[];window.mParticle.config.snippetVersion=2.6;window.mParticle.ready=function(e){window.mParticle.config.rq.push(e)};var i=["endSession","logError","logBaseEvent","logEvent","logForm","logLink","logPageView","setSessionAttribute","setAppName","setAppVersion","setOptOut","setPosition","startNewSession","startTrackingLocation","stopTrackingLocation"];var t=["setCurrencyCode","logCheckout"];var n=["identify","login","logout","modify"];var o=["selectPlacements","hashAttributes","setExtensionData"];i.forEach(function(e){window.mParticle[e]=r(e)});t.forEach(function(e){window.mParticle.eCommerce[e]=r(e,"eCommerce")});n.forEach(function(e){window.mParticle.Identity[e]=r(e,"Identity")});o.forEach(function(e){window.mParticle.Rokt[e]=r(e,"Rokt")});function r(i,t){return function(){if(t){i=t+"."+i}var e=Array.prototype.slice.call(arguments);e.unshift(i);window.mParticle.config.rq.push(e)}}var a=window.mParticle.config,c=a.isDevelopmentMode?1:0,s="?env="+c,l=a.dataPlan;if(l){var w=l.planId,d=l.planVersion;if(w){if(d&&(d<1||d>1e3)){d=null}s+="&plan_id="+w+(d?"&plan_version="+d:"")}}var m=a.versions;var f=[];if(m){Object.keys(m).forEach(function(e){f.push(e+"="+m[e])})}var p=document.createElement("script");p.type="text/javascript";p.async=true;window.ROKT_DOMAIN=ROKT_DOMAIN||"https://apps.rokt-api.com";window.mParticle.config.domain=ROKT_DOMAIN.split("//")[1];p.src=ROKT_DOMAIN+"/js/v2/"+e+"/app.js"+s+"&"+f.join("&");var P=document.getElementsByTagName("script")[0];P.parentNode.insertBefore(p,P)})("REPLACE WITH API KEY"); \ No newline at end of file +(function(e){window.mParticle=window.mParticle||{};window.mParticle.EventType={Unknown:0,Navigation:1,Location:2,Search:3,Transaction:4,UserContent:5,UserPreference:6,Social:7,Other:8,Media:9};window.mParticle.eCommerce={Cart:{}};window.mParticle.Identity={};window.mParticle.Rokt={};window.mParticle.config=window.mParticle.config||{};window.mParticle.config.rq=[];window.mParticle.config.snippetVersion=2.7;window.mParticle.ready=function(e){window.mParticle.config.rq.push(e)};var i=["endSession","logError","logBaseEvent","logEvent","logForm","logLink","logPageView","setSessionAttribute","setAppName","setAppVersion","setOptOut","setPosition","startNewSession","startTrackingLocation","stopTrackingLocation"];var t=["setCurrencyCode","logCheckout"];var n=["identify","login","logout","modify"];var o=["selectPlacements","hashAttributes","setExtensionData","use","getVersion","terminate"];i.forEach(function(e){window.mParticle[e]=r(e)});t.forEach(function(e){window.mParticle.eCommerce[e]=r(e,"eCommerce")});n.forEach(function(e){window.mParticle.Identity[e]=r(e,"Identity")});o.forEach(function(e){window.mParticle.Rokt[e]=r(e,"Rokt")});function r(i,t){return function(){if(t){i=t+"."+i}var e=Array.prototype.slice.call(arguments);e.unshift(i);window.mParticle.config.rq.push(e)}}var a=window.mParticle.config,c=a.isDevelopmentMode?1:0,s="?env="+c,l=a.dataPlan;if(l){var w=l.planId,m=l.planVersion;if(w){if(m&&(m<1||m>1e3)){m=null}s+="&plan_id="+w+(m?"&plan_version="+m:"")}}var d=a.versions;var f=[];if(d){Object.keys(d).forEach(function(e){f.push(e+"="+d[e])})}var p=document.createElement("script");p.type="text/javascript";p.async=true;window.ROKT_DOMAIN=ROKT_DOMAIN||"https://apps.rokt-api.com";window.mParticle.config.domain=ROKT_DOMAIN.split("//")[1];p.src=ROKT_DOMAIN+"/js/v2/"+e+"/app.js"+s+"&"+f.join("&");var P=document.getElementsByTagName("script")[0];P.parentNode.insertBefore(p,P)})("REPLACE WITH API KEY"); \ No newline at end of file diff --git a/src/roktManager.ts b/src/roktManager.ts index 9a2527f6c..c426fb54e 100644 --- a/src/roktManager.ts +++ b/src/roktManager.ts @@ -38,6 +38,9 @@ export interface IRoktSelection { export interface IRoktLauncher { selectPlacements: (options: IRoktSelectPlacementsOptions) => Promise; hashAttributes: (attributes: IRoktPartnerAttributes) => Promise>; + use: (name: string) => Promise; + getVersion: () => Promise; + terminate: () => Promise; } export interface IRoktMessage { @@ -62,6 +65,9 @@ export interface IRoktKit { hashAttributes: (attributes: IRoktPartnerAttributes) => Promise>; selectPlacements: (options: IRoktSelectPlacementsOptions) => Promise; setExtensionData(extensionData: IRoktPartnerExtensionData): void; + terminate: () => Promise; + getVersion: () => Promise; + use: (name: string) => Promise; launcherOptions?: Dictionary; } @@ -251,6 +257,42 @@ export default class RoktManager { } } + public use(name: string): Promise { + if (!this.isReady()) { + return this.deferredCall('use', name); + } + + try { + return this.kit.use(name); + } catch (error) { + return Promise.reject(error instanceof Error ? error : new Error('Error using extension: ' + name)); + } + } + + public terminate(): Promise { + if (!this.isReady()) { + return this.deferredCall('terminate', {}); + } + + try { + return this.kit.terminate(); + } catch (error) { + return Promise.reject(error instanceof Error ? error : new Error('Error terminating')); + } + } + + public getVersion(): Promise { + if (!this.isReady()) { + return this.deferredCall('getVersion', {}); + } + + try { + return this.kit.getVersion(); + } catch (error) { + return Promise.reject(error instanceof Error ? error : new Error('Error getting the version')); + } + } + public getLocalSessionAttributes(): LocalSessionAttributes { return this.store.getLocalSessionAttributes(); } diff --git a/test/jest/roktManager.spec.ts b/test/jest/roktManager.spec.ts index 3529b5909..ac3242687 100644 --- a/test/jest/roktManager.spec.ts +++ b/test/jest/roktManager.spec.ts @@ -84,13 +84,19 @@ describe('RoktManager', () => { const kit: IRoktKit = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, filters: undefined, filteredUser: undefined, hashAttributes: jest.fn(), selectPlacements: jest.fn(), setExtensionData: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), + use: jest.fn(), userAttributes: undefined, }; @@ -106,13 +112,19 @@ describe('RoktManager', () => { const kit: IRoktKit = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, filters: undefined, filteredUser: undefined, hashAttributes: jest.fn(), selectPlacements: jest.fn(), setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), userAttributes: undefined, }; @@ -145,13 +157,19 @@ describe('RoktManager', () => { const kit: IRoktKit = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, filters: undefined, filteredUser: undefined, hashAttributes: jest.fn(), selectPlacements: jest.fn(), setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), userAttributes: undefined, }; @@ -177,7 +195,10 @@ describe('RoktManager', () => { const kit: Partial = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, // We are mocking the hashAttributes method to return the @@ -364,14 +385,20 @@ describe('RoktManager', () => { const kit: IRoktKit = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, filters: undefined, filteredUser: undefined, userAttributes: undefined, selectPlacements: jest.fn(), hashAttributes: jest.fn(), - setExtensionData: jest.fn() + setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }; roktManager.attachKit(kit); @@ -384,14 +411,20 @@ describe('RoktManager', () => { const kit: IRoktKit = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, filters: undefined, selectPlacements: jest.fn(), hashAttributes: jest.fn(), filteredUser: undefined, userAttributes: undefined, - setExtensionData: jest.fn() + setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }; @@ -420,7 +453,10 @@ describe('RoktManager', () => { const kit: IRoktKit = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, filters: undefined, filteredUser: undefined, @@ -428,6 +464,9 @@ describe('RoktManager', () => { selectPlacements: jest.fn(), hashAttributes: jest.fn(), setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }; roktManager.attachKit(kit); @@ -444,7 +483,10 @@ describe('RoktManager', () => { const kit: IRoktKit = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, filters: undefined, filteredUser: undefined, @@ -452,6 +494,9 @@ describe('RoktManager', () => { selectPlacements: jest.fn(), hashAttributes: jest.fn(), setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }; roktManager.attachKit(kit); @@ -489,7 +534,10 @@ describe('RoktManager', () => { const kit: IRoktKit = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, filters: undefined, filteredUser: undefined, @@ -497,6 +545,9 @@ describe('RoktManager', () => { selectPlacements: jest.fn().mockResolvedValue(expectedResult), hashAttributes: jest.fn(), setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }; const options = { @@ -535,7 +586,10 @@ describe('RoktManager', () => { const kit: IRoktKit = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, filters: undefined, filteredUser: undefined, @@ -551,6 +605,9 @@ describe('RoktManager', () => { }), hashAttributes: jest.fn(), setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }; roktManager.attachKit(kit); @@ -574,7 +631,10 @@ describe('RoktManager', () => { const kit: IRoktKit = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, filters: undefined, filteredUser: undefined, @@ -582,6 +642,9 @@ describe('RoktManager', () => { setExtensionData: jest.fn(), hashAttributes: jest.fn(), userAttributes: undefined, + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }; roktManager.attachKit(kit); @@ -602,7 +665,10 @@ describe('RoktManager', () => { const kit: IRoktKit = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, filters: undefined, filteredUser: undefined, @@ -610,6 +676,9 @@ describe('RoktManager', () => { selectPlacements: jest.fn(), hashAttributes: jest.fn(), setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }; roktManager.attachKit(kit); @@ -632,7 +701,10 @@ describe('RoktManager', () => { const kit: IRoktKit = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, filters: undefined, filteredUser: undefined, @@ -640,6 +712,9 @@ describe('RoktManager', () => { setExtensionData: jest.fn(), hashAttributes: jest.fn(), userAttributes: undefined, + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }; roktManager.attachKit(kit); @@ -661,11 +736,17 @@ describe('RoktManager', () => { const kit: Partial = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, hashAttributes: jest.fn(), selectPlacements: jest.fn(), - setExtensionData: jest.fn() + setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }; roktManager.kit = kit as IRoktKit; @@ -708,11 +789,17 @@ describe('RoktManager', () => { const kit: Partial = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, hashAttributes: jest.fn(), selectPlacements: jest.fn(), setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }; roktManager.kit = kit as IRoktKit; @@ -735,11 +822,17 @@ describe('RoktManager', () => { const kit: Partial = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, selectPlacements: jest.fn(), hashAttributes: jest.fn(), setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }; roktManager.kit = kit as IRoktKit; @@ -784,11 +877,17 @@ describe('RoktManager', () => { const kit: Partial = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, selectPlacements: jest.fn(), hashAttributes: jest.fn(), setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }; roktManager.kit = kit as IRoktKit; @@ -813,11 +912,17 @@ describe('RoktManager', () => { const kit: Partial = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, - selectPlacements: jest.fn().mockResolvedValue({}), + getVersion: jest.fn(), hashAttributes: jest.fn(), + selectPlacements: jest.fn().mockResolvedValue({}), setExtensionData: jest.fn(), + use: jest.fn(), + terminate: jest.fn(), }; roktManager.kit = kit as IRoktKit; @@ -864,12 +969,18 @@ describe('RoktManager', () => { const kit: Partial = { launcher: { + hashAttributes: jest.fn(), selectPlacements: jest.fn(), - hashAttributes: jest.fn() + use: jest.fn(), + terminate: jest.fn(), + getVersion: jest.fn(), }, selectPlacements: jest.fn(), hashAttributes: jest.fn(), setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }; roktManager.kit = kit as IRoktKit; @@ -905,11 +1016,17 @@ describe('RoktManager', () => { const kit: Partial = { launcher: { selectPlacements: jest.fn(), - hashAttributes: jest.fn() + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, - selectPlacements: jest.fn(), + getVersion: jest.fn(), hashAttributes: jest.fn(), + selectPlacements: jest.fn(), setExtensionData: jest.fn(), + use: jest.fn(), + terminate: jest.fn(), }; roktManager.kit = kit as IRoktKit; @@ -948,12 +1065,18 @@ describe('RoktManager', () => { it('should log error when identify fails with a 500 but continue execution', async () => { const kit: Partial = { launcher: { + getVersion: jest.fn(), + hashAttributes: jest.fn(), selectPlacements: jest.fn(), - hashAttributes: jest.fn() + terminate: jest.fn(), + use: jest.fn(), }, - selectPlacements: jest.fn().mockResolvedValue({}), + getVersion: jest.fn(), hashAttributes: jest.fn(), + selectPlacements: jest.fn().mockResolvedValue({}), setExtensionData: jest.fn(), + terminate: jest.fn(), + use: jest.fn(), }; roktManager.kit = kit as IRoktKit; @@ -1000,6 +1123,9 @@ describe('RoktManager', () => { launcher: { hashAttributes: jest.fn(), selectPlacements: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, setExtensionData: jest.fn() }; @@ -1039,7 +1165,10 @@ describe('RoktManager', () => { const kit: Partial = { launcher: { hashAttributes: jest.fn(), - selectPlacements: jest.fn() + selectPlacements: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, setExtensionData: jest.fn() }; @@ -1055,7 +1184,10 @@ describe('RoktManager', () => { const kit: Partial = { launcher: { hashAttributes: jest.fn(), - selectPlacements: jest.fn() + selectPlacements: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), }, setExtensionData: jest.fn() }; @@ -1082,6 +1214,289 @@ describe('RoktManager', () => { }); }); + describe('#terminate', () => { + it('should call kit.terminate when already attached', async () => { + const kit: IRoktKit = { + launcher: { + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), + }, + filters: undefined, + filteredUser: undefined, + userAttributes: undefined, + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), + }; + + roktManager.attachKit(kit); + + roktManager.terminate(); + expect(kit.terminate).toHaveBeenCalled(); + }); + + it('should queue the terminate method if no launcher or kit is attached', () => { + roktManager.terminate(); + + expect(roktManager['kit']).toBeNull(); + expect(roktManager['messageQueue'].size).toBe(1); + const queuedMessage = Array.from(roktManager['messageQueue'].values())[0]; + expect(queuedMessage.methodName).toBe('terminate'); + expect(queuedMessage.payload).toEqual({}); + }); + + it('should process queued terminate once the launcher and kit are attached', async () => { + const kit: IRoktKit = { + launcher: { + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), + }, + filters: undefined, + filteredUser: undefined, + userAttributes: undefined, + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), + }; + + roktManager.terminate(); + + expect(roktManager['kit']).toBeNull(); + expect(roktManager['messageQueue'].size).toBe(1); + const queuedMessage = Array.from(roktManager['messageQueue'].values())[0]; + expect(queuedMessage.methodName).toBe('terminate'); + expect(queuedMessage.payload).toEqual({}); + + roktManager.attachKit(kit); + expect(roktManager['kit']).not.toBeNull(); + expect(roktManager['messageQueue'].size).toBe(0); + expect(kit.terminate).toHaveBeenCalled(); + }); + + it('should pass through to kit.launcher.terminate', async () => { + const kit: Partial = { + launcher: { + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), + }, + terminate: jest.fn().mockImplementation(() => (kit.launcher).terminate()), + }; + + roktManager.attachKit(kit as IRoktKit); + + roktManager.terminate(); + expect(kit.terminate).toHaveBeenCalled(); + expect(kit.launcher.terminate).toHaveBeenCalled(); + }); + }); + + describe('#getVersion', () => { + it('should call kit.getVersion', async () => { + const kit: IRoktKit = { + launcher: { + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn().mockResolvedValue('1.1'), + terminate: jest.fn(), + }, + getVersion: jest.fn().mockImplementation(() => kit.launcher.getVersion()), + filters: undefined, + filteredUser: undefined, + userAttributes: undefined, + hashAttributes: jest.fn(), + selectPlacements: jest.fn(), + setExtensionData: jest.fn(), + use: jest.fn(), + terminate: jest.fn(), + }; + + roktManager.attachKit(kit); + + const version = await roktManager.getVersion(); + expect(kit.getVersion).toHaveBeenCalled(); + expect(version).toBe('1.1'); + }); + + it('should queue the getVersion method if no launcher or kit is attached', () => { + roktManager.getVersion(); + + expect(roktManager['kit']).toBeNull(); + expect(roktManager['messageQueue'].size).toBe(1); + const queuedMessage = Array.from(roktManager['messageQueue'].values())[0]; + expect(queuedMessage.methodName).toBe('getVersion'); + expect(queuedMessage.payload).toEqual({}); + }); + + it('should process queued getVersion calls once the launcher and kit are attached', () => { + const kit: IRoktKit = { + launcher: { + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), + }, + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + setExtensionData: jest.fn(), + use: jest.fn(), + terminate: jest.fn(), + getVersion: jest.fn(), + filters: undefined, + filteredUser: undefined, + userAttributes: undefined, + }; + + roktManager.getVersion(); + + expect(roktManager['kit']).toBeNull(); + expect(roktManager['messageQueue'].size).toBe(1); + const queuedMessage = Array.from(roktManager['messageQueue'].values())[0]; + expect(queuedMessage.methodName).toBe('getVersion'); + expect(queuedMessage.payload).toEqual({}); + + roktManager.attachKit(kit); + expect(roktManager['kit']).not.toBeNull(); + expect(roktManager['messageQueue'].size).toBe(0); + expect(kit.getVersion).toHaveBeenCalled(); + }); + + it('should pass through to kit.launcher.getVersion and return the version', async () => { + const kit: Partial = { + launcher: { + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn().mockResolvedValue('1.1'), + terminate: jest.fn(), + }, + getVersion: jest.fn().mockImplementation(() => (kit.launcher).getVersion()), + }; + + roktManager.attachKit(kit as IRoktKit); + + const version = await roktManager.getVersion(); + expect(kit.getVersion).toHaveBeenCalled(); + expect(kit.launcher.getVersion).toHaveBeenCalled(); + expect(version).toBe('1.1'); + }); + }); + + describe('#use', () => { + it('should call kit.use with provided name', async () => { + const kit: IRoktKit = { + launcher: { + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), + }, + filters: undefined, + filteredUser: undefined, + userAttributes: undefined, + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), + }; + + roktManager.attachKit(kit); + + roktManager.use('ThankYouPageJourney'); + expect(kit.use).toHaveBeenCalledWith('ThankYouPageJourney'); + }); + + it('should queue the use method if no launcher or kit is attached', () => { + roktManager.use('ThankYouPageJourney'); + + expect(roktManager['kit']).toBeNull(); + expect(roktManager['messageQueue'].size).toBe(1); + const queuedMessage = Array.from(roktManager['messageQueue'].values())[0]; + expect(queuedMessage.methodName).toBe('use'); + expect(queuedMessage.payload).toBe('ThankYouPageJourney'); + }); + + it('should process queued use calls once the launcher and kit are attached', async () => { + const kit: IRoktKit = { + launcher: { + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), + }, + filters: undefined, + filteredUser: undefined, + userAttributes: undefined, + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + setExtensionData: jest.fn(), + use: jest.fn(), + getVersion: jest.fn(), + terminate: jest.fn(), + }; + + roktManager.use('ThankYouPageJourney'); + + expect(roktManager['kit']).toBeNull(); + expect(roktManager['messageQueue'].size).toBe(1); + const queuedMessage = Array.from(roktManager['messageQueue'].values())[0]; + expect(queuedMessage.methodName).toBe('use'); + expect(queuedMessage.payload).toBe('ThankYouPageJourney'); + expect(kit.use).not.toHaveBeenCalled(); + + roktManager.attachKit(kit); + + expect(roktManager['messageQueue'].size).toBe(0); + expect(roktManager['kit']).not.toBeNull(); + expect(kit.use).toHaveBeenCalledWith('ThankYouPageJourney'); + }); + + it('should pass through to kit.launcher.use and return the value', async () => { + const kit: Partial = { + launcher: { + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + use: jest.fn().mockResolvedValue('test-use'), + getVersion: jest.fn(), + terminate: jest.fn(), + }, + selectPlacements: jest.fn(), + hashAttributes: jest.fn(), + setExtensionData: jest.fn(), + use: jest.fn().mockImplementation((name: string) => (kit.launcher).use(name)), + getVersion: jest.fn(), + terminate: jest.fn(), + }; + + roktManager.attachKit(kit as IRoktKit); + + const result = await roktManager.use('ThankYouPageJourney'); + expect(kit.use).toHaveBeenCalledWith('ThankYouPageJourney'); + expect(kit.launcher.use).toHaveBeenCalledWith('ThankYouPageJourney'); + expect(result).toBe('test-use'); + }); + }); + describe('#deferredCall', () => { it('should create a deferred promise with unique messageId', () => { const testPayload = { test: 'data' }; diff --git a/test/snippet/tests-snippet.js b/test/snippet/tests-snippet.js index 3a623a023..270aaef56 100644 --- a/test/snippet/tests-snippet.js +++ b/test/snippet/tests-snippet.js @@ -140,9 +140,15 @@ describe('snippet', function() { mParticle.Rokt.hashAttributes(); mParticle.Rokt.selectPlacements(); mParticle.Rokt.setExtensionData(); + mParticle.Rokt.use(); + mParticle.Rokt.getVersion(); + mParticle.Rokt.terminate(); mParticle.config.rq[0][0].should.equal('Rokt.hashAttributes'); mParticle.config.rq[1][0].should.equal('Rokt.selectPlacements'); mParticle.config.rq[2][0].should.equal('Rokt.setExtensionData'); + mParticle.config.rq[3][0].should.equal('Rokt.use'); + mParticle.config.rq[4][0].should.equal('Rokt.getVersion'); + mParticle.config.rq[5][0].should.equal('Rokt.terminate'); done(); }); });