squid-js/test/unit/keeper/ContractEvent.test.ts

93 lines
2.9 KiB
TypeScript
Raw Normal View History

2019-06-20 00:20:09 +02:00
import { assert } from 'chai'
2020-01-30 22:08:18 +01:00
import { EventHandler } from '../../../src/keeper/EventHandler'
import { ContractEventSubscription } from '../../../src/keeper/ContractEvent'
import { Ocean } from '../../../src/ocean/Ocean'
2019-06-20 00:20:09 +02:00
import config from '../config'
import TestContractHandler from './TestContractHandler'
describe('ContractEvent', () => {
let ocean: Ocean
let account: string
let eventHandler: EventHandler
let executeTransaction: () => Promise<any>
beforeEach(async () => {
await TestContractHandler.prepareContracts()
ocean = await Ocean.getInstance(config)
2019-03-21 03:17:36 +01:00
eventHandler = new EventHandler((ocean as any).instanceConfig)
account = (await ocean.accounts.list())[0].getId()
2019-09-09 12:18:54 +02:00
executeTransaction = () => ocean.keeper.dispenser.requestTokens(10, account)
})
2019-06-20 00:20:09 +02:00
describe('#subscribe()', () => {
2019-10-31 11:23:41 +01:00
it('should be able to listen to events', async () => {
2019-11-15 00:00:10 +01:00
const event = eventHandler.getEvent(ocean.keeper.token, 'Transfer', {
to: account
})
let validResolve = false
let subscription: ContractEventSubscription
const waitUntilEvent = new Promise((resolve) => {
subscription = event.subscribe((events) => {
assert.isDefined(events)
assert.lengthOf(events, 2)
if (validResolve) {
resolve()
}
})
})
2019-06-20 00:20:09 +02:00
await Promise.all([executeTransaction(), executeTransaction()])
await new Promise((resolve) => setTimeout(resolve, 2000))
validResolve = true
2019-06-20 00:20:09 +02:00
await Promise.all([executeTransaction(), executeTransaction()])
await waitUntilEvent
subscription.unsubscribe()
})
})
2019-06-20 00:20:09 +02:00
describe('#once()', () => {
2019-10-31 11:23:41 +01:00
it('should listen to event only once', async () => {
const to = account
2019-09-09 12:18:54 +02:00
const event = eventHandler.getEvent(ocean.keeper.token, 'Transfer', { to })
let canBeRejected = false
const waitUntilEvent = new Promise((resolve, reject) => {
2019-10-31 11:23:41 +01:00
event.once(() => {
if (canBeRejected) {
2019-06-24 13:06:38 +02:00
reject(new Error(''))
}
setTimeout(resolve, 600)
})
})
await executeTransaction()
await new Promise((resolve) => setTimeout(resolve, 2000))
canBeRejected = true
await executeTransaction()
await waitUntilEvent
})
2019-06-20 00:20:09 +02:00
it('should get the event like a promise', async () => {
const to = account
2019-09-09 12:18:54 +02:00
const event = eventHandler.getEvent(ocean.keeper.token, 'Transfer', { to })
const waitUntilEvent = event.once()
await new Promise((resolve) => setTimeout(resolve, 400))
await executeTransaction()
await waitUntilEvent
})
})
})