import { BaseProvider, Network } from '@ethersproject/providers';
import { describe, test, expect } from 'vitest';

import Provider from '../src/provider';

class FakeProvider extends BaseProvider {
  async getNetwork(): Promise<Network> {
    return {
      name: 'FakeNetwork',
      chainId: -1,
    };
  }
}

describe('Provider', () => {
  test('throws if provider is not initiated', () => {
    const errorMessage = 'Provider should be initialized before use.';
    const provider = new Provider();
    expect(provider.all([])).rejects.toThrow(errorMessage);
    expect(provider.tryAll([])).rejects.toThrow(errorMessage);
    expect(provider.tryEach([], [])).rejects.toThrow(errorMessage);
  });

  test('throws if Multicall is not available', async () => {
    const errorMessage = 'Multicall contract is not available on this network.';
    const provider = new Provider();
    await provider.init(new FakeProvider(0));
    expect(() => provider.getEthBalance('')).toThrow(errorMessage);
    expect(provider.all([])).rejects.toThrow();
    expect(provider.tryAll([])).rejects.toThrow();
    expect(provider.tryEach([], [])).rejects.toThrow();
  });
});