202 lines
5.2 KiB
JavaScript
202 lines
5.2 KiB
JavaScript
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;
|
|
}
|
|
});
|