fix: finalize HeroSMS reuse after full flow success
This commit is contained in:
@@ -114,6 +114,12 @@ let currentState = {
|
||||
inbucketMailbox: '',
|
||||
cloudflareDomain: '',
|
||||
cloudflareDomains: [],
|
||||
reusablePhoneActivation: {
|
||||
activationId: '123456',
|
||||
phoneNumber: '66959916439',
|
||||
successfulUses: 1,
|
||||
maxUses: 3,
|
||||
},
|
||||
tabRegistry: {},
|
||||
sourceLastUrls: {},
|
||||
};
|
||||
@@ -329,6 +335,16 @@ return {
|
||||
assert.strictEqual(snapshot.currentState.autoRunSessionId, 0, 'session id should be cleared after completion');
|
||||
assert.strictEqual(snapshot.currentState.gmailBaseEmail, 'demo@gmail.com', 'gmail base email should survive fresh-attempt reset');
|
||||
assert.strictEqual(snapshot.currentState.mail2925BaseEmail, 'demo@2925.com', '2925 base email should survive fresh-attempt reset');
|
||||
assert.deepStrictEqual(
|
||||
snapshot.currentState.reusablePhoneActivation,
|
||||
{
|
||||
activationId: '123456',
|
||||
phoneNumber: '66959916439',
|
||||
successfulUses: 1,
|
||||
maxUses: 3,
|
||||
},
|
||||
'reusable phone activation should survive fresh-attempt reset'
|
||||
);
|
||||
|
||||
console.log('auto-run fresh attempt reset tests passed');
|
||||
})().catch((error) => {
|
||||
|
||||
@@ -713,6 +713,7 @@ function broadcastDataUpdate() {}
|
||||
function isLocalhostOAuthCallbackUrl() {
|
||||
return true;
|
||||
}
|
||||
async function finalizePhoneActivationAfterSuccessfulFlow() {}
|
||||
async function finalizeIcloudAliasAfterSuccessfulFlow() {}
|
||||
|
||||
${bundle}
|
||||
|
||||
@@ -12,6 +12,7 @@ function createRouter(overrides = {}) {
|
||||
stepStatuses: [],
|
||||
emailStates: [],
|
||||
finalizePayloads: [],
|
||||
phoneFinalizations: [],
|
||||
notifyCompletions: [],
|
||||
notifyErrors: [],
|
||||
securityBlocks: [],
|
||||
@@ -49,6 +50,9 @@ function createRouter(overrides = {}) {
|
||||
executeStepViaCompletionSignal: async () => {},
|
||||
exportSettingsBundle: async () => ({}),
|
||||
fetchGeneratedEmail: async () => '',
|
||||
finalizePhoneActivationAfterSuccessfulFlow: overrides.finalizePhoneActivationAfterSuccessfulFlow || (async (state) => {
|
||||
events.phoneFinalizations.push(state);
|
||||
}),
|
||||
finalizeStep3Completion: overrides.finalizeStep3Completion || (async (payload) => {
|
||||
events.finalizePayloads.push(payload);
|
||||
}),
|
||||
@@ -262,6 +266,34 @@ test('message router finalizes step 3 before marking it completed', async () =>
|
||||
assert.deepStrictEqual(response, { ok: true });
|
||||
});
|
||||
|
||||
test('message router finalizes pending phone activation on platform verify success', async () => {
|
||||
const state = {
|
||||
stepStatuses: { 10: 'pending' },
|
||||
reusablePhoneActivation: {
|
||||
activationId: '123456',
|
||||
phoneNumber: '66959916439',
|
||||
successfulUses: 0,
|
||||
maxUses: 3,
|
||||
},
|
||||
pendingPhoneActivationConfirmation: {
|
||||
activationId: '123456',
|
||||
phoneNumber: '66959916439',
|
||||
successfulUses: 0,
|
||||
maxUses: 3,
|
||||
},
|
||||
};
|
||||
const { router, events } = createRouter({
|
||||
state,
|
||||
getStepDefinitionForState: (step) => ({ id: step, key: step === 10 ? 'platform-verify' : '' }),
|
||||
});
|
||||
|
||||
await router.handleStepData(10, {
|
||||
localhostUrl: 'http://localhost:1455/auth/callback?code=ok',
|
||||
});
|
||||
|
||||
assert.deepStrictEqual(events.phoneFinalizations, [state]);
|
||||
});
|
||||
|
||||
test('message router marks step 3 failed when post-submit finalize fails', async () => {
|
||||
const { router, events } = createRouter({
|
||||
finalizeStep3Completion: async () => {
|
||||
|
||||
@@ -260,18 +260,6 @@ test('phone verification helper uses HeroSMS getStatusV2 after acquiring a numbe
|
||||
statusAction: 'getStatusV2',
|
||||
},
|
||||
},
|
||||
{
|
||||
currentPhoneActivation: {
|
||||
activationId: '654321',
|
||||
phoneNumber: '447911123456',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 16,
|
||||
successfulUses: 1,
|
||||
maxUses: 3,
|
||||
statusAction: 'getStatusV2',
|
||||
},
|
||||
},
|
||||
{
|
||||
reusablePhoneActivation: {
|
||||
activationId: '654321',
|
||||
@@ -279,7 +267,19 @@ test('phone verification helper uses HeroSMS getStatusV2 after acquiring a numbe
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 16,
|
||||
successfulUses: 1,
|
||||
successfulUses: 0,
|
||||
maxUses: 3,
|
||||
statusAction: 'getStatusV2',
|
||||
},
|
||||
},
|
||||
{
|
||||
pendingPhoneActivationConfirmation: {
|
||||
activationId: '654321',
|
||||
phoneNumber: '447911123456',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 16,
|
||||
successfulUses: 0,
|
||||
maxUses: 3,
|
||||
statusAction: 'getStatusV2',
|
||||
},
|
||||
@@ -413,17 +413,6 @@ test('phone verification helper completes add-phone flow, clears current activat
|
||||
maxUses: 3,
|
||||
},
|
||||
},
|
||||
{
|
||||
currentPhoneActivation: {
|
||||
activationId: '123456',
|
||||
phoneNumber: '66959916439',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 52,
|
||||
successfulUses: 1,
|
||||
maxUses: 3,
|
||||
},
|
||||
},
|
||||
{
|
||||
reusablePhoneActivation: {
|
||||
activationId: '123456',
|
||||
@@ -431,7 +420,18 @@ test('phone verification helper completes add-phone flow, clears current activat
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 52,
|
||||
successfulUses: 1,
|
||||
successfulUses: 0,
|
||||
maxUses: 3,
|
||||
},
|
||||
},
|
||||
{
|
||||
pendingPhoneActivationConfirmation: {
|
||||
activationId: '123456',
|
||||
phoneNumber: '66959916439',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 52,
|
||||
successfulUses: 0,
|
||||
maxUses: 3,
|
||||
},
|
||||
},
|
||||
@@ -519,6 +519,7 @@ test('phone verification helper still succeeds when HeroSMS setStatus(3) fails a
|
||||
});
|
||||
assert.deepStrictEqual(currentState.currentPhoneActivation, null);
|
||||
assert.deepStrictEqual(currentState.reusablePhoneActivation, null);
|
||||
assert.deepStrictEqual(currentState.pendingPhoneActivationConfirmation, null);
|
||||
const actions = requests.map((url) => url.searchParams.get('action'));
|
||||
assert.deepStrictEqual(actions, ['getNumber', 'getStatus', 'setStatus']);
|
||||
});
|
||||
@@ -843,12 +844,21 @@ test('phone verification helper replaces the number when code submission returns
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 52,
|
||||
successfulUses: 1,
|
||||
successfulUses: 0,
|
||||
maxUses: 3,
|
||||
});
|
||||
assert.deepStrictEqual(currentState.pendingPhoneActivationConfirmation, {
|
||||
activationId: '222222',
|
||||
phoneNumber: '66950000002',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 52,
|
||||
successfulUses: 0,
|
||||
maxUses: 3,
|
||||
});
|
||||
});
|
||||
|
||||
test('phone verification helper reuses the same number up to three successful registrations', async () => {
|
||||
test('phone verification helper defers maxUses accounting for reused activations until the full flow succeeds', async () => {
|
||||
const requests = [];
|
||||
let currentState = {
|
||||
heroSmsApiKey: 'demo-key',
|
||||
@@ -934,10 +944,27 @@ test('phone verification helper reuses the same number up to three successful re
|
||||
});
|
||||
assert.equal(requests[0].searchParams.get('action'), 'reactivate');
|
||||
assert.equal(requests[0].searchParams.get('id'), '123456');
|
||||
assert.deepStrictEqual(currentState.reusablePhoneActivation, null);
|
||||
assert.deepStrictEqual(currentState.reusablePhoneActivation, {
|
||||
activationId: '222333',
|
||||
phoneNumber: '66959916439',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 52,
|
||||
successfulUses: 2,
|
||||
maxUses: 3,
|
||||
});
|
||||
assert.deepStrictEqual(currentState.pendingPhoneActivationConfirmation, {
|
||||
activationId: '222333',
|
||||
phoneNumber: '66959916439',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 52,
|
||||
successfulUses: 2,
|
||||
maxUses: 3,
|
||||
});
|
||||
});
|
||||
|
||||
test('phone verification helper keeps maxUses behavior for reused V2 activations', async () => {
|
||||
test('phone verification helper defers maxUses accounting for reused V2 activations until the full flow succeeds', async () => {
|
||||
const requests = [];
|
||||
let currentState = {
|
||||
heroSmsApiKey: 'demo-key',
|
||||
@@ -1026,5 +1053,131 @@ test('phone verification helper keeps maxUses behavior for reused V2 activations
|
||||
});
|
||||
const actions = requests.map((url) => url.searchParams.get('action'));
|
||||
assert.deepStrictEqual(actions, ['reactivate', 'getStatusV2', 'setStatus']);
|
||||
assert.deepStrictEqual(currentState.reusablePhoneActivation, null);
|
||||
assert.deepStrictEqual(currentState.reusablePhoneActivation, {
|
||||
activationId: '222333',
|
||||
phoneNumber: '447911123456',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 16,
|
||||
successfulUses: 2,
|
||||
maxUses: 3,
|
||||
statusAction: 'getStatusV2',
|
||||
});
|
||||
assert.deepStrictEqual(currentState.pendingPhoneActivationConfirmation, {
|
||||
activationId: '222333',
|
||||
phoneNumber: '447911123456',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 16,
|
||||
successfulUses: 2,
|
||||
maxUses: 3,
|
||||
statusAction: 'getStatusV2',
|
||||
});
|
||||
});
|
||||
|
||||
test('phone verification helper finalizes pending phone activation confirmation after the full flow succeeds', async () => {
|
||||
let currentState = {
|
||||
reusablePhoneActivation: {
|
||||
activationId: '123456',
|
||||
phoneNumber: '66959916439',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 52,
|
||||
successfulUses: 0,
|
||||
maxUses: 3,
|
||||
},
|
||||
pendingPhoneActivationConfirmation: {
|
||||
activationId: '123456',
|
||||
phoneNumber: '66959916439',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 52,
|
||||
successfulUses: 0,
|
||||
maxUses: 3,
|
||||
},
|
||||
};
|
||||
|
||||
const helpers = api.createPhoneVerificationHelpers({
|
||||
addLog: async () => {},
|
||||
getState: async () => ({ ...currentState }),
|
||||
sendToContentScriptResilient: async () => ({}),
|
||||
setState: async (updates) => {
|
||||
currentState = { ...currentState, ...updates };
|
||||
},
|
||||
sleepWithStop: async () => {},
|
||||
throwIfStopped: () => {},
|
||||
});
|
||||
|
||||
const committedActivation = await helpers.finalizePendingPhoneActivationConfirmation();
|
||||
|
||||
assert.deepStrictEqual(committedActivation, {
|
||||
activationId: '123456',
|
||||
phoneNumber: '66959916439',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 52,
|
||||
successfulUses: 1,
|
||||
maxUses: 3,
|
||||
});
|
||||
assert.deepStrictEqual(currentState.reusablePhoneActivation, {
|
||||
activationId: '123456',
|
||||
phoneNumber: '66959916439',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 52,
|
||||
successfulUses: 1,
|
||||
maxUses: 3,
|
||||
});
|
||||
assert.equal(currentState.pendingPhoneActivationConfirmation, null);
|
||||
});
|
||||
|
||||
test('phone verification helper clears reusable activation when final success exhausts maxUses', async () => {
|
||||
let currentState = {
|
||||
reusablePhoneActivation: {
|
||||
activationId: '222333',
|
||||
phoneNumber: '447911123456',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 16,
|
||||
successfulUses: 2,
|
||||
maxUses: 3,
|
||||
statusAction: 'getStatusV2',
|
||||
},
|
||||
pendingPhoneActivationConfirmation: {
|
||||
activationId: '222333',
|
||||
phoneNumber: '447911123456',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 16,
|
||||
successfulUses: 2,
|
||||
maxUses: 3,
|
||||
statusAction: 'getStatusV2',
|
||||
},
|
||||
};
|
||||
|
||||
const helpers = api.createPhoneVerificationHelpers({
|
||||
addLog: async () => {},
|
||||
getState: async () => ({ ...currentState }),
|
||||
sendToContentScriptResilient: async () => ({}),
|
||||
setState: async (updates) => {
|
||||
currentState = { ...currentState, ...updates };
|
||||
},
|
||||
sleepWithStop: async () => {},
|
||||
throwIfStopped: () => {},
|
||||
});
|
||||
|
||||
const committedActivation = await helpers.finalizePendingPhoneActivationConfirmation();
|
||||
|
||||
assert.deepStrictEqual(committedActivation, {
|
||||
activationId: '222333',
|
||||
phoneNumber: '447911123456',
|
||||
provider: 'hero-sms',
|
||||
serviceCode: 'dr',
|
||||
countryId: 16,
|
||||
successfulUses: 3,
|
||||
maxUses: 3,
|
||||
statusAction: 'getStatusV2',
|
||||
});
|
||||
assert.equal(currentState.reusablePhoneActivation, null);
|
||||
assert.equal(currentState.pendingPhoneActivationConfirmation, null);
|
||||
});
|
||||
|
||||
@@ -114,6 +114,7 @@ function broadcastDataUpdate() {}
|
||||
async function addLog(message) {
|
||||
logMessages.push(message);
|
||||
}
|
||||
async function finalizePhoneActivationAfterSuccessfulFlow() {}
|
||||
async function finalizeIcloudAliasAfterSuccessfulFlow() {}
|
||||
function matchesSourceUrlFamily() {
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user