const test = require('node:test'); const assert = require('node:assert/strict'); const fs = require('node:fs'); function loadStep14() { const source = fs.readFileSync('background/steps/fill-paypal-payment.js', 'utf8'); const scope = {}; new Function('self', `${source}; return self.MultiPageBackgroundStep14;`)(scope); return scope.MultiPageBackgroundStep14; } test('step 9 passes configured PayPal phone and sms api to content script', async () => { const api = loadStep14(); let sentMessage = null; const executor = api.createStep14Executor({ addLog: async () => {}, fetchCheckoutAddress: async () => ({ street: '1 Main St', city: 'New York', state: 'New York', zip: '10001', }), generateRandomEmail: () => 'checkout@example.com', sendToContentScriptResilient: async (_source, message) => { sentMessage = message; }, }); await executor.executeStep14({ paypalPhone: '+15822201173', paypalSmsApiUrl: 'http://a.62-us.com/api/get_sms?key=test', }); assert.equal(sentMessage.step, 9); assert.equal(sentMessage.payload.phone, '5822201173'); assert.equal(sentMessage.payload.paypalPhone, '+15822201173'); assert.equal(sentMessage.payload.paypalSmsApiUrl, 'http://a.62-us.com/api/get_sms?key=test'); const card = sentMessage.payload.card; assert.equal(card.Credit_Card_Type, 'Visa'); assert.match(card.Credit_Card_Number, /^4\d{15}$/); assert.equal(isLuhnValid(card.Credit_Card_Number), true); assert.match(card.Expires, /^(0[1-9]|1[0-2])\/\d{2}$/); assert.match(card.CVV2, /^\d{3}$/); }); function isLuhnValid(value) { let sum = 0; let shouldDouble = false; for (let index = String(value).length - 1; index >= 0; index -= 1) { let digit = Number(value[index]); if (!Number.isInteger(digit)) return false; if (shouldDouble) { digit *= 2; if (digit > 9) digit -= 9; } sum += digit; shouldDouble = !shouldDouble; } return sum % 10 === 0; }