fix: 兼容中文 add-phone 页的国家匹配
This commit is contained in:
@@ -0,0 +1,201 @@
|
||||
const test = require('node:test');
|
||||
const assert = require('node:assert/strict');
|
||||
const fs = require('node:fs');
|
||||
|
||||
const source = fs.readFileSync('content/phone-auth.js', 'utf8');
|
||||
const globalScope = { navigator: { language: 'zh-CN' } };
|
||||
const api = new Function('self', `${source}; return self.MultiPagePhoneAuth;`)(globalScope);
|
||||
|
||||
function createFakeAddPhoneDom() {
|
||||
const selectEvents = [];
|
||||
const hiddenInputEvents = [];
|
||||
let submitClicked = false;
|
||||
|
||||
const options = [
|
||||
{ value: 'US', textContent: '美国' },
|
||||
{ value: 'TH', textContent: '泰国' },
|
||||
];
|
||||
|
||||
const select = {
|
||||
options,
|
||||
selectedIndex: 0,
|
||||
dispatchEvent(event) {
|
||||
selectEvents.push(event?.type || '');
|
||||
return true;
|
||||
},
|
||||
};
|
||||
|
||||
Object.defineProperty(select, 'value', {
|
||||
get() {
|
||||
return options[select.selectedIndex]?.value || '';
|
||||
},
|
||||
set(nextValue) {
|
||||
const nextIndex = options.findIndex((option) => option.value === String(nextValue || ''));
|
||||
if (nextIndex >= 0) {
|
||||
select.selectedIndex = nextIndex;
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const phoneInput = {
|
||||
value: '',
|
||||
type: 'tel',
|
||||
dispatchEvent() {
|
||||
return true;
|
||||
},
|
||||
closest() {
|
||||
return null;
|
||||
},
|
||||
};
|
||||
|
||||
const hiddenPhoneInput = {
|
||||
value: '',
|
||||
dispatchEvent(event) {
|
||||
hiddenInputEvents.push(event?.type || '');
|
||||
return true;
|
||||
},
|
||||
};
|
||||
|
||||
const selectValueNode = {
|
||||
get textContent() {
|
||||
return select.value === 'TH' ? '泰国 (+66)' : '美国 (+1)';
|
||||
},
|
||||
};
|
||||
|
||||
const countryButton = {
|
||||
querySelector(selector) {
|
||||
return selector === '.react-aria-SelectValue' ? selectValueNode : null;
|
||||
},
|
||||
get textContent() {
|
||||
return selectValueNode.textContent;
|
||||
},
|
||||
};
|
||||
|
||||
const submitButton = {
|
||||
type: 'submit',
|
||||
click() {
|
||||
submitClicked = true;
|
||||
},
|
||||
};
|
||||
|
||||
const form = {
|
||||
querySelector(selector) {
|
||||
switch (selector) {
|
||||
case 'select':
|
||||
return select;
|
||||
case 'input[type="tel"], input[name="__reservedForPhoneNumberInput_tel"], input[autocomplete="tel"]':
|
||||
return phoneInput;
|
||||
case 'input[name="phoneNumber"]':
|
||||
return hiddenPhoneInput;
|
||||
case 'button[aria-haspopup="listbox"]':
|
||||
return countryButton;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
},
|
||||
querySelectorAll(selector) {
|
||||
if (selector === 'button[type="submit"], input[type="submit"]') {
|
||||
return [submitButton];
|
||||
}
|
||||
return [];
|
||||
},
|
||||
};
|
||||
|
||||
const document = {
|
||||
documentElement: {
|
||||
lang: 'zh-CN',
|
||||
getAttribute(name) {
|
||||
return name === 'lang' ? 'zh-CN' : '';
|
||||
},
|
||||
},
|
||||
querySelector(selector) {
|
||||
if (selector === 'form[action*="/add-phone" i]') {
|
||||
return form;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
};
|
||||
|
||||
return {
|
||||
document,
|
||||
hiddenInputEvents,
|
||||
hiddenPhoneInput,
|
||||
phoneInput,
|
||||
select,
|
||||
selectEvents,
|
||||
submitButton,
|
||||
wasSubmitClicked: () => submitClicked,
|
||||
};
|
||||
}
|
||||
|
||||
test('phone auth matches english HeroSMS country labels against localized add-phone options', async () => {
|
||||
const originalDocument = global.document;
|
||||
const originalEvent = global.Event;
|
||||
const originalLocation = global.location;
|
||||
const OriginalDisplayNames = Intl.DisplayNames;
|
||||
|
||||
const dom = createFakeAddPhoneDom();
|
||||
let phoneVerificationReady = false;
|
||||
|
||||
global.document = dom.document;
|
||||
global.Event = class Event {
|
||||
constructor(type) {
|
||||
this.type = type;
|
||||
}
|
||||
};
|
||||
global.location = { href: 'https://auth.openai.com/add-phone' };
|
||||
Intl.DisplayNames = class DisplayNames {
|
||||
of(regionCode) {
|
||||
if (regionCode === 'TH') return 'Thailand';
|
||||
if (regionCode === 'US') return 'United States';
|
||||
return regionCode;
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
const helpers = api.createPhoneAuthHelpers({
|
||||
fillInput: (element, value) => {
|
||||
element.value = value;
|
||||
},
|
||||
getActionText: () => '',
|
||||
getPageTextSnapshot: () => '',
|
||||
getVerificationErrorText: () => '',
|
||||
humanPause: async () => {},
|
||||
isActionEnabled: () => true,
|
||||
isAddPhonePageReady: () => true,
|
||||
isConsentReady: () => false,
|
||||
isPhoneVerificationPageReady: () => phoneVerificationReady,
|
||||
isVisibleElement: () => true,
|
||||
simulateClick: (element) => {
|
||||
element.click?.();
|
||||
phoneVerificationReady = true;
|
||||
global.location.href = 'https://auth.openai.com/phone-verification';
|
||||
},
|
||||
sleep: async () => {},
|
||||
throwIfStopped: () => {},
|
||||
waitForElement: async () => null,
|
||||
});
|
||||
|
||||
const result = await helpers.submitPhoneNumber({
|
||||
countryLabel: 'Thailand',
|
||||
phoneNumber: '66959916439',
|
||||
});
|
||||
|
||||
assert.equal(dom.select.value, 'TH');
|
||||
assert.deepStrictEqual(dom.selectEvents, ['input', 'change']);
|
||||
assert.equal(dom.phoneInput.value, '959916439');
|
||||
assert.equal(dom.hiddenPhoneInput.value, '+66959916439');
|
||||
assert.deepStrictEqual(dom.hiddenInputEvents, ['input', 'change']);
|
||||
assert.equal(dom.wasSubmitClicked(), true);
|
||||
assert.deepStrictEqual(result, {
|
||||
phoneVerificationPage: true,
|
||||
displayedPhone: '',
|
||||
url: 'https://auth.openai.com/phone-verification',
|
||||
});
|
||||
} finally {
|
||||
global.document = originalDocument;
|
||||
global.Event = originalEvent;
|
||||
global.location = originalLocation;
|
||||
Intl.DisplayNames = OriginalDisplayNames;
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user