import type { DataSourceCredential } from './types' import { fireEvent, render, screen } from '@testing-library/react' import { CredentialTypeEnum } from '@/app/components/plugins/plugin-auth/types' import Operator from './operator' /** * Operator Component Tests * Using Unit approach with mocked Dropdown to isolate item rendering logic. */ // Helper to open dropdown const openDropdown = () => { fireEvent.click(screen.getByRole('button')) } describe('Operator Component', () => { const mockOnAction = vi.fn() const mockOnRename = vi.fn() const createMockCredential = (type: CredentialTypeEnum): DataSourceCredential => ({ id: 'test-id', name: 'Test Credential', credential: {}, type, is_default: false, avatar_url: '', }) beforeEach(() => { vi.clearAllMocks() }) describe('Conditional Action Rendering', () => { it('should render correct actions for API_KEY type', async () => { // Arrange const credential = createMockCredential(CredentialTypeEnum.API_KEY) // Act render() openDropdown() // Assert expect(await screen.findByText('plugin.auth.setDefault')).toBeInTheDocument() expect(screen.getByText('common.operation.edit')).toBeInTheDocument() expect(screen.getByText('common.operation.remove')).toBeInTheDocument() expect(screen.queryByText('common.operation.rename')).not.toBeInTheDocument() expect(screen.queryByText('common.dataSource.notion.changeAuthorizedPages')).not.toBeInTheDocument() }) it('should render correct actions for OAUTH2 type', async () => { // Arrange const credential = createMockCredential(CredentialTypeEnum.OAUTH2) // Act render() openDropdown() // Assert expect(await screen.findByText('plugin.auth.setDefault')).toBeInTheDocument() expect(screen.getByText('common.operation.rename')).toBeInTheDocument() expect(screen.getByText('common.dataSource.notion.changeAuthorizedPages')).toBeInTheDocument() expect(screen.getByText('common.operation.remove')).toBeInTheDocument() expect(screen.queryByText('common.operation.edit')).not.toBeInTheDocument() }) }) describe('Action Callbacks', () => { it('should call onRename when "rename" action is selected', async () => { // Arrange const credential = createMockCredential(CredentialTypeEnum.OAUTH2) render() // Act openDropdown() fireEvent.click(await screen.findByText('common.operation.rename')) // Assert expect(mockOnRename).toHaveBeenCalledTimes(1) expect(mockOnAction).not.toHaveBeenCalled() }) it('should handle missing onRename gracefully when "rename" action is selected', async () => { // Arrange const credential = createMockCredential(CredentialTypeEnum.OAUTH2) render() // Act & Assert openDropdown() const renameBtn = await screen.findByText('common.operation.rename') expect(() => fireEvent.click(renameBtn)).not.toThrow() }) it('should call onAction for "setDefault" action', async () => { // Arrange const credential = createMockCredential(CredentialTypeEnum.API_KEY) render() // Act openDropdown() fireEvent.click(await screen.findByText('plugin.auth.setDefault')) // Assert expect(mockOnAction).toHaveBeenCalledWith('setDefault', credential) }) it('should call onAction for "edit" action', async () => { // Arrange const credential = createMockCredential(CredentialTypeEnum.API_KEY) render() // Act openDropdown() fireEvent.click(await screen.findByText('common.operation.edit')) // Assert expect(mockOnAction).toHaveBeenCalledWith('edit', credential) }) it('should call onAction for "change" action', async () => { // Arrange const credential = createMockCredential(CredentialTypeEnum.OAUTH2) render() // Act openDropdown() fireEvent.click(await screen.findByText('common.dataSource.notion.changeAuthorizedPages')) // Assert expect(mockOnAction).toHaveBeenCalledWith('change', credential) }) it('should call onAction for "delete" action', async () => { // Arrange const credential = createMockCredential(CredentialTypeEnum.API_KEY) render() // Act openDropdown() fireEvent.click(await screen.findByText('common.operation.remove')) // Assert expect(mockOnAction).toHaveBeenCalledWith('delete', credential) }) }) })