Skip to content

Commit

Permalink
feat: type conversion utils
Browse files Browse the repository at this point in the history
  • Loading branch information
shuffledex committed Feb 19, 2020
1 parent ca94f11 commit c4c917a
Show file tree
Hide file tree
Showing 4 changed files with 161 additions and 7 deletions.
6 changes: 4 additions & 2 deletions package.json
Expand Up @@ -13,7 +13,8 @@
"commit": "npx git-cz",
"semantic-release": "semantic-release",
"lint": "eslint src --ext .js,.jsx,.ts,.tsx",
"format": "cross-env prettier-eslint $PWD\"/src/**/*.{ts,tsx,js,jsx}\" --write"
"format": "cross-env prettier-eslint $PWD\"/src/**/*.{ts,tsx,js,jsx}\" --write",
"ts-node": "ts-node -r tsconfig-paths/register"
},
"devDependencies": {
"@commitlint/cli": "^7.6.1",
Expand Down Expand Up @@ -48,6 +49,7 @@
"sinon": "^8.1.1",
"ts-jest": "^24.3.0",
"ts-mock-imports": "^1.2.6",
"tsconfig-paths": "^3.9.0",
"ttypescript": "^1.5.10",
"typedoc": "^0.16.8",
"typescript": "3.7.5"
Expand All @@ -61,7 +63,7 @@
"access": "public"
},
"dependencies": {
"@polymathnetwork/polkadot": "0.101.0-beta.14",
"@polymathnetwork/polkadot": "0.101.0-beta.15",
"json-stable-stringify": "^1.0.1",
"lodash": "^4.17.15"
}
Expand Down
100 changes: 99 additions & 1 deletion src/utils/__tests__/index.ts
@@ -1,4 +1,20 @@
import { delay, serialize, unserialize } from '~/utils';
import * as createTypeModule from '@polymathnetwork/polkadot/types/create/createType';
import * as registryModule from '@polymathnetwork/polkadot/types/create/registry';
import { Balance, IdentityId } from '@polymathnetwork/polkadot/types/interfaces';
import sinon from 'sinon';
import { ImportMock, MockManager, StaticMockManager } from 'ts-mock-imports';

import * as contextModule from '~/Context';
import { PolkadotMockFactory } from '~/testUtils/mocks/PolkadotMockFactory';
import {
balanceToNumber,
delay,
identityIdToString,
numberToBalance,
serialize,
stringToIdentityId,
unserialize,
} from '~/utils';

describe('delay', () => {
jest.useFakeTimers();
Expand Down Expand Up @@ -54,3 +70,85 @@ describe('serialize and unserialize', () => {
expect(() => unserialize(fakeSerialized)).toThrowError(errorMsg);
});
});

describe('stringToIdentityId and identityIdToString', () => {
let mockContext: StaticMockManager<contextModule.Context>;
let mockRegistry: MockManager<registryModule.TypeRegistry>;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let mockCreateType: sinon.SinonStub<any[], any>;

beforeEach(() => {
mockContext = ImportMock.mockStaticClass(contextModule, 'Context');
mockRegistry = ImportMock.mockClass(registryModule, 'TypeRegistry');
mockCreateType = ImportMock.mockFunction(createTypeModule, 'createType', 'type');
});

afterEach(() => {
mockContext.restore();
mockRegistry.restore();
mockCreateType.restore();
});

test('should stringToIdentityId being called with provided arguments', () => {
mockContext.set('polymeshApi', {
registry: mockRegistry.getMockInstance(),
});
const identity = 'IdentityObject';
const context = mockContext.getMockInstance();
stringToIdentityId(identity, context);
sinon.assert.calledWith(mockCreateType, context.polymeshApi.registry, 'IdentityId', identity);
});

test('should identityIdToString returns an string', () => {
const toStringStub = sinon.stub().returns('IdentityString');
const identityId = ({
toString: toStringStub,
} as unknown) as IdentityId;

const result = identityIdToString(identityId);
sinon.assert.calledOnce(toStringStub);
sinon.assert.match(typeof result === 'string', true);
});
});

describe('numberToBalance and balanceToNumber', () => {
let mockContext: StaticMockManager<contextModule.Context>;
let mockRegistry: MockManager<registryModule.TypeRegistry>;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let mockCreateType: sinon.SinonStub<any[], any>;

beforeEach(() => {
mockContext = ImportMock.mockStaticClass(contextModule, 'Context');
mockRegistry = ImportMock.mockClass(registryModule, 'TypeRegistry');
mockCreateType = ImportMock.mockFunction(createTypeModule, 'createType', 'type');
});

afterEach(() => {
mockContext.restore();
mockRegistry.restore();
mockCreateType.restore();
});

test('should numberToBalance being called with provided arguments', () => {
mockContext.set('polymeshApi', {
registry: mockRegistry.getMockInstance(),
});

const value = 100;
const context = mockContext.getMockInstance();
numberToBalance(value, context);
sinon.assert.calledWith(mockCreateType, context.polymeshApi.registry, 'Balance', value);
});

test('should balanceToNumber returns a base 6 number', () => {
const toStringStub = sinon.stub().returns('100');
const balance = ({
toString: toStringStub,
} as unknown) as Balance;

const result = balanceToNumber(balance);
sinon.assert.calledOnce(toStringStub);
sinon.assert.match(typeof result === 'number', true);
sinon.assert.match(result === 100 / Math.pow(10, 6), true);
});
});
32 changes: 32 additions & 0 deletions src/utils/index.ts
@@ -1,5 +1,9 @@
import { createType } from '@polymathnetwork/polkadot/types/create/createType';
import { Balance, IdentityId } from '@polymathnetwork/polkadot/types/interfaces';
import stringify from 'json-stable-stringify';

