Files
lnbits/tests/integration/011_auction_house.spec.js
T
2026-07-16 10:40:28 +03:00

268 lines
6.9 KiB
JavaScript

const {
test,
expect,
setupIntegration,
state,
apiKeyHeaders,
getPayments,
jsonRequest,
newUser,
newUserWithUi,
getAdminSession,
payInvoiceViaUi,
ensureExtensionsInstalledViaUi,
enableExtensionViaUi,
createNip5Domain,
createUserNip5Address,
activateNip5Address,
createAuctionRoom,
updateAuctionRoom,
createAuctionItem,
bidOnItem,
auctionNip5Webhooks
} = require('./scenario-helpers')
setupIntegration()
test('011 auction house transfers NIP5 addresses through bids and fixed-price sale', async ({
browser
}) => {
test.setTimeout(10 * 60 * 1000)
const admin = await getAdminSession(browser)
await ensureExtensionsInstalledViaUi(admin, [
'auction_house',
'nostrnip5',
'lnurlp'
])
await enableExtensionViaUi(admin, 'nostrnip5')
await enableExtensionViaUi(admin, 'lnurlp')
await jsonRequest(state.adminContext, 'put', '/nostrnip5/api/v1/settings', {
headers: apiKeyHeaders(state.adminWallet.adminkey),
data: {
lnaddress_api_endpoint: state.baseURL,
lnaddress_api_admin_key: state.adminWallet.adminkey
}
})
const owner = await newUserWithUi(browser, 'auction-owner')
await enableExtensionViaUi(owner, 'auction_house')
await enableExtensionViaUi(owner, 'nostrnip5')
await enableExtensionViaUi(owner, 'lnurlp')
const domain = await createNip5Domain(owner.context, owner, {
cost_extra: {transfer_secret: '1234'}
})
const domainId = domain.id
await jsonRequest(owner.context, 'put', '/nostrnip5/api/v1/settings', {
headers: apiKeyHeaders(owner.adminkey),
data: {
lnaddress_api_endpoint: state.baseURL,
lnaddress_api_admin_key: state.adminWallet.adminkey
}
})
const seller = await newUserWithUi(browser, 'auction-seller')
await enableExtensionViaUi(seller, 'auction_house')
await enableExtensionViaUi(seller, 'nostrnip5')
const createdAddresses = []
for (let index = 1; index <= 10; index++) {
const address = await createUserNip5Address(
seller.context,
seller,
domainId,
`id_${index}__${domainId}`
)
await activateNip5Address(owner.context, owner, domainId, address.id)
createdAddresses.push(address)
}
const sellRoom = await createAuctionRoom(owner.context, owner, {
name: 'nip5 sales',
description: 'Auctions for Nip5',
fee_wallet_id: owner.walletId,
currency: 'USD',
type: 'fixed_price'
})
await updateAuctionRoom(owner.context, owner, {
id: sellRoom.id,
name: 'nip5 sells',
description: 'Sells for Nip5',
currency: 'sat',
type: 'fixed_price',
room_percentage: 20,
fee_wallet_id: owner.walletId,
is_open_room: true,
extra: auctionNip5Webhooks(domainId)
})
const auctionRoom = await createAuctionRoom(owner.context, owner, {
name: 'nip5 auctions',
description: 'Auctions for Nip5',
fee_wallet_id: owner.walletId,
currency: 'USD',
type: 'auction'
})
await updateAuctionRoom(owner.context, owner, {
id: auctionRoom.id,
name: 'nip5 auctions',
description: 'Auctions for Nip5',
currency: 'sat',
type: 'auction',
min_bid_up_percentage: 5,
room_percentage: 10,
fee_wallet_id: owner.walletId,
is_open_room: true,
extra: auctionNip5Webhooks(domainId)
})
const sellerAddresses = await jsonRequest(
seller.context,
'get',
'/nostrnip5/api/v1/user/addresses',
{
headers: apiKeyHeaders(seller.inkey),
params: {active: true}
}
)
expect(Array.isArray(sellerAddresses)).toBeTruthy()
const addressForAuction = createdAddresses[0]
const transfer = await jsonRequest(
seller.context,
'get',
`/nostrnip5/api/v1/domain/${domainId}/address/${addressForAuction.id}/transfer`,
{headers: apiKeyHeaders(seller.adminkey)}
)
expect(transfer.transfer_code).toBeTruthy()
const item = await createAuctionItem(seller.context, seller, auctionRoom.id, {
name: addressForAuction.local_part,
ask_price: 10.1,
transfer_code: transfer.transfer_code
})
let winningBidder
for (let index = 1; index <= 15; index++) {
const bidder = await newUser(`auction-bidder-${index}`)
const bid = await bidOnItem(
bidder.context,
bidder,
item.id,
index * 100,
`bid index: ${index}`
)
await payInvoiceViaUi(admin, bid.payment_request)
winningBidder = bidder
}
await expect
.poll(
async () => {
const bids = await jsonRequest(
owner.context,
'get',
`/auction_house/api/v1/bids/${item.id}/paginated`,
{
headers: apiKeyHeaders(owner.inkey),
params: {limit: 20}
}
)
return bids.total
},
{timeout: 15_000}
)
.toBeGreaterThanOrEqual(15)
await getPayments(owner.context, owner.inkey)
await jsonRequest(
owner.context,
'delete',
`/auction_house/api/v1/items/${item.id}`,
{
headers: apiKeyHeaders(owner.adminkey),
params: {force_close: true}
}
)
const winnerAddresses = await jsonRequest(
winningBidder.context,
'get',
'/nostrnip5/api/v1/user/addresses',
{
headers: apiKeyHeaders(winningBidder.inkey),
params: {active: true}
}
)
expect(JSON.stringify(winnerAddresses)).toContain(
addressForAuction.local_part
)
const fixedPriceAddress = createdAddresses[1]
const fixedItems = await jsonRequest(
seller.context,
'get',
`/auction_house/api/v1/items/${auctionRoom.id}/paginated`,
{
headers: apiKeyHeaders(seller.inkey),
params: {
sortby: 'ask_price',
direction: 'asc',
name: fixedPriceAddress.local_part
}
}
)
if (fixedItems.data?.[0]?.id) {
await jsonRequest(
seller.context,
'delete',
`/auction_house/api/v1/items/${fixedItems.data[0].id}`,
{
headers: apiKeyHeaders(seller.adminkey),
params: {force_close: true}
}
)
}
const fixedTransfer = await jsonRequest(
seller.context,
'get',
`/nostrnip5/api/v1/domain/${domainId}/address/${fixedPriceAddress.id}/transfer`,
{headers: apiKeyHeaders(seller.adminkey)}
)
const sellItem = await createAuctionItem(
seller.context,
seller,
sellRoom.id,
{
name: fixedPriceAddress.local_part,
ask_price: 5000,
transfer_code: fixedTransfer.transfer_code
}
)
const buyer = await newUser('auction-buyer')
const buy = await bidOnItem(
buyer.context,
buyer,
sellItem.id,
5000,
'fixed price buy'
)
await payInvoiceViaUi(admin, buy.payment_request)
await expect
.poll(
async () => {
const buyerAddresses = await jsonRequest(
buyer.context,
'get',
'/nostrnip5/api/v1/user/addresses',
{
headers: apiKeyHeaders(buyer.inkey),
params: {active: true}
}
)
return JSON.stringify(buyerAddresses)
},
{timeout: 15_000}
)
.toContain(fixedPriceAddress.local_part)
})