Skip to content

Commit

Permalink
feat: refactor PIA and CAA remove procedures
Browse files Browse the repository at this point in the history
  • Loading branch information
shuffledex committed Jun 29, 2021
1 parent 08432ca commit 89b291d
Show file tree
Hide file tree
Showing 9 changed files with 242 additions and 192 deletions.
1 change: 0 additions & 1 deletion src/api/entities/Identity/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,6 @@ export class Identity extends Entity<UniqueIdentifiers> {

const token = new SecurityToken({ ticker }, context);
const { primaryIssuanceAgents } = await token.details();
console.log(primaryIssuanceAgents);

return primaryIssuanceAgents.map(({ did: agentDid }) => agentDid).includes(did);
} else if (isTokenCaaRole(role)) {
Expand Down
2 changes: 2 additions & 0 deletions src/api/entities/SecurityToken/CorporateActions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ export class CorporateActions extends Namespace<SecurityToken> {
*
* @note required role:
* - Security Token Owner
*
* @deprecated
*/
public removeAgent: ProcedureMethod<void, void>;

Expand Down
28 changes: 14 additions & 14 deletions src/api/entities/SecurityToken/__tests__/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -517,24 +517,24 @@ describe('SecurityToken class', () => {
});
});

// describe('method: removePrimaryIssuanceAgent', () => {
// test('should prepare the procedure and return the resulting transaction queue', async () => {
// const ticker = 'TICKER';
// const context = dsMockUtils.getContextInstance();
// const securityToken = new SecurityToken({ ticker }, context);
describe('method: removePrimaryIssuanceAgent', () => {
test('should prepare the procedure and return the resulting transaction queue', async () => {
const ticker = 'TICKER';
const context = dsMockUtils.getContextInstance();
const securityToken = new SecurityToken({ ticker }, context);

// const expectedQueue = ('someQueue' as unknown) as TransactionQueue<void>;
const expectedQueue = ('someQueue' as unknown) as TransactionQueue<void>;

// procedureMockUtils
// .getPrepareStub()
// .withArgs({ args: { ticker }, transformer: undefined }, context)
// .resolves(expectedQueue);
procedureMockUtils
.getPrepareStub()
.withArgs({ args: { ticker }, transformer: undefined }, context)
.resolves(expectedQueue);

// const queue = await securityToken.removePrimaryIssuanceAgent();
const queue = await securityToken.removePrimaryIssuanceAgent();

// expect(queue).toBe(expectedQueue);
// });
// });
expect(queue).toBe(expectedQueue);
});
});

