Skip to content
This repository was archived by the owner on Apr 27, 2024. It is now read-only.

Commit

Permalink
Merge pull request #40 from john-doherty/fix-ids
Browse files Browse the repository at this point in the history
Fix: retain device_id
  • Loading branch information
john-doherty authored Mar 11, 2024
2 parents bd70902 + 1e48e09 commit 304142a
Show file tree
Hide file tree
Showing 10 changed files with 153 additions and 19 deletions.
4 changes: 2 additions & 2 deletions dist/mixpanel-lite.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mixpanel-lite",
"version": "1.5.9",
"version": "1.5.10",
"description": "A lightweight alternative to mixpanel-js with offline support for PWAs",
"main": "src/mixpanel-lite.js",
"scripts": {
Expand Down
25 changes: 15 additions & 10 deletions src/mixpanel-lite.js
Original file line number Diff line number Diff line change
Expand Up @@ -313,15 +313,15 @@
// mark sending complete
_sending = false;
})
.catch(function (err) {
.catch(function (err) {

if (_debugging) {
console.log(err);
}
if (_debugging) {
console.log(err);
}

// something went wrong, allow this method to be recalled
_sending = false;
});
// something went wrong, allow this method to be recalled
_sending = false;
});
}

/* #region Helpers */
Expand Down Expand Up @@ -961,7 +961,12 @@
_token = token;
_debugging = (opts.debug === true);

var uuid = getNewUUID();
var distinctId = getNewUUID();
var deviceId = simpleStorage.get('device_id') || getNewUUID();

if (!simpleStorage.exists('device_id')) {
simpleStorage.set('device_id', deviceId);
}

