Bug 1852138 - [Survey] Add 24 hours time gap from opt-in before displaying survey r=omc-reviewers,aminomancer

Differential Revision: https://phabricator.services.mozilla.com/D188386
This commit is contained in:
hanna alemu 2023-09-20 23:34:32 +00:00
parent b83f530f68
commit b67cc3be4f
3 changed files with 101 additions and 1 deletions

View file

@ -629,6 +629,8 @@ const SHOPPING_MICROSURVEY = {
],
};
const OPTED_IN_TIME_PREF = "browser.shopping.experience2023.survey.optedInTime";
XPCOMUtils.defineLazyPreferenceGetter(
lazy,
"isSurveySeen",
@ -643,9 +645,18 @@ XPCOMUtils.defineLazyPreferenceGetter(
0
);
XPCOMUtils.defineLazyPreferenceGetter(
lazy,
"optedInTime",
OPTED_IN_TIME_PREF,
0
);
let optInDynamicContent;
// Limit pref increase to 5 as we don't need to count any higher than that
const MIN_VISITS_TO_SHOW_SURVEY = 5;
// Wait 24 hours after opt in to show survey
const MIN_TIME_AFTER_OPT_IN = 24 * 60 * 60;
class AboutWelcomeShoppingChild extends AboutWelcomeChild {
// Static state used to track session in which user opted-in
@ -688,17 +699,35 @@ class AboutWelcomeShoppingChild extends AboutWelcomeChild {
evaluateAndShowSurvey() {
// Re-evaluate if we should show the survey
// Render survey if user is opted-in and has met survey seen conditions
const now = Date.now() / 1000;
const hasBeen24HrsSinceOptin =
lazy.optedInTime && now - lazy.optedInTime >= MIN_TIME_AFTER_OPT_IN;
this.showMicroSurvey =
this.surveyEnabled &&
!lazy.isSurveySeen &&
!AboutWelcomeShoppingChild.optedInSession &&
lazy.pdpVisits >= MIN_VISITS_TO_SHOW_SURVEY;
lazy.pdpVisits >= MIN_VISITS_TO_SHOW_SURVEY &&
hasBeen24HrsSinceOptin;
if (this.showMicroSurvey) {
this.renderMessage();
}
}
setOptInTime() {
const now = Date.now() / 1000;
this.AWSendToParent("SPECIAL_ACTION", {
type: "SET_PREF",
data: {
pref: {
name: OPTED_IN_TIME_PREF,
value: now,
},
},
});
}
handleEvent(event) {
// Decide when to show/hide onboarding and survey message
const { productUrl, showOnboarding, data } = event.detail;
@ -713,6 +742,14 @@ class AboutWelcomeShoppingChild extends AboutWelcomeChild {
return;
}
//Store timestamp if user opts in
if (
Object.hasOwn(event.detail, "showOnboarding") &&
!event.detail.showOnboarding &&
!lazy.optedInTime
) {
this.setOptInTime();
}
// Hide the container until the user is eligible to see the survey
if (!lazy.isSurveySeen) {
this.document.getElementById("multi-stage-message-root").hidden = true;

View file

@ -3,6 +3,10 @@
"use strict";
const currentTime = Date.now() / 1000;
const time25HrsAgo = currentTime - 25 * 60 * 60;
const time1HrAgo = currentTime - 1 * 60 * 60;
add_task(async function test_setup() {
await BrowserTestUtils.withNewTab(
{
@ -30,6 +34,7 @@ add_task(async function test_showSurvey_Enabled() {
["browser.shopping.experience2023.survey.enabled", true],
["browser.shopping.experience2023.survey.hasSeen", false],
["browser.shopping.experience2023.survey.pdpVisits", 5],
["browser.shopping.experience2023.survey.optedInTime", time25HrsAgo],
],
});
await BrowserTestUtils.withNewTab(
@ -121,6 +126,7 @@ add_task(async function test_showSurvey_Disabled() {
["browser.shopping.experience2023.survey.enabled", false],
["browser.shopping.experience2023.survey.hasSeen", false],
["browser.shopping.experience2023.survey.pdpVisits", 5],
["browser.shopping.experience2023.survey.optedInTime", time25HrsAgo],
],
});
await BrowserTestUtils.withNewTab(
@ -180,3 +186,59 @@ add_task(async function test_showSurvey_Disabled() {
);
await SpecialPowers.popPrefEnv();
});
/**
* Test to check survey display logic respects 24 hours after Opt-in rule
*/
add_task(async function test_24_hr_since_optin_rule() {
await SpecialPowers.pushPrefEnv({
set: [
["browser.shopping.experience2023.optedIn", 1],
["browser.shopping.experience2023.survey.enabled", true],
["browser.shopping.experience2023.survey.hasSeen", false],
["browser.shopping.experience2023.survey.pdpVisits", 5],
["browser.shopping.experience2023.survey.optedInTime", time1HrAgo],
],
});
await BrowserTestUtils.withNewTab(
{
url: "about:shoppingsidebar",
gBrowser,
},
async browser => {
await SpecialPowers.spawn(
browser,
[MOCK_ANALYZED_PRODUCT_RESPONSE],
async mockData => {
let shoppingContainer =
content.document.querySelector(
"shopping-container"
).wrappedJSObject;
shoppingContainer.data = Cu.cloneInto(mockData, content);
await shoppingContainer.updateComplete;
let childActor = content.windowGlobalChild.getExistingActor(
"AboutWelcomeShopping"
);
let surveyScreen = content.document.querySelector(
"shopping-container .screen.SHOPPING_MICROSURVEY_SCREEN_1"
);
ok(!surveyScreen, "Survey screen is not rendered");
ok(
!childActor.showMicroSurvey,
"Show Survey 24 hours after opt in conditions are not met"
);
ok(
content.document.getElementById("multi-stage-message-root").hidden,
"Survey Message container is hidden"
);
childActor.resetChildStates();
}
);
}
);
await SpecialPowers.popPrefEnv();
});

View file

@ -198,6 +198,7 @@ export const SpecialMessageActions = {
"browser.migrate.preferences-entrypoint.enabled",
"browser.shopping.experience2023.active",
"browser.shopping.experience2023.optedIn",
"browser.shopping.experience2023.survey.optedInTime",
"browser.shopping.experience2023.survey.hasSeen",
"browser.shopping.experience2023.survey.pdpVisits",
"browser.startup.homepage",