@unilogin/sdk
Version:
SDK is a JS library, that communicates with relayer. SDK allows managing contract, by creating basic contract-calling messages.
118 lines (85 loc) • 4.78 kB
text/typescript
import chai, {expect} from 'chai';
import sinon from 'sinon';
import sinonChai from 'sinon-chai';
import {providers, Wallet, utils} from 'ethers';
import {createMockProvider, getWallets} from 'ethereum-waffle';
import {TokensValueConverter, BalanceChecker, TokenDetails, ETHER_NATIVE_TOKEN, TEST_ACCOUNT_ADDRESS, waitUntil} from '@unilogin/commons';
import {AggregateBalanceObserver} from '../../../src/core/observers/AggregateBalanceObserver';
import {BalanceObserver} from '../../../src/core/observers/BalanceObserver';
import {createMockedPriceObserver} from '../../mock/PriceObserver';
import {SdkConfigDefault} from '../../../src/config/SdkConfigDefault';
import {TokensDetailsStore} from '../../../src/core/services/TokensDetailsStore';
chai.use(sinonChai);
describe('INT: AggregateBalanceObserver', () => {
let provider: providers.Provider;
let balanceChecker: BalanceChecker;
let balanceObserver: BalanceObserver;
let mockedAggregateBalanceObserver: AggregateBalanceObserver;
let wallet: Wallet;
const {mockedPriceObserver, resetCallCount} = createMockedPriceObserver();
const tokensValueConverter = new TokensValueConverter(SdkConfigDefault.observedCurrencies);
beforeEach(() => {
provider = createMockProvider();
[wallet] = getWallets(provider);
balanceChecker = new BalanceChecker(provider);
const observedTokens: TokenDetails[] = [
ETHER_NATIVE_TOKEN,
];
balanceObserver = new BalanceObserver(balanceChecker, TEST_ACCOUNT_ADDRESS, {tokensDetails: observedTokens} as TokensDetailsStore, 10);
mockedAggregateBalanceObserver = new AggregateBalanceObserver(balanceObserver, mockedPriceObserver, tokensValueConverter);
resetCallCount();
});
it('1 subscription - balance 0 -> prices changed', async () => {
const callback = sinon.spy();
const unsubscribe = mockedAggregateBalanceObserver.subscribe(callback);
await waitUntil(() => !!callback.firstCall);
expect(callback).to.have.been.calledOnce;
await mockedPriceObserver.execute();
await waitUntil(() => !!callback.secondCall);
expect(callback).to.have.been.calledTwice;
unsubscribe();
expect(callback.firstCall.args[0]).to.deep.eq({USD: 0, DAI: 0, SAI: 0, ETH: 0});
expect(callback.secondCall.args[0]).to.deep.eq({USD: 0, DAI: 0, SAI: 0, ETH: 0});
});
it('1 subscription - balance 0 -> balance changed -> prices changed', async () => {
const callback = sinon.spy();
const unsubscribe = mockedAggregateBalanceObserver.subscribe(callback);
await waitUntil(() => !!callback.firstCall);
expect(callback).to.have.been.calledOnce;
await wallet.sendTransaction({to: TEST_ACCOUNT_ADDRESS, value: utils.parseEther('0.5')});
await waitUntil(() => !!callback.secondCall);
expect(callback).to.have.been.calledTwice;
await mockedPriceObserver.execute();
await waitUntil(() => !!callback.thirdCall);
expect(callback).to.have.been.calledThrice;
unsubscribe();
expect(callback.firstCall.args[0]).to.deep.eq({USD: 0, DAI: 0, SAI: 0, ETH: 0});
expect(callback.secondCall.args[0]).to.deep.eq({USD: 109.105, DAI: 97.19, SAI: 97.19, ETH: 0.009465});
expect(callback.thirdCall.args[0]).to.deep.eq({USD: 919.255, DAI: 747.355, SAI: 747.355, ETH: 0.049465});
});
it('2 subscriptions - no change -> balance changed -> prices changed', async () => {
const callback1 = sinon.spy();
const callback2 = sinon.spy();
const unsubscribe1 = mockedAggregateBalanceObserver.subscribe(callback1);
const unsubscribe2 = mockedAggregateBalanceObserver.subscribe(callback2);
await waitUntil(() => !!callback1.firstCall);
expect(callback1).to.have.been.calledOnce;
await waitUntil(() => !!callback2.firstCall);
expect(callback2).to.have.been.calledOnce;
await wallet.sendTransaction({to: TEST_ACCOUNT_ADDRESS, value: utils.parseEther('0.5')});
await waitUntil(() => !!callback1.secondCall);
expect(callback1).to.have.been.calledTwice;
await waitUntil(() => !!callback2.secondCall);
expect(callback2).to.have.been.calledTwice;
unsubscribe1();
await mockedPriceObserver.execute();
await waitUntil(() => !!callback2.thirdCall);
expect(callback2).to.have.been.calledThrice;
unsubscribe2();
expect(callback1.firstCall.args[0]).to.deep.eq({USD: 0, DAI: 0, SAI: 0, ETH: 0});
expect(callback1.secondCall.args[0]).to.deep.eq({USD: 109.105, DAI: 97.19, SAI: 97.19, ETH: 0.009465});
expect(callback2.firstCall.args[0]).to.deep.eq({USD: 0, DAI: 0, SAI: 0, ETH: 0});
expect(callback2.secondCall.args[0]).to.deep.eq({USD: 109.105, DAI: 97.19, SAI: 97.19, ETH: 0.009465});
expect(callback2.thirdCall.args[0]).to.deep.eq({USD: 919.255, DAI: 747.355, SAI: 747.355, ETH: 0.049465});
});
});