// params -> https://help.mixpanel.com/hc/en-us/articles/115004613766-Default-Properties-Collected-by-Mixpanel
_properties = {
Expand All @@ -974,8 +979,8 @@
$screen_width: screen.width,
$referrer: document.referrer,
$referring_domain: getReferringDomain(),
distinct_id: uuid,
$device_id: uuid,
distinct_id: distinctId,
$device_id: deviceId,
mp_lib: 'mixpanel-lite',
$lib_version: '0.0.0',
language: getBrowserLanguage()
Expand Down
2 changes: 1 addition & 1 deletion tests/mixpanel-lite-advert-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ var url = 'file://' + path.join(__dirname, 'environment.html');
var page = null;
var browser = null;

describe('mixpanel-lite .ad', function () {
describe('mixpanel-lite: .ad', function () {

// create a new browser instance before each test
beforeEach(async function () {
Expand Down
2 changes: 1 addition & 1 deletion tests/mixpanel-lite-automated-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ var url = 'file://' + path.join(__dirname, 'environment.html');
var page = null;
var browser = null;

describe('mixpanel-lite .automated', function () {
describe('mixpanel-lite: .automated', function () {

// create a new browser instance before each test
beforeEach(async function () {
Expand Down
129 changes: 129 additions & 0 deletions tests/mixpanel-lite-ids-spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
var path = require('path');
var puppeteer = require('puppeteer');
var utils = require('./utils');
var cuid = require('cuid');

var url = 'file://' + path.join(__dirname, 'environment.html');
var page = null;
var browser = null;

describe('mixpanel-lite: ids', function () {

// create a new browser instance before each test
beforeEach(async function () {

// Launch a new browser instance
browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox']
});

// get page
page = (await browser.pages())[0];

// Navigate to the desired URL
await page.goto(url);
});

afterEach(function () {

return page.evaluate(function () {
return localStorage.removeItem('mixpanel-lite');
})
.then(function() {
return utils.sleep(250);
})
.then(function() {
return browser.close();
});
});

it('should reused device_id but assign new distinct_id', async function() {

// create some tracking events
var event1 = {
name: `event-${cuid.slug()}`,
data: {
age: utils.randomInteger(10, 20)
}
};
var event2 = {
name: `event-${cuid.slug()}`,
data: {
age: utils.randomInteger(30, 40)
}
};

// setup request intercept
await page.setRequestInterception(true);

// setup mixpanel
await utils.setMixpanelToken(page, 'test-token');

// listen for track requests
var trackRequests = utils.waitForPuppeteerRequests(page, 2, 'https://api.mixpanel.com/track');

// send event
await utils.sendMixpanelEvent(page, event1.name, event1.data);

// setup mixpanel (2nd time should trigger device_id logic which pulls from storage)
await utils.setMixpanelToken(page, 'test-token');

// send event
await utils.sendMixpanelEvent(page, event2.name, event2.data);

// wait for requests to be sent
var results = await trackRequests;

// get the data sent via tracking request
var eventPayload1 = utils.getJsonPayloadFromMixpanelUrl(results[0].url);
var eventPayload2 = utils.getJsonPayloadFromMixpanelUrl(results[1].url);

// should have the correct event names
expect(eventPayload1.event).toEqual(event1.name);
expect(eventPayload2.event).toEqual(event2.name);

// should have correct event data
expect(eventPayload1.properties.age).toEqual(event1.data.age);
expect(eventPayload2.properties.age).toEqual(event2.data.age);

// should have different distinct_id (one for each call to mixpanel.init)
expect(eventPayload2.properties.distinct_id).not.toEqual(eventPayload1.properties.distinct_id);

// should have same device_id (second call, gets value from localStorage)
expect(eventPayload2.properties.$device_id).toEqual(eventPayload1.properties.$device_id);
});

it('should use a unique $insert_id for each event', async function() {

// setup request intercept
await page.setRequestInterception(true);

// setup mixpanel
await utils.setMixpanelToken(page, 'test-token');

// listen for track requests
var trackRequests = utils.waitForPuppeteerRequests(page, 2, 'https://api.mixpanel.com/track');

// send events
await utils.sendMixpanelEvent(page, 'event1', { eventNumber: 1 });
await utils.sendMixpanelEvent(page, 'event2', { eventNumber: 2 });
await utils.sendMixpanelEvent(page, 'event3', { eventNumber: 3 });

// wait for requests to be sent
var results = await trackRequests;

// get the data sent via tracking request
var eventPayload1 = utils.getJsonPayloadFromMixpanelUrl(results[0].url);
var eventPayload2 = utils.getJsonPayloadFromMixpanelUrl(results[1].url);

// should have the correct event names
expect(eventPayload1.event).toEqual('event1');
expect(eventPayload2.event).toEqual('event2');

// should have different $insert_id values
expect(eventPayload1.properties.$insert_id).toBeDefined();
expect(eventPayload2.properties.$insert_id).toBeDefined();
expect(eventPayload1.properties.$insert_id).not.toEqual(eventPayload2.properties.$insert_id);
});
});
2 changes: 1 addition & 1 deletion tests/mixpanel-lite-interface-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ var url = 'file://' + path.join(__dirname, 'environment.html');
var page = null;
var browser = null;

describe('mixpanel-lite interface', function () {
describe('mixpanel-lite: interface', function () {

// create a new browser instance before each test
beforeEach(async function () {
Expand Down
2 changes: 1 addition & 1 deletion tests/mixpanel-lite-offline-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ var url = 'file://' + path.join(__dirname, 'environment.html');
var page = null;
var browser = null;

describe('mixpanel-lite .offline', function () {
describe('mixpanel-lite: .offline', function () {

// create a new browser instance before each test
beforeEach(async function () {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ var url = 'file://' + path.join(__dirname, 'environment.html');
var page = null;
var browser = null;

describe('mixpanel-lite request', function () {
describe('mixpanel-lite: requests', function () {

// create a new browser instance before each test
beforeEach(async function () {
Expand Down
2 changes: 1 addition & 1 deletion tests/mixpanel-lite-utm-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ var url = 'file://' + path.join(__dirname, 'environment.html');
var page = null;
var browser = null;

describe('mixpanel-lite .utm', function () {
describe('mixpanel-lite: .utm', function () {

// create a new browser instance before each test
beforeEach(async function () {
Expand Down

0 comments on commit 304142a

Please sign in to comment.