@yoroi/portfolio
Version:
The Portfolio package of Yoroi SDK
166 lines (164 loc) • 7.07 kB
JavaScript
;
var _common = require("@yoroi/common");
var _balanceStorageMaker = require("./balance-storage-maker");
var _token = require("../token.mocks");
var _deserializers = require("../../transformers/deserializers");
var _tokenBalance = require("../token-balance.mocks");
describe('portfolioBalanceStorageMaker', () => {
let balanceStorage;
let primaryBreakdownStorage;
beforeEach(() => {
balanceStorage = createMockStorage('v2/wallets/id/balance/', _deserializers.deserializers.tokenAmount);
primaryBreakdownStorage = createMockStorage('v2/wallets/id/primary-breakdown/', _deserializers.deserializers.primaryBreakdown);
balanceStorage.clear();
primaryBreakdownStorage.clear();
jest.clearAllMocks();
});
it('should instantiate storage', () => {
const storage = (0, _balanceStorageMaker.portfolioBalanceStorageMaker)({
balanceStorage,
primaryBreakdownStorage,
primaryTokenId: _token.tokenMocks.primaryETH.info.id
});
expect(storage).toBeDefined();
expect(Object.isFrozen(storage)).toBe(true);
});
it('should save balances entries', () => {
const {
balances
} = (0, _balanceStorageMaker.portfolioBalanceStorageMaker)({
balanceStorage,
primaryBreakdownStorage,
primaryTokenId: _token.tokenMocks.primaryETH.info.id
});
balances.save(_tokenBalance.tokenBalanceMocks.storage.entries1);
expect(balanceStorage.multiSet).toHaveBeenCalledWith(_tokenBalance.tokenBalanceMocks.storage.entries1, _common.storageSerializer);
});
it('should read balances entries', () => {
const nftCryptoKitty = _token.tokenMocks.nftCryptoKitty.info;
const rnftWhatever = _token.tokenMocks.rnftWhatever.info;
const {
balances
} = (0, _balanceStorageMaker.portfolioBalanceStorageMaker)({
balanceStorage,
primaryBreakdownStorage,
primaryTokenId: _token.tokenMocks.primaryETH.info.id
});
balances.save(_tokenBalance.tokenBalanceMocks.storage.entries1);
const keys = [nftCryptoKitty.id, rnftWhatever.id];
const result = balances.read(keys);
expect(result).toEqual([[nftCryptoKitty.id, _tokenBalance.tokenBalanceMocks.nftCryptoKitty], [rnftWhatever.id, _tokenBalance.tokenBalanceMocks.rnftWhatever]]);
expect(balanceStorage.multiGet).toHaveBeenCalledWith(keys, _deserializers.deserializers.tokenAmount);
});
it('should clear all portfolio records', () => {
const {
clear,
balances,
primaryBreakdown
} = (0, _balanceStorageMaker.portfolioBalanceStorageMaker)({
balanceStorage,
primaryBreakdownStorage,
primaryTokenId: _token.tokenMocks.primaryETH.info.id
});
balances.save(_tokenBalance.tokenBalanceMocks.storage.entries1);
primaryBreakdown.save(_tokenBalance.tokenBalanceMocks.primaryETHBreakdown);
let balanceResult = balances.all();
let primaryBreakdownResult = primaryBreakdown.read();
expect(balanceResult).toEqual(_tokenBalance.tokenBalanceMocks.storage.entries1);
expect(primaryBreakdownResult).toEqual(_tokenBalance.tokenBalanceMocks.primaryETHBreakdown);
clear();
balanceResult = balances.all();
primaryBreakdownResult = primaryBreakdown.read();
// keys are gone
expect(balanceResult).toEqual([]);
expect(primaryBreakdownResult).toEqual(null);
expect(balanceStorage.clear).toHaveBeenCalled();
expect(primaryBreakdownStorage.clear).toHaveBeenCalled();
});
it('should return all keys', () => {
const {
balances,
primaryBreakdown
} = (0, _balanceStorageMaker.portfolioBalanceStorageMaker)({
balanceStorage,
primaryBreakdownStorage,
primaryTokenId: _token.tokenMocks.primaryETH.info.id
});
balances.save(_tokenBalance.tokenBalanceMocks.storage.entries1);
primaryBreakdown.save(_tokenBalance.tokenBalanceMocks.primaryETHBreakdown);
let balanceResult = balances.keys();
expect(balanceResult).toEqual([...new Map(_tokenBalance.tokenBalanceMocks.storage.entries1).keys()]);
});
it('should call clear', () => {
const {
balances,
primaryBreakdown
} = (0, _balanceStorageMaker.portfolioBalanceStorageMaker)({
balanceStorage,
primaryBreakdownStorage,
primaryTokenId: _token.tokenMocks.primaryETH.info.id
});
balances.clear();
primaryBreakdown.clear();
expect(balanceStorage.clear).toHaveBeenCalled();
expect(primaryBreakdownStorage.clear).toHaveBeenCalled();
});
});
function createMockStorage() {
let path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '/';
let deserializer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : JSON.parse;
let serializer = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _common.storageSerializer;
let storage = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new Map();
let subscriptions = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : new Set();
const withPath = key => `${path}${key}`;
return {
join: jest.fn(folderName => createMockStorage(`${path}${folderName}`, deserializer, serializer, storage, subscriptions)),
getItem: jest.fn(function (key) {
let parser = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : deserializer;
const item = storage.get(withPath(key)) ?? null;
return parser(item);
}),
multiGet: jest.fn(function (keys) {
let parser = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : deserializer;
return keys.map(key => [key, parser(storage.get(withPath(key)) ?? null)]);
}),
setItem: jest.fn(function (key, value) {
let stringifier = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : serializer;
storage.set(withPath(key), stringifier(value));
}),
multiSet: jest.fn(function (tuples) {
let stringifier = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : serializer;
tuples.forEach(_ref => {
let [key, value] = _ref;
storage.set(withPath(key), stringifier(value));
});
}),
removeItem: jest.fn(key => {
storage.delete(withPath(key));
}),
removeFolder: jest.fn(folderName => {
const prefix = `${path}${folderName}`;
const keysToRemove = [...storage.keys()].filter(key => key.startsWith(prefix));
keysToRemove.forEach(key => storage.delete(key));
}),
multiRemove: jest.fn(keys => {
keys.forEach(key => storage.delete(withPath(key)));
}),
getAllKeys: jest.fn(() => {
const withoutPath = absolutePath => absolutePath.slice(path.length);
return [...storage.keys()].filter(key => key.startsWith(path)).map(key => withoutPath(key));
}),
clear: jest.fn(() => {
storage.clear();
}),
onChange: jest.fn((_keysToObserve, callback) => {
subscriptions.add(callback);
return {
unsubscribe: jest.fn(() => {
subscriptions.delete(callback);
})
};
})
};
}
//# sourceMappingURL=balance-storage-maker.test.js.map