diff options
Diffstat (limited to 'packages/sra-report/src')
-rw-r--r-- | packages/sra-report/src/globals.d.ts | 6 | ||||
-rw-r--r-- | packages/sra-report/src/index.ts | 86 | ||||
-rw-r--r-- | packages/sra-report/src/postman_environment_factory.ts | 74 | ||||
-rw-r--r-- | packages/sra-report/src/utils.ts | 5 |
4 files changed, 171 insertions, 0 deletions
diff --git a/packages/sra-report/src/globals.d.ts b/packages/sra-report/src/globals.d.ts new file mode 100644 index 000000000..eb09d3fcf --- /dev/null +++ b/packages/sra-report/src/globals.d.ts @@ -0,0 +1,6 @@ +declare module 'newman'; + +declare module '*.json' { + const value: any; + export default value; +} diff --git a/packages/sra-report/src/index.ts b/packages/sra-report/src/index.ts new file mode 100644 index 000000000..bee9db192 --- /dev/null +++ b/packages/sra-report/src/index.ts @@ -0,0 +1,86 @@ +#!/usr/bin/env node +import { assert } from '@0xproject/assert'; +import { HttpClient } from '@0xproject/connect'; +import { Schema, schemas } from '@0xproject/json-schemas'; +import { promisify } from '@0xproject/utils'; +import chalk from 'chalk'; +import * as _ from 'lodash'; +import * as newman from 'newman'; +import * as yargs from 'yargs'; + +import * as sraReportCollectionJSON from '../postman_configs/collections/sra_report.postman_collection.json'; + +import { postmanEnvironmentFactory } from './postman_environment_factory'; +import { utils } from './utils'; + +const newmanRunAsync = promisify<void>(newman.run); +const DEFAULT_NETWORK_ID = 1; +const SUPPORTED_NETWORK_IDS = [1, 42]; + +// extract command line arguments +const args = yargs + .option('url', { + alias: ['u'], + describe: 'API endpoint to test for standard relayer API compliance', + type: 'string', + demandOption: true, + }) + .option('output', { + alias: ['o', 'out'], + describe: 'Folder where to write the reports', + type: 'string', + normalize: true, + demandOption: false, + }) + .option('network-id', { + alias: ['n'], + describe: 'ID of the network that the API is serving orders from', + type: 'number', + default: DEFAULT_NETWORK_ID, + }) + .example("$0 --url 'http://api.example.com' --out 'src/contracts/generated/' --network-id 42", 'Full usage example') + .argv; +// perform extra validation on command line arguments +try { + assert.isHttpUrl('args', args.url); +} catch (err) { + utils.log(`${chalk.red(`Invalid url format:`)} ${args.url}`); + process.exit(1); +} +if (!_.includes(SUPPORTED_NETWORK_IDS, args.networkId)) { + utils.log(`${chalk.red(`Unsupported network id:`)} ${args.networkId}`); + utils.log(`${chalk.bold(`Supported network ids:`)} ${SUPPORTED_NETWORK_IDS}`); + process.exit(1); +} + +const mainAsync = async () => { + const httpClient = new HttpClient(args.url); + const orders = await httpClient.getOrdersAsync(); + const firstOrder = _.head(orders); + if (_.isUndefined(firstOrder)) { + throw new Error('Could not get any orders from /orders endpoint'); + } + const newmanEnvironmentOptions = { + collection: sraReportCollectionJSON, + globals: postmanEnvironmentFactory.createGlobalEnvironment(args.url, firstOrder), + environment: postmanEnvironmentFactory.createNetworkEnvironment(args.networkId), + }; + const newmanReporterOptions = !_.isUndefined(args.output) + ? { + reporters: 'json', + reporter: { + json: { + export: args.output, + }, + }, + } + : { + reporters: 'cli', + }; + const newmanRunOptions = { + ...newmanEnvironmentOptions, + ...newmanReporterOptions, + }; + await newmanRunAsync(newmanRunOptions); +}; +mainAsync().catch(utils.log); diff --git a/packages/sra-report/src/postman_environment_factory.ts b/packages/sra-report/src/postman_environment_factory.ts new file mode 100644 index 000000000..a8753d9ff --- /dev/null +++ b/packages/sra-report/src/postman_environment_factory.ts @@ -0,0 +1,74 @@ +import { SignedOrder, ZeroEx } from '0x.js'; +import { Schema, schemas as schemasByName } from '@0xproject/json-schemas'; +import * as _ from 'lodash'; + +import * as kovanTokensEnvironmentJSON from '../postman_configs/environments/kovan_tokens.postman_environment.json'; +import * as mainnetTokensEnvironmentJSON from '../postman_configs/environments/mainnet_tokens.postman_environment.json'; + +interface EnvironmentValue { + key: string; + value: string; + enabled: boolean; + type: string; +} + +export const postmanEnvironmentFactory = { + createGlobalEnvironment(url: string, order: SignedOrder) { + const schemas: Schema[] = _.values(schemasByName); + const schemaEnvironmentValues = _.compact( + _.map(schemas, (schema: Schema) => { + if (_.isUndefined(schema.id)) { + return undefined; + } else { + const schemaKey = convertSchemaIdToKey(schema.id); + const stringifiedSchema = JSON.stringify(schema); + const schemaEnvironmentValue = createEnvironmentValue(schemaKey, stringifiedSchema); + return schemaEnvironmentValue; + } + }), + ); + const schemaKeys = _.map(schemaEnvironmentValues, (environmentValue: EnvironmentValue) => { + return environmentValue.key; + }); + const allEnvironmentValues = _.concat( + schemaEnvironmentValues, + createEnvironmentValue('schemaKeys', JSON.stringify(schemaKeys)), + createEnvironmentValue('url', url), + createEnvironmentValue('order', JSON.stringify(order)), + createEnvironmentValue('orderMaker', order.maker), + createEnvironmentValue('orderTaker', order.taker), + createEnvironmentValue('orderFeeRecipient', order.feeRecipient), + createEnvironmentValue('orderHash', ZeroEx.getOrderHashHex(order)), + ); + const environment = { + values: allEnvironmentValues, + }; + return environment; + }, + createNetworkEnvironment(networkId: number) { + switch (networkId) { + case 1: + return mainnetTokensEnvironmentJSON; + case 42: + return kovanTokensEnvironmentJSON; + default: + return {}; + } + }, +}; +function convertSchemaIdToKey(schemaId: string) { + let result = schemaId; + if (_.startsWith(result, '/')) { + result = result.substr(1); + } + result = `${result}Schema`; + return result; +} +function createEnvironmentValue(key: string, value: string) { + return { + key, + value, + enabled: true, + type: 'text', + }; +} diff --git a/packages/sra-report/src/utils.ts b/packages/sra-report/src/utils.ts new file mode 100644 index 000000000..5423cabd9 --- /dev/null +++ b/packages/sra-report/src/utils.ts @@ -0,0 +1,5 @@ +export const utils = { + log(...args: any[]): void { + console.log(...args); // tslint:disable-line:no-console + }, +}; |