diff --git a/test/api/unit/models/user.test.js b/test/api/unit/models/user.test.js
index 27c61485d9..eb462a20f4 100644
--- a/test/api/unit/models/user.test.js
+++ b/test/api/unit/models/user.test.js
@@ -592,6 +592,20 @@ describe('User Model', () => {
});
context('pre-save hook', () => {
+ it('enrolls users that signup through web in the Drop Cap AB test', async () => {
+ let user = new User();
+ user.registeredThrough = 'habitica-web';
+ user = await user.save();
+ expect(user._ABtests.dropCapNotif).to.exist;
+ });
+
+ it('does not enroll users that signup through modal in the Drop Cap AB test', async () => {
+ let user = new User();
+ user.registeredThrough = 'habitica-ios';
+ user = await user.save();
+ expect(user._ABtests.dropCapNotif).to.not.exist;
+ });
+
it('marks the last news post as read for new users', async () => {
const lastNewsPost = { _id: '1' };
sandbox.stub(NewsPost, 'lastNewsPost').returns(lastNewsPost);
diff --git a/website/client/src/components/achievements/dropCapReached.vue b/website/client/src/components/achievements/dropCapReached.vue
index e5f592e8fc..a804fd78fa 100644
--- a/website/client/src/components/achievements/dropCapReached.vue
+++ b/website/client/src/components/achievements/dropCapReached.vue
@@ -3,7 +3,7 @@
id="drop-cap-reached"
size="md"
:hide-header="true"
- :hide-footer="!hasSubscription"
+ :hide-footer="hasSubscription"
>
Modal > Subscriptions',
});
+
+ this.close();
+ this.$router.push('/user/settings/subscription');
},
},
};
diff --git a/website/client/src/components/header/userDropdown.vue b/website/client/src/components/header/userDropdown.vue
index ec0bc2547a..6da37f6ca1 100644
--- a/website/client/src/components/header/userDropdown.vue
+++ b/website/client/src/components/header/userDropdown.vue
@@ -94,7 +94,7 @@
@@ -173,15 +173,15 @@ export default {
showProfile (startingPage) {
this.$router.push({ name: startingPage });
},
- showBuyGemsModal () {
+ toLearnMore () {
Analytics.track({
hitType: 'event',
eventCategory: 'button',
eventAction: 'click',
- eventLabel: 'Gems > User Dropdown',
+ eventLabel: 'User Dropdown > Subscriptions',
});
- this.$root.$emit('bv::show::modal', 'buy-gems', { alreadyTracked: true });
+ this.$router.push({ name: 'subscription' });
},
logout () {
this.$store.dispatch('auth:logout');
diff --git a/website/server/middlewares/cron.js b/website/server/middlewares/cron.js
index 8b8f8be59e..0d20e8923e 100644
--- a/website/server/middlewares/cron.js
+++ b/website/server/middlewares/cron.js
@@ -52,26 +52,6 @@ async function unlockUser (user) {
}).exec();
}
-// Enroll users in the Drop Cap A/B Test
-function dropCapABTest (user, req) {
- // Only target users that use web for cron and aren't subscribed.
- // Those using mobile aren't excluded as they may use it later
- const isWeb = req.headers['x-client'] === 'habitica-web';
-
- if (isWeb && !user._ABtests.dropCapNotif && !user.isSubscribed()) {
- const testGroup = Math.random();
- // Enroll 20% of users, splitting them 50/50
- if (testGroup <= 0.25) {
- user._ABtests.dropCapNotif = 'drop-cap-notif-enabled';
- } else if (testGroup <= 0.5) {
- user._ABtests.dropCapNotif = 'drop-cap-notif-disabled';
- } else {
- user._ABtests.dropCapNotif = 'drop-cap-notif-not-enrolled';
- }
- user.markModified('_ABtests');
- }
-}
-
async function cronAsync (req, res) {
let { user } = res.locals;
if (!user) return null; // User might not be available when authentication is not mandatory
@@ -86,7 +66,7 @@ async function cronAsync (req, res) {
res.locals.user = user;
const { daysMissed, timezoneUtcOffsetFromUserPrefs } = user.daysUserHasMissed(now, req);
- dropCapABTest(user, req);
+ user.enrollInDropCapABTest(req.headers['x-client']);
await updateLastCron(user, now);
if (daysMissed <= 0) {
diff --git a/website/server/models/user/hooks.js b/website/server/models/user/hooks.js
index fab92c7365..5a3c67a154 100644
--- a/website/server/models/user/hooks.js
+++ b/website/server/models/user/hooks.js
@@ -164,6 +164,8 @@ function _setUpNewUser (user) {
user.markModified('items achievements');
+ user.enrollInDropCapABTest(user.registeredThrough);
+
if (user.registeredThrough === 'habitica-web') {
taskTypes = ['habit', 'daily', 'todo', 'reward', 'tag'];
diff --git a/website/server/models/user/methods.js b/website/server/models/user/methods.js
index d92fd30557..fbe084b407 100644
--- a/website/server/models/user/methods.js
+++ b/website/server/models/user/methods.js
@@ -525,3 +525,23 @@ schema.methods.getSecretData = function getSecretData () {
return user.secret;
};
+
+// Enroll users in the Drop Cap A/B Test
+schema.methods.enrollInDropCapABTest = function enrollInDropCapABTest (xClientHeader) {
+ // Only target users that use web for cron and aren't subscribed.
+ // Those using mobile aren't excluded as they may use it later
+ const isWeb = xClientHeader === 'habitica-web';
+
+ if (isWeb && !this._ABtests.dropCapNotif && !this.isSubscribed()) {
+ const testGroup = Math.random();
+ // Enroll 20% of users, splitting them 50/50
+ if (testGroup <= 0.25) {
+ this._ABtests.dropCapNotif = 'drop-cap-notif-enabled';
+ } else if (testGroup <= 0.5) {
+ this._ABtests.dropCapNotif = 'drop-cap-notif-disabled';
+ } else {
+ this._ABtests.dropCapNotif = 'drop-cap-notif-not-enrolled';
+ }
+ this.markModified('_ABtests');
+ }
+};