projectpulse-mcp 1.5.0 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/tools/analyze-code-scanning.js +1 -1
  2. package/dist/tools/analyze-code-scanning.js.map +1 -1
  3. package/dist/tools/analyze-dependencies.js +1 -1
  4. package/dist/tools/analyze-dependencies.js.map +1 -1
  5. package/dist/tools/check-ci-status.js +1 -1
  6. package/dist/tools/check-ci-status.js.map +1 -1
  7. package/dist/tools/compare-repos.js +1 -1
  8. package/dist/tools/compare-repos.js.map +1 -1
  9. package/dist/tools/get-dora-metrics.js +1 -1
  10. package/dist/tools/get-dora-metrics.js.map +1 -1
  11. package/dist/tools/get-health-score.js +1 -1
  12. package/dist/tools/get-health-score.js.map +1 -1
  13. package/dist/tools/get-repo-health.js +1 -1
  14. package/dist/tools/get-repo-health.js.map +1 -1
  15. package/package.json +5 -3
  16. package/dist/analytics/dora.test.d.ts +0 -2
  17. package/dist/analytics/dora.test.d.ts.map +0 -1
  18. package/dist/analytics/dora.test.js +0 -164
  19. package/dist/analytics/dora.test.js.map +0 -1
  20. package/dist/scoring/health-score.test.d.ts +0 -2
  21. package/dist/scoring/health-score.test.d.ts.map +0 -1
  22. package/dist/scoring/health-score.test.js +0 -249
  23. package/dist/scoring/health-score.test.js.map +0 -1
  24. package/dist/security/openssf-client.test.d.ts +0 -2
  25. package/dist/security/openssf-client.test.d.ts.map +0 -1
  26. package/dist/security/openssf-client.test.js +0 -70
  27. package/dist/security/openssf-client.test.js.map +0 -1
  28. package/dist/tools/analyze-code-scanning.test.d.ts +0 -2
  29. package/dist/tools/analyze-code-scanning.test.d.ts.map +0 -1
  30. package/dist/tools/analyze-code-scanning.test.js +0 -72
  31. package/dist/tools/analyze-code-scanning.test.js.map +0 -1
  32. package/dist/tools/analyze-dependencies.test.d.ts +0 -2
  33. package/dist/tools/analyze-dependencies.test.d.ts.map +0 -1
  34. package/dist/tools/analyze-dependencies.test.js +0 -65
  35. package/dist/tools/analyze-dependencies.test.js.map +0 -1
  36. package/dist/tools/check-ci-status.test.d.ts +0 -2
  37. package/dist/tools/check-ci-status.test.d.ts.map +0 -1
  38. package/dist/tools/check-ci-status.test.js +0 -90
  39. package/dist/tools/check-ci-status.test.js.map +0 -1
  40. package/dist/tools/compare-repos.test.d.ts +0 -2
  41. package/dist/tools/compare-repos.test.d.ts.map +0 -1
  42. package/dist/tools/compare-repos.test.js +0 -138
  43. package/dist/tools/compare-repos.test.js.map +0 -1
  44. package/dist/tools/get-dora-metrics.test.d.ts +0 -2
  45. package/dist/tools/get-dora-metrics.test.d.ts.map +0 -1
  46. package/dist/tools/get-dora-metrics.test.js +0 -71
  47. package/dist/tools/get-dora-metrics.test.js.map +0 -1
  48. package/dist/tools/get-health-score.test.d.ts +0 -2
  49. package/dist/tools/get-health-score.test.d.ts.map +0 -1
  50. package/dist/tools/get-health-score.test.js +0 -130
  51. package/dist/tools/get-health-score.test.js.map +0 -1
  52. package/dist/tools/get-repo-health.test.d.ts +0 -2
  53. package/dist/tools/get-repo-health.test.d.ts.map +0 -1
  54. package/dist/tools/get-repo-health.test.js +0 -80
  55. package/dist/tools/get-repo-health.test.js.map +0 -1
  56. package/dist/vitest.config.d.ts +0 -3
  57. package/dist/vitest.config.d.ts.map +0 -1
  58. package/dist/vitest.config.js +0 -7
  59. package/dist/vitest.config.js.map +0 -1