describe('method: redeem', () => {
test('should prepare the procedure and return the resulting transaction queue', async () => {
Expand Down
14 changes: 8 additions & 6 deletions src/api/entities/SecurityToken/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
ModifyTokenParams,
redeemToken,
RedeemTokenParams,
// removePrimaryIssuanceAgent,
removePrimaryIssuanceAgent,
toggleFreezeTransfers,
transferTokenOwnership,
TransferTokenOwnershipParams,
Expand Down Expand Up @@ -140,10 +140,10 @@ export class SecurityToken extends Entity<UniqueIdentifiers> {
{ getProcedureAndArgs: args => [modifyPrimaryIssuanceAgent, { ticker, ...args }] },
context
);
// this.removePrimaryIssuanceAgent = createProcedureMethod(
// { getProcedureAndArgs: () => [removePrimaryIssuanceAgent, { ticker }] },
// context
// );
this.removePrimaryIssuanceAgent = createProcedureMethod(
{ getProcedureAndArgs: () => [removePrimaryIssuanceAgent, { ticker }] },
context
);
this.redeem = createProcedureMethod(
{ getProcedureAndArgs: args => [redeemToken, { ticker, ...args }] },
context
Expand Down Expand Up @@ -405,8 +405,10 @@ export class SecurityToken extends Entity<UniqueIdentifiers> {
*
* @note required role:
* - Security Token Owner
*
* @deprecated
*/
// public removePrimaryIssuanceAgent: ProcedureMethod<void, void>;
public removePrimaryIssuanceAgent: ProcedureMethod<void, void>;

/**
* Redeem (burn) an amount of this Security Token
Expand Down
27 changes: 13 additions & 14 deletions src/api/procedures/__tests__/removeCorporateActionsAgent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,48 +49,47 @@ describe('removeCorporateActionsAgent procedure', () => {
});

test('should add a remove corporate agent transaction to the queue', async () => {
const did = 'someDid';

entityMockUtils.configureMocks({
securityTokenOptions: {
corporateActionsGetAgents: [entityMockUtils.getIdentityInstance({ did: 'someDid' })],
details: {
owner: entityMockUtils.getIdentityInstance({ did: 'otherDid' }),
},
corporateActionsGetAgents: [entityMockUtils.getIdentityInstance({ did })],
},
});

const rawTicker = dsMockUtils.createMockTicker(ticker);
const rawIdentityId = dsMockUtils.createMockIdentityId(did);

sinon.stub(utilsConversionModule, 'stringToTicker').returns(rawTicker);
sinon.stub(utilsConversionModule, 'stringToIdentityId').returns(rawIdentityId);

const transaction = dsMockUtils.createTxStub('corporateAction', 'removeCa');
const transaction = dsMockUtils.createTxStub('externalAgents', 'removeAgent');
const proc = procedureMockUtils.getInstance<Params, void>(mockContext);

await prepareRemoveCorporateActionsAgent.call(proc, { ticker });

sinon.assert.calledWith(addTransactionStub, transaction, {}, rawTicker);
sinon.assert.calledWith(addTransactionStub, transaction, {}, rawTicker, rawIdentityId);
});

test('should throw an error if attempting to remove the asset owner', async () => {
test('should throw an error if Corporate Actions Agent list has more than one identity', async () => {
const args = {
id,
ticker,
};
const did = 'someDid';
const identity = entityMockUtils.getIdentityInstance({ did });

entityMockUtils.configureMocks({
securityTokenOptions: {
corporateActionsGetAgents: [identity],
details: {
owner: identity,
},
corporateActionsGetAgents: [
entityMockUtils.getIdentityInstance({ did: 'did' }),
entityMockUtils.getIdentityInstance({ did: 'otherDid' }),
],
},
});

const proc = procedureMockUtils.getInstance<Params, void>(mockContext);

await expect(prepareRemoveCorporateActionsAgent.call(proc, args)).rejects.toThrow(
'There is no set Corporate Actions Agent'
'We can not perform this procedure with more than one Corporate Actions Agent involved'
);
});

Expand Down
208 changes: 120 additions & 88 deletions src/api/procedures/__tests__/removePrimaryIssuanceAgent.ts
Original file line number Diff line number Diff line change
@@ -1,91 +1,123 @@
import { IdentityId, Ticker, TxTags } from 'polymesh-types/types';
import sinon from 'sinon';

import {
getAuthorization,
Params,
prepareRemovePrimaryIssuanceAgent,
} from '~/api/procedures/removePrimaryIssuanceAgent';
import { Context } from '~/internal';
import { dsMockUtils, entityMockUtils, procedureMockUtils } from '~/testUtils/mocks';
import { Mocked } from '~/testUtils/types';
import { RoleType } from '~/types';
import * as utilsConversionModule from '~/utils/conversion';

jest.mock(
'~/api/entities/SecurityToken',
require('~/testUtils/mocks/entities').mockSecurityTokenModule('~/api/entities/SecurityToken')
);

describe('removePrimaryIssuanceAgent procedure', () => {
test('dummy test', () => {
expect(true).toBeTruthy();
let mockContext: Mocked<Context>;
let stringToTickerStub: sinon.SinonStub;
let stringToIdentityIdStub: sinon.SinonStub;
let ticker: string;
let did: string;
let rawTicker: Ticker;
let rawIdentityId: IdentityId;
let addTransactionStub: sinon.SinonStub;

beforeAll(() => {
dsMockUtils.initMocks();
procedureMockUtils.initMocks();
entityMockUtils.initMocks();
stringToTickerStub = sinon.stub(utilsConversionModule, 'stringToTicker');
stringToIdentityIdStub = sinon.stub(utilsConversionModule, 'stringToIdentityId');
ticker = 'someTicker';
rawTicker = dsMockUtils.createMockTicker(ticker);
did = 'someDid';
rawIdentityId = dsMockUtils.createMockIdentityId(did);
});
});

// import { Ticker, TxTags } from 'polymesh-types/types';
// import sinon from 'sinon';

// import {
// getAuthorization,
// Params,
// prepareRemovePrimaryIssuanceAgent,
// } from '~/api/procedures/removePrimaryIssuanceAgent';
// import { Context } from '~/internal';
// import { dsMockUtils, entityMockUtils, procedureMockUtils } from '~/testUtils/mocks';
// import { Mocked } from '~/testUtils/types';
// import { RoleType } from '~/types';
// import * as utilsConversionModule from '~/utils/conversion';

// jest.mock(
// '~/api/entities/SecurityToken',
// require('~/testUtils/mocks/entities').mockSecurityTokenModule('~/api/entities/SecurityToken')
// );

// describe('removePrimaryIssuanceAgent procedure', () => {
// let mockContext: Mocked<Context>;
// let stringToTickerStub: sinon.SinonStub;
// let ticker: string;
// let rawTicker: Ticker;
// let addTransactionStub: sinon.SinonStub;

// beforeAll(() => {
// dsMockUtils.initMocks();
// procedureMockUtils.initMocks();
// entityMockUtils.initMocks();
// stringToTickerStub = sinon.stub(utilsConversionModule, 'stringToTicker');
// ticker = 'someTicker';
// rawTicker = dsMockUtils.createMockTicker(ticker);
// });

// beforeEach(() => {
// mockContext = dsMockUtils.getContextInstance();
// stringToTickerStub.returns(rawTicker);
// addTransactionStub = procedureMockUtils.getAddTransactionStub();
// });

// afterEach(() => {
// entityMockUtils.reset();
// procedureMockUtils.reset();
// dsMockUtils.reset();
// });

// afterAll(() => {
// entityMockUtils.cleanup();
// procedureMockUtils.cleanup();
// dsMockUtils.cleanup();
// });

// test('should add a remove primary issuance agent transaction to the queue', async () => {
// const args = {
// ticker,
// };

// const transaction = dsMockUtils.createTxStub('asset', 'removePrimaryIssuanceAgent');
// const proc = procedureMockUtils.getInstance<Params, void>(mockContext);

// await prepareRemovePrimaryIssuanceAgent.call(proc, args);

// sinon.assert.calledWith(addTransactionStub, transaction, {}, rawTicker);
// });

// describe('getAuthorization', () => {
// test('should return the appropriate roles and permissions', () => {
// const proc = procedureMockUtils.getInstance<Params, void>(mockContext);
// const boundFunc = getAuthorization.bind(proc);
// const args = {
// ticker,
// } as Params;

// expect(boundFunc(args)).toEqual({
// identityRoles: [{ type: RoleType.TokenOwner, ticker }],
// signerPermissions: {
// transactions: [TxTags.asset.RemovePrimaryIssuanceAgent],
// tokens: [entityMockUtils.getSecurityTokenInstance({ ticker })],
// portfolios: [],
// },
// });
// });
// });
// });
beforeEach(() => {
mockContext = dsMockUtils.getContextInstance();
stringToTickerStub.returns(rawTicker);
stringToIdentityIdStub.returns(rawIdentityId);
addTransactionStub = procedureMockUtils.getAddTransactionStub();
});

afterEach(() => {
entityMockUtils.reset();
procedureMockUtils.reset();
dsMockUtils.reset();
});

afterAll(() => {
entityMockUtils.cleanup();
procedureMockUtils.cleanup();
dsMockUtils.cleanup();
});

test('should add a remove primary issuance agent transaction to the queue', async () => {
const args = {
ticker,
};

entityMockUtils.configureMocks({
securityTokenOptions: {
details: {
primaryIssuanceAgents: [entityMockUtils.getIdentityInstance({ did })],
},
},
});

const transaction = dsMockUtils.createTxStub('externalAgents', 'removeAgent');
const proc = procedureMockUtils.getInstance<Params, void>(mockContext);

await prepareRemovePrimaryIssuanceAgent.call(proc, args);

sinon.assert.calledWith(addTransactionStub, transaction, {}, rawTicker, rawIdentityId);
});

test('should throw an error if Primary Issuance Agent list has more than one identity', async () => {
const args = {
ticker,
};

entityMockUtils.configureMocks({
securityTokenOptions: {
details: {
primaryIssuanceAgents: [
entityMockUtils.getIdentityInstance({ did: 'did' }),
entityMockUtils.getIdentityInstance({ did: 'otherDid' }),
],
},
},
});

const proc = procedureMockUtils.getInstance<Params, void>(mockContext);

await expect(prepareRemovePrimaryIssuanceAgent.call(proc, args)).rejects.toThrow(
'We can not perform this procedure with more than one Primary Issuance Agent involved'
);
});

describe('getAuthorization', () => {
test('should return the appropriate roles and permissions', () => {
const proc = procedureMockUtils.getInstance<Params, void>(mockContext);
const boundFunc = getAuthorization.bind(proc);
const args = {
ticker,
} as Params;

expect(boundFunc(args)).toEqual({
identityRoles: [{ type: RoleType.TokenOwner, ticker }],
signerPermissions: {
transactions: [TxTags.asset.RemovePrimaryIssuanceAgent],
tokens: [entityMockUtils.getSecurityTokenInstance({ ticker })],
portfolios: [],
},
});
});
});
});

0 comments on commit 89b291d

Please sign in to comment.