// @vitest-environment happy-dom
import { render, screen, waitFor } from '@testing-library/react';
import { userEvent } from '@testing-library/user-event';
import React from 'react';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { Config } from '../screens/config/config.js';
function mockFetchEmpty() {
vi.stubGlobal(
'fetch',
vi.fn(async (url: string) => {
if (url === '/api/vault/sources') return { ok: true, json: async () => [] } as Response;
if (url === '/api/vault/accounts') return { ok: true, json: async () => [] } as Response;
if (url === '/api/vault/settings')
return {
ok: true,
json: async () => ({
showBrowser: false,
fetchBankOfIsraelRates: true,
concurrentScraping: true,
}),
} as Response;
return { ok: false, json: async () => ({}) } as Response;
}),
);
}
beforeEach(() => {
mockFetchEmpty();
});
describe('Config tab navigation', () => {
it('renders Credentials tab by default', async () => {
render();
await waitFor(() => {
expect(screen.getByRole('tab', { name: 'Credentials' })).toBeTruthy();
});
expect(
screen.getByRole('tab', { name: 'Credentials' }).getAttribute('aria-selected'),
).toBe('true');
expect(screen.getByText(/no sources configured/i)).toBeTruthy();
});
it('shows server connection fields in Credentials tab', async () => {
render();
await waitFor(() => screen.getByLabelText(/server url/i));
expect(screen.getByLabelText(/api key/i)).toBeTruthy();
expect(screen.getByRole('button', { name: /test connection/i })).toBeTruthy();
});
it('switches to Settings tab on click', async () => {
render();
await waitFor(() => screen.getByRole('tab', { name: 'Settings' }));
await userEvent.click(screen.getByRole('tab', { name: 'Settings' }));
await waitFor(() => {
expect(screen.getByLabelText(/show browser/i)).toBeTruthy();
});
expect(screen.getByRole('tab', { name: 'Settings' }).getAttribute('aria-selected')).toBe('true');
expect(
screen.getByRole('tab', { name: 'Credentials' }).getAttribute('aria-selected'),
).toBe('false');
});
it('switches to Accounts tab on click', async () => {
render();
await waitFor(() => screen.getByRole('tab', { name: 'Accounts' }));
await userEvent.click(screen.getByRole('tab', { name: 'Accounts' }));
await waitFor(() => {
expect(screen.getByText(/no account records discovered/i)).toBeTruthy();
});
expect(screen.getByRole('tab', { name: 'Accounts' }).getAttribute('aria-selected')).toBe('true');
});
it('only renders the active panel', async () => {
render();
await waitFor(() => screen.getByText(/no sources/i));
expect(screen.queryByLabelText(/show browser/i)).toBeNull();
expect(screen.queryByText(/no account records/i)).toBeNull();
});
it('can navigate back to Credentials after switching away', async () => {
render();
await waitFor(() => screen.getByText(/no sources/i));
await userEvent.click(screen.getByRole('tab', { name: 'Settings' }));
await waitFor(() => screen.getByLabelText(/show browser/i));
await userEvent.click(screen.getByRole('tab', { name: 'Credentials' }));
await waitFor(() => {
expect(screen.getByText(/no sources configured/i)).toBeTruthy();
});
});
});