@@ -1,138 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { executeCompareRepos, inputSchema } from './compare-repos.js';
3
- import { executeGetHealthScore } from './get-health-score.js';
4
- vi.mock('./get-health-score.js');
5
- describe('executeCompareRepos', () => {
6
- beforeEach(() => {
7
- vi.resetAllMocks();
8
- });
9
- it('should retrieve scores, rank repositories correctly including ties, and handle failures gracefully', async () => {
10
- // Mock executeGetHealthScore behavior:
11
- // repo-a: 85 score
12
- // repo-b: 85 score (tie with repo-a)
13
- // repo-c: 70 score (should be rank 3 in standard competition ranking)
14
- // repo-fail: fails
15
- vi.mocked(executeGetHealthScore).mockImplementation(async (repo) => {
16
- if (repo.repo === 'repo-a') {
17
- return {
18
- content: [{
19
- type: 'text',
20
- text: JSON.stringify({
21
- repo: 'test/repo-a',
22
- score: 85,
23
- grade: 'B',
24
- breakdown: {},
25
- suggestions: [],
26
- checkedAt: '2023-10-01T00:00:00Z'
27
- })
28
- }]
29
- };
30
- }
31
- if (repo.repo === 'repo-b') {
32
- return {
33
- content: [{
34
- type: 'text',
35
- text: JSON.stringify({
36
- repo: 'test/repo-b',
37
- score: 85,
38
- grade: 'B',
39
- breakdown: {},
40
- suggestions: [],
41
- checkedAt: '2023-10-01T00:00:00Z'
42
- })
43
- }]
44
- };
45
- }
46
- if (repo.repo === 'repo-c') {
47
- return {
48
- content: [{
49
- type: 'text',
50
- text: JSON.stringify({
51
- repo: 'test/repo-c',
52
- score: 70,
53
- grade: 'C',
54
- breakdown: {},
55
- suggestions: [],
56
- checkedAt: '2023-10-01T00:00:00Z'
57
- })
58
- }]
59
- };
60
- }
61
- throw new Error('API Rate Limit or Repository not found');
62
- });
63
- const repos = [
64
- { owner: 'test', repo: 'repo-a' },
65
- { owner: 'test', repo: 'repo-fail' },
66
- { owner: 'test', repo: 'repo-b' },
67
- { owner: 'test', repo: 'repo-c' }
68
- ];
69
- const result = await executeCompareRepos({ repos });
70
- expect(result.content).toHaveLength(1);
71
- expect(result.content[0].type).toBe('text');
72
- const comparison = JSON.parse(result.content[0].text);
73
- expect(comparison.compared_at).toBeDefined();
74
- expect(comparison.repos).toHaveLength(4);
75
- // Verify sorting order: success ordered by score desc, then failures
76
- expect(comparison.repos[0].repo).toMatch(/repo-a|repo-b/);
77
- expect(comparison.repos[1].repo).toMatch(/repo-a|repo-b/);
78
- expect(comparison.repos[2].repo).toBe('repo-c');
79
- expect(comparison.repos[3].repo).toBe('repo-fail');
80
- const repoA = comparison.repos.find((r) => r.repo === 'repo-a');
81
- const repoB = comparison.repos.find((r) => r.repo === 'repo-b');
82
- const repoC = comparison.repos.find((r) => r.repo === 'repo-c');
83
- const repoFail = comparison.repos.find((r) => r.repo === 'repo-fail');
84
- expect(repoA.rank).toBe(1);
85
- expect(repoA.health.score).toBe(85);
86
- expect(repoA.error).toBeNull();
87
- expect(repoB.rank).toBe(1);
88
- expect(repoB.health.score).toBe(85);
89
- expect(repoB.error).toBeNull();
90
- // repo-c should be rank 3 (since 2 repos share rank 1)
91
- expect(repoC.rank).toBe(3);
92
- expect(repoC.health.score).toBe(70);
93
- expect(repoC.error).toBeNull();
94
- // repo-fail should be rank 0 with error details
95
- expect(repoFail.rank).toBe(0);
96
- expect(repoFail.health).toBeNull();
97
- expect(repoFail.error).toContain('API Rate Limit');
98
- });
99
- describe('inputSchema validation', () => {
100
- it('should validate correctly with 2 to 5 repos', () => {
101
- const valid = inputSchema.safeParse({
102
- repos: [
103
- { owner: 'owner1', repo: 'repo1' },
104
- { owner: 'owner2', repo: 'repo2' }
105
- ]
106
- });
107
- expect(valid.success).toBe(true);
108
- });
109
- it('should fail validation with less than 2 repos', () => {
110
- const invalid = inputSchema.safeParse({
111
- repos: [
112
- { owner: 'owner1', repo: 'repo1' }
113
- ]
114
- });
115
- expect(invalid.success).toBe(false);
116
- if (!invalid.success) {
117
- expect(invalid.error.issues[0].message).toBe('At least 2 repositories are required');
118
- }
119
- });
120
- it('should fail validation with more than 5 repos', () => {
121
- const invalid = inputSchema.safeParse({
122
- repos: [
123
- { owner: 'owner1', repo: 'repo1' },
124
- { owner: 'owner2', repo: 'repo2' },
125
- { owner: 'owner3', repo: 'repo3' },
126
- { owner: 'owner4', repo: 'repo4' },
127
- { owner: 'owner5', repo: 'repo5' },
128
- { owner: 'owner6', repo: 'repo6' }
129
- ]
130
- });
131
- expect(invalid.success).toBe(false);
132
- if (!invalid.success) {
133
- expect(invalid.error.issues[0].message).toBe('At most 5 repositories are allowed');
134
- }
135
- });
136
- });
137
- });
138
- //# sourceMappingURL=compare-repos.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"compare-repos.test.js","sourceRoot":"","sources":["../../src/tools/compare-repos.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=get-dora-metrics.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-dora-metrics.test.d.ts","sourceRoot":"","sources":["../../src/tools/get-dora-metrics.test.ts"],"names":[],"mappings":""}
@@ -1,71 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { listMergedPulls, listReleases, listWorkflowRuns } from '../github/client.js';
3
- import { executeGetDoraMetrics } from './get-dora-metrics.js';
4
- vi.mock('../github/client.js');
5
- describe('executeGetDoraMetrics', () => {
6
- beforeEach(() => {
7
- vi.resetAllMocks();
8
- });
9
- it('should fetch data and return metrics as JSON text', async () => {
10
- // mock return values for the client functions
11
- vi.mocked(listReleases).mockResolvedValue([
12
- { id: 1, tag_name: 'v1.0', published_at: '2026-08-01T00:00:00Z' }
13
- ]);
14
- vi.mocked(listWorkflowRuns).mockResolvedValue([
15
- { id: 1, name: 'CI', head_branch: 'main', conclusion: 'success', created_at: '2026-08-01T00:00:00Z' }
16
- ]);
17
- vi.mocked(listMergedPulls).mockResolvedValue([
18
- { number: 1, created_at: '2026-08-01T00:00:00Z', merged_at: '2026-08-02T00:00:00Z' }
19
- ]);
20
- const result = await executeGetDoraMetrics({ owner: 'testowner', repo: 'testrepo', days: 14 });
21
- expect(listReleases).toHaveBeenCalledWith('testowner', 'testrepo', expect.any(Date));
22
- expect(listWorkflowRuns).toHaveBeenCalledWith('testowner', 'testrepo', expect.any(Date));
23
- expect(listMergedPulls).toHaveBeenCalledWith('testowner', 'testrepo', expect.any(Date));
24
- expect(result.content).toHaveLength(1);
25
- expect(result.content[0].type).toBe('text');
26
- const parsedText = JSON.parse(result.content[0].text);
27
- expect(parsedText.owner).toBe('testowner');
28
- expect(parsedText.repo).toBe('testrepo');
29
- expect(parsedText.period_days).toBe(14);
30
- // Assert some metric outputs based on the mocked input
31
- expect(parsedText.deployment_frequency.releases_count).toBe(1);
32
- expect(parsedText.lead_time.pr_count).toBe(1);
33
- expect(parsedText.change_failure_rate.total_runs).toBe(1);
34
- expect(parsedText.change_failure_rate.failed_runs).toBe(0);
35
- });
36
- it('should handle empty data correctly (zero releases, PRs, runs)', async () => {
37
- vi.mocked(listReleases).mockResolvedValue([]);
38
- vi.mocked(listWorkflowRuns).mockResolvedValue([]);
39
- vi.mocked(listMergedPulls).mockResolvedValue([]);
40
- const result = await executeGetDoraMetrics({ owner: 'testowner', repo: 'testrepo', days: 30 });
41
- const parsedText = JSON.parse(result.content[0].text);
42
- expect(parsedText.deployment_frequency.releases_count).toBe(0);
43
- expect(parsedText.deployment_frequency.per_week).toBeNull();
44
- expect(parsedText.lead_time.pr_count).toBe(0);
45
- expect(parsedText.lead_time.median_hours).toBeNull();
46
- expect(parsedText.change_failure_rate.total_runs).toBe(0);
47
- expect(parsedText.change_failure_rate.rate_percent).toBeNull();
48
- expect(parsedText.mttr.incidents_count).toBe(0);
49
- expect(parsedText.mttr.median_hours).toBeNull();
50
- });
51
- it('should pass the correct since Date to client functions', async () => {
52
- vi.mocked(listReleases).mockResolvedValue([]);
53
- vi.mocked(listWorkflowRuns).mockResolvedValue([]);
54
- vi.mocked(listMergedPulls).mockResolvedValue([]);
55
- const days = 14;
56
- await executeGetDoraMetrics({ owner: 'testowner', repo: 'testrepo', days });
57
- const expectedSince = new Date(Date.now() - days * 24 * 60 * 60 * 1000);
58
- const callArg = vi.mocked(listReleases).mock.calls[0][2];
59
- const diffMs = Math.abs(callArg.getTime() - expectedSince.getTime());
60
- expect(diffMs).toBeLessThan(1000); // Tolleranza di 1 secondo per l'esecuzione
61
- });
62
- it('should fail if any client call fails', async () => {
63
- vi.mocked(listReleases).mockRejectedValue(new Error('API Error'));
64
- vi.mocked(listWorkflowRuns).mockResolvedValue([]);
65
- vi.mocked(listMergedPulls).mockResolvedValue([]);
66
- await expect(executeGetDoraMetrics({ owner: 'testowner', repo: 'testrepo', days: 30 }))
67
- .rejects
68
- .toThrow('API Error');
69
- });
70
- });
71
- //# sourceMappingURL=get-dora-metrics.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-dora-metrics.test.js","sourceRoot":"","sources":["../../src/tools/get-dora-metrics.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=get-health-score.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-health-score.test.d.ts","sourceRoot":"","sources":["../../src/tools/get-health-score.test.ts"],"names":[],"mappings":""}
@@ -1,130 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { getOctokit } from '../github/client.js';
3
- import { executeGetHealthScore } from './get-health-score.js';
4
- import { fetchOpenSSFScore } from '../security/openssf-client.js';
5
- vi.mock('../github/client.js');
6
- vi.mock('../security/openssf-client.js');
7
- describe('executeGetHealthScore', () => {
8
- beforeEach(() => {
9
- vi.resetAllMocks();
10
- });
11
- it('should calculate health score successfully with dependabot alerts', async () => {
12
- const mockReposGet = vi.fn().mockResolvedValue({
13
- data: {
14
- pushed_at: '2023-10-01T00:00:00Z',
15
- open_issues_count: 5,
16
- forks_count: 10,
17
- license: { spdx_id: 'MIT' },
18
- description: 'test repo',
19
- archived: false
20
- }
21
- });
22
- const mockListRuns = vi.fn().mockResolvedValue({
23
- data: {
24
- workflow_runs: [{ conclusion: 'success' }]
25
- }
26
- });
27
- const mockListAlerts = vi.fn().mockResolvedValue({
28
- data: [
29
- { security_advisory: { severity: 'critical' }, state: 'open' },
30
- { security_advisory: { severity: 'high' }, state: 'open' }
31
- ]
32
- });
33
- vi.mocked(getOctokit).mockReturnValue({
34
- repos: { get: mockReposGet },
35
- actions: { listWorkflowRunsForRepo: mockListRuns },
36
- dependabot: { listAlertsForRepo: mockListAlerts }
37
- });
38
- const result = await executeGetHealthScore({ owner: 'test', repo: 'repo' });
39
- expect(mockReposGet).toHaveBeenCalledWith({ owner: 'test', repo: 'repo' });
40
- expect(mockListRuns).toHaveBeenCalledWith({ owner: 'test', repo: 'repo', per_page: 10 });
41
- expect(mockListAlerts).toHaveBeenCalledWith({ owner: 'test', repo: 'repo' });
42
- expect(result.content).toHaveLength(1);
43
- expect(result.content[0].type).toBe('text');
44
- const parsedText = JSON.parse(result.content[0].text);
45
- expect(parsedText.repo).toBe('test/repo');
46
- expect(parsedText.score).toBeTypeOf('number');
47
- expect(parsedText.grade).toBeTypeOf('string');
48
- // Ensure dependabot parsing worked:
49
- expect(parsedText.breakdown.security.detail).toContain('1 critical');
50
- expect(parsedText.breakdown.security.detail).toContain('1 high');
51
- });
52
- it('should calculate health score successfully even if dependabot fails', async () => {
53
- const mockReposGet = vi.fn().mockResolvedValue({
54
- data: {
55
- pushed_at: '2023-10-01T00:00:00Z',
56
- open_issues_count: 5,
57
- forks_count: 10,
58
- license: { spdx_id: 'MIT' },
59
- description: 'test repo',
60
- archived: false
61
- }
62
- });
63
- const mockListRuns = vi.fn().mockResolvedValue({
64
- data: {
65
- workflow_runs: [{ conclusion: 'success' }]
66
- }
67
- });
68
- // Simulating 404 or disabled dependabot
69
- const mockListAlerts = vi.fn().mockRejectedValue(new Error('Not Found'));
70
- vi.mocked(getOctokit).mockReturnValue({
71
- repos: { get: mockReposGet },
72
- actions: { listWorkflowRunsForRepo: mockListRuns },
73
- dependabot: { listAlertsForRepo: mockListAlerts }
74
- });
75
- const result = await executeGetHealthScore({ owner: 'test', repo: 'repo' });
76
- const parsedText = JSON.parse(result.content[0].text);
77
- expect(parsedText.repo).toBe('test/repo');
78
- // If dependabot fails, it should assume 0 alerts
79
- expect(parsedText.breakdown.security.detail).toContain('0 critical');
80
- expect(parsedText.breakdown.security.detail).toContain('0 high');
81
- });
82
- it('should fail if repos.get fails', async () => {
83
- const mockReposGet = vi.fn().mockRejectedValue(new Error('API Error'));
84
- const mockListRuns = vi.fn().mockResolvedValue({ data: { workflow_runs: [] } });
85
- vi.mocked(getOctokit).mockReturnValue({
86
- repos: { get: mockReposGet },
87
- actions: { listWorkflowRunsForRepo: mockListRuns },
88
- dependabot: { listAlertsForRepo: vi.fn() }
89
- });
90
- await expect(executeGetHealthScore({ owner: 'test', repo: 'error-repo' }))
91
- .rejects
92
- .toThrow('API Error');
93
- });
94
- it('should include OpenSSF score when available', async () => {
95
- const mockReposGet = vi.fn().mockResolvedValue({
96
- data: { pushed_at: '2023-10-01T00:00:00Z', open_issues_count: 0, forks_count: 0, license: { spdx_id: 'MIT' }, description: 'test', archived: false }
97
- });
98
- const mockListRuns = vi.fn().mockResolvedValue({ data: { workflow_runs: [] } });
99
- const mockListAlerts = vi.fn().mockResolvedValue({ data: [] });
100
- vi.mocked(getOctokit).mockReturnValue({
101
- repos: { get: mockReposGet },
102
- actions: { listWorkflowRunsForRepo: mockListRuns },
103
- dependabot: { listAlertsForRepo: mockListAlerts }
104
- });
105
- vi.mocked(fetchOpenSSFScore).mockResolvedValue({
106
- score: 80, checksUsed: 8, checksTotal: 10, details: "8/10 security checks, score 80/100"
107
- });
108
- const result = await executeGetHealthScore({ owner: 'test', repo: 'repo' });
109
- const parsedText = JSON.parse(result.content[0].text);
110
- expect(parsedText.breakdown.security.detail).toContain('OpenSSF');
111
- });
112
- it('should fallback to Dependabot only when OpenSSF is null', async () => {
113
- const mockReposGet = vi.fn().mockResolvedValue({
114
- data: { pushed_at: '2023-10-01T00:00:00Z', open_issues_count: 0, forks_count: 0, license: { spdx_id: 'MIT' }, description: 'test', archived: false }
115
- });
116
- const mockListRuns = vi.fn().mockResolvedValue({ data: { workflow_runs: [] } });
117
- const mockListAlerts = vi.fn().mockResolvedValue({ data: [] });
118
- vi.mocked(getOctokit).mockReturnValue({
119
- repos: { get: mockReposGet },
120
- actions: { listWorkflowRunsForRepo: mockListRuns },
121
- dependabot: { listAlertsForRepo: mockListAlerts }
122
- });
123
- vi.mocked(fetchOpenSSFScore).mockResolvedValue(null);
124
- const result = await executeGetHealthScore({ owner: 'test', repo: 'repo' });
125
- const parsedText = JSON.parse(result.content[0].text);
126
- expect(parsedText.breakdown.security.detail).not.toContain('OpenSSF');
127
- expect(parsedText.breakdown.security.score).toBe(100);
128
- });
129
- });
130
- //# sourceMappingURL=get-health-score.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-health-score.test.js","sourceRoot":"","sources":["../../src/tools/get-health-score.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=get-repo-health.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-repo-health.test.d.ts","sourceRoot":"","sources":["../../src/tools/get-repo-health.test.ts"],"names":[],"mappings":""}
@@ -1,80 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { getOctokit } from '../github/client.js';
3
- import { executeGetRepoHealth } from './get-repo-health.js';
4
- // Mock intero modulo
5
- vi.mock('../github/client.js');
6
- describe('executeGetRepoHealth', () => {
7
- beforeEach(() => {
8
- vi.resetAllMocks(); // pulisci mock tra un test e l'altro
9
- });
10
- it('should return repo data for valid repo', async () => {
11
- // 1. Configura mock: getOctokit() ritorna oggetto con repos.get()
12
- const mockReposGet = vi.fn().mockResolvedValue({
13
- data: {
14
- full_name: 'test/repo',
15
- description: 'test description',
16
- stargazers_count: 100,
17
- open_issues_count: 5,
18
- language: 'TypeScript',
19
- license: { spdx_id: 'MIT' },
20
- pushed_at: '2023-10-01T00:00:00Z',
21
- default_branch: 'main',
22
- archived: false,
23
- forks_count: 10
24
- }
25
- });
26
- vi.mocked(getOctokit).mockReturnValue({
27
- repos: { get: mockReposGet }
28
- });
29
- // 2. Chiama il tool
30
- const result = await executeGetRepoHealth({ owner: 'test', repo: 'repo' });
31
- // 3. Verifica output
32
- expect(mockReposGet).toHaveBeenCalledWith({ owner: 'test', repo: 'repo' });
33
- expect(result.content).toHaveLength(1);
34
- expect(result.content[0].type).toBe('text');
35
- const parsedText = JSON.parse(result.content[0].text);
36
- expect(parsedText).toEqual({
37
- full_name: 'test/repo',
38
- description: 'test description',
39
- stargazers_count: 100,
40
- open_issues_count: 5,
41
- language: 'TypeScript',
42
- license: 'MIT',
43
- pushed_at: '2023-10-01T00:00:00Z',
44
- default_branch: 'main',
45
- archived: false,
46
- forks_count: 10
47
- });
48
- });
49
- it('should handle 404 for non-existent repo', async () => {
50
- // 1. Configura mock: repos.get() lancia errore con status 404
51
- const notFoundError = new Error('Not Found');
52
- notFoundError.status = 404;
53
- const mockReposGet = vi.fn().mockRejectedValue(notFoundError);
54
- vi.mocked(getOctokit).mockReturnValue({
55
- repos: { get: mockReposGet }
56
- });
57
- // 2. Chiama il tool
58
- const result = await executeGetRepoHealth({ owner: 'test', repo: 'not-found' });
59
- // 3. Verifica che ritorna messaggio errore, non throw
60
- expect(result.content).toHaveLength(1);
61
- expect(result.content[0].type).toBe('text');
62
- const parsedText = JSON.parse(result.content[0].text);
63
- expect(parsedText).toEqual({
64
- error: "Repository not found",
65
- details: "Not Found"
66
- });
67
- });
68
- it('should throw error for non-404 errors', async () => {
69
- const serverError = new Error('Internal Server Error');
70
- serverError.status = 500;
71
- const mockReposGet = vi.fn().mockRejectedValue(serverError);
72
- vi.mocked(getOctokit).mockReturnValue({
73
- repos: { get: mockReposGet }
74
- });
75
- await expect(executeGetRepoHealth({ owner: 'test', repo: 'error-repo' }))
76
- .rejects
77
- .toThrow('Internal Server Error');
78
- });
79
- });
80
- //# sourceMappingURL=get-repo-health.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-repo-health.test.js","sourceRoot":"","sources":["../../src/tools/get-repo-health.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- declare const _default: import("vite").UserConfig;
2
- export default _default;
3
- //# sourceMappingURL=vitest.config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vitest.config.d.ts","sourceRoot":"","sources":["../src/vitest.config.ts"],"names":[],"mappings":";AAEA,wBAIG"}
@@ -1,7 +0,0 @@
1
- import { defineConfig } from 'vitest/config';
2
- export default defineConfig({
3
- test: {
4
- globals: true,
5
- },
6
- });
7
- //# sourceMappingURL=vitest.config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../src/vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAe,YAAY,CAAC;IACxB,IAAI,EAAE;QACF,OAAO,EAAE,IAAI;KAChB;CACJ,CAAC,CAAC"}