bitbucket-mcp-server 1.0.0

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.
@@ -0,0 +1,203 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ // Mock node-fetch using vi.hoisted to avoid hoisting issues
3
+ const mockFetch = vi.hoisted(() => vi.fn());
4
+ vi.mock('node-fetch', () => ({
5
+ default: mockFetch,
6
+ }));
7
+ import { BitbucketAPI } from './bitbucket-api.js';
8
+ describe('BitbucketAPI', () => {
9
+ let api;
10
+ beforeEach(() => {
11
+ // Mock console.error to avoid noise in tests before creating the API instance
12
+ vi.spyOn(console, 'error').mockImplementation(() => { });
13
+ api = new BitbucketAPI();
14
+ vi.clearAllMocks();
15
+ });
16
+ afterEach(() => {
17
+ vi.restoreAllMocks();
18
+ });
19
+ describe('listRepositories', () => {
20
+ it('should return repositories for a workspace', async () => {
21
+ const mockResponse = {
22
+ ok: true,
23
+ status: 200,
24
+ json: vi.fn().mockResolvedValue({
25
+ values: [
26
+ {
27
+ uuid: 'test-uuid',
28
+ name: 'test-repo',
29
+ full_name: 'workspace/test-repo',
30
+ description: 'A test repository',
31
+ is_private: false,
32
+ created_on: '2023-01-01T00:00:00Z',
33
+ updated_on: '2023-01-02T00:00:00Z',
34
+ size: 1024,
35
+ language: 'TypeScript',
36
+ owner: {
37
+ display_name: 'Test User',
38
+ username: 'testuser',
39
+ },
40
+ links: {
41
+ html: { href: 'https://bitbucket.org/workspace/test-repo' },
42
+ clone: [
43
+ { name: 'https', href: 'https://bitbucket.org/workspace/test-repo.git' },
44
+ { name: 'ssh', href: 'git@bitbucket.org:workspace/test-repo.git' },
45
+ ],
46
+ },
47
+ }
48
+ ],
49
+ next: null,
50
+ }),
51
+ };
52
+ mockFetch.mockResolvedValue(mockResponse);
53
+ const result = await api.listRepositories('testworkspace');
54
+ expect(result.repositories).toHaveLength(1);
55
+ expect(result.repositories[0].name).toBe('test-repo');
56
+ expect(result.hasMore).toBe(false);
57
+ expect(mockFetch).toHaveBeenCalledWith('https://api.bitbucket.org/2.0/repositories/testworkspace', expect.objectContaining({
58
+ headers: expect.objectContaining({
59
+ 'Accept': 'application/json',
60
+ 'User-Agent': 'bitbucket-mcp-server/1.0',
61
+ }),
62
+ signal: expect.any(AbortSignal),
63
+ }));
64
+ });
65
+ it('should handle authentication when credentials are provided', async () => {
66
+ // Set up authenticated API
67
+ const authenticatedApi = new BitbucketAPI('testuser', 'testpass');
68
+ const mockResponse = {
69
+ ok: true,
70
+ status: 200,
71
+ json: vi.fn().mockResolvedValue({ values: [], next: null }),
72
+ };
73
+ mockFetch.mockResolvedValue(mockResponse);
74
+ await authenticatedApi.listRepositories('testworkspace');
75
+ expect(mockFetch).toHaveBeenCalledWith('https://api.bitbucket.org/2.0/repositories/testworkspace', expect.objectContaining({
76
+ headers: expect.objectContaining({
77
+ 'Authorization': 'Basic dGVzdHVzZXI6dGVzdHBhc3M=', // base64 of testuser:testpass
78
+ }),
79
+ }));
80
+ });
81
+ it('should handle API errors gracefully', async () => {
82
+ const errorResponse = {
83
+ ok: false,
84
+ status: 404,
85
+ statusText: 'Not Found',
86
+ json: vi.fn().mockResolvedValue({ error: { message: 'Workspace not found' } }),
87
+ };
88
+ mockFetch.mockResolvedValue(errorResponse);
89
+ await expect(api.listRepositories('nonexistent')).rejects.toThrow();
90
+ });
91
+ });
92
+ describe('getRepository', () => {
93
+ it('should return repository details', async () => {
94
+ const mockRepo = {
95
+ uuid: 'test-uuid',
96
+ name: 'test-repo',
97
+ full_name: 'workspace/test-repo',
98
+ description: 'A test repository',
99
+ is_private: false,
100
+ created_on: '2023-01-01T00:00:00Z',
101
+ updated_on: '2023-01-02T00:00:00Z',
102
+ size: 1024,
103
+ language: 'TypeScript',
104
+ owner: {
105
+ display_name: 'Test User',
106
+ username: 'testuser',
107
+ },
108
+ links: {
109
+ html: { href: 'https://bitbucket.org/workspace/test-repo' },
110
+ clone: [
111
+ { name: 'https', href: 'https://bitbucket.org/workspace/test-repo.git' },
112
+ { name: 'ssh', href: 'git@bitbucket.org:workspace/test-repo.git' },
113
+ ],
114
+ },
115
+ };
116
+ const mockResponse = {
117
+ ok: true,
118
+ status: 200,
119
+ json: vi.fn().mockResolvedValue(mockRepo),
120
+ };
121
+ mockFetch.mockResolvedValue(mockResponse);
122
+ const result = await api.getRepository('testworkspace', 'test-repo');
123
+ expect(result).toEqual(mockRepo);
124
+ expect(mockFetch).toHaveBeenCalledWith('https://api.bitbucket.org/2.0/repositories/testworkspace/test-repo', expect.any(Object));
125
+ });
126
+ });
127
+ describe('getPullRequest', () => {
128
+ it('should return pull request details', async () => {
129
+ const mockPullRequest = {
130
+ id: 123,
131
+ title: 'Fix critical bug',
132
+ state: 'OPEN',
133
+ author: {
134
+ display_name: 'John Doe',
135
+ username: 'johndoe',
136
+ },
137
+ created_on: '2023-12-01T10:00:00Z',
138
+ updated_on: '2023-12-01T15:30:00Z',
139
+ source: {
140
+ branch: {
141
+ name: 'feature/fix-bug',
142
+ },
143
+ repository: {
144
+ name: 'test-repo',
145
+ },
146
+ },
147
+ destination: {
148
+ branch: {
149
+ name: 'main',
150
+ },
151
+ repository: {
152
+ name: 'test-repo',
153
+ },
154
+ },
155
+ links: {
156
+ html: {
157
+ href: 'https://bitbucket.org/workspace/test-repo/pull-requests/123',
158
+ },
159
+ },
160
+ description: 'This PR fixes a critical bug in the authentication system.',
161
+ };
162
+ const mockResponse = {
163
+ ok: true,
164
+ status: 200,
165
+ json: vi.fn().mockResolvedValue(mockPullRequest),
166
+ };
167
+ mockFetch.mockResolvedValue(mockResponse);
168
+ const result = await api.getPullRequest('testworkspace', 'test-repo', 123);
169
+ expect(result).toEqual(mockPullRequest);
170
+ expect(mockFetch).toHaveBeenCalledWith('https://api.bitbucket.org/2.0/repositories/testworkspace/test-repo/pullrequests/123', expect.any(Object));
171
+ });
172
+ it('should handle pull request not found error', async () => {
173
+ const errorResponse = {
174
+ ok: false,
175
+ status: 404,
176
+ statusText: 'Not Found',
177
+ json: vi.fn().mockResolvedValue({ error: { message: 'Pull request not found' } }),
178
+ };
179
+ mockFetch.mockResolvedValue(errorResponse);
180
+ await expect(api.getPullRequest('testworkspace', 'test-repo', 999)).rejects.toThrow();
181
+ });
182
+ it('should handle authentication when getting pull request', async () => {
183
+ const authenticatedApi = new BitbucketAPI('testuser', 'testpass');
184
+ const mockResponse = {
185
+ ok: true,
186
+ status: 200,
187
+ json: vi.fn().mockResolvedValue({
188
+ id: 123,
189
+ title: 'Test PR',
190
+ state: 'OPEN',
191
+ }),
192
+ };
193
+ mockFetch.mockResolvedValue(mockResponse);
194
+ await authenticatedApi.getPullRequest('testworkspace', 'test-repo', 123);
195
+ expect(mockFetch).toHaveBeenCalledWith('https://api.bitbucket.org/2.0/repositories/testworkspace/test-repo/pullrequests/123', expect.objectContaining({
196
+ headers: expect.objectContaining({
197
+ 'Authorization': 'Basic dGVzdHVzZXI6dGVzdHBhc3M=',
198
+ }),
199
+ }));
200
+ });
201
+ });
202
+ });
203
+ //# sourceMappingURL=bitbucket-api.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitbucket-api.test.js","sourceRoot":"","sources":["../src/bitbucket-api.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Caching system for the Bitbucket MCP server
3
+ */
4
+ export interface CacheEntry<T = any> {
5
+ data: T;
6
+ timestamp: number;
7
+ ttl: number;
8
+ key: string;
9
+ }
10
+ export interface CacheOptions {
11
+ maxSize: number;
12
+ defaultTtl: number;
13
+ cleanupInterval: number;
14
+ }
15
+ export interface CacheStats {
16
+ hits: number;
17
+ misses: number;
18
+ totalRequests: number;
19
+ hitRate: number;
20
+ cacheSize: number;
21
+ maxSize: number;
22
+ }
23
+ /**
24
+ * LRU Cache implementation with TTL support
25
+ */
26
+ export declare class LRUCache<T = any> {
27
+ private options;
28
+ private cache;
29
+ private accessOrder;
30
+ private accessCounter;
31
+ private stats;
32
+ private cleanupTimer?;
33
+ constructor(options: CacheOptions);
34
+ /**
35
+ * Get an item from the cache
36
+ */
37
+ get(key: string): T | null;
38
+ /**
39
+ * Set an item in the cache
40
+ */
41
+ set(key: string, data: T, ttl?: number): void;
42
+ /**
43
+ * Delete an item from the cache
44
+ */
45
+ delete(key: string): boolean;
46
+ /**
47
+ * Check if a key exists in the cache (without affecting access order)
48
+ */
49
+ has(key: string): boolean;
50
+ /**
51
+ * Clear all cache entries
52
+ */
53
+ clear(): void;
54
+ /**
55
+ * Get cache statistics
56
+ */
57
+ getStats(): CacheStats;
58
+ /**
59
+ * Reset cache statistics
60
+ */
61
+ resetStats(): void;
62
+ /**
63
+ * Get all cache keys
64
+ */
65
+ keys(): string[];
66
+ /**
67
+ * Get cache size
68
+ */
69
+ size(): number;
70
+ /**
71
+ * Get cache configuration
72
+ */
73
+ getConfig(): CacheOptions;
74
+ /**
75
+ * Update cache configuration
76
+ */
77
+ updateConfig(newOptions: Partial<CacheOptions>): void;
78
+ /**
79
+ * Cleanup expired entries
80
+ */
81
+ private cleanup;
82
+ /**
83
+ * Evict least recently used item
84
+ */
85
+ private evictLRU;
86
+ /**
87
+ * Update hit rate calculation
88
+ */
89
+ private updateHitRate;
90
+ /**
91
+ * Update cache size in stats
92
+ */
93
+ private updateCacheSize;
94
+ /**
95
+ * Cleanup resources
96
+ */
97
+ destroy(): void;
98
+ }
99
+ /**
100
+ * Cache key generator for API requests
101
+ */
102
+ export declare class CacheKeyGenerator {
103
+ static forRepository(workspace: string, repoSlug: string): string;
104
+ static forRepositories(workspace: string, options?: Record<string, any>): string;
105
+ static forPullRequests(workspace: string, repoSlug: string, state?: string): string;
106
+ static forIssues(workspace: string, repoSlug: string, state?: string): string;
107
+ static forBranches(workspace: string, repoSlug: string): string;
108
+ static forCommits(workspace: string, repoSlug: string, branch?: string): string;
109
+ static forSearch(workspace: string, query: string, types: string[], limit: number): string;
110
+ }
111
+ /**
112
+ * Cache decorator for API methods
113
+ */
114
+ export declare function cached<T extends (...args: any[]) => Promise<any>>(cache: LRUCache, keyGenerator: (...args: any[]) => string, ttl?: number): (target: any, propertyName: string, descriptor: TypedPropertyDescriptor<T>) => void;
115
+ /**
116
+ * Cache management utilities
117
+ */
118
+ export declare class CacheManager {
119
+ private caches;
120
+ /**
121
+ * Create a new cache instance
122
+ */
123
+ createCache(name: string, options: CacheOptions): LRUCache;
124
+ /**
125
+ * Get a cache instance by name
126
+ */
127
+ getCache(name: string): LRUCache | undefined;
128
+ /**
129
+ * Remove a cache instance
130
+ */
131
+ removeCache(name: string): boolean;
132
+ /**
133
+ * Get statistics for all caches
134
+ */
135
+ getAllStats(): Record<string, CacheStats>;
136
+ /**
137
+ * Clear all caches
138
+ */
139
+ clearAll(): void;
140
+ /**
141
+ * Reset statistics for all caches
142
+ */
143
+ resetAllStats(): void;
144
+ /**
145
+ * Destroy all caches
146
+ */
147
+ destroyAll(): void;
148
+ }
149
+ export declare const cacheManager: CacheManager;
150
+ export declare const apiCache: LRUCache<any>;