src/leverage/leverage.test.ts
v0.1.0 · 2.2 KB
import { describe, expect, it } from 'vitest';
import type { RestClient } from '../rest/index.js';
import { FIXTURE_ACCOUNT } from '../testing/index.js';
import { createLeverageClient } from './index.js';
describe('leverage write serialization', () => {
it('reserves the symbol before awaiting an exposure check', async () => {
let writes = 0;
let release!: (value: boolean) => void;
const permission = new Promise<boolean>((resolve) => {
release = resolve;
});
const client = createLeverageClient({
accountId: FIXTURE_ACCOUNT,
timeoutMs: 80,
unknownLockMs: 160,
canChange: () => permission,
rest: {
userPost: async () => {
writes++;
},
} as unknown as RestClient,
session: {
getAvailableLeverageLevels: async () => [
{
symbol: 'BTC-USD',
leverage: '8',
id: null,
initialMargin: null,
maintenanceMargin: null,
maxNotional: null,
},
],
getUserLeverage: async () => new Map([['BTC-USD', 8]]),
},
});
const first = client.set('BTC-USD', 8);
expect(await client.set('BTC-USD', 8)).toEqual({ kind: 'locked' });
release(true);
expect(await first).toEqual({ kind: 'set', leverage: 8 });
expect(writes).toBe(1);
});
it('rechecks exposure after reading supported levels', async () => {
let safe = true,
writes = 0;
const client = createLeverageClient({
accountId: FIXTURE_ACCOUNT,
timeoutMs: 80,
unknownLockMs: 160,
canChange: () => safe,
rest: {
userPost: async () => {
writes++;
},
} as unknown as RestClient,
session: {
getAvailableLeverageLevels: async () => {
safe = false;
return [
{
symbol: 'BTC-USD',
leverage: '8',
id: null,
initialMargin: null,
maintenanceMargin: null,
maxNotional: null,
},
];
},
getUserLeverage: async () => new Map(),
},
});
expect(await client.set('BTC-USD', 8)).toEqual({ kind: 'locked' });
expect(writes).toBe(0);
});
});