Files
lnbits/tests/integration/006_watchonly-satspay-tipjar.spec.js
2026-07-16 10:40:28 +03:00

234 lines
6.3 KiB
JavaScript

const {
test,
expect,
setupIntegration,
apiKeyHeaders,
clearMirror,
getPayments,
jsonRequest,
mirrorUrl,
pageStatus,
pollWalletBalance,
newUserWithUi,
getAdminSession,
payInvoiceViaUi,
ensureExtensionsInstalledViaUi,
enableExtensionViaUi
} = require('./scenario-helpers')
setupIntegration()
test('006 watchonly, satspay, and tipjar scenario', async ({browser}) => {
test.setTimeout(7 * 60 * 1000)
await clearMirror()
const admin = await getAdminSession(browser)
await ensureExtensionsInstalledViaUi(admin, [
'watchonly',
'satspay',
'tipjar'
])
const user = await newUserWithUi(browser, 'watchonly-satspay-tipjar')
await enableExtensionViaUi(user, 'watchonly')
await pageStatus(user.context, `/watchonly/?usr=${user.userId}`)
await jsonRequest(user.context, 'get', '/watchonly/api/v1/config', {
headers: apiKeyHeaders(user.inkey)
})
await jsonRequest(user.context, 'get', '/watchonly/api/v1/wallet', {
headers: apiKeyHeaders(user.inkey),
params: {network: 'Mainnet'}
})
const onchain = await jsonRequest(
user.context,
'post',
'/watchonly/api/v1/wallet',
{
headers: apiKeyHeaders(user.adminkey),
data: {
title: 'segwit',
masterpub:
'zpub6rsRjqj6BTbD9DjqrY4p14tUx5kdA8ZGCTJD99wZTxD5wfvCkyXKrK3s7M3B1eFN6NbRhmbDDRDC8LF3Bn5gmxxN9rF8mDpZsGC6isGrK1g',
network: 'Mainnet',
meta: '{"accountPath":"m/84\'/0\'/0\'"}'
},
expected: [200, 201]
}
)
expect(onchain.id).toBeTruthy()
await jsonRequest(
user.context,
'get',
`/watchonly/api/v1/addresses/${onchain.id}`,
{
headers: apiKeyHeaders(user.inkey)
}
)
await jsonRequest(
user.context,
'get',
`/watchonly/api/v1/address/${onchain.id}`,
{
headers: apiKeyHeaders(user.inkey)
}
)
await enableExtensionViaUi(user, 'satspay')
await pageStatus(user.context, '/satspay/')
await jsonRequest(user.context, 'get', '/satspay/api/v1/charges', {
headers: apiKeyHeaders(user.adminkey)
})
const onchainCharge = await jsonRequest(
user.context,
'post',
'/satspay/api/v1/charge',
{
headers: apiKeyHeaders(user.adminkey),
data: {
onchain: true,
onchainwallet: onchain.id,
lnbits: false,
description: 'Onchain Charge',
time: 1111,
amount: 1111,
lnbitswallet: null
},
expected: [200, 201]
}
)
expect(onchainCharge.id).toBeTruthy()
await jsonRequest(user.context, 'post', '/satspay/api/v1/charge', {
headers: apiKeyHeaders(user.adminkey),
data: {
onchain: false,
onchainwallet: null,
lnbits: true,
description: 'lightning charge - to expire',
time: 1,
amount: 10,
lnbitswallet: user.walletId,
webhook: 'https://google.com',
completelink: 'https://twitter.com',
completelinktext: 'Have Fun'
},
expected: [200, 201]
})
let expectedBalanceSats = 0
for (let index = 1; index <= 5; index++) {
const amount = 9 + index
const charge = await jsonRequest(
user.context,
'post',
'/satspay/api/v1/charge',
{
headers: apiKeyHeaders(user.adminkey),
data: {
onchain: false,
onchainwallet: null,
lnbits: true,
description: `lightning charge [${index}]`,
time: 1220,
amount,
lnbitswallet: user.walletId,
webhook: mirrorUrl(),
completelink: 'https://twitter.com',
completelinktext: 'Have Fun'
},
expected: [200, 201]
}
)
expect(charge.payment_request).toBeTruthy()
await pageStatus(user.context, `/satspay/${charge.id}`)
await jsonRequest(
user.context,
'get',
`/satspay/api/v1/charge/balance/${charge.id}`,
{
headers: apiKeyHeaders(user.inkey)
}
)
await payInvoiceViaUi(admin, charge.payment_request)
await expect
.poll(async () => {
const updatedCharge = await jsonRequest(
user.context,
'get',
`/satspay/api/v1/charge/${charge.id}`,
{
headers: apiKeyHeaders(user.inkey)
}
)
return Boolean(updatedCharge.paid || updatedCharge.lnbitswallet)
})
.toBeTruthy()
expectedBalanceSats += amount
}
await pollWalletBalance(user.context, user.inkey, expectedBalanceSats * 1000)
const charges = await jsonRequest(
user.context,
'get',
'/satspay/api/v1/charges',
{
headers: apiKeyHeaders(user.adminkey)
}
)
expect(charges.length).toBeGreaterThanOrEqual(7)
const payments = await getPayments(user.context, user.inkey)
expect(payments.length).toBeGreaterThanOrEqual(6)
await enableExtensionViaUi(user, 'tipjar')
await pageStatus(user.context, `/tipjar/?usr=${user.userId}`)
await jsonRequest(user.context, 'get', '/tipjar/api/v1/tipjars', {
headers: apiKeyHeaders(user.inkey)
})
const tipjar = await jsonRequest(
user.context,
'post',
'/tipjar/api/v1/tipjars',
{
headers: apiKeyHeaders(user.adminkey),
data: {wallet: user.walletId, name: 'Nakamoto', webhook: mirrorUrl()},
expected: [200, 201]
}
)
expect(tipjar.id).toBeTruthy()
await pageStatus(user.context, `/tipjar/${tipjar.id}`)
for (let index = 1; index <= 5; index++) {
const tip = await jsonRequest(user.context, 'post', '/tipjar/api/v1/tips', {
headers: apiKeyHeaders(user.adminkey),
data: {
tipjar: tipjar.id,
name: 'Hal',
sats: 21,
message: `Let's go ...${index}!`
},
expected: [200, 201]
})
expect(tip.redirect_url).toBeTruthy()
const tipChargeId = tip.redirect_url.split('/').filter(Boolean).at(-1)
const charge = await jsonRequest(
user.context,
'get',
`/satspay/api/v1/charge/${tipChargeId}`,
{
headers: apiKeyHeaders(user.inkey)
}
)
expect(charge.description).toBe(`Let's go ...${index}!`)
const tips = await jsonRequest(user.context, 'get', '/tipjar/api/v1/tips', {
headers: apiKeyHeaders(user.inkey)
})
expect(tips.length).toBe(index)
await payInvoiceViaUi(admin, tip.payment_request || charge.payment_request)
expectedBalanceSats += 21
await pollWalletBalance(
user.context,
user.inkey,
expectedBalanceSats * 1000
)
}
})