test_OnboardingMessageProvider.js (7790B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 const { OnboardingMessageProvider } = ChromeUtils.importESModule( 5 "resource:///modules/asrouter/OnboardingMessageProvider.sys.mjs" 6 ); 7 8 function getOnboardingScreenById(screens, screenId) { 9 return screens.find(screen => { 10 return screen?.id === screenId; 11 }); 12 } 13 14 add_task( 15 async function test_OnboardingMessageProvider_getUpgradeMessage_no_pin() { 16 let sandbox = sinon.createSandbox(); 17 sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin").resolves(true); 18 const message = await OnboardingMessageProvider.getUpgradeMessage(); 19 // If Firefox is not pinned, the screen should have "pin" content 20 equal( 21 message.content.screens[0].id, 22 "UPGRADE_PIN_FIREFOX", 23 "Screen has pin screen id" 24 ); 25 // PIN_FIREFOX_TO_TASKBAR is contained within a MULTI_ACTION 26 // which also applies PIN_FIREFOX_TO_START_MENU where applicable. 27 equal( 28 message.content.screens[0].content.primary_button.action.type, 29 "MULTI_ACTION", 30 "Primary button has multi-action type" 31 ); 32 sandbox.restore(); 33 } 34 ); 35 36 add_task( 37 async function test_OnboardingMessageProvider_getUpgradeMessage_pin_no_default() { 38 let sandbox = sinon.createSandbox(); 39 sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin").resolves(false); 40 sandbox 41 .stub(OnboardingMessageProvider, "_doesAppNeedDefault") 42 .resolves(true); 43 const message = await OnboardingMessageProvider.getUpgradeMessage(); 44 // If Firefox is pinned, but not the default, the screen should have "make default" content 45 equal( 46 message.content.screens[0].id, 47 "UPGRADE_ONLY_DEFAULT", 48 "Screen has make default screen id" 49 ); 50 equal( 51 message.content.screens[0].content.primary_button.action.type, 52 "SET_DEFAULT_BROWSER", 53 "Primary button has make default action" 54 ); 55 sandbox.restore(); 56 } 57 ); 58 59 add_task( 60 async function test_OnboardingMessageProvider_getUpgradeMessage_pin_and_default() { 61 let sandbox = sinon.createSandbox(); 62 sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin").resolves(false); 63 sandbox 64 .stub(OnboardingMessageProvider, "_doesAppNeedDefault") 65 .resolves(false); 66 const message = await OnboardingMessageProvider.getUpgradeMessage(); 67 // If Firefox is pinned and the default, the screen should have "get started" content 68 equal( 69 message.content.screens[0].id, 70 "UPGRADE_GET_STARTED", 71 "Screen has get started screen id" 72 ); 73 ok( 74 !message.content.screens[0].content.primary_button.action.type, 75 "Primary button has no action type" 76 ); 77 sandbox.restore(); 78 } 79 ); 80 81 add_task(async function test_OnboardingMessageProvider_getNoImport_default() { 82 let sandbox = sinon.createSandbox(); 83 sandbox 84 .stub(OnboardingMessageProvider, "_doesAppNeedDefault") 85 .resolves(false); 86 const message = await OnboardingMessageProvider.getUpgradeMessage(); 87 88 // No import screen is shown when user has Firefox both pinned and default 89 Assert.notEqual( 90 message.content.screens[1]?.id, 91 "UPGRADE_IMPORT_SETTINGS_EMBEDDED", 92 "Screen has no import screen id" 93 ); 94 sandbox.restore(); 95 }); 96 97 add_task(async function test_OnboardingMessageProvider_getImport_nodefault() { 98 Services.prefs.setBoolPref("browser.shell.checkDefaultBrowser", true); 99 registerCleanupFunction(() => { 100 Services.prefs.clearUserPref("browser.shell.checkDefaultBrowser"); 101 }); 102 103 let sandbox = sinon.createSandbox(); 104 sandbox.stub(OnboardingMessageProvider, "_doesAppNeedDefault").resolves(true); 105 sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin").resolves(false); 106 const message = await OnboardingMessageProvider.getUpgradeMessage(); 107 108 // Import screen is shown when user doesn't have Firefox pinned and default 109 Assert.equal( 110 message.content.screens[1]?.id, 111 "UPGRADE_IMPORT_SETTINGS_EMBEDDED", 112 "Screen has import screen id" 113 ); 114 sandbox.restore(); 115 }); 116 117 add_task( 118 async function test_OnboardingMessageProvider_getPinPrivateWindow_noPrivatePin() { 119 Services.prefs.setBoolPref("browser.shell.checkDefaultBrowser", true); 120 registerCleanupFunction(() => { 121 Services.prefs.clearUserPref("browser.shell.checkDefaultBrowser"); 122 }); 123 let sandbox = sinon.createSandbox(); 124 // User needs default to ensure Pin Private window shows as third screen after import 125 sandbox 126 .stub(OnboardingMessageProvider, "_doesAppNeedDefault") 127 .resolves(true); 128 129 let pinStub = sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin"); 130 pinStub.resolves(false); 131 pinStub.withArgs(true).resolves(true); 132 const message = await OnboardingMessageProvider.getUpgradeMessage(); 133 134 // Pin Private screen is shown when user doesn't have Firefox private pinned but has Firefox pinned 135 Assert.ok( 136 getOnboardingScreenById( 137 message.content.screens, 138 "UPGRADE_PIN_PRIVATE_WINDOW" 139 ) 140 ); 141 sandbox.restore(); 142 } 143 ); 144 145 add_task( 146 async function test_OnboardingMessageProvider_getNoPinPrivateWindow_noPin() { 147 Services.prefs.setBoolPref("browser.shell.checkDefaultBrowser", true); 148 registerCleanupFunction(() => { 149 Services.prefs.clearUserPref("browser.shell.checkDefaultBrowser"); 150 }); 151 let sandbox = sinon.createSandbox(); 152 // User needs default to ensure Pin Private window shows as third screen after import 153 sandbox 154 .stub(OnboardingMessageProvider, "_doesAppNeedDefault") 155 .resolves(true); 156 157 let pinStub = sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin"); 158 pinStub.resolves(true); 159 const message = await OnboardingMessageProvider.getUpgradeMessage(); 160 161 // Pin Private screen is not shown when user doesn't have Firefox pinned 162 Assert.ok( 163 !getOnboardingScreenById( 164 message.content.screens, 165 "UPGRADE_PIN_PRIVATE_WINDOW" 166 ) 167 ); 168 sandbox.restore(); 169 } 170 ); 171 172 add_task(async function test_schemaValidation() { 173 const { experimentValidator, messageValidators } = await makeValidators(); 174 175 const messages = await OnboardingMessageProvider.getMessages(); 176 for (const message of messages) { 177 const validator = messageValidators[message.template]; 178 179 Assert.notStrictEqual( 180 typeof validator, 181 "undefined", 182 typeof validator !== "undefined" 183 ? `Schema validator found for ${message.template}.` 184 : `No schema validator found for template ${message.template}. Please update this test to add one.` 185 ); 186 assertValidates( 187 validator, 188 message, 189 `Message ${message.id} validates as template ${message.template}` 190 ); 191 assertValidates( 192 experimentValidator, 193 message, 194 `Message ${message.id} validates as MessagingExperiment` 195 ); 196 } 197 }); 198 199 add_task( 200 async function test_OnboardingMessageProvider_getPinPrivateWindow_pinPBMPrefDisabled() { 201 Services.prefs.setBoolPref( 202 "browser.startup.upgradeDialog.pinPBM.disabled", 203 true 204 ); 205 registerCleanupFunction(() => { 206 Services.prefs.clearUserPref( 207 "browser.startup.upgradeDialog.pinPBM.disabled" 208 ); 209 }); 210 let sandbox = sinon.createSandbox(); 211 // User needs default to ensure Pin Private window shows as third screen after import 212 sandbox 213 .stub(OnboardingMessageProvider, "_doesAppNeedDefault") 214 .resolves(true); 215 216 let pinStub = sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin"); 217 pinStub.resolves(true); 218 219 const message = await OnboardingMessageProvider.getUpgradeMessage(); 220 // Pin Private screen is not shown when pref is turned on 221 Assert.ok( 222 !getOnboardingScreenById( 223 message.content.screens, 224 "UPGRADE_PIN_PRIVATE_WINDOW" 225 ) 226 ); 227 sandbox.restore(); 228 } 229 );