feat(ui): branch selectors in the GitLab merge request create form

This commit is contained in:
2026-08-16 16:27:48 +00:00
parent c25e16d093
commit d5dea0c004
18 changed files with 188 additions and 21 deletions
+33
View File
@@ -263,6 +263,39 @@ describe('createWebGitLabAPI', () => {
await expect(api.mrMerge({ directory: '/workspace', number: 12 })).rejects.toThrow('Bad Gateway');
});
it('parses branches and the default branch from repoBranches', async () => {
runtimeFetchMock.mockResolvedValueOnce(Response.json({ branches: ['main', 'feat/api'], defaultBranch: 'main' }));
const api = await createAPI();
await expect(api.repoBranches('group', 'sub')).resolves.toEqual({ branches: ['main', 'feat/api'], defaultBranch: 'main' });
expect(runtimeFetchMock).toHaveBeenCalledWith('/api/gitlab/repo/branches?namespace=group&project=sub', {
method: 'GET',
headers: { Accept: 'application/json' },
});
});
it('defaults defaultBranch to null when repoBranches omits it', async () => {
runtimeFetchMock.mockResolvedValueOnce(Response.json({ branches: ['main'] }));
const api = await createAPI();
await expect(api.repoBranches('group', 'sub')).resolves.toEqual({ branches: ['main'], defaultBranch: null });
});
it('throws the server error message when repoBranches fails', async () => {
runtimeFetchMock.mockResolvedValueOnce(Response.json({ error: 'GitLab rate limited' }, { status: 503 }));
const api = await createAPI();
await expect(api.repoBranches('group', 'sub')).rejects.toThrow('GitLab rate limited');
});
it('throws the response status text when repoBranches has no parseable payload', async () => {
runtimeFetchMock.mockResolvedValueOnce(new Response('upstream gone', { status: 502, statusText: 'Bad Gateway' }));
const api = await createAPI();
await expect(api.repoBranches('group', 'sub')).rejects.toThrow('Bad Gateway');
});
it('throws the server error message on {error} payloads', async () => {
runtimeFetchMock.mockResolvedValueOnce(Response.json({ error: 'Not connected to GitLab' }, { status: 401 }));
+5 -2
View File
@@ -232,7 +232,7 @@ export const createWebGitLabAPI = ({ urls }: WebGitLabAPIOptions): GitLabAPI =>
};
},
async repoBranches(namespace: string, project: string): Promise<string[]> {
async repoBranches(namespace: string, project: string): Promise<GitLabBranchesResult> {
const response = await runtimeFetch(
`/api/gitlab/repo/branches?namespace=${encodeURIComponent(namespace)}&project=${encodeURIComponent(project)}`,
{ method: 'GET', headers: { Accept: 'application/json' } }
@@ -241,6 +241,9 @@ export const createWebGitLabAPI = ({ urls }: WebGitLabAPIOptions): GitLabAPI =>
if (!response.ok || !body) {
throw new Error(body?.error || response.statusText || 'Failed to fetch GitLab repo branches');
}
return body.branches ?? [];
return {
branches: body.branches ?? [],
defaultBranch: body.defaultBranch ?? null,
};
},
});