Skip to content

Commit f740be3

Browse files
committed
add unit tests
1 parent cbc1fb6 commit f740be3

2 files changed

Lines changed: 59 additions & 6 deletions

File tree

workspaces/scorecard/plugins/scorecard-backend-module-dependabot/src/clients/DependabotClient.test.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@
1515
*/
1616

1717
import { ConfigReader } from '@backstage/config';
18-
import { DefaultGithubCredentialsProvider } from '@backstage/integration';
18+
import {
19+
DefaultGithubCredentialsProvider,
20+
ScmIntegrations,
21+
} from '@backstage/integration';
1922
import { DependabotClient } from './DependabotClient';
2023

2124
const mockPaginate = jest.fn();
@@ -112,6 +115,22 @@ describe('DependabotClient', () => {
112115
expect(mockPaginate).not.toHaveBeenCalled();
113116
});
114117

118+
it('throws when GitHub API base URL is missing', async () => {
119+
jest.spyOn(ScmIntegrations, 'fromConfig').mockReturnValueOnce({
120+
github: {
121+
byUrl: jest.fn().mockReturnValue({
122+
config: {},
123+
}),
124+
},
125+
} as any);
126+
const clientWithoutApiBaseUrl = new DependabotClient(config, logger);
127+
128+
await expect(
129+
clientWithoutApiBaseUrl.getAlerts(url, repo, 'critical'),
130+
).rejects.toThrow(`Missing GitHub API base URL for '${url}'`);
131+
expect(mockPaginate).not.toHaveBeenCalled();
132+
});
133+
115134
it('throws when Octokit paginate fails', async () => {
116135
mockPaginate.mockRejectedValueOnce(new Error('GitHub API error: 403'));
117136

workspaces/scorecard/plugins/scorecard-backend-module-dependabot/src/metricProviders/DependabotMetricProvider.test.ts

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616

1717
import { ConfigReader } from '@backstage/config';
18+
import { CATALOG_FILTER_EXISTS } from '@backstage/catalog-client';
1819
import type { Entity } from '@backstage/catalog-model';
1920
import { DependabotMetricProvider } from './DependabotMetricProvider';
2021
import { DEPENDABOT_SEVERITY_METRIC } from './DependabotConfig';
@@ -86,6 +87,8 @@ describe('DependabotMetricProvider', () => {
8687
expect(metric.description).toBe(
8788
DEPENDABOT_SEVERITY_METRIC[severity].description,
8889
);
90+
expect(metric.type).toBe('number');
91+
expect(metric.history).toBe(true);
8992
},
9093
);
9194
});
@@ -131,11 +134,10 @@ describe('DependabotMetricProvider', () => {
131134
mockLogger,
132135
'critical',
133136
);
134-
const filter = provider.getCatalogFilter();
135-
expect(
136-
filter['metadata.annotations.github.com/project-slug'],
137-
).toBeDefined();
138-
expect(filter['metadata.annotations.github.com/dependabot']).toBe('true');
137+
expect(provider.getCatalogFilter()).toEqual({
138+
'metadata.annotations.github.com/project-slug': CATALOG_FILTER_EXISTS,
139+
'metadata.annotations.github.com/dependabot': 'true',
140+
});
139141
});
140142
});
141143

@@ -175,6 +177,20 @@ describe('DependabotMetricProvider', () => {
175177
"Invalid format of 'github.com/project-slug'",
176178
);
177179
});
180+
181+
it.each(['/repo', 'owner/'])(
182+
'throws when project-slug has an empty owner or repo segment: %s',
183+
projectSlug => {
184+
const provider = new DependabotMetricProvider(
185+
mockConfig,
186+
mockLogger,
187+
'critical',
188+
);
189+
expect(() => provider.getRepository(entity(projectSlug))).toThrow(
190+
"Invalid format of 'github.com/project-slug'",
191+
);
192+
},
193+
);
178194
});
179195

180196
describe('calculateMetric', () => {
@@ -214,5 +230,23 @@ describe('DependabotMetricProvider', () => {
214230
);
215231
expect(await provider.calculateMetric(entity())).toBe(0);
216232
});
233+
234+
it('propagates errors when getAlerts fails', async () => {
235+
mockGetAlerts.mockRejectedValueOnce(new Error('dependabot unavailable'));
236+
const provider = new DependabotMetricProvider(
237+
mockConfig,
238+
mockLogger,
239+
'critical',
240+
);
241+
242+
await expect(provider.calculateMetric(entity())).rejects.toThrow(
243+
'dependabot unavailable',
244+
);
245+
expect(mockGetAlerts).toHaveBeenCalledWith(
246+
'https://github.com/owner/repo',
247+
{ owner: 'owner', repo: 'repo' },
248+
'critical',
249+
);
250+
});
217251
});
218252
});

0 commit comments

Comments
 (0)