import { BrokerAccountsService } from './broker-accounts.service'; import { TBankClientService } from './tbank-client.service'; import { CacheService } from '../../cache/cache.service'; describe('BrokerAccountsService', () => { const client = { getServiceClient: vi.fn(), callUnary: vi.fn(), } as unknown as TBankClientService; const cache = { getOrFetch: vi.fn(), } as unknown as CacheService; beforeEach(() => { vi.clearAllMocks(); }); it('returns only open brokerage and IIS accounts from cache wrapper', async () => { vi.mocked(cache.getOrFetch).mockImplementation( async (_prefix: string, _parts: string[], fetchFn: () => Promise) => ({ data: await fetchFn(), fromCache: false, cachedAt: '2026-06-16T02:30:00.000Z', }), ); vi.mocked(client.getServiceClient).mockReturnValue({ getAccounts: vi.fn() } as any); vi.mocked(client.callUnary).mockResolvedValue({ accounts: [ { id: '1', type: 'ACCOUNT_TYPE_TINKOFF', name: 'Broker', status: 'ACCOUNT_STATUS_OPEN' }, { id: '2', type: 'ACCOUNT_TYPE_TINKOFF_IIS', name: 'IIS', status: 'ACCOUNT_STATUS_OPEN' }, { id: '3', type: 'ACCOUNT_TYPE_INVEST_BOX', name: 'Box', status: 'ACCOUNT_STATUS_OPEN' }, { id: '4', type: 'ACCOUNT_TYPE_TINKOFF', name: 'Closed', status: 'ACCOUNT_STATUS_CLOSED' }, ], }); const service = new BrokerAccountsService(client, cache); const result = await service.findAll(); expect(result.data).toHaveLength(2); expect(result.data.map((account) => account.type)).toEqual(['brokerage', 'iis']); expect(result.meta.fromCache).toBe(false); expect(cache.getOrFetch).toHaveBeenCalledWith( 'tbank:accounts', ['open-brokerage-iis'], expect.any(Function), 'tbankAccountsTtl', ); }); });