import { Context } from '~/Context';

/**
* Promisified version of a timeout
*
Expand Down Expand Up @@ -42,3 +46,31 @@ export function unserialize(id: string): Record<string, unknown> {
throw new Error(errorMsg);
}
}

/**
* Convert an Identity id string to an IdentityId object
*/
export function stringToIdentityId(identityId: string, context: Context): IdentityId {
return createType<'IdentityId'>(context.polymeshApi.registry, 'IdentityId', identityId);
}

/**
* Convert an IdentityId object to an Identity id string
*/
export function identityIdToString(identityId: IdentityId): string {
return identityId.toString();
}

/**
* Convert an human readable number to a Balance object
*/
export function numberToBalance(value: number, context: Context): Balance {
return createType<'Balance'>(context.polymeshApi.registry, 'Balance', value);
}

/**
* Convert a Balance object to an human readable number
*/
export function balanceToNumber(balance: Balance): number {
return Number(balance.toString()) / Math.pow(10, 6);
}
30 changes: 26 additions & 4 deletions yarn.lock
Expand Up @@ -670,10 +670,10 @@
resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto/-/wasm-crypto-1.0.1.tgz#80a2a6e8d63a7decdd1163cc49b263ccef4ad36d"
integrity sha512-l6izEdPXl4V8SBU9m3ct5PkHcdKZVDJMb10CFPNuNXT5OXMRaDs+Rlt/EHKjh8wbv8s9EOqy42BSHO8Qqrcg/g==

"@polymathnetwork/polkadot@0.101.0-beta.14":
version "0.101.0-beta.14"
resolved "https://registry.yarnpkg.com/@polymathnetwork/polkadot/-/polkadot-0.101.0-beta.14.tgz#1905bd3842e93772598d508b59edceaa9dbfeda4"
integrity sha512-/Y+HnwlFbEKfGvr3kIhEp83kUtAQ60ub4ZToPPbVgpwzLBURQW5mRlPVXm4c4mnD4/EyaOfUqmcJISwNNCMtEA==
"@polymathnetwork/polkadot@0.101.0-beta.15":
version "0.101.0-beta.15"
resolved "https://registry.yarnpkg.com/@polymathnetwork/polkadot/-/polkadot-0.101.0-beta.15.tgz#f224130e60b93163adfd555bbd643e5272be51a6"
integrity sha512-a9cKRLphBYtKhyiXkt1r0LGttCTXh71sUCC8SEmPGevXEakH/i1YnJlcfl6+UN1G2kvBymesd9IhOvNVUBWYqA==
dependencies:
"@babel/core" "7.8.4"
"@babel/register" "7.8.3"
Expand Down Expand Up @@ -914,6 +914,11 @@
resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.32.tgz#121f6917c4389db3923640b2e68de5fa64dda88e"
integrity sha512-q9Q6+eUEGwQkv4Sbst3J4PNgDOvpuVuKj79Hl/qnmBMEIPzB5QoFRUtjcgcg2xNUZyYUGXBk5wYIBKHt0A+Mxw==

"@types/json5@^0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=

"@types/lodash@^4.14.149":
version "4.14.149"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.149.tgz#1342d63d948c6062838fbf961012f74d4e638440"
Expand Down Expand Up @@ -5143,6 +5148,13 @@ json5@2.x, json5@^2.1.0:
dependencies:
minimist "^1.2.0"

json5@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
dependencies:
minimist "^1.2.0"

jsonfile@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
Expand Down Expand Up @@ -8762,6 +8774,16 @@ ts-mock-imports@^1.2.6:
resolved "https://registry.yarnpkg.com/ts-mock-imports/-/ts-mock-imports-1.2.6.tgz#5a98a398c3eadb7f75b6904984bb0ba5f3fbb912"
integrity sha512-rZjsIEBWx9a3RGUo4Rhj/hzEGB4GPWJx46fls9EJf4UBsf5SxS2qiozf6dQp0Ym/9LC5MArlXZbZ+93wJzAmjA==

tsconfig-paths@^3.9.0:
version "3.9.0"
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b"
integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==
dependencies:
"@types/json5" "^0.0.29"
json5 "^1.0.1"
minimist "^1.2.0"
strip-bom "^3.0.0"

tslib@^1.8.1, tslib@^1.9.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
Expand Down

0 comments on commit c4c917a

Please sign in to comment.