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.{' '}