From d568c06cf8d006f5048a0367f2d1e787711f39cf Mon Sep 17 00:00:00 2001 From: "@daniel-lxs" <57051444+daniel-lxs@users.noreply.github.com> Date: Wed, 23 Sep 2026 05:43:29 +0000 Subject: [PATCH] fix: distinguish source control setup actions by provider --- .../settings/SourceControl.test.tsx | 60 +++++++++++++++++-- .../src/components/settings/SourceControl.tsx | 1 + 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/apps/web/src/components/settings/SourceControl.test.tsx b/apps/web/src/components/settings/SourceControl.test.tsx index e9de1ba5d9..50d8599617 100644 --- a/apps/web/src/components/settings/SourceControl.test.tsx +++ b/apps/web/src/components/settings/SourceControl.test.tsx @@ -526,7 +526,9 @@ describe('SourceControl settings', () => { render(); - fireEvent.click(screen.getByRole('button', { name: 'Set it up' })); + fireEvent.click( + screen.getByRole('button', { name: 'Set it up for GitHub' }), + ); expect( screen.getByRole('button', { name: 'Create GitHub App' }), @@ -546,6 +548,44 @@ describe('SourceControl settings', () => { ).not.toBeInTheDocument(); }); + it('names each unconfigured setup action by provider and expands the chosen provider', () => { + state.configProviders = state.configProviders.map((provider) => ({ + ...provider, + configSatisfied: false, + })); + + render(); + + const providerNames = [ + 'GitHub', + 'GitLab', + 'Gitea', + 'Bitbucket Cloud', + 'Azure DevOps', + ]; + for (const name of providerNames) { + const button = screen.getByRole('button', { + name: `Set it up for ${name}`, + }); + expect(button).toHaveTextContent('Set it up'); + } + expect(screen.queryByRole('button', { name: 'Set it up' })).toBeNull(); + + fireEvent.click( + screen.getByRole('button', { name: 'Set it up for GitHub' }), + ); + + expect( + screen.getByRole('button', { name: 'Create GitHub App' }), + ).toBeInTheDocument(); + expect( + screen.queryByTestId('source-control-config-github'), + ).not.toBeInTheDocument(); + expect( + screen.getByRole('button', { name: 'Set it up for GitLab' }), + ).toBeInTheDocument(); + }); + it('shows the recommendation highlight copy when targeted from a setup link', () => { state.searchParams = 'highlight=github'; @@ -706,10 +746,12 @@ describe('SourceControl settings', () => { screen.queryByRole('button', { name: 'Refresh GitLab' }), ).not.toBeInTheDocument(); expect( - screen.getByRole('button', { name: 'Set it up' }), + screen.getByRole('button', { name: 'Set it up for GitLab' }), ).toBeInTheDocument(); - fireEvent.click(screen.getByRole('button', { name: 'Set it up' })); + fireEvent.click( + screen.getByRole('button', { name: 'Set it up for GitLab' }), + ); expect(screen.getByTestId('source-control-config-gitlab')).toHaveAttribute( 'data-show-setup-instructions', @@ -739,7 +781,9 @@ describe('SourceControl settings', () => { screen.queryByRole('button', { name: 'Refresh Azure DevOps' }), ).not.toBeInTheDocument(); - fireEvent.click(screen.getByRole('button', { name: 'Set it up' })); + fireEvent.click( + screen.getByRole('button', { name: 'Set it up for Azure DevOps' }), + ); expect(screen.getByTestId('source-control-config-ado')).toHaveAttribute( 'data-show-setup-instructions', @@ -760,8 +804,12 @@ describe('SourceControl settings', () => { render(); - fireEvent.click(screen.getAllByRole('button', { name: 'Set it up' })[0]!); - fireEvent.click(screen.getByRole('button', { name: 'Set it up' })); + fireEvent.click( + screen.getByRole('button', { name: 'Set it up for Gitea' }), + ); + fireEvent.click( + screen.getByRole('button', { name: 'Set it up for Azure DevOps' }), + ); expect( screen.getByTestId('source-control-config-gitea'), diff --git a/apps/web/src/components/settings/SourceControl.tsx b/apps/web/src/components/settings/SourceControl.tsx index 29da166c7c..c647b4e218 100644 --- a/apps/web/src/components/settings/SourceControl.tsx +++ b/apps/web/src/components/settings/SourceControl.tsx @@ -814,6 +814,7 @@ function SourceControlProviderBlock({ Not configured.{' '}