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

98 lines
2.9 KiB
TypeScript
Raw Normal View History

import { assert } from "chai"
import { EventHandler } from "../../src/keeper/EventHandler"
import { ContractEventSubscription } from "../../src/keeper/ContractEvent"
import { Ocean } from "../../src/ocean/Ocean"
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()
executeTransaction = () => ocean.keeper.dispenser.requestTokens(10, account)
})
describe("#subscribe()", () => {
it("should listen the events", async () => {
const event = eventHandler.getEvent(ocean.keeper.token, "Transfer", {to: account})
let validResolve = false
let subscription: ContractEventSubscription
2019-03-21 03:17:36 +01:00
const waitUntilEvent = new Promise((resolve) => {
subscription = event.subscribe((events) => {
assert.isDefined(events)
assert.lengthOf(events, 2)
if (validResolve) {
resolve()
}
})
})
await Promise.all([
executeTransaction(),
executeTransaction(),
])
2019-03-21 03:17:36 +01:00
await new Promise((_) => setTimeout(_, 2000))
validResolve = true
await Promise.all([
executeTransaction(),
executeTransaction(),
])
await waitUntilEvent
subscription.unsubscribe()
})
})
describe("#once()", () => {
it("should listen only once", async () => {
const to = account
const event = eventHandler.getEvent(ocean.keeper.token, "Transfer", {to})
let canBeRejected = false
const waitUntilEvent = new Promise((resolve, reject) => {
2019-03-21 03:17:36 +01:00
event.once((events) => {
if (canBeRejected) {
reject()
}
setTimeout(resolve, 600)
})
})
await executeTransaction()
2019-03-21 03:17:36 +01:00
await new Promise((_) => setTimeout(_, 2000))
canBeRejected = true
await executeTransaction()
await waitUntilEvent
})
it("should get the event like a promise", async () => {
const to = account
const event = eventHandler.getEvent(ocean.keeper.token, "Transfer", {to})
const waitUntilEvent = event.once()
2019-03-21 03:17:36 +01:00
await new Promise((_) => setTimeout(_, 400))
await executeTransaction()
await waitUntilEvent
})
})
})