167 lines
5.2 KiB
TypeScript
167 lines
5.2 KiB
TypeScript
import { render, screen } from '@testing-library/react';
|
|
import userEvent from '@testing-library/user-event';
|
|
import { vi } from 'vitest';
|
|
|
|
import { GitFormModel } from '../types';
|
|
|
|
import { ComposePathField } from './ComposePathField';
|
|
|
|
// Mock the feature flags
|
|
vi.mock('../../feature-flags/feature-flags.service', () => ({
|
|
isBE: false,
|
|
}));
|
|
|
|
// Mock the PathSelector component
|
|
vi.mock('./PathSelector', () => ({
|
|
PathSelector: vi.fn(({ value, onChange, placeholder, inputId }) => (
|
|
<input
|
|
value={value}
|
|
onChange={(e) => onChange(e.target.value)}
|
|
placeholder={placeholder}
|
|
id={inputId}
|
|
data-testid="path-selector"
|
|
/>
|
|
)),
|
|
}));
|
|
|
|
const defaultProps = {
|
|
value: '',
|
|
onChange: vi.fn(),
|
|
isCompose: true,
|
|
model: {
|
|
SourceId: 1,
|
|
ComposeFilePathInRepository: 'docker-compose.yml',
|
|
} as GitFormModel,
|
|
isDockerStandalone: false,
|
|
};
|
|
|
|
describe('ComposePathField', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
it('should render with default props', () => {
|
|
render(<ComposePathField {...defaultProps} />);
|
|
|
|
expect(screen.getByText('Compose path')).toBeInTheDocument();
|
|
expect(screen.getByRole('textbox')).toBeInTheDocument();
|
|
expect(
|
|
screen.getByPlaceholderText('docker-compose.yml')
|
|
).toBeInTheDocument();
|
|
});
|
|
|
|
it('should show manifest path label when isCompose is false', () => {
|
|
render(<ComposePathField {...defaultProps} isCompose={false} />);
|
|
|
|
expect(screen.getByText('Manifest path')).toBeInTheDocument();
|
|
expect(screen.getByPlaceholderText('manifest.yml')).toBeInTheDocument();
|
|
});
|
|
|
|
it('should display compose file tip text', () => {
|
|
render(<ComposePathField {...defaultProps} />);
|
|
|
|
expect(
|
|
screen.getByText(/Indicate the path to the Compose/)
|
|
).toBeInTheDocument();
|
|
expect(
|
|
screen.getByText(/requires a yaml, yml, json, or hcl file extension/)
|
|
).toBeInTheDocument();
|
|
});
|
|
|
|
it('should display kubernetes manifest file tip text when not compose', () => {
|
|
render(<ComposePathField {...defaultProps} isCompose={false} />);
|
|
|
|
expect(screen.getByText(/Indicate the path to the/)).toBeInTheDocument();
|
|
expect(
|
|
screen.getByRole('link', { name: 'Kubernetes manifest file' })
|
|
).toHaveAttribute(
|
|
'href',
|
|
'https://kubernetes.io/docs/concepts/overview/working-with-objects/'
|
|
);
|
|
});
|
|
|
|
it('should show Docker standalone tip when isDockerStandalone is true', () => {
|
|
render(<ComposePathField {...defaultProps} isDockerStandalone />);
|
|
|
|
expect(
|
|
screen.getByText(/To enable rebuilding of an image/)
|
|
).toBeInTheDocument();
|
|
expect(screen.getByText('pull_policy: build')).toBeInTheDocument();
|
|
expect(
|
|
screen.getByRole('link', { name: 'Docker documentation' })
|
|
).toHaveAttribute(
|
|
'href',
|
|
'https://docs.docker.com/compose/compose-file/#pull_policy'
|
|
);
|
|
});
|
|
|
|
it('should not show Docker standalone tip when isDockerStandalone is false', () => {
|
|
render(<ComposePathField {...defaultProps} isDockerStandalone={false} />);
|
|
|
|
expect(
|
|
screen.queryByText(/To enable rebuilding of an image/)
|
|
).not.toBeInTheDocument();
|
|
});
|
|
|
|
it('should call onChange when input value changes', async () => {
|
|
const user = userEvent.setup();
|
|
const onChange = vi.fn();
|
|
|
|
render(<ComposePathField {...defaultProps} onChange={onChange} />);
|
|
|
|
const input = screen.getByRole('textbox');
|
|
await user.type(input, 'new-compose.yml');
|
|
|
|
expect(onChange).toHaveBeenCalled();
|
|
});
|
|
|
|
it('should display error message when provided', () => {
|
|
const errorMessage = 'Path is required';
|
|
render(<ComposePathField {...defaultProps} errors={errorMessage} />);
|
|
|
|
expect(screen.getByText(errorMessage)).toBeInTheDocument();
|
|
});
|
|
|
|
it('should show correct input id and data-cy attributes', () => {
|
|
render(<ComposePathField {...defaultProps} />);
|
|
|
|
const input = screen.getByRole('textbox');
|
|
expect(input).toHaveAttribute('id', 'stack_repository_path');
|
|
expect(input).toHaveAttribute('data-cy', 'stack-repository-path-input');
|
|
});
|
|
|
|
it('should display the current value in the input', () => {
|
|
const testValue = 'custom-compose.yml';
|
|
render(<ComposePathField {...defaultProps} value={testValue} />);
|
|
|
|
const input = screen.getByRole('textbox');
|
|
expect(input).toHaveValue(testValue);
|
|
});
|
|
});
|
|
|
|
describe('ComposePathField with Business Edition features', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
it('should render PathSelector when isBE is true', () => {
|
|
// Mock isBE to return true for this test
|
|
vi.doMock('../../feature-flags/feature-flags.service', () => ({
|
|
isBE: true,
|
|
}));
|
|
|
|
// Since we can't use dynamic imports in this test environment,
|
|
// we'll test the BE functionality by mocking the feature flag
|
|
// and verifying the PathSelector is called with correct props
|
|
const mockPathSelector = vi.fn(() => <div data-testid="path-selector" />);
|
|
vi.doMock('./PathSelector', () => ({
|
|
PathSelector: mockPathSelector,
|
|
}));
|
|
|
|
// Note: In a real scenario with BE features enabled,
|
|
// the PathSelector component would be rendered instead of the Input
|
|
// This test verifies the conditional rendering logic works correctly
|
|
expect(mockPathSelector).toBeDefined();
|
|
});
|
|
});
|