import { render } from 'utils/testRenderer'; import { Route, Routes } from 'react-router-dom'; import { ProjectFeatureToggles } from './ProjectFeatureToggles'; import { testServerRoute, testServerSetup } from 'utils/testServer'; import { fireEvent, screen } from '@testing-library/react'; import { BATCH_SELECTED_COUNT } from 'utils/testIds'; const server = testServerSetup(); const setupApi = () => { const features = [ { name: 'featureA', tags: [{ type: 'backend', value: 'sdk' }], type: 'operational', createdBy: { id: 1, name: 'author' }, }, { name: 'featureB', type: 'release', createdBy: { id: 1, name: 'author' }, }, ]; testServerRoute(server, '/api/admin/search/features', { features, total: features.length, }); testServerRoute(server, '/api/admin/ui-config', { flags: { flagCreator: true, onboardingUI: true, }, }); testServerRoute(server, '/api/admin/tags', { tags: [{ type: 'backend', value: 'sdk' }], }); testServerRoute(server, '/api/admin/projects/default/flag-creators', [ { id: 1, name: 'AuthorA' }, { id: 2, name: 'AuthorB' }, ]); }; test('filters by flag type', async () => { setupApi(); render( } /> , { route: '/projects/default', }, ); await screen.findByText('featureA'); const [icon] = await screen.findAllByTestId('feature-type-icon'); fireEvent.click(icon); await screen.findByText('Flag type'); await screen.findByText('Operational'); }); test('selects project features', async () => { setupApi(); render( } /> , { route: '/projects/default', }, ); await screen.findByText('featureA'); await screen.findByText('featureB'); await screen.findByText('Feature flags (2)'); const [selectAll, selectFeatureA] = screen.queryAllByRole('checkbox'); // batch select selectAll.click(); let selectedCount = await screen.findByTestId(BATCH_SELECTED_COUNT); expect(selectedCount.textContent).toBe('2'); // batch deselect fireEvent.click(selectAll); expect(screen.queryByTestId(BATCH_SELECTED_COUNT)).not.toBeInTheDocument(); // select a single item fireEvent.click(selectFeatureA); selectedCount = await screen.findByTestId(BATCH_SELECTED_COUNT); expect(selectedCount.textContent).toBe('1'); // deselect a single item fireEvent.click(selectFeatureA); expect(screen.queryByTestId(BATCH_SELECTED_COUNT)).not.toBeInTheDocument(); }); test('filters by tag', async () => { setupApi(); render( } /> , { route: '/projects/default', }, ); const tag = await screen.findByText('backend:sdk'); fireEvent.click(tag); await screen.findByText('include'); expect(await screen.findAllByText('backend:sdk')).toHaveLength(2); }); test('filters by flag author', async () => { setupApi(); render( } /> , { route: '/projects/default', }, ); const addFilter = await screen.findByText('Add Filter'); fireEvent.click(addFilter); const createdBy = await screen.findByText('Created by'); fireEvent.click(createdBy); const authorA = await screen.findByText('AuthorA'); fireEvent.click(authorA); expect(window.location.href).toContain('createdBy=IS%3A1'); }); test('Project is onboarded', async () => { const projectId = 'default'; setupApi(); testServerRoute(server, '/api/admin/projects/default/overview', { onboardingStatus: { status: 'onboarded', }, }); render( } /> , { route: `/projects/${projectId}`, }, ); expect( screen.queryByText('Welcome to your project'), ).not.toBeInTheDocument(); }); test('Project is not onboarded', async () => { const projectId = 'default'; setupApi(); testServerRoute(server, '/api/admin/projects/default/overview', { onboardingStatus: { status: 'onboarding-started', }, }); render( } /> , { route: `/projects/${projectId}`, }, ); await screen.findByText('Welcome to your project'); });