Skip to content
markpaper

src/leverage/leverage.test.ts

v0.1.0 · 2.2 KB

Download file
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);
  });
});
All files