diff --git a/src/Rokt-Kit.js b/src/Rokt-Kit.js index 1e11709..f510692 100644 --- a/src/Rokt-Kit.js +++ b/src/Rokt-Kit.js @@ -15,6 +15,7 @@ var name = 'Rokt'; var moduleId = 181; +var EVENT_NAME_SELECT_PLACEMENTS = 'selectPlacements'; var constructor = function () { var self = this; @@ -255,9 +256,38 @@ var constructor = function () { attributes: selectPlacementsAttributes, }); + // Log custom event for selectPlacements call + logSelectPlacementsEvent(selectPlacementsAttributes); + return self.launcher.selectPlacements(selectPlacementsOptions); } + /** + * Logs a custom event when selectPlacements is called + * This enables visibility and troubleshooting + * @param {Object} attributes - The attributes sent to Rokt + */ + function logSelectPlacementsEvent(attributes) { + if ( + !window.mParticle || + typeof window.mParticle.logEvent !== 'function' + ) { + return; + } + + if (!isObject(attributes)) { + return; + } + + var EVENT_TYPE_OTHER = window.mParticle.EventType.Other; + + window.mParticle.logEvent( + EVENT_NAME_SELECT_PLACEMENTS, + EVENT_TYPE_OTHER, + attributes + ); + } + /** * Enables optional Integration Launcher extensions before selecting placements * @param {string} extensionName - Name of the extension to enable diff --git a/test/src/tests.js b/test/src/tests.js index 0b75846..b2f5d99 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -88,6 +88,15 @@ describe('Rokt Forwarder', () => { mParticle.generateHash = function (input) { return 'hashed-<' + input + '>-value'; }; + // Mock for logEvent to capture custom event logging + mParticle.loggedEvents = []; + mParticle.logEvent = function (eventName, eventType, eventAttributes) { + mParticle.loggedEvents.push({ + eventName: eventName, + eventType: eventType, + eventAttributes: eventAttributes, + }); + }; // -------------------START EDITING BELOW:----------------------- var MockRoktForwarder = function () { var self = this; @@ -734,6 +743,7 @@ describe('Rokt Forwarder', () => { window.mParticle.Rokt.attachKitCalled = true; return Promise.resolve(); }; + mParticle.loggedEvents = []; window.mParticle.Rokt.setLocalSessionAttribute = function ( key, value @@ -2495,6 +2505,97 @@ describe('Rokt Forwarder', () => { ); }); }); + + describe('#logSelectPlacementsEvent', () => { + it('should log a custom event', async () => { + await window.mParticle.forwarder.init( + { + accountId: '123456', + }, + reportService.cb, + true, + null, + { + 'cached-user-attr': 'cached-value', + } + ); + + await window.mParticle.forwarder.selectPlacements({ + identifier: 'test-placement', + attributes: { + 'new-attr': 'new-value', + }, + }); + + mParticle.loggedEvents.length.should.equal(1); + mParticle.loggedEvents[0].eventName.should.equal( + 'selectPlacements' + ); + mParticle.loggedEvents[0].eventType.should.equal(8); // EventType.Other + + const eventAttributes = + mParticle.loggedEvents[0].eventAttributes; + eventAttributes.should.have.property('mpid'); + }); + + it('should include merged user attributes, identities, and mpid', async () => { + await window.mParticle.forwarder.init( + { + accountId: '123456', + }, + reportService.cb, + true, + null, + { + 'cached-user-attr': 'cached-value', + } + ); + + await window.mParticle.forwarder.selectPlacements({ + identifier: 'test-placement', + attributes: { + 'new-attr': 'new-value', + }, + }); + + const eventAttributes = + mParticle.loggedEvents[0].eventAttributes; + + // eventAttributes should include merged attributes and mpid directly + eventAttributes.should.have.property('mpid', '123'); + eventAttributes.should.have.property('new-attr', 'new-value'); + eventAttributes.should.have.property( + 'cached-user-attr', + 'cached-value' + ); + }); + + it('should skip logging when mParticle.logEvent is not available', async () => { + var originalLogEvent = window.mParticle.logEvent; + window.mParticle.logEvent = undefined; + + await window.mParticle.forwarder.init( + { + accountId: '123456', + }, + reportService.cb, + true, + null, + {} + ); + + await window.mParticle.forwarder.selectPlacements({ + identifier: 'test-placement', + attributes: { + attr: 'value', + }, + }); + + window.Rokt.selectPlacementsCalled.should.equal(true); + mParticle.loggedEvents.length.should.equal(0); + window.mParticle.logEvent = originalLogEvent; + }); + }); }); describe('#use', () => {