diff --git a/test/api/v3/unit/libs/analyticsService.test.js b/test/api/v3/unit/libs/analyticsService.test.js index 8eb7f9c05e..7efe32f864 100644 --- a/test/api/v3/unit/libs/analyticsService.test.js +++ b/test/api/v3/unit/libs/analyticsService.test.js @@ -94,7 +94,19 @@ describe('analyticsService', () => { amplitudeNock .filteringPath(/httpapi.*platform.*3rd\%20Party.*/g, ''); - data.headers = {}; + data.headers = {'x-client': 'some-third-party'}; + + return analyticsService.track(eventType, data) + .then(() => { + amplitudeNock.done(); + }); + }); + + it('logs unknown if headers are not passed in', () => { + amplitudeNock + .filteringPath(/httpapi.*platform.*Unknown.*/g, ''); + + delete data.headers; return analyticsService.track(eventType, data) .then(() => { @@ -108,6 +120,11 @@ describe('analyticsService', () => { amplitudeNock .filteringPath(/httpapi.*os.*name.*Other.*/g, ''); + data.headers = { + 'x-client': 'thrid-party', + 'user-agent': 'foo', + }; + return analyticsService.track(eventType, data) .then(() => { amplitudeNock.done(); @@ -118,8 +135,10 @@ describe('analyticsService', () => { amplitudeNock .filteringPath(/httpapi.*os.*name.*iOS.*/g, ''); - data.headers = {'x-client': 'habitica-ios', - 'user-agent': 'Habitica/148 (iPhone; iOS 9.3; Scale/2.00)'}; + data.headers = { + 'x-client': 'habitica-ios', + 'user-agent': 'Habitica/148 (iPhone; iOS 9.3; Scale/2.00)', + }; return analyticsService.track(eventType, data) .then(() => { @@ -131,7 +150,22 @@ describe('analyticsService', () => { amplitudeNock .filteringPath(/httpapi.*os.*name.*Android.*/g, ''); - data.headers = {'x-client': 'habitica-android'}; + data.headers = { + 'x-client': 'habitica-android', + 'user-agent': 'Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19', + }; + + return analyticsService.track(eventType, data) + .then(() => { + amplitudeNock.done(); + }); + }); + + it('sets Unkown if headers are not passed in', () => { + amplitudeNock + .filteringPath(/httpapi.*Unknown.*/g, ''); + + delete data.headers; return analyticsService.track(eventType, data) .then(() => { diff --git a/website/server/libs/analyticsService.js b/website/server/libs/analyticsService.js index 6996d565c0..eda6a2a561 100644 --- a/website/server/libs/analyticsService.js +++ b/website/server/libs/analyticsService.js @@ -89,6 +89,10 @@ let _formatUserData = (user) => { }; let _formatPlatformForAmplitude = (platform) => { + if (!platform) { + return 'Unknown'; + } + if (platform in PLATFORM_MAP) { return PLATFORM_MAP[platform]; } @@ -97,6 +101,10 @@ let _formatPlatformForAmplitude = (platform) => { }; let _formatUserAgentForAmplitude = (platform, agentString) => { + if (!agentString) { + return 'Unknown'; + } + let agent = useragent.lookup(agentString).toJSON(); let formattedAgent = {}; if (platform === 'iOS' || platform === 'Android') { @@ -115,8 +123,8 @@ let _formatUserAgentForAmplitude = (platform, agentString) => { let _formatDataForAmplitude = (data) => { let event_properties = omit(data, AMPLITUDE_PROPERTIES_TO_SCRUB); - let platform = _formatPlatformForAmplitude(data.headers['x-client']); - let agent = _formatUserAgentForAmplitude(platform, data.headers['user-agent']); + let platform = _formatPlatformForAmplitude(data.headers && data.headers['x-client']); + let agent = _formatUserAgentForAmplitude(platform, data.headers && data.headers['user-agent']); let ampData = { user_id: data.uuid || 'no-user-id-was-provided', platform,