feat: add RepoOwnerPicker tests and prettier linting

Signed-off-by: asheen1234 <sergeantnumnumz@gmail.com>
This commit is contained in:
asheen1234
2026-03-30 21:12:40 -04:00
parent 4204cd8bc7
commit 7eeadfa8e3
2 changed files with 161 additions and 5 deletions
@@ -25,11 +25,9 @@ import userEvent from '@testing-library/user-event';
describe('GitLabRepoOwnerPicker', () => {
const scaffolderApiMock: Partial<ScaffolderApi> = {
autocomplete: jest
.fn()
.mockResolvedValue({
results: [{ title: 'owner1' }, { title: 'owner2' }],
}),
autocomplete: jest.fn().mockResolvedValue({
results: [{ title: 'owner1' }, { title: 'owner2' }],
}),
};
it('renders an input field', async () => {
@@ -38,6 +38,10 @@ describe('RepoOwnerPicker', () => {
byHost: () => ({ type: 'github' }),
};
const mockIntegrationsApiGitLab: Partial<ScmIntegrationsApi> = {
byHost: () => ({ type: 'gitlab' }),
};
let mockScmAuthApi: Partial<ScmAuthApi>;
beforeEach(() => {
@@ -305,4 +309,158 @@ describe('RepoOwnerPicker', () => {
expect(getByText('abc123')).toBeInTheDocument();
});
});
describe('requestUserCredentialsGitLab', () => {
it('should call the scmAuthApi with the correct params', async () => {
const secretsKey = 'testKey';
const SecretsComponent = () => {
const { secrets } = useTemplateSecrets();
const secret = secrets[secretsKey];
return secret ? <div>{secret}</div> : null;
};
const { getByText } = await renderInTestApp(
<TestApiProvider
apis={[
[scmIntegrationsApiRef, mockIntegrationsApiGitLab],
[scmAuthApiRef, mockScmAuthApi],
[scaffolderApiRef, {}],
]}
>
<SecretsContextProvider>
<Form
validator={validator}
schema={{ type: 'string' }}
uiSchema={{
'ui:field': 'RepoOwnerPicker',
'ui:options': {
host: 'gitlab.com',
requestUserCredentials: {
secretsKey,
additionalScopes: { gitlab: ['workflow'] },
},
},
}}
fields={{
RepoOwnerPicker: RepoOwnerPicker as ScaffolderRJSFField<string>,
}}
/>
<SecretsComponent />
</SecretsContextProvider>
</TestApiProvider>,
);
await act(async () => {
// need to wait for the debounce to finish
await new Promise(resolve => setTimeout(resolve, 600));
});
expect(mockScmAuthApi.getCredentials).toHaveBeenCalledWith({
url: 'https://gitlab.com',
additionalScope: {
repoWrite: true,
customScopes: {
gitlab: ['workflow'],
},
},
});
expect(getByText('abc123')).toBeInTheDocument();
});
it('should call the scmAuthApi with the correct params if workspace is nested', async () => {
await renderInTestApp(
<TestApiProvider
apis={[
[scmIntegrationsApiRef, mockIntegrationsApiGitLab],
[scmAuthApiRef, mockScmAuthApi],
[scaffolderApiRef, {}],
]}
>
<SecretsContextProvider>
<Form
validator={validator}
schema={{ type: 'string' }}
uiSchema={{
'ui:field': 'RepoOwnerPicker',
'ui:options': {
host: 'gitlab.com',
requestUserCredentials: {
secretsKey: 'testKey',
},
},
}}
fields={{
RepoOwnerPicker: RepoOwnerPicker as ScaffolderRJSFField<string>,
}}
/>
</SecretsContextProvider>
</TestApiProvider>,
);
await act(async () => {
// need to wait for the debounce to finish
await new Promise(resolve => setTimeout(resolve, 600));
});
expect(mockScmAuthApi.getCredentials).toHaveBeenCalledWith({
url: 'https://gitlab.com',
additionalScope: {
repoWrite: true,
},
});
});
it('should not call the scmAuthApi if secret is available in the state', async () => {
const secretsKey = 'testKey';
const SecretsComponent = () => {
const { secrets } = useTemplateSecrets();
const secret = secrets[secretsKey];
return secret ? <div>{secret}</div> : null;
};
const { getByText } = await renderInTestApp(
<TestApiProvider
apis={[
[scmIntegrationsApiRef, mockIntegrationsApiGitLab],
[scmAuthApiRef, mockScmAuthApi],
[scaffolderApiRef, {}],
]}
>
<SecretsContextProvider initialSecrets={{ [secretsKey]: 'abc123' }}>
<Form
validator={validator}
schema={{ type: 'string' }}
uiSchema={{
'ui:field': 'RepoOwnerPicker',
'ui:options': {
host: 'gitlab.com',
requestUserCredentials: {
secretsKey,
additionalScopes: { gitlab: ['workflow'] },
},
},
}}
fields={{
RepoOwnerPicker: RepoOwnerPicker as ScaffolderRJSFField<string>,
}}
/>
<SecretsComponent />
</SecretsContextProvider>
</TestApiProvider>,
);
await act(async () => {
// need to wait for the debounce to finish
await new Promise(resolve => setTimeout(resolve, 600));
});
// as we already have a secret in the state, getCredentials should not be called again.
expect(mockScmAuthApi.getCredentials).toHaveBeenCalledTimes(0);
expect(getByText('abc123')).toBeInTheDocument();
});
});
});