import { render, renderGlobalModal, screen, userEvent, } from 'sentry-test/reactTestingLibrary'; import {Client} from 'sentry/api'; import RepositoryRow from 'sentry/components/repositoryRow'; describe('RepositoryRow', function () { beforeEach(function () { Client.clearMockResponses(); }); const repository = TestStubs.Repository(); const pendingRepo = TestStubs.Repository({ status: 'pending_deletion', }); const customRepo = TestStubs.Repository({ provider: { id: 'integrations:custom_scm', }, }); const customPendingRepo = TestStubs.Repository({ provider: { id: 'integrations:custom_scm', }, status: 'pending_deletion', }); const api = new Client(); describe('rendering with access', function () { const organization = TestStubs.Organization({ access: ['org:integrations'], }); const routerContext = TestStubs.routerContext([{organization}]); it('displays provider information', function () { render( , {context: routerContext} ); expect(screen.getByText(repository.name)).toBeInTheDocument(); expect(screen.getByText('github.com/example/repo-name')).toBeInTheDocument(); // Trash button should display enabled expect(screen.getByRole('button', {name: 'delete'})).toBeEnabled(); // No cancel button expect(screen.queryByRole('button', {name: 'Cancel'})).not.toBeInTheDocument(); }); it('displays cancel pending button', function () { render( , {context: routerContext} ); // Trash button should be disabled expect(screen.getByRole('button', {name: 'delete'})).toBeDisabled(); // Cancel button active expect(screen.getByRole('button', {name: 'Cancel'})).toBeInTheDocument(); expect(screen.getByRole('button', {name: 'Cancel'})).toBeEnabled(); }); }); describe('rendering without access', function () { const organization = TestStubs.Organization({ access: ['org:write'], }); const routerContext = TestStubs.routerContext([{organization}]); it('displays disabled trash', function () { render( , {context: routerContext} ); // Trash button should be disabled expect(screen.getByRole('button', {name: 'delete'})).toBeDisabled(); }); it('displays disabled cancel', function () { render( , {context: routerContext} ); // Cancel should be disabled expect(screen.getByRole('button', {name: 'Cancel'})).toBeDisabled(); }); }); describe('deletion', function () { const organization = TestStubs.Organization({ access: ['org:integrations'], }); const routerContext = TestStubs.routerContext([{organization}]); it('sends api request on delete', function () { const deleteRepo = Client.addMockResponse({ url: `/organizations/${organization.slug}/repos/${repository.id}/`, method: 'DELETE', statusCode: 204, body: {}, }); render( , {context: routerContext} ); renderGlobalModal(); userEvent.click(screen.getByRole('button', {name: 'delete'})); // Confirm modal userEvent.click(screen.getByRole('button', {name: 'Confirm'})); expect(deleteRepo).toHaveBeenCalled(); }); }); describe('cancel deletion', function () { const organization = TestStubs.Organization({ access: ['org:integrations'], }); const routerContext = TestStubs.routerContext([{organization}]); it('sends api request to cancel', function () { const cancel = Client.addMockResponse({ url: `/organizations/${organization.slug}/repos/${pendingRepo.id}/`, method: 'PUT', statusCode: 204, body: {}, }); render( , {context: routerContext} ); userEvent.click(screen.getByRole('button', {name: 'Cancel'})); expect(cancel).toHaveBeenCalled(); }); }); describe('renders custom_scm repo', function () { const organization = TestStubs.Organization({ access: ['org:integrations'], features: ['integrations-custom-scm'], }); const routerContext = TestStubs.routerContext([{organization}]); it('displays edit button', function () { render( , {context: routerContext} ); // Trash button should display enabled expect(screen.getByRole('button', {name: 'delete'})).toBeEnabled(); // No cancel button expect(screen.queryByRole('button', {name: 'Cancel'})).not.toBeInTheDocument(); // Edit button should display enabled expect(screen.getByRole('button', {name: 'edit'})).toBeEnabled(); }); it('disables edit button when cancel pending', function () { render( , {context: routerContext} ); // Trash button should be disabled expect(screen.getByRole('button', {name: 'delete'})).toBeDisabled(); // Edit button should be disabled expect(screen.getByRole('button', {name: 'edit'})).toBeDisabled(); // Cancel button active expect(screen.queryByRole('button', {name: 'Cancel'})).toBeEnabled(); }); }); });