import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render as rtlRender, screen, fireEvent } from '@testing-library/react';
import React from 'react';
import { MantineProvider } from '@mantine/core';
import GitSettings from './GitSettings';
// Helper wrapper component for testing
const TestWrapper = ({ children }: { children: React.ReactNode }) => (
{children}
);
// Custom render function
const render = (ui: React.ReactElement) => {
return rtlRender(ui, { wrapper: TestWrapper });
};
describe('GitSettings', () => {
const mockOnInputChange = vi.fn();
const defaultProps = {
gitEnabled: false,
gitUrl: '',
gitUser: '',
gitToken: '',
gitAutoCommit: false,
gitCommitMsgTemplate: '',
gitCommitName: '',
gitCommitEmail: '',
onInputChange: mockOnInputChange,
};
beforeEach(() => {
vi.clearAllMocks();
});
it('renders all git settings fields', () => {
render();
expect(screen.getByText('Enable Git Repository')).toBeInTheDocument();
expect(screen.getByText('Git URL')).toBeInTheDocument();
expect(screen.getByText('Username')).toBeInTheDocument();
expect(screen.getByText('Access Token')).toBeInTheDocument();
expect(screen.getByText('Commit on Save')).toBeInTheDocument();
expect(screen.getByText('Commit Message Template')).toBeInTheDocument();
expect(screen.getByText('Commit Author')).toBeInTheDocument();
expect(screen.getByText('Commit Author Email')).toBeInTheDocument();
});
it('disables all inputs when git is not enabled', () => {
render();
expect(screen.getByPlaceholderText('Enter Git URL')).toBeDisabled();
expect(screen.getByPlaceholderText('Enter Git username')).toBeDisabled();
expect(screen.getByPlaceholderText('Enter Git token')).toBeDisabled();
const switches = screen.getAllByRole('switch');
const commitOnSaveSwitch = switches[1]; // Second switch is commit on save
expect(commitOnSaveSwitch).toBeDisabled();
});
it('enables all inputs when git is enabled', () => {
render();
expect(screen.getByPlaceholderText('Enter Git URL')).not.toBeDisabled();
expect(
screen.getByPlaceholderText('Enter Git username')
).not.toBeDisabled();
expect(screen.getByPlaceholderText('Enter Git token')).not.toBeDisabled();
const switches = screen.getAllByRole('switch');
const commitOnSaveSwitch = switches[1];
expect(commitOnSaveSwitch).not.toBeDisabled();
});
it('calls onInputChange when git enabled toggle is changed', () => {
render();
const switches = screen.getAllByRole('switch');
const gitEnabledSwitch = switches[0];
expect(gitEnabledSwitch).toBeDefined();
fireEvent.click(gitEnabledSwitch!);
expect(mockOnInputChange).toHaveBeenCalledWith('gitEnabled', true);
});
it('calls onInputChange when git URL is changed', () => {
render();
const urlInput = screen.getByPlaceholderText('Enter Git URL');
fireEvent.change(urlInput, {
target: { value: 'https://github.com/user/repo.git' },
});
expect(mockOnInputChange).toHaveBeenCalledWith(
'gitUrl',
'https://github.com/user/repo.git'
);
});
it('calls onInputChange when commit template is changed', () => {
render();
const templateInput = screen.getByPlaceholderText(
'Enter commit message template'
);
fireEvent.change(templateInput, {
target: { value: '${action}: ${filename}' },
});
expect(mockOnInputChange).toHaveBeenCalledWith(
'gitCommitMsgTemplate',
'${action}: ${filename}'
);
});
it('shows current values in form fields', () => {
const propsWithValues = {
...defaultProps,
gitEnabled: true,
gitUrl: 'https://github.com/test/repo.git',
gitUser: 'testuser',
gitCommitMsgTemplate: 'Update ${filename}',
};
render();
expect(
screen.getByDisplayValue('https://github.com/test/repo.git')
).toBeInTheDocument();
expect(screen.getByDisplayValue('testuser')).toBeInTheDocument();
expect(screen.getByDisplayValue('Update ${filename}')).toBeInTheDocument();
});
});