@efficy/tribecrm-mcp-server 0.4.2 → 0.5.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.
- package/README.md +86 -9
- package/dist/auth/callback-server.d.ts +41 -0
- package/dist/auth/callback-server.d.ts.map +1 -0
- package/dist/auth/callback-server.js +247 -0
- package/dist/auth/callback-server.js.map +1 -0
- package/dist/auth/callback-server.test.d.ts +2 -0
- package/dist/auth/callback-server.test.d.ts.map +1 -0
- package/dist/auth/callback-server.test.js +233 -0
- package/dist/auth/callback-server.test.js.map +1 -0
- package/dist/auth/oauth-flow.d.ts +55 -0
- package/dist/auth/oauth-flow.d.ts.map +1 -0
- package/dist/auth/oauth-flow.js +120 -0
- package/dist/auth/oauth-flow.js.map +1 -0
- package/dist/auth/oauth-flow.test.d.ts +2 -0
- package/dist/auth/oauth-flow.test.d.ts.map +1 -0
- package/dist/auth/oauth-flow.test.js +154 -0
- package/dist/auth/oauth-flow.test.js.map +1 -0
- package/dist/auth/token-manager.d.ts +43 -0
- package/dist/auth/token-manager.d.ts.map +1 -0
- package/dist/auth/token-manager.js +105 -0
- package/dist/auth/token-manager.js.map +1 -0
- package/dist/auth/token-manager.test.d.ts +2 -0
- package/dist/auth/token-manager.test.d.ts.map +1 -0
- package/dist/auth/token-manager.test.js +190 -0
- package/dist/auth/token-manager.test.js.map +1 -0
- package/dist/auth/user-auth.d.ts +48 -0
- package/dist/auth/user-auth.d.ts.map +1 -0
- package/dist/auth/user-auth.js +186 -0
- package/dist/auth/user-auth.js.map +1 -0
- package/dist/auth/user-auth.test.d.ts +2 -0
- package/dist/auth/user-auth.test.d.ts.map +1 -0
- package/dist/auth/user-auth.test.js +366 -0
- package/dist/auth/user-auth.test.js.map +1 -0
- package/dist/client.d.ts +5 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +42 -4
- package/dist/client.js.map +1 -1
- package/dist/client.test.js +2 -3
- package/dist/client.test.js.map +1 -1
- package/dist/index.js +109 -6
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +5 -3
- package/dist/index.test.js.map +1 -1
- package/dist/scripts/authenticate.d.ts +12 -0
- package/dist/scripts/authenticate.d.ts.map +1 -0
- package/dist/scripts/authenticate.js +95 -0
- package/dist/scripts/authenticate.js.map +1 -0
- package/dist/types.d.ts +0 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.test.js +0 -11
- package/dist/types.test.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import { UserAuth } from './user-auth.js';
|
|
3
|
+
import { TokenManager } from './token-manager.js';
|
|
4
|
+
import { OAuthFlow } from './oauth-flow.js';
|
|
5
|
+
import { CallbackServer } from './callback-server.js';
|
|
6
|
+
// Mock modules
|
|
7
|
+
vi.mock('./token-manager.js');
|
|
8
|
+
vi.mock('./oauth-flow.js');
|
|
9
|
+
vi.mock('./callback-server.js');
|
|
10
|
+
describe('UserAuth', () => {
|
|
11
|
+
let userAuth;
|
|
12
|
+
let mockTokenManager;
|
|
13
|
+
let mockOAuthFlow;
|
|
14
|
+
let mockCallbackServer;
|
|
15
|
+
const testConfig = {
|
|
16
|
+
authUrl: 'https://auth.test.com',
|
|
17
|
+
clientId: 'test-client-id',
|
|
18
|
+
clientSecret: 'test-client-secret',
|
|
19
|
+
redirectUri: 'http://localhost:3000/callback',
|
|
20
|
+
organizationId: 'test-org-id',
|
|
21
|
+
callbackPort: 3000,
|
|
22
|
+
tokenFilePath: '/test/tokens.json'
|
|
23
|
+
};
|
|
24
|
+
const mockTokens = {
|
|
25
|
+
access_token: 'test-access-token',
|
|
26
|
+
token_type: 'Bearer',
|
|
27
|
+
expires_in: 86400,
|
|
28
|
+
scope: 'read write offline',
|
|
29
|
+
refresh_token: 'test-refresh-token'
|
|
30
|
+
};
|
|
31
|
+
const mockStoredTokens = {
|
|
32
|
+
...mockTokens,
|
|
33
|
+
expires_at: Date.now() + 3600000 // 1 hour from now
|
|
34
|
+
};
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
vi.clearAllMocks();
|
|
37
|
+
// Setup TokenManager mock
|
|
38
|
+
mockTokenManager = {
|
|
39
|
+
loadTokens: vi.fn(),
|
|
40
|
+
saveTokens: vi.fn(),
|
|
41
|
+
deleteTokens: vi.fn(),
|
|
42
|
+
areTokensValid: vi.fn(),
|
|
43
|
+
getTokenPath: vi.fn().mockReturnValue('/test/tokens.json')
|
|
44
|
+
};
|
|
45
|
+
vi.mocked(TokenManager).mockImplementation(() => mockTokenManager);
|
|
46
|
+
// Setup OAuthFlow mock
|
|
47
|
+
mockOAuthFlow = {
|
|
48
|
+
generatePKCE: vi.fn().mockReturnValue({
|
|
49
|
+
verifier: 'test-verifier',
|
|
50
|
+
challenge: 'test-challenge'
|
|
51
|
+
}),
|
|
52
|
+
generateConsentUrl: vi.fn().mockReturnValue('https://auth.test.com/consent'),
|
|
53
|
+
exchangeCodeForTokens: vi.fn().mockResolvedValue(mockTokens),
|
|
54
|
+
refreshAccessToken: vi.fn().mockResolvedValue(mockTokens)
|
|
55
|
+
};
|
|
56
|
+
vi.mocked(OAuthFlow).mockImplementation(() => mockOAuthFlow);
|
|
57
|
+
vi.mocked(OAuthFlow.generateState).mockReturnValue('test-state');
|
|
58
|
+
// Setup CallbackServer mock
|
|
59
|
+
mockCallbackServer = {
|
|
60
|
+
waitForCallback: vi.fn().mockResolvedValue({
|
|
61
|
+
code: 'test-auth-code',
|
|
62
|
+
state: 'test-state'
|
|
63
|
+
}),
|
|
64
|
+
stop: vi.fn(),
|
|
65
|
+
getPort: vi.fn().mockReturnValue(3000)
|
|
66
|
+
};
|
|
67
|
+
vi.mocked(CallbackServer).mockImplementation(() => mockCallbackServer);
|
|
68
|
+
userAuth = new UserAuth(testConfig);
|
|
69
|
+
});
|
|
70
|
+
afterEach(() => {
|
|
71
|
+
vi.restoreAllMocks();
|
|
72
|
+
});
|
|
73
|
+
describe('constructor', () => {
|
|
74
|
+
it('should initialize with provided config', () => {
|
|
75
|
+
expect(TokenManager).toHaveBeenCalledWith('/test/tokens.json');
|
|
76
|
+
expect(OAuthFlow).toHaveBeenCalledWith({
|
|
77
|
+
authUrl: testConfig.authUrl,
|
|
78
|
+
clientId: testConfig.clientId,
|
|
79
|
+
clientSecret: testConfig.clientSecret,
|
|
80
|
+
redirectUri: testConfig.redirectUri,
|
|
81
|
+
organizationId: testConfig.organizationId
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
it('should work without optional config parameters', () => {
|
|
85
|
+
const minimalConfig = {
|
|
86
|
+
authUrl: 'https://auth.test.com',
|
|
87
|
+
clientId: 'test-client-id',
|
|
88
|
+
clientSecret: 'test-client-secret',
|
|
89
|
+
redirectUri: 'http://localhost:3000/callback'
|
|
90
|
+
};
|
|
91
|
+
const minimalUserAuth = new UserAuth(minimalConfig);
|
|
92
|
+
expect(minimalUserAuth).toBeDefined();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe('getAccessToken', () => {
|
|
96
|
+
it('should return current token if still valid', async () => {
|
|
97
|
+
// Simulate having a valid token in memory
|
|
98
|
+
mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
|
|
99
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
100
|
+
const token1 = await userAuth.getAccessToken();
|
|
101
|
+
const token2 = await userAuth.getAccessToken(); // Should use cached token
|
|
102
|
+
expect(token1).toBe(mockTokens.access_token);
|
|
103
|
+
expect(token2).toBe(mockTokens.access_token);
|
|
104
|
+
expect(mockTokenManager.loadTokens).toHaveBeenCalledTimes(1); // Only loaded once
|
|
105
|
+
});
|
|
106
|
+
it('should load tokens from disk if not in memory', async () => {
|
|
107
|
+
mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
|
|
108
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
109
|
+
const token = await userAuth.getAccessToken();
|
|
110
|
+
expect(token).toBe(mockTokens.access_token);
|
|
111
|
+
expect(mockTokenManager.loadTokens).toHaveBeenCalled();
|
|
112
|
+
expect(mockTokenManager.areTokensValid).toHaveBeenCalled();
|
|
113
|
+
});
|
|
114
|
+
it('should refresh expired tokens using refresh_token', async () => {
|
|
115
|
+
const expiredTokens = {
|
|
116
|
+
...mockStoredTokens,
|
|
117
|
+
expires_at: Date.now() - 1000 // Expired 1 second ago
|
|
118
|
+
};
|
|
119
|
+
const newTokens = {
|
|
120
|
+
...mockTokens,
|
|
121
|
+
access_token: 'new-access-token',
|
|
122
|
+
expires_at: Date.now() + 3600000
|
|
123
|
+
};
|
|
124
|
+
mockTokenManager.loadTokens.mockReturnValue(expiredTokens);
|
|
125
|
+
mockTokenManager.areTokensValid.mockReturnValue(false);
|
|
126
|
+
mockOAuthFlow.refreshAccessToken.mockResolvedValue(newTokens);
|
|
127
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
128
|
+
const token = await userAuth.getAccessToken();
|
|
129
|
+
expect(token).toBe('new-access-token');
|
|
130
|
+
expect(mockOAuthFlow.refreshAccessToken).toHaveBeenCalledWith('test-refresh-token');
|
|
131
|
+
expect(mockTokenManager.saveTokens).toHaveBeenCalledWith(newTokens);
|
|
132
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Access token expired, refreshing...');
|
|
133
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Access token refreshed successfully');
|
|
134
|
+
consoleErrorSpy.mockRestore();
|
|
135
|
+
});
|
|
136
|
+
it('should throw error if no valid tokens and refresh fails', async () => {
|
|
137
|
+
const expiredTokens = {
|
|
138
|
+
...mockStoredTokens,
|
|
139
|
+
expires_at: Date.now() - 1000
|
|
140
|
+
};
|
|
141
|
+
mockTokenManager.loadTokens.mockReturnValue(expiredTokens);
|
|
142
|
+
mockTokenManager.areTokensValid.mockReturnValue(false);
|
|
143
|
+
mockOAuthFlow.refreshAccessToken.mockRejectedValue(new Error('Refresh failed'));
|
|
144
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
145
|
+
await expect(userAuth.getAccessToken()).rejects.toThrow('No valid authentication tokens found');
|
|
146
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Token refresh failed:', 'Refresh failed');
|
|
147
|
+
consoleErrorSpy.mockRestore();
|
|
148
|
+
});
|
|
149
|
+
it('should throw error if no tokens exist on disk', async () => {
|
|
150
|
+
mockTokenManager.loadTokens.mockReturnValue(null);
|
|
151
|
+
await expect(userAuth.getAccessToken()).rejects.toThrow('No valid authentication tokens found. Please run the authentication process');
|
|
152
|
+
});
|
|
153
|
+
it('should throw error with helpful message about authentication', async () => {
|
|
154
|
+
mockTokenManager.loadTokens.mockReturnValue(null);
|
|
155
|
+
try {
|
|
156
|
+
await userAuth.getAccessToken();
|
|
157
|
+
expect.fail('Should have thrown error');
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
expect(error.message).toContain('npx @efficy/tribecrm-mcp-server authenticate');
|
|
161
|
+
expect(error.message).toContain('TRIBECRM_AUTH=app');
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
it('should use in-memory token if expiry is more than 60 seconds away', async () => {
|
|
165
|
+
// First call loads from disk
|
|
166
|
+
mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
|
|
167
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
168
|
+
await userAuth.getAccessToken();
|
|
169
|
+
// Second call should use in-memory token (not load from disk again)
|
|
170
|
+
mockTokenManager.loadTokens.mockClear();
|
|
171
|
+
const token = await userAuth.getAccessToken();
|
|
172
|
+
expect(token).toBe(mockTokens.access_token);
|
|
173
|
+
expect(mockTokenManager.loadTokens).not.toHaveBeenCalled();
|
|
174
|
+
});
|
|
175
|
+
it('should reload token if expiry is less than 60 seconds away', async () => {
|
|
176
|
+
const soonToExpireTokens = {
|
|
177
|
+
...mockStoredTokens,
|
|
178
|
+
expires_at: Date.now() + 30000 // 30 seconds from now
|
|
179
|
+
};
|
|
180
|
+
// First call
|
|
181
|
+
mockTokenManager.loadTokens.mockReturnValueOnce(soonToExpireTokens);
|
|
182
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
183
|
+
await userAuth.getAccessToken();
|
|
184
|
+
// Second call should reload because expiry is soon
|
|
185
|
+
const freshTokens = {
|
|
186
|
+
...mockStoredTokens,
|
|
187
|
+
expires_at: Date.now() + 3600000
|
|
188
|
+
};
|
|
189
|
+
mockTokenManager.loadTokens.mockReturnValue(freshTokens);
|
|
190
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
191
|
+
const token = await userAuth.getAccessToken();
|
|
192
|
+
expect(token).toBe(mockTokens.access_token);
|
|
193
|
+
expect(mockTokenManager.loadTokens).toHaveBeenCalledTimes(2);
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
describe('authenticate', () => {
|
|
197
|
+
it('should complete full OAuth flow successfully', async () => {
|
|
198
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
199
|
+
// Mock browser opening
|
|
200
|
+
const mockExec = vi.fn().mockResolvedValue({ stdout: '', stderr: '' });
|
|
201
|
+
vi.doMock('child_process', () => ({
|
|
202
|
+
exec: mockExec
|
|
203
|
+
}));
|
|
204
|
+
vi.doMock('util', () => ({
|
|
205
|
+
promisify: (fn) => mockExec
|
|
206
|
+
}));
|
|
207
|
+
await userAuth.authenticate();
|
|
208
|
+
// Verify PKCE generation
|
|
209
|
+
expect(mockOAuthFlow.generatePKCE).toHaveBeenCalled();
|
|
210
|
+
expect(OAuthFlow.generateState).toHaveBeenCalled();
|
|
211
|
+
// Verify consent URL generation
|
|
212
|
+
expect(mockOAuthFlow.generateConsentUrl).toHaveBeenCalledWith('test-state', 'test-challenge');
|
|
213
|
+
// Verify callback server was started
|
|
214
|
+
expect(CallbackServer).toHaveBeenCalledWith(3000);
|
|
215
|
+
expect(mockCallbackServer.waitForCallback).toHaveBeenCalledWith('test-state');
|
|
216
|
+
// Verify code exchange
|
|
217
|
+
expect(mockOAuthFlow.exchangeCodeForTokens).toHaveBeenCalledWith('test-auth-code', 'test-verifier');
|
|
218
|
+
// Verify tokens were saved
|
|
219
|
+
expect(mockTokenManager.saveTokens).toHaveBeenCalledWith(mockTokens);
|
|
220
|
+
// Verify success messages
|
|
221
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Starting TribeCRM User Authentication'));
|
|
222
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Authentication successful'));
|
|
223
|
+
consoleErrorSpy.mockRestore();
|
|
224
|
+
});
|
|
225
|
+
it('should use custom callback port if configured', async () => {
|
|
226
|
+
const customConfig = {
|
|
227
|
+
...testConfig,
|
|
228
|
+
callbackPort: 4567
|
|
229
|
+
};
|
|
230
|
+
const customUserAuth = new UserAuth(customConfig);
|
|
231
|
+
vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
232
|
+
await customUserAuth.authenticate();
|
|
233
|
+
expect(CallbackServer).toHaveBeenCalledWith(4567);
|
|
234
|
+
});
|
|
235
|
+
it('should throw error if callback fails', async () => {
|
|
236
|
+
mockCallbackServer.waitForCallback.mockRejectedValue(new Error('Callback timeout'));
|
|
237
|
+
vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
238
|
+
await expect(userAuth.authenticate()).rejects.toThrow('Authentication failed: Callback timeout');
|
|
239
|
+
expect(mockCallbackServer.stop).toHaveBeenCalled();
|
|
240
|
+
});
|
|
241
|
+
it('should throw error if token exchange fails', async () => {
|
|
242
|
+
mockOAuthFlow.exchangeCodeForTokens.mockRejectedValue(new Error('Invalid authorization code'));
|
|
243
|
+
vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
244
|
+
await expect(userAuth.authenticate()).rejects.toThrow('Authentication failed: Invalid authorization code');
|
|
245
|
+
});
|
|
246
|
+
it('should display consent URL in console', async () => {
|
|
247
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
248
|
+
await userAuth.authenticate();
|
|
249
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('https://auth.test.com/consent'));
|
|
250
|
+
consoleErrorSpy.mockRestore();
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
describe('isAuthenticated', () => {
|
|
254
|
+
it('should return true if valid token in memory', () => {
|
|
255
|
+
mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
|
|
256
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
257
|
+
// Load token into memory
|
|
258
|
+
userAuth.getAccessToken();
|
|
259
|
+
expect(userAuth.isAuthenticated()).toBe(true);
|
|
260
|
+
});
|
|
261
|
+
it('should return true if stored tokens are valid', () => {
|
|
262
|
+
mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
|
|
263
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
264
|
+
expect(userAuth.isAuthenticated()).toBe(true);
|
|
265
|
+
});
|
|
266
|
+
it('should return true if tokens expired but refresh_token exists', () => {
|
|
267
|
+
const expiredTokens = {
|
|
268
|
+
...mockStoredTokens,
|
|
269
|
+
expires_at: Date.now() - 1000
|
|
270
|
+
};
|
|
271
|
+
mockTokenManager.loadTokens.mockReturnValue(expiredTokens);
|
|
272
|
+
mockTokenManager.areTokensValid.mockReturnValue(false);
|
|
273
|
+
expect(userAuth.isAuthenticated()).toBe(true); // Can refresh
|
|
274
|
+
});
|
|
275
|
+
it('should return false if no tokens exist', () => {
|
|
276
|
+
mockTokenManager.loadTokens.mockReturnValue(null);
|
|
277
|
+
expect(userAuth.isAuthenticated()).toBe(false);
|
|
278
|
+
});
|
|
279
|
+
it('should return false if tokens expired and no refresh_token', () => {
|
|
280
|
+
const expiredTokensNoRefresh = {
|
|
281
|
+
access_token: 'old-token',
|
|
282
|
+
token_type: 'Bearer',
|
|
283
|
+
expires_in: 3600,
|
|
284
|
+
expires_at: Date.now() - 1000
|
|
285
|
+
// No refresh_token
|
|
286
|
+
};
|
|
287
|
+
mockTokenManager.loadTokens.mockReturnValue(expiredTokensNoRefresh);
|
|
288
|
+
mockTokenManager.areTokensValid.mockReturnValue(false);
|
|
289
|
+
expect(userAuth.isAuthenticated()).toBe(false);
|
|
290
|
+
});
|
|
291
|
+
it('should check in-memory token before disk', () => {
|
|
292
|
+
// Set up valid in-memory token
|
|
293
|
+
mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
|
|
294
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
295
|
+
userAuth.getAccessToken();
|
|
296
|
+
// Clear mock to verify it's not called again
|
|
297
|
+
mockTokenManager.loadTokens.mockClear();
|
|
298
|
+
expect(userAuth.isAuthenticated()).toBe(true);
|
|
299
|
+
expect(mockTokenManager.loadTokens).not.toHaveBeenCalled();
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
describe('logout', () => {
|
|
303
|
+
it('should delete tokens and clear memory', async () => {
|
|
304
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
305
|
+
// First authenticate
|
|
306
|
+
mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
|
|
307
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
308
|
+
await userAuth.getAccessToken();
|
|
309
|
+
expect(userAuth.isAuthenticated()).toBe(true);
|
|
310
|
+
// Logout
|
|
311
|
+
userAuth.logout();
|
|
312
|
+
expect(mockTokenManager.deleteTokens).toHaveBeenCalled();
|
|
313
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Logged out successfully');
|
|
314
|
+
// After logout, should need to load from disk again
|
|
315
|
+
mockTokenManager.loadTokens.mockReturnValue(null);
|
|
316
|
+
expect(userAuth.isAuthenticated()).toBe(false);
|
|
317
|
+
consoleErrorSpy.mockRestore();
|
|
318
|
+
});
|
|
319
|
+
it('should handle logout when not authenticated', () => {
|
|
320
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
321
|
+
userAuth.logout();
|
|
322
|
+
expect(mockTokenManager.deleteTokens).toHaveBeenCalled();
|
|
323
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Logged out successfully');
|
|
324
|
+
consoleErrorSpy.mockRestore();
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
describe('getTokenPath', () => {
|
|
328
|
+
it('should return token file path from token manager', () => {
|
|
329
|
+
const path = userAuth.getTokenPath();
|
|
330
|
+
expect(path).toBe('/test/tokens.json');
|
|
331
|
+
expect(mockTokenManager.getTokenPath).toHaveBeenCalled();
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
describe('edge cases and error handling', () => {
|
|
335
|
+
it('should handle token manager errors gracefully', async () => {
|
|
336
|
+
mockTokenManager.loadTokens.mockImplementation(() => {
|
|
337
|
+
throw new Error('Disk read error');
|
|
338
|
+
});
|
|
339
|
+
await expect(userAuth.getAccessToken()).rejects.toThrow();
|
|
340
|
+
});
|
|
341
|
+
it('should handle OAuth flow errors gracefully', async () => {
|
|
342
|
+
mockOAuthFlow.exchangeCodeForTokens.mockRejectedValue(new Error('Network error'));
|
|
343
|
+
vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
344
|
+
await expect(userAuth.authenticate()).rejects.toThrow('Authentication failed: Network error');
|
|
345
|
+
});
|
|
346
|
+
it('should handle callback server errors gracefully', async () => {
|
|
347
|
+
mockCallbackServer.waitForCallback.mockRejectedValue(new Error('Port in use'));
|
|
348
|
+
vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
349
|
+
await expect(userAuth.authenticate()).rejects.toThrow('Authentication failed: Port in use');
|
|
350
|
+
expect(mockCallbackServer.stop).toHaveBeenCalled();
|
|
351
|
+
});
|
|
352
|
+
it('should handle missing refresh_token during refresh', async () => {
|
|
353
|
+
const tokensWithoutRefresh = {
|
|
354
|
+
access_token: 'old-token',
|
|
355
|
+
token_type: 'Bearer',
|
|
356
|
+
expires_in: 3600,
|
|
357
|
+
expires_at: Date.now() - 1000
|
|
358
|
+
// No refresh_token
|
|
359
|
+
};
|
|
360
|
+
mockTokenManager.loadTokens.mockReturnValue(tokensWithoutRefresh);
|
|
361
|
+
mockTokenManager.areTokensValid.mockReturnValue(false);
|
|
362
|
+
await expect(userAuth.getAccessToken()).rejects.toThrow('No valid authentication tokens found');
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
//# sourceMappingURL=user-auth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-auth.test.js","sourceRoot":"","sources":["../../src/auth/user-auth.test.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -4,7 +4,12 @@ export declare class TribeCRMClient {
|
|
|
4
4
|
private config;
|
|
5
5
|
private token;
|
|
6
6
|
private tokenExpiry;
|
|
7
|
+
private userAuth;
|
|
7
8
|
constructor(config: TribeCRMConfig);
|
|
9
|
+
/**
|
|
10
|
+
* Extract port number from redirect URI
|
|
11
|
+
*/
|
|
12
|
+
private extractPortFromUri;
|
|
8
13
|
private ensureAuthenticated;
|
|
9
14
|
/**
|
|
10
15
|
* Get a single entity by ID
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAa,MAAM,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAa,MAAM,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAGpG,qBAAa,cAAc;IACzB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,MAAM,EAAE,cAAc;IAyBlC;;OAEG;IACH,OAAO,CAAC,kBAAkB;YASZ,mBAAmB;IAoDjC;;;;;;OAMG;IACG,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC;IAUlB;;;;OAIG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAMlF;;;;;OAKG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAOpG;;;;OAIG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvE;;;;OAIG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,GACA,OAAO,CAAC,GAAG,CAAC;IAgBf;;OAEG;IACG,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IASvD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAoB/C"}
|
package/dist/client.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
|
+
import { UserAuth } from './auth/user-auth.js';
|
|
2
3
|
export class TribeCRMClient {
|
|
3
4
|
axiosInstance;
|
|
4
5
|
config;
|
|
5
6
|
token = null;
|
|
6
7
|
tokenExpiry = 0;
|
|
8
|
+
userAuth = null;
|
|
7
9
|
constructor(config) {
|
|
8
10
|
this.config = config;
|
|
9
11
|
this.axiosInstance = axios.create({
|
|
@@ -12,6 +14,31 @@ export class TribeCRMClient {
|
|
|
12
14
|
'Content-Type': 'application/json',
|
|
13
15
|
},
|
|
14
16
|
});
|
|
17
|
+
// Initialize user authentication if authMethod is 'user'
|
|
18
|
+
if (config.authMethod === 'user') {
|
|
19
|
+
const redirectUri = process.env.TRIBECRM_REDIRECT_URI || 'http://localhost:3000/callback';
|
|
20
|
+
const callbackPort = this.extractPortFromUri(redirectUri);
|
|
21
|
+
this.userAuth = new UserAuth({
|
|
22
|
+
authUrl: config.authUrl,
|
|
23
|
+
clientId: config.clientId,
|
|
24
|
+
clientSecret: config.clientSecret,
|
|
25
|
+
redirectUri: redirectUri,
|
|
26
|
+
callbackPort: callbackPort,
|
|
27
|
+
usePKCE: false, // TribeCRM doesn't use PKCE for user auth
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Extract port number from redirect URI
|
|
33
|
+
*/
|
|
34
|
+
extractPortFromUri(uri) {
|
|
35
|
+
try {
|
|
36
|
+
const url = new URL(uri);
|
|
37
|
+
return url.port ? parseInt(url.port, 10) : 3000;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return 3000;
|
|
41
|
+
}
|
|
15
42
|
}
|
|
16
43
|
async ensureAuthenticated() {
|
|
17
44
|
const now = Date.now();
|
|
@@ -21,9 +48,21 @@ export class TribeCRMClient {
|
|
|
21
48
|
}
|
|
22
49
|
// Branch based on authentication method
|
|
23
50
|
if (this.config.authMethod === 'user') {
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
51
|
+
// User authentication (OAuth2 Authorization Code flow)
|
|
52
|
+
if (!this.userAuth) {
|
|
53
|
+
throw new Error('User authentication not initialized');
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const accessToken = await this.userAuth.getAccessToken();
|
|
57
|
+
this.axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${accessToken}`;
|
|
58
|
+
// Note: Token expiry is managed by UserAuth internally
|
|
59
|
+
this.token = { access_token: accessToken, token_type: 'bearer', expires_in: 86400, scope: 'read write offline' };
|
|
60
|
+
this.tokenExpiry = now + 86400000; // 24 hours
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
throw new Error(`User authentication failed: ${error.message}`);
|
|
64
|
+
}
|
|
65
|
+
return;
|
|
27
66
|
}
|
|
28
67
|
// Default: App authentication (OAuth2 Client Credentials)
|
|
29
68
|
try {
|
|
@@ -32,7 +71,6 @@ export class TribeCRMClient {
|
|
|
32
71
|
client_id: this.config.clientId,
|
|
33
72
|
client_secret: this.config.clientSecret,
|
|
34
73
|
scope: 'read write offline',
|
|
35
|
-
...(this.config.organizationId && { organization_id: this.config.organizationId }),
|
|
36
74
|
}), {
|
|
37
75
|
headers: {
|
|
38
76
|
'Content-Type': 'application/x-www-form-urlencoded',
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.test.js
CHANGED
|
@@ -16,7 +16,6 @@ describe('TribeCRMClient', () => {
|
|
|
16
16
|
authUrl: 'https://auth-test.tribecrm.nl',
|
|
17
17
|
clientId: 'test-client-id',
|
|
18
18
|
clientSecret: 'test-client-secret',
|
|
19
|
-
organizationId: 'test-org-id',
|
|
20
19
|
mode: 'read-write',
|
|
21
20
|
};
|
|
22
21
|
// Mock axios.create to return a mocked instance
|
|
@@ -60,7 +59,7 @@ describe('TribeCRMClient', () => {
|
|
|
60
59
|
}));
|
|
61
60
|
expect(result).toEqual({ ID: 'test-employee-id', Name: 'Test User' });
|
|
62
61
|
});
|
|
63
|
-
it('should throw error for user authentication
|
|
62
|
+
it('should throw error for user authentication without tokens', async () => {
|
|
64
63
|
const userConfig = {
|
|
65
64
|
apiUrl: 'https://api-test.tribecrm.nl',
|
|
66
65
|
authUrl: 'https://auth-test.tribecrm.nl',
|
|
@@ -71,7 +70,7 @@ describe('TribeCRMClient', () => {
|
|
|
71
70
|
const userClient = new TribeCRMClient(userConfig);
|
|
72
71
|
await expect(userClient.getCurrentEmployee())
|
|
73
72
|
.rejects
|
|
74
|
-
.toThrow('
|
|
73
|
+
.toThrow('No valid authentication tokens found');
|
|
75
74
|
});
|
|
76
75
|
it('should use app authentication by default', async () => {
|
|
77
76
|
const mockToken = {
|