From 25ed05ab0aceea7c6af44f76e1275f7f944232eb Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Sat, 13 Oct 2018 13:03:20 -0500 Subject: [PATCH] Analytics: clean up old A/B test code & add username verify flag (#10754) * chore(analytics): clean up old A/B test code & add username verify * fix(lint): more AB cleanup --- .../user/auth/POST-register_local.test.js | 2 +- .../user/auth/POST-user_auth_social.test.js | 4 ++-- website/server/controllers/api-v3/groups.js | 8 -------- website/server/controllers/api-v3/tasks.js | 12 ------------ website/server/libs/analyticsService.js | 5 +---- website/server/libs/cron.js | 2 -- website/server/models/user/hooks.js | 19 ------------------- 7 files changed, 4 insertions(+), 48 deletions(-) diff --git a/test/api/v3/integration/user/auth/POST-register_local.test.js b/test/api/v3/integration/user/auth/POST-register_local.test.js index 1552ae8358..c6b3248258 100644 --- a/test/api/v3/integration/user/auth/POST-register_local.test.js +++ b/test/api/v3/integration/user/auth/POST-register_local.test.js @@ -276,7 +276,7 @@ describe('POST /user/auth/local/register', () => { }); }); - it('enrolls new users in an A/B test', async () => { + xit('enrolls new users in an A/B test', async () => { let username = generateRandomUserName(); let email = `${username}@example.com`; let password = 'password'; diff --git a/test/api/v3/integration/user/auth/POST-user_auth_social.test.js b/test/api/v3/integration/user/auth/POST-user_auth_social.test.js index 992dd0c6f5..65aeb7985d 100644 --- a/test/api/v3/integration/user/auth/POST-user_auth_social.test.js +++ b/test/api/v3/integration/user/auth/POST-user_auth_social.test.js @@ -80,7 +80,7 @@ describe('POST /user/auth/social', () => { expect(response.newUser).to.be.false; }); - it('enrolls a new user in an A/B test', async () => { + xit('enrolls a new user in an A/B test', async () => { await api.post(endpoint, { authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase network, @@ -136,7 +136,7 @@ describe('POST /user/auth/social', () => { expect(response.newUser).to.be.false; }); - it('enrolls a new user in an A/B test', async () => { + xit('enrolls a new user in an A/B test', async () => { await api.post(endpoint, { authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase network, diff --git a/website/server/controllers/api-v3/groups.js b/website/server/controllers/api-v3/groups.js index 73d41e2957..11bdc40e8c 100644 --- a/website/server/controllers/api-v3/groups.js +++ b/website/server/controllers/api-v3/groups.js @@ -127,10 +127,6 @@ api.createGroup = { user.achievements.joinedGuild = true; user.addNotification('GUILD_JOINED_ACHIEVEMENT'); } - if (user._ABtests && user._ABtests.guildReminder && user._ABtests.counter !== -1) { - user._ABtests.counter = -1; - user.markModified('_ABtests'); - } } else { if (group.privacy !== 'private') throw new NotAuthorized(res.t('partyMustbePrivate')); if (user.party._id) throw new NotAuthorized(res.t('messageGroupAlreadyInParty')); @@ -570,10 +566,6 @@ api.joinGroup = { user.achievements.joinedGuild = true; user.addNotification('GUILD_JOINED_ACHIEVEMENT'); } - if (user._ABtests && user._ABtests.guildReminder && user._ABtests.counter !== -1) { - user._ABtests.counter = -1; - user.markModified('_ABtests'); - } } if (!isUserInvited) throw new NotAuthorized(res.t('messageGroupRequiresInvite')); diff --git a/website/server/controllers/api-v3/tasks.js b/website/server/controllers/api-v3/tasks.js index 0ee33b26a5..524669d3a1 100644 --- a/website/server/controllers/api-v3/tasks.js +++ b/website/server/controllers/api-v3/tasks.js @@ -630,18 +630,6 @@ api.scoreTask = { setNextDue(task, user); - if (user._ABtests && user._ABtests.guildReminder && user._ABtests.counter !== -1) { - user._ABtests.counter++; - if (user._ABtests.counter > 1) { - if (user._ABtests.guildReminder.indexOf('timing1') !== -1 || user._ABtests.counter > 4) { - user._ABtests.counter = -1; - let textVariant = user._ABtests.guildReminder.indexOf('text2'); - user.addNotification('GUILD_PROMPT', {textVariant}); - } - } - user.markModified('_ABtests'); - } - let promises = [ user.save(), task.save(), diff --git a/website/server/libs/analyticsService.js b/website/server/libs/analyticsService.js index 8a745f90e0..6f0787c0c3 100644 --- a/website/server/libs/analyticsService.js +++ b/website/server/libs/analyticsService.js @@ -70,8 +70,8 @@ let _formatUserData = (user) => { properties.balance = user.balance; properties.balanceGemAmount = properties.balance * 4; - properties.tutorialComplete = user.flags && user.flags.tour && user.flags.tour.intro === -2; + properties.verifiedUsername = user.flags && user.flags.verifiedUsername; if (user.habits && user.dailys && user.todos && user.rewards) { properties['Number Of Tasks'] = { @@ -90,9 +90,6 @@ let _formatUserData = (user) => { properties.subscription = user.purchased.plan.planId; } - if (user._ABtest) { - properties.ABtest = user._ABtest; - } if (user._ABtests) { properties.ABtests = toArray(user._ABtests); } diff --git a/website/server/libs/cron.js b/website/server/libs/cron.js index 3091987637..5106b013e2 100644 --- a/website/server/libs/cron.js +++ b/website/server/libs/cron.js @@ -200,8 +200,6 @@ function trackCronAnalytics (analytics, user, _progress, options) { function awardLoginIncentives (user) { if (user.loginIncentives > MAX_INCENTIVES) return; - // A/B test 2016-12-21: Should we deliver notifications for upcoming incentives on days when users don't receive rewards? - if (!loginIncentives[user.loginIncentives].rewardKey && user._ABtests && user._ABtests.checkInModals === '20161221_noCheckInPreviews') return; // Remove old notifications if they exists user.notifications.forEach((notif, index) => { diff --git a/website/server/models/user/hooks.js b/website/server/models/user/hooks.js index 727396234d..020dd59ebe 100644 --- a/website/server/models/user/hooks.js +++ b/website/server/models/user/hooks.js @@ -124,25 +124,6 @@ function _setUpNewUser (user) { let taskTypes; let iterableFlags = user.flags.toObject(); - // A/B test 2017-05-11: Can we encourage people to join Guilds with a pester modal? - let testGroup = Math.random(); - if (testGroup < 0.1) { - user._ABtests.guildReminder = '20170511_noGuildReminder'; // control group, don't pester about Guilds - user._ABtests.counter = -1; - } else if (testGroup < 0.235) { - user._ABtests.guildReminder = '20170511_text1timing1'; // first sample text, show after two clicks - user._ABtests.counter = 0; - } else if (testGroup < 0.46) { - user._ABtests.guildReminder = '20170511_text2timing1'; // second sample text, show after two clicks - user._ABtests.counter = 0; - } else if (testGroup < 0.685) { - user._ABtests.guildReminder = '20170511_text1timing2'; // first sample text, show after five clicks - user._ABtests.counter = 0; - } else { - user._ABtests.guildReminder = '20170511_text2timing2'; // second sample text, show after five clicks - user._ABtests.counter = 0; - } - user.items.quests.dustbunnies = 1; user.purchased.background.violet = true; user.preferences.background = 'violet';