Skip to content

Commit

Permalink
feat: add getPendingInstructions to the Venue class
Browse files Browse the repository at this point in the history
  • Loading branch information
monitz87 committed Oct 12, 2020
1 parent 8f4aa1e commit eb472c5
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 4 deletions.
42 changes: 42 additions & 0 deletions src/api/entities/Venue/__tests__/index.ts
Expand Up @@ -13,6 +13,10 @@ jest.mock(
'~/api/entities/Identity',
require('~/testUtils/mocks/entities').mockIdentityModule('~/api/entities/Identity')
);
jest.mock(
'~/api/entities/Instruction',
require('~/testUtils/mocks/entities').mockInstructionModule('~/api/entities/Instruction')
);

describe('Venue class', () => {
let context: Mocked<Context>;
Expand Down Expand Up @@ -58,6 +62,10 @@ describe('Venue class', () => {
});

describe('method: details', () => {
afterAll(() => {
sinon.restore();
});

test('should return the Venue details', async () => {
const description = 'someDescription';
const type = VenueType.Other;
Expand Down Expand Up @@ -89,4 +97,38 @@ describe('Venue class', () => {
});
});
});

describe('method: getPendingInstructions', () => {
afterAll(() => {
sinon.restore();
});

test("should return the Venue's pending instructions", async () => {
const description = 'someDescription';
const type = VenueType.Other;
const owner = 'someDid';
const instructionId = new BigNumber(1);

entityMockUtils.configureMocks({ instructionOptions: { id: instructionId } });
sinon
.stub(utilsModule, 'numberToU64')
.withArgs(id, context)
.returns(rawId);

dsMockUtils
.createQueryStub('settlement', 'venueInfo')
.withArgs(rawId)
.resolves({
creator: dsMockUtils.createMockIdentityId(owner),
instructions: [dsMockUtils.createMockU64(instructionId.toNumber())],
details: dsMockUtils.createMockVenueDetails(description),
// eslint-disable-next-line @typescript-eslint/camelcase
venue_type: dsMockUtils.createMockVenueType(type),
});

const result = await venue.getPendingInstructions();

expect(result[0].id).toEqual(instructionId);
});
});
});
32 changes: 31 additions & 1 deletion src/api/entities/Venue/index.ts
@@ -1,11 +1,14 @@
import BigNumber from 'bignumber.js';
import P from 'bluebird';

import { Entity, Identity } from '~/api/entities';
import { Entity, Identity, Instruction } from '~/api/entities';
import { Context } from '~/base';
import { InstructionStatus } from '~/types';
import {
identityIdToString,
meshVenueTypeToVenueType,
numberToU64,
u64ToBigNumber,
venueDetailsToString,
} from '~/utils';

Expand Down Expand Up @@ -69,4 +72,31 @@ export class Venue extends Entity<UniqueIdentifiers> {
type: meshVenueTypeToVenueType(type),
};
}

/**
* Retrieve all pending Instructions in this Venue
*/
public async getPendingInstructions(): Promise<Instruction[]> {
const {
context: {
polymeshApi: {
query: { settlement },
},
},
id,
context,
} = this;

const { instructions: rawInstructions } = await settlement.venueInfo(numberToU64(id, context));

const instructions = rawInstructions.map(
instructionId => new Instruction({ id: u64ToBigNumber(instructionId) }, context)
);

return P.filter(instructions, async instruction => {
const { status } = await instruction.details();

return status === InstructionStatus.Pending;
});
}
}
5 changes: 4 additions & 1 deletion src/api/procedures/__tests__/addInstruction.ts
Expand Up @@ -24,7 +24,10 @@ describe('addInstruction procedure', () => {
let portfolioIdToMeshPortfolioIdStub: sinon.SinonStub;
let stringToTickerStub: sinon.SinonStub<[string, Context], Ticker>;
let numberToU64Stub: sinon.SinonStub<[number | BigNumber, Context], u64>;
let numberToBalanceStub: sinon.SinonStub<[number | BigNumber, Context], Balance>;
let numberToBalanceStub: sinon.SinonStub<
[number | BigNumber, Context, (boolean | undefined)?],
Balance
>;
let endConditionToSettlementTypeStub: sinon.SinonStub<
[
(
Expand Down
31 changes: 29 additions & 2 deletions src/testUtils/mocks/entities.ts
Expand Up @@ -24,6 +24,9 @@ import {
Authorization,
AuthorizationType,
ExtrinsicData,
InstructionDetails,
InstructionStatus,
InstructionType,
SecondaryKey,
SecurityTokenDetails,
TickerReservationDetails,
Expand Down Expand Up @@ -119,6 +122,7 @@ interface VenueOptions {

interface InstructionOptions {
id?: BigNumber;
details?: InstructionDetails;
}

let identityConstructorStub: SinonStub;
Expand Down Expand Up @@ -153,6 +157,7 @@ let currentAccountGetIdentityStub: SinonStub;
let currentAccountGetTransactionHistoryStub: SinonStub;
let tickerReservationDetailsStub: SinonStub;
let venueDetailsStub: SinonStub;
let instructionDetailsStub: SinonStub;

const MockIdentityClass = class {
/**
Expand Down Expand Up @@ -291,7 +296,7 @@ export const mockVenueModule = (path: string) => (): object => ({

export const mockInstructionModule = (path: string) => (): object => ({
...jest.requireActual(path),
Venue: MockInstructionClass,
Instruction: MockInstructionClass,
});

const defaultIdentityOptions: IdentityOptions = {
Expand Down Expand Up @@ -364,6 +369,12 @@ const defaultVenueOptions: VenueOptions = {
let venueOptions = defaultVenueOptions;
const defaultInstructionOptions: InstructionOptions = {
id: new BigNumber(1),
details: {
status: InstructionStatus.Pending,
createdAt: new Date(new Date().getTime() + 365 * 24 * 60 * 60 * 1000),
validFrom: null,
type: InstructionType.SettleOnAuthorization,
},
};
let instructionOptions = defaultInstructionOptions;
// NOTE uncomment in Governance v2 upgrade
Expand Down Expand Up @@ -419,6 +430,7 @@ let instructionOptions = defaultInstructionOptions;
function configureInstruction(opts: InstructionOptions): void {
const instruction = ({
id: opts.id,
details: instructionDetailsStub.resolves(opts.details),
} as unknown) as MockInstruction;

Object.assign(mockInstanceContainer.instruction, instruction);
Expand All @@ -433,6 +445,7 @@ function configureInstruction(opts: InstructionOptions): void {
*/
function initInstruction(opts?: InstructionOptions): void {
instructionConstructorStub = sinon.stub();
instructionDetailsStub = sinon.stub();

instructionOptions = { ...defaultInstructionOptions, ...opts };

Expand Down Expand Up @@ -794,7 +807,7 @@ export function configureMocks(opts?: {

const tempInstructionOptions = {
...defaultInstructionOptions,
...opts?.venueOptions,
...opts?.instructionOptions,
};
configureInstruction(tempInstructionOptions);
}
Expand Down Expand Up @@ -1212,3 +1225,17 @@ export function getInstructionInstance(opts?: InstructionOptions): MockInstructi

return mockInstanceContainer.instruction;
}

/**
* @hidden
* Retrieve the stub of the `Instruction.details` method
*/
export function getInstructionDetailsStub(details?: Partial<InstructionDetails>): SinonStub {
if (details) {
return instructionDetailsStub.resolves({
...defaultInstructionOptions.details,
...details,
});
}
return instructionDetailsStub;
}

0 comments on commit eb472c5

Please sign in to comment.