Skip to content

Commit

Permalink
indexer-service: Fix tests and improve readability
Browse files Browse the repository at this point in the history
  • Loading branch information
fordN committed Jan 28, 2022
1 parent 62effa0 commit d3f4974
Show file tree
Hide file tree
Showing 3 changed files with 130 additions and 103 deletions.
1 change: 1 addition & 0 deletions packages/indexer-service/jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,6 @@ module.exports = {
process.env.POSTGRES_TEST_DATABASE ||
bail('POSTGRES_TEST_DATABASE is not defined'),
},
__LOG_LEVEL__: process.env.LOG_LEVEL || 'info'
},
}
225 changes: 126 additions & 99 deletions packages/indexer-service/src/server/__tests__/server.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,18 @@
* Assumes a graph-node is running
*/

import http from 'http'
import supertest from 'supertest'
import express from 'express'
import { BigNumber, ethers, Wallet } from 'ethers'
import { Sequelize } from 'sequelize'
import { Socket } from 'net'

import {
connectContracts,
connectDatabase,
createLogger,
createMetrics,
Logger,
NetworkContracts,
toAddress,
} from '@graphprotocol/common-ts'
Expand All @@ -29,13 +32,15 @@ import {
NetworkSubgraph,
QueryFeeModels,
} from '@graphprotocol/indexer-common'
import { Sequelize } from 'sequelize'

// Make global Jest variable available
// eslint-disable-next-line @typescript-eslint/no-explicit-any
declare const __DATABASE__: any
declare const __LOG_LEVEL__: never

let app: express.Express
let logger: Logger
let server: http.Server
let sockets: Socket[] = []
let sequelize: Sequelize
let models: IndexerManagementModels
let queryFeeModels: QueryFeeModels
Expand All @@ -46,111 +51,133 @@ let networkSubgraph: NetworkSubgraph
let client: IndexerManagementClient
let receiptManager: AllocationReceiptManager

describe('Server', () => {
beforeAll(async () => {
const logger = createLogger({ name: 'server.test.ts', level: 'trace' })
const metrics = createMetrics()

sequelize = await connectDatabase(__DATABASE__)

queryFeeModels = defineQueryFeeModels(sequelize)
models = defineIndexerManagementModels(sequelize)
address = '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1'
contracts = await connectContracts(ethers.getDefaultProvider('rinkeby'), 4)
await sequelize.sync({ force: true })
indexingStatusResolver = new IndexingStatusResolver({
logger: logger,
statusEndpoint: 'http://localhost:8030/graphql',
})
networkSubgraph = await NetworkSubgraph.create({
logger,
endpoint: 'https://gateway.testnet.thegraph.com/network',
deployment: undefined,
})
const setup = async () => {
logger = createLogger({ name: 'server.test.ts', async: false, level: __LOG_LEVEL__ })
const metrics = createMetrics()

client = await createIndexerManagementClient({
models,
address,
contracts,
indexingStatusResolver,
networkSubgraph,
logger,
defaults: {
// This is just a dummy, since we're never writing to the management
// client from the indexer service.
globalIndexingRule: {
allocationAmount: BigNumber.from('0'),
},
},
features: {
injectDai: true,
},
})
sequelize = await connectDatabase(__DATABASE__)

queryFeeModels = defineQueryFeeModels(sequelize)
models = defineIndexerManagementModels(sequelize)
address = '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1'
contracts = await connectContracts(ethers.getDefaultProvider('rinkeby'), 4)
await sequelize.sync({ force: true })
indexingStatusResolver = new IndexingStatusResolver({
logger: logger,
statusEndpoint: 'http://localhost:8030/graphql',
})
networkSubgraph = await NetworkSubgraph.create({
logger,
endpoint: 'https://gateway.testnet.thegraph.com/network',
deployment: undefined,
})

receiptManager = new AllocationReceiptManager(
sequelize,
queryFeeModels,
logger,
toAddress(address), //update maybe
)

const release = {
version: '0.0.1',
dependencies: {
'@graphprotocol/common-ts': '1.8.0',
client = await createIndexerManagementClient({
models,
address,
contracts,
indexingStatusResolver,
networkSubgraph,
logger,
defaults: {
// This is just a dummy, since we're never writing to the management
// client from the indexer service.
globalIndexingRule: {
allocationAmount: BigNumber.from('0'),
},
}

// Monitor indexer allocations that we may receive traffic for
const allocations = monitorEligibleAllocations({
indexer: toAddress(address),
logger,
networkSubgraph,
interval: 120_000,
})
const wallet = Wallet.fromMnemonic(
'myth like bonus scare over problem client lizard pioneer submit female collect',
)

// Ensure there is an attestation signer for every allocation
const signers = ensureAttestationSigners({
logger,
allocations,
wallet,
chainId: 4,
disputeManagerAddress: contracts.disputeManager.address,
})
},
features: {
injectDai: true,
},
})

const queryProcessor = new QueryProcessor({
logger: logger.child({ component: 'QueryProcessor' }),
graphNode: 'http://localhost:8000/',
metrics,
receiptManager,
signers,
})
receiptManager = new AllocationReceiptManager(
sequelize,
queryFeeModels,
logger,
toAddress(address), //update maybe
)

const release = {
version: '0.0.1',
dependencies: {
'@graphprotocol/common-ts': '1.8.0',
},
}

// Monitor indexer allocations that we may receive traffic for
const allocations = monitorEligibleAllocations({
indexer: toAddress(address),
logger,
networkSubgraph,
interval: 120_000,
})
const wallet = Wallet.fromMnemonic(
'myth like bonus scare over problem client lizard pioneer submit female collect',
)

// Ensure there is an attestation signer for every allocation
const signers = ensureAttestationSigners({
logger,
allocations,
wallet,
chainId: 4,
disputeManagerAddress: contracts.disputeManager.address,
})

app = await createServer({
logger,
port: 9600,
queryProcessor,
graphNodeStatusEndpoint: 'http://localhost:8030/graphql',
metrics,
freeQueryAuthToken: '',
indexerManagementClient: client,
release,
operatorPublicKey: wallet.publicKey,
networkSubgraph,
networkSubgraphAuthToken: 'superdupersecrettoken',
serveNetworkSubgraph: false,
})
const queryProcessor = new QueryProcessor({
logger: logger.child({ component: 'QueryProcessor' }),
graphNode: 'http://localhost:8000/',
metrics,
receiptManager,
signers,
})

afterAll(async () => {
await sequelize.drop({})
server = await createServer({
logger,
port: 9600,
queryProcessor,
graphNodeStatusEndpoint: 'http://localhost:8030/graphql',
metrics,
freeQueryAuthToken: '',
indexerManagementClient: client,
release,
operatorPublicKey: wallet.publicKey,
networkSubgraph,
networkSubgraphAuthToken: 'superdupersecrettoken',
serveNetworkSubgraph: false,
})
server.on('connection', socket => {
logger.debug('Connection established', { socket })
sockets.push(socket)
socket.on('close', () => (sockets = sockets.filter(curr => curr !== socket)))
})
process.on('SIGTERM', await shutdownServer)
process.on('SIGINT', await shutdownServer)
}

const shutdownServer = async () => {
logger.debug('Received kill signal, shutting down gracefully')
if(server) {
server.close(() => {
logger.debug('Closed out remaining connections')
})
}
if(sockets.length > 0) {
sockets.forEach(socket => socket.destroy())
}
}

const teardown = async () => {
await shutdownServer()
await sequelize.drop({})
}

describe('Server', () => {
beforeAll(setup)
afterAll(teardown)

it('is ready to roll', done => {
supertest(app).get('/').expect(200, done)
//expect(response.body.message).toBe('ready to roll!')
supertest(server).get('/').expect(200, done)
})
})
7 changes: 3 additions & 4 deletions packages/indexer-service/src/server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {
import { createCostServer } from './cost'
import { createOperatorServer } from './operator'
import rateLimit from 'express-rate-limit'
import http from 'http'

export interface ServerOptions {
logger: Logger
Expand Down Expand Up @@ -362,7 +363,7 @@ export const createServer = async ({
networkSubgraph,
networkSubgraphAuthToken,
serveNetworkSubgraph,
}: ServerOptions): Promise<express.Express> => {
}: ServerOptions): Promise<http.Server> => {
const app = await createApp({
logger,
queryProcessor,
Expand All @@ -377,9 +378,7 @@ export const createServer = async ({
serveNetworkSubgraph,
})

app.listen(port, () => {
return app.listen(port, () => {
logger.debug(`Listening on port ${port}`)
})

return app
}

0 comments on commit d3f4974

Please sign in to comment.