You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
3.7 KiB
90 lines
3.7 KiB
import { describe, expect, it } from 'vitest' |
|
import { normalizePaypalAuthority, resolvePaypalPaymentUrl } from './payto-paypal-url' |
|
|
|
describe('resolvePaypalPaymentUrl', () => { |
|
it('maps paypal.com/paypalme slug to paypal.me', () => { |
|
expect(resolvePaypalPaymentUrl('https://www.paypal.com/paypalme/2rizmo%40gmail.com')).toBe( |
|
'https://paypal.me/2rizmo%40gmail.com' |
|
) |
|
}) |
|
|
|
it('resolves donate links with and without https', () => { |
|
const canonical = 'https://www.paypal.com/donate/?hosted_button_id=T32KCSU8EZTBL' |
|
expect(resolvePaypalPaymentUrl('https://www.paypal.com/donate/?hosted_button_id=T32KCSU8EZTBL')).toBe( |
|
canonical |
|
) |
|
expect(resolvePaypalPaymentUrl('www.paypal.com/donate/?hosted_button_id=T32KCSU8EZTBL')).toBe( |
|
canonical |
|
) |
|
expect(resolvePaypalPaymentUrl('paypal.com/donate/?hosted_button_id=T32KCSU8EZTBL')).toBe( |
|
canonical |
|
) |
|
}) |
|
|
|
it('maps legacy webscr hosted buttons to donate URLs', () => { |
|
expect( |
|
resolvePaypalPaymentUrl( |
|
'https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=T32KCSU8EZTBL' |
|
) |
|
).toBe('https://www.paypal.com/donate/?hosted_button_id=T32KCSU8EZTBL') |
|
}) |
|
|
|
it('unwraps YouTube redirect q= PayPal URL', () => { |
|
const yt = |
|
'https://www.youtube.com/redirect?event=channel_description&redir_token=abc&q=https%3A%2F%2Fwww.paypal.com%2Fdonate%2F%3Fhosted_button_id%3DT32KCSU8EZTBL' |
|
expect(resolvePaypalPaymentUrl(yt)).toBe( |
|
'https://www.paypal.com/donate/?hosted_button_id=T32KCSU8EZTBL' |
|
) |
|
}) |
|
|
|
it('builds paypal.me from bare username', () => { |
|
expect(resolvePaypalPaymentUrl('somecreator')).toBe('https://paypal.me/somecreator') |
|
expect(resolvePaypalPaymentUrl('https://www.paypal.com/paypalme/2rizmo@gmail.com')).toBe( |
|
'https://paypal.me/2rizmo%40gmail.com' |
|
) |
|
}) |
|
|
|
it('normalizes paypal.me path', () => { |
|
expect(resolvePaypalPaymentUrl('https://paypal.me/foo')).toBe('https://paypal.me/foo') |
|
}) |
|
|
|
it('handles www.paypal.me profile links', () => { |
|
expect(resolvePaypalPaymentUrl('https://www.paypal.me/user38910')).toBe('https://paypal.me/user38910') |
|
expect(resolvePaypalPaymentUrl('www.paypal.me/user38910')).toBe('https://paypal.me/user38910') |
|
}) |
|
|
|
it('unwraps payto://paypal/… authorities', () => { |
|
expect(resolvePaypalPaymentUrl('payto://paypal/https://www.paypal.me/user38910')).toBe( |
|
'https://paypal.me/user38910' |
|
) |
|
expect(resolvePaypalPaymentUrl('payto://paypal/user38910')).toBe('https://paypal.me/user38910') |
|
expect( |
|
resolvePaypalPaymentUrl('payto://paypal/www.paypal.com/donate/?hosted_button_id=ABC') |
|
).toBe('https://www.paypal.com/donate/?hosted_button_id=ABC') |
|
}) |
|
|
|
it('passes through pool and campaign donate URLs with https', () => { |
|
const pool = 'https://www.paypal.com/pools/c/abc123' |
|
expect(resolvePaypalPaymentUrl(pool)).toBe(pool) |
|
const campaign = 'https://www.paypal.com/donate/?campaign_id=foo' |
|
expect(resolvePaypalPaymentUrl(campaign)).toBe(campaign) |
|
}) |
|
}) |
|
|
|
describe('normalizePaypalAuthority', () => { |
|
it('extracts username from PayPal.Me URLs', () => { |
|
expect(normalizePaypalAuthority('https://www.paypal.me/user38910')).toBe('user38910') |
|
expect(normalizePaypalAuthority('user38910')).toBe('user38910') |
|
}) |
|
|
|
it('stores canonical donation URLs', () => { |
|
expect( |
|
normalizePaypalAuthority('www.paypal.com/donate/?hosted_button_id=T32KCSU8EZTBL') |
|
).toBe('https://www.paypal.com/donate/?hosted_button_id=T32KCSU8EZTBL') |
|
expect( |
|
normalizePaypalAuthority( |
|
'https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=T32KCSU8EZTBL' |
|
) |
|
).toBe('https://www.paypal.com/donate/?hosted_button_id=T32KCSU8EZTBL') |
|
}) |
|
})
|
|
|