import { transactionFeeFor, cappedFee, DEFAULT_TRANSACTION_FEE } from './transaction-fee'; const tenant = (countryPack: string, settings: any = {}) => ({ countryPack, settings }) as any; describe('transactionFeeFor — رسم العملية (docs/24 §3.3)', () => { it('يطبّق افتراض الدولة حين لا إعداد', () => { expect(transactionFeeFor(tenant('sy'))).toEqual({ fee: 35, currency: 'SYP' }); expect(transactionFeeFor(tenant('eg'))).toEqual({ fee: 5, currency: 'EGP' }); expect(transactionFeeFor(tenant('jo'))).toEqual({ fee: 0.2, currency: 'JOD' }); }); it('إعداد المستأجر يتقدّم على افتراض دولته', () => { const t = tenant('sy', { payments: { transaction_fee: 50 } }); expect(transactionFeeFor(t).fee).toBe(50); }); it('رسم صفر إعدادٌ صالح — لا يعود إلى افتراض الدولة', () => { // الفخّ: `configured || byCountry` كان سيبتلع الصفر ويقتطع 35 من مستأجر // اتّفقنا معه على ألّا رسوم عليه. const t = tenant('sy', { payments: { transaction_fee: 0 } }); expect(transactionFeeFor(t).fee).toBe(0); }); it('يتجاهل الإعداد غير الصالح ويعود للافتراض', () => { expect(transactionFeeFor(tenant('jo', { payments: { transaction_fee: 'كثير' } })).fee).toBe(0.2); expect(transactionFeeFor(tenant('jo', { payments: { transaction_fee: -5 } })).fee).toBe(0.2); }); it('دولة غير معروفة = بلا رسم، لا رقم مخمَّن', () => { expect(transactionFeeFor(tenant('xx')).fee).toBe(0); }); it('الرقم مصدره واحد — لا يُكتب في منطق الأعمال (درس سيرو)', () => { expect(DEFAULT_TRANSACTION_FEE.sy.fee).toBe(35); }); }); describe('cappedFee — الرسم لا يبتلع المبلغ', () => { it('يقصّ الرسم عند مبلغ أصغر منه', () => { // شحن 20 ل.س ورسمه 35: بلا القصّ يخرج المستخدم بصافٍ سالب. expect(cappedFee(35, 20)).toBe(20); }); it('يمرّ الرسم كاملاً حين المبلغ أكبر', () => { expect(cappedFee(35, 1000)).toBe(35); }); it('بلا رسم يعيد صفراً', () => { expect(cappedFee(0, 100)).toBe(0); }); });