@rekog/mcp-nest 1.8.0-alpha.0 → 1.8.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.
|
@@ -4,12 +4,12 @@ const testing_1 = require("@nestjs/testing");
|
|
|
4
4
|
const typeorm_1 = require("@nestjs/typeorm");
|
|
5
5
|
const typeorm_store_service_1 = require("./typeorm-store.service");
|
|
6
6
|
const entities_1 = require("./entities");
|
|
7
|
+
const constants_1 = require("./constants");
|
|
7
8
|
describe('TypeOrmStore', () => {
|
|
8
9
|
let service;
|
|
9
10
|
let clientRepository;
|
|
10
11
|
let authCodeRepository;
|
|
11
12
|
let sessionRepository;
|
|
12
|
-
let userProfileRepository;
|
|
13
13
|
beforeEach(async () => {
|
|
14
14
|
const mockClientRepository = {
|
|
15
15
|
save: jest.fn(),
|
|
@@ -26,7 +26,7 @@ describe('TypeOrmStore', () => {
|
|
|
26
26
|
findOne: jest.fn(),
|
|
27
27
|
delete: jest.fn(),
|
|
28
28
|
};
|
|
29
|
-
const
|
|
29
|
+
const mockUserProfileRepository = {
|
|
30
30
|
save: jest.fn(),
|
|
31
31
|
findOne: jest.fn(),
|
|
32
32
|
delete: jest.fn(),
|
|
@@ -35,27 +35,27 @@ describe('TypeOrmStore', () => {
|
|
|
35
35
|
providers: [
|
|
36
36
|
typeorm_store_service_1.TypeOrmStore,
|
|
37
37
|
{
|
|
38
|
-
provide: (0, typeorm_1.getRepositoryToken)(entities_1.OAuthClientEntity),
|
|
38
|
+
provide: (0, typeorm_1.getRepositoryToken)(entities_1.OAuthClientEntity, constants_1.OAUTH_TYPEORM_CONNECTION_NAME),
|
|
39
39
|
useValue: mockClientRepository,
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
|
-
provide: (0, typeorm_1.getRepositoryToken)(entities_1.AuthorizationCodeEntity),
|
|
42
|
+
provide: (0, typeorm_1.getRepositoryToken)(entities_1.AuthorizationCodeEntity, constants_1.OAUTH_TYPEORM_CONNECTION_NAME),
|
|
43
43
|
useValue: mockAuthCodeRepository,
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
|
-
provide: (0, typeorm_1.getRepositoryToken)(entities_1.OAuthSessionEntity),
|
|
46
|
+
provide: (0, typeorm_1.getRepositoryToken)(entities_1.OAuthSessionEntity, constants_1.OAUTH_TYPEORM_CONNECTION_NAME),
|
|
47
47
|
useValue: mockSessionRepository,
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
|
-
provide: (0, typeorm_1.getRepositoryToken)(entities_1.OAuthUserProfileEntity),
|
|
51
|
-
useValue:
|
|
50
|
+
provide: (0, typeorm_1.getRepositoryToken)(entities_1.OAuthUserProfileEntity, constants_1.OAUTH_TYPEORM_CONNECTION_NAME),
|
|
51
|
+
useValue: mockUserProfileRepository,
|
|
52
52
|
},
|
|
53
53
|
],
|
|
54
54
|
}).compile();
|
|
55
55
|
service = module.get(typeorm_store_service_1.TypeOrmStore);
|
|
56
|
-
clientRepository = module.get((0, typeorm_1.getRepositoryToken)(entities_1.OAuthClientEntity));
|
|
57
|
-
authCodeRepository = module.get((0, typeorm_1.getRepositoryToken)(entities_1.AuthorizationCodeEntity));
|
|
58
|
-
sessionRepository = module.get((0, typeorm_1.getRepositoryToken)(entities_1.OAuthSessionEntity));
|
|
56
|
+
clientRepository = module.get((0, typeorm_1.getRepositoryToken)(entities_1.OAuthClientEntity, constants_1.OAUTH_TYPEORM_CONNECTION_NAME));
|
|
57
|
+
authCodeRepository = module.get((0, typeorm_1.getRepositoryToken)(entities_1.AuthorizationCodeEntity, constants_1.OAUTH_TYPEORM_CONNECTION_NAME));
|
|
58
|
+
sessionRepository = module.get((0, typeorm_1.getRepositoryToken)(entities_1.OAuthSessionEntity, constants_1.OAUTH_TYPEORM_CONNECTION_NAME));
|
|
59
59
|
});
|
|
60
60
|
afterEach(() => {
|
|
61
61
|
jest.clearAllMocks();
|
|
@@ -212,7 +212,10 @@ describe('TypeOrmStore', () => {
|
|
|
212
212
|
});
|
|
213
213
|
it('should return undefined and delete expired authorization code', async () => {
|
|
214
214
|
authCodeRepository.findOne.mockResolvedValue(expiredAuthCode);
|
|
215
|
-
authCodeRepository.delete.mockResolvedValue({
|
|
215
|
+
authCodeRepository.delete.mockResolvedValue({
|
|
216
|
+
raw: {},
|
|
217
|
+
affected: 1,
|
|
218
|
+
});
|
|
216
219
|
const result = await service.getAuthCode('expired-code');
|
|
217
220
|
expect(authCodeRepository.findOne).toHaveBeenCalledWith({
|
|
218
221
|
where: { code: 'expired-code' },
|
|
@@ -235,7 +238,10 @@ describe('TypeOrmStore', () => {
|
|
|
235
238
|
});
|
|
236
239
|
describe('removeAuthCode', () => {
|
|
237
240
|
it('should remove an authorization code', async () => {
|
|
238
|
-
authCodeRepository.delete.mockResolvedValue({
|
|
241
|
+
authCodeRepository.delete.mockResolvedValue({
|
|
242
|
+
raw: {},
|
|
243
|
+
affected: 1,
|
|
244
|
+
});
|
|
239
245
|
await service.removeAuthCode('test-auth-code');
|
|
240
246
|
expect(authCodeRepository.delete).toHaveBeenCalledWith({
|
|
241
247
|
code: 'test-auth-code',
|
|
@@ -289,7 +295,10 @@ describe('TypeOrmStore', () => {
|
|
|
289
295
|
});
|
|
290
296
|
it('should return undefined and delete expired OAuth session', async () => {
|
|
291
297
|
sessionRepository.findOne.mockResolvedValue(expiredSession);
|
|
292
|
-
sessionRepository.delete.mockResolvedValue({
|
|
298
|
+
sessionRepository.delete.mockResolvedValue({
|
|
299
|
+
raw: {},
|
|
300
|
+
affected: 1,
|
|
301
|
+
});
|
|
293
302
|
const result = await service.getOAuthSession('expired-session');
|
|
294
303
|
expect(sessionRepository.findOne).toHaveBeenCalledWith({
|
|
295
304
|
where: { sessionId: 'expired-session' },
|
|
@@ -312,7 +321,10 @@ describe('TypeOrmStore', () => {
|
|
|
312
321
|
});
|
|
313
322
|
describe('removeOAuthSession', () => {
|
|
314
323
|
it('should remove an OAuth session', async () => {
|
|
315
|
-
sessionRepository.delete.mockResolvedValue({
|
|
324
|
+
sessionRepository.delete.mockResolvedValue({
|
|
325
|
+
raw: {},
|
|
326
|
+
affected: 1,
|
|
327
|
+
});
|
|
316
328
|
await service.removeOAuthSession('session-123');
|
|
317
329
|
expect(sessionRepository.delete).toHaveBeenCalledWith({
|
|
318
330
|
sessionId: 'session-123',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeorm-store.service.spec.js","sourceRoot":"","sources":["../../../../src/authz/stores/typeorm/typeorm-store.service.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { getRepositoryToken } from '@nestjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { TypeOrmStore } from './typeorm-store.service';\nimport {\n OAuthClientEntity,\n AuthorizationCodeEntity,\n OAuthSessionEntity,\n OAuthUserProfileEntity,\n} from './entities';\nimport { OAuthClient, AuthorizationCode } from '../oauth-store.interface';\nimport { OAuthSession } from '../../providers/oauth-provider.interface';\n\ndescribe('TypeOrmStore', () => {\n let service: TypeOrmStore;\n let clientRepository: jest.Mocked<Repository<OAuthClientEntity>>;\n let authCodeRepository: jest.Mocked<Repository<AuthorizationCodeEntity>>;\n let sessionRepository: jest.Mocked<Repository<OAuthSessionEntity>>;\n let userProfileRepository: jest.Mocked<Repository<OAuthUserProfileEntity>>;\n\n beforeEach(async () => {\n // Create mocked repositories\n const mockClientRepository = {\n save: jest.fn(),\n findOne: jest.fn(),\n delete: jest.fn(),\n };\n\n const mockAuthCodeRepository = {\n save: jest.fn(),\n findOne: jest.fn(),\n delete: jest.fn(),\n };\n\n const mockSessionRepository = {\n save: jest.fn(),\n findOne: jest.fn(),\n delete: jest.fn(),\n };\n\n const userProfileRepository = {\n save: jest.fn(),\n findOne: jest.fn(),\n delete: jest.fn(),\n };\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n TypeOrmStore,\n {\n provide: getRepositoryToken(OAuthClientEntity),\n useValue: mockClientRepository,\n },\n {\n provide: getRepositoryToken(AuthorizationCodeEntity),\n useValue: mockAuthCodeRepository,\n },\n {\n provide: getRepositoryToken(OAuthSessionEntity),\n useValue: mockSessionRepository,\n },\n {\n provide: getRepositoryToken(OAuthUserProfileEntity),\n useValue: userProfileRepository,\n },\n ],\n }).compile();\n\n service = module.get<TypeOrmStore>(TypeOrmStore);\n clientRepository = module.get(getRepositoryToken(OAuthClientEntity));\n authCodeRepository = module.get(\n getRepositoryToken(AuthorizationCodeEntity),\n );\n sessionRepository = module.get(getRepositoryToken(OAuthSessionEntity));\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n\n describe('generateClientId', () => {\n const mockClient: OAuthClient = {\n client_id: '',\n client_name: 'Test Client',\n client_description: 'A test OAuth client',\n logo_uri: 'https://example.com/logo.png',\n client_uri: 'https://example.com',\n developer_name: 'Test Developer',\n developer_email: 'test@example.com',\n redirect_uris: ['http://localhost:3000/callback'],\n grant_types: ['authorization_code', 'refresh_token'],\n response_types: ['code'],\n token_endpoint_auth_method: 'none',\n created_at: new Date(),\n updated_at: new Date(),\n };\n\n it('should generate client IDs with correct format', () => {\n const clientId = service.generateClientId(mockClient);\n\n // Should match pattern: normalizedname_8hexchars\n expect(clientId).toMatch(/^[a-z0-9]+_[a-f0-9]{8}$/);\n });\n\n it('should include normalized client name in the generated ID', () => {\n const clientWithSpecialChars = {\n ...mockClient,\n client_name: 'Test Client!@#',\n };\n\n const clientId = service.generateClientId(clientWithSpecialChars);\n expect(clientId).toMatch(/^testclient_[a-f0-9]{8}$/);\n });\n\n it('should generate different IDs for different clients', () => {\n const client1 = { ...mockClient, client_name: 'Client One' };\n const client2 = { ...mockClient, client_name: 'Client Two' };\n\n const id1 = service.generateClientId(client1);\n const id2 = service.generateClientId(client2);\n\n expect(id1).not.toBe(id2);\n });\n\n it('should generate different IDs on each call (non-deterministic)', () => {\n const id1 = service.generateClientId(mockClient);\n const id2 = service.generateClientId(mockClient);\n\n // TypeORM store uses random bytes, so IDs should be different\n expect(id1).not.toBe(id2);\n });\n });\n\n describe('Client Management', () => {\n const mockClient: OAuthClient = {\n client_id: 'test-client-id',\n client_name: 'Test Client',\n client_description: 'A test OAuth client',\n logo_uri: 'https://example.com/logo.png',\n client_uri: 'https://example.com',\n developer_name: 'Test Developer',\n developer_email: 'test@example.com',\n redirect_uris: ['http://localhost:3000/callback'],\n grant_types: ['authorization_code', 'refresh_token'],\n response_types: ['code'],\n token_endpoint_auth_method: 'none',\n created_at: new Date(),\n updated_at: new Date(),\n };\n\n describe('storeClient', () => {\n it('should store a client and return the saved result', async () => {\n clientRepository.save.mockResolvedValue(\n mockClient as OAuthClientEntity,\n );\n\n const result = await service.storeClient(mockClient);\n\n expect(clientRepository.save).toHaveBeenCalledWith(mockClient);\n expect(result).toEqual(mockClient);\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n clientRepository.save.mockRejectedValue(error);\n\n await expect(service.storeClient(mockClient)).rejects.toThrow(\n 'Database error',\n );\n });\n });\n\n describe('getClient', () => {\n it('should return client when found', async () => {\n clientRepository.findOne.mockResolvedValue(\n mockClient as OAuthClientEntity,\n );\n\n const result = await service.getClient('test-client-id');\n\n expect(clientRepository.findOne).toHaveBeenCalledWith({\n where: { client_id: 'test-client-id' },\n });\n expect(result).toEqual(mockClient);\n });\n\n it('should return undefined when client not found', async () => {\n clientRepository.findOne.mockResolvedValue(null);\n\n const result = await service.getClient('non-existent-id');\n\n expect(result).toBeUndefined();\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n clientRepository.findOne.mockRejectedValue(error);\n\n await expect(service.getClient('test-client-id')).rejects.toThrow(\n 'Database error',\n );\n });\n });\n\n describe('findClient', () => {\n it('should find client by name when found', async () => {\n clientRepository.findOne.mockResolvedValue(\n mockClient as OAuthClientEntity,\n );\n\n const result = await service.findClient('Test Client');\n\n expect(clientRepository.findOne).toHaveBeenCalledWith({\n where: { client_name: 'Test Client' },\n });\n expect(result).toEqual(mockClient);\n });\n\n it('should return undefined when client name not found', async () => {\n clientRepository.findOne.mockResolvedValue(null);\n\n const result = await service.findClient('Non-existent Client');\n\n expect(result).toBeUndefined();\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n clientRepository.findOne.mockRejectedValue(error);\n\n await expect(service.findClient('Test Client')).rejects.toThrow(\n 'Database error',\n );\n });\n });\n });\n\n describe('Authorization Code Management', () => {\n const mockAuthCode: AuthorizationCode = {\n code: 'test-auth-code',\n user_id: 'user-123',\n client_id: 'client-123',\n redirect_uri: 'http://localhost:3000/callback',\n code_challenge: 'test-challenge',\n code_challenge_method: 'S256',\n expires_at: Date.now() + 600000, // 10 minutes from now\n github_access_token: 'github-token-123',\n };\n\n const expiredAuthCode: AuthorizationCode = {\n ...mockAuthCode,\n expires_at: Date.now() - 1000, // 1 second ago\n };\n\n describe('storeAuthCode', () => {\n it('should store an authorization code', async () => {\n authCodeRepository.save.mockResolvedValue(\n mockAuthCode as AuthorizationCodeEntity,\n );\n\n await service.storeAuthCode(mockAuthCode);\n\n expect(authCodeRepository.save).toHaveBeenCalledWith(mockAuthCode);\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n authCodeRepository.save.mockRejectedValue(error);\n\n await expect(service.storeAuthCode(mockAuthCode)).rejects.toThrow(\n 'Database error',\n );\n });\n });\n\n describe('getAuthCode', () => {\n it('should return authorization code when found and not expired', async () => {\n authCodeRepository.findOne.mockResolvedValue(\n mockAuthCode as AuthorizationCodeEntity,\n );\n\n const result = await service.getAuthCode('test-auth-code');\n\n expect(authCodeRepository.findOne).toHaveBeenCalledWith({\n where: { code: 'test-auth-code' },\n });\n expect(result).toEqual(mockAuthCode);\n });\n\n it('should return undefined and delete expired authorization code', async () => {\n authCodeRepository.findOne.mockResolvedValue(\n expiredAuthCode as AuthorizationCodeEntity,\n );\n authCodeRepository.delete.mockResolvedValue({} as any);\n\n const result = await service.getAuthCode('expired-code');\n\n expect(authCodeRepository.findOne).toHaveBeenCalledWith({\n where: { code: 'expired-code' },\n });\n expect(authCodeRepository.delete).toHaveBeenCalledWith({\n code: 'expired-code',\n });\n expect(result).toBeUndefined();\n });\n\n it('should return undefined when authorization code not found', async () => {\n authCodeRepository.findOne.mockResolvedValue(null);\n\n const result = await service.getAuthCode('non-existent-code');\n\n expect(result).toBeUndefined();\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n authCodeRepository.findOne.mockRejectedValue(error);\n\n await expect(service.getAuthCode('test-auth-code')).rejects.toThrow(\n 'Database error',\n );\n });\n });\n\n describe('removeAuthCode', () => {\n it('should remove an authorization code', async () => {\n authCodeRepository.delete.mockResolvedValue({} as any);\n\n await service.removeAuthCode('test-auth-code');\n\n expect(authCodeRepository.delete).toHaveBeenCalledWith({\n code: 'test-auth-code',\n });\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n authCodeRepository.delete.mockRejectedValue(error);\n\n await expect(service.removeAuthCode('test-auth-code')).rejects.toThrow(\n 'Database error',\n );\n });\n });\n });\n\n describe('OAuth Session Management', () => {\n const mockSession: OAuthSession = {\n sessionId: 'session-123',\n state: 'test-state',\n clientId: 'client-123',\n redirectUri: 'http://localhost:3000/callback',\n codeChallenge: 'test-challenge',\n codeChallengeMethod: 'S256',\n oauthState: 'oauth-state-123',\n resource: 'test-resource',\n expiresAt: Date.now() + 3600000, // 1 hour from now\n };\n\n const expiredSession: OAuthSession = {\n ...mockSession,\n sessionId: 'expired-session',\n expiresAt: Date.now() - 1000, // 1 second ago\n };\n\n describe('storeOAuthSession', () => {\n it('should store an OAuth session', async () => {\n const expectedEntity = { ...mockSession, sessionId: 'session-123' };\n sessionRepository.save.mockResolvedValue(\n expectedEntity as OAuthSessionEntity,\n );\n\n await service.storeOAuthSession('session-123', mockSession);\n\n expect(sessionRepository.save).toHaveBeenCalledWith(expectedEntity);\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n sessionRepository.save.mockRejectedValue(error);\n\n await expect(\n service.storeOAuthSession('session-123', mockSession),\n ).rejects.toThrow('Database error');\n });\n });\n\n describe('getOAuthSession', () => {\n it('should return OAuth session when found and not expired', async () => {\n sessionRepository.findOne.mockResolvedValue(\n mockSession as OAuthSessionEntity,\n );\n\n const result = await service.getOAuthSession('session-123');\n\n expect(sessionRepository.findOne).toHaveBeenCalledWith({\n where: { sessionId: 'session-123' },\n });\n expect(result).toEqual(mockSession);\n });\n\n it('should return undefined and delete expired OAuth session', async () => {\n sessionRepository.findOne.mockResolvedValue(\n expiredSession as OAuthSessionEntity,\n );\n sessionRepository.delete.mockResolvedValue({} as any);\n\n const result = await service.getOAuthSession('expired-session');\n\n expect(sessionRepository.findOne).toHaveBeenCalledWith({\n where: { sessionId: 'expired-session' },\n });\n expect(sessionRepository.delete).toHaveBeenCalledWith({\n sessionId: 'expired-session',\n });\n expect(result).toBeUndefined();\n });\n\n it('should return undefined when OAuth session not found', async () => {\n sessionRepository.findOne.mockResolvedValue(null);\n\n const result = await service.getOAuthSession('non-existent-session');\n\n expect(result).toBeUndefined();\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n sessionRepository.findOne.mockRejectedValue(error);\n\n await expect(service.getOAuthSession('session-123')).rejects.toThrow(\n 'Database error',\n );\n });\n });\n\n describe('removeOAuthSession', () => {\n it('should remove an OAuth session', async () => {\n sessionRepository.delete.mockResolvedValue({} as any);\n\n await service.removeOAuthSession('session-123');\n\n expect(sessionRepository.delete).toHaveBeenCalledWith({\n sessionId: 'session-123',\n });\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n sessionRepository.delete.mockRejectedValue(error);\n\n await expect(service.removeOAuthSession('session-123')).rejects.toThrow(\n 'Database error',\n );\n });\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"typeorm-store.service.spec.js","sourceRoot":"","sources":["../../../../src/authz/stores/typeorm/typeorm-store.service.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/unbound-method */\nimport { Test, TestingModule } from '@nestjs/testing';\nimport { getRepositoryToken } from '@nestjs/typeorm';\nimport { Repository, DeleteResult } from 'typeorm';\nimport { TypeOrmStore } from './typeorm-store.service';\nimport {\n OAuthClientEntity,\n AuthorizationCodeEntity,\n OAuthSessionEntity,\n OAuthUserProfileEntity,\n} from './entities';\nimport { OAuthClient, AuthorizationCode } from '../oauth-store.interface';\nimport { OAuthSession } from '../../providers/oauth-provider.interface';\nimport { OAUTH_TYPEORM_CONNECTION_NAME } from './constants';\n\ndescribe('TypeOrmStore', () => {\n let service: TypeOrmStore;\n let clientRepository: jest.Mocked<Repository<OAuthClientEntity>>;\n let authCodeRepository: jest.Mocked<Repository<AuthorizationCodeEntity>>;\n let sessionRepository: jest.Mocked<Repository<OAuthSessionEntity>>;\n\n beforeEach(async () => {\n // Create mocked repositories\n const mockClientRepository = {\n save: jest.fn(),\n findOne: jest.fn(),\n delete: jest.fn(),\n };\n\n const mockAuthCodeRepository = {\n save: jest.fn(),\n findOne: jest.fn(),\n delete: jest.fn(),\n };\n\n const mockSessionRepository = {\n save: jest.fn(),\n findOne: jest.fn(),\n delete: jest.fn(),\n };\n\n const mockUserProfileRepository = {\n save: jest.fn(),\n findOne: jest.fn(),\n delete: jest.fn(),\n };\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n TypeOrmStore,\n {\n provide: getRepositoryToken(\n OAuthClientEntity,\n OAUTH_TYPEORM_CONNECTION_NAME,\n ),\n useValue: mockClientRepository,\n },\n {\n provide: getRepositoryToken(\n AuthorizationCodeEntity,\n OAUTH_TYPEORM_CONNECTION_NAME,\n ),\n useValue: mockAuthCodeRepository,\n },\n {\n provide: getRepositoryToken(\n OAuthSessionEntity,\n OAUTH_TYPEORM_CONNECTION_NAME,\n ),\n useValue: mockSessionRepository,\n },\n {\n provide: getRepositoryToken(\n OAuthUserProfileEntity,\n OAUTH_TYPEORM_CONNECTION_NAME,\n ),\n useValue: mockUserProfileRepository,\n },\n ],\n }).compile();\n\n service = module.get<TypeOrmStore>(TypeOrmStore);\n clientRepository = module.get(\n getRepositoryToken(OAuthClientEntity, OAUTH_TYPEORM_CONNECTION_NAME),\n );\n authCodeRepository = module.get(\n getRepositoryToken(\n AuthorizationCodeEntity,\n OAUTH_TYPEORM_CONNECTION_NAME,\n ),\n );\n sessionRepository = module.get(\n getRepositoryToken(OAuthSessionEntity, OAUTH_TYPEORM_CONNECTION_NAME),\n );\n // Note: userProfileRepository is not directly used in tests below; it's provided for completeness\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n\n describe('generateClientId', () => {\n const mockClient: OAuthClient = {\n client_id: '',\n client_name: 'Test Client',\n client_description: 'A test OAuth client',\n logo_uri: 'https://example.com/logo.png',\n client_uri: 'https://example.com',\n developer_name: 'Test Developer',\n developer_email: 'test@example.com',\n redirect_uris: ['http://localhost:3000/callback'],\n grant_types: ['authorization_code', 'refresh_token'],\n response_types: ['code'],\n token_endpoint_auth_method: 'none',\n created_at: new Date(),\n updated_at: new Date(),\n };\n\n it('should generate client IDs with correct format', () => {\n const clientId = service.generateClientId(mockClient);\n\n // Should match pattern: normalizedname_8hexchars\n expect(clientId).toMatch(/^[a-z0-9]+_[a-f0-9]{8}$/);\n });\n\n it('should include normalized client name in the generated ID', () => {\n const clientWithSpecialChars = {\n ...mockClient,\n client_name: 'Test Client!@#',\n };\n\n const clientId = service.generateClientId(clientWithSpecialChars);\n expect(clientId).toMatch(/^testclient_[a-f0-9]{8}$/);\n });\n\n it('should generate different IDs for different clients', () => {\n const client1 = { ...mockClient, client_name: 'Client One' };\n const client2 = { ...mockClient, client_name: 'Client Two' };\n\n const id1 = service.generateClientId(client1);\n const id2 = service.generateClientId(client2);\n\n expect(id1).not.toBe(id2);\n });\n\n it('should generate different IDs on each call (non-deterministic)', () => {\n const id1 = service.generateClientId(mockClient);\n const id2 = service.generateClientId(mockClient);\n\n // TypeORM store uses random bytes, so IDs should be different\n expect(id1).not.toBe(id2);\n });\n });\n\n describe('Client Management', () => {\n const mockClient: OAuthClient = {\n client_id: 'test-client-id',\n client_name: 'Test Client',\n client_description: 'A test OAuth client',\n logo_uri: 'https://example.com/logo.png',\n client_uri: 'https://example.com',\n developer_name: 'Test Developer',\n developer_email: 'test@example.com',\n redirect_uris: ['http://localhost:3000/callback'],\n grant_types: ['authorization_code', 'refresh_token'],\n response_types: ['code'],\n token_endpoint_auth_method: 'none',\n created_at: new Date(),\n updated_at: new Date(),\n };\n\n describe('storeClient', () => {\n it('should store a client and return the saved result', async () => {\n clientRepository.save.mockResolvedValue(\n mockClient as OAuthClientEntity,\n );\n\n const result = await service.storeClient(mockClient);\n\n expect(clientRepository.save).toHaveBeenCalledWith(mockClient);\n expect(result).toEqual(mockClient);\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n clientRepository.save.mockRejectedValue(error);\n\n await expect(service.storeClient(mockClient)).rejects.toThrow(\n 'Database error',\n );\n });\n });\n\n describe('getClient', () => {\n it('should return client when found', async () => {\n clientRepository.findOne.mockResolvedValue(\n mockClient as OAuthClientEntity,\n );\n\n const result = await service.getClient('test-client-id');\n\n expect(clientRepository.findOne).toHaveBeenCalledWith({\n where: { client_id: 'test-client-id' },\n });\n expect(result).toEqual(mockClient);\n });\n\n it('should return undefined when client not found', async () => {\n clientRepository.findOne.mockResolvedValue(null);\n\n const result = await service.getClient('non-existent-id');\n\n expect(result).toBeUndefined();\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n clientRepository.findOne.mockRejectedValue(error);\n\n await expect(service.getClient('test-client-id')).rejects.toThrow(\n 'Database error',\n );\n });\n });\n\n describe('findClient', () => {\n it('should find client by name when found', async () => {\n clientRepository.findOne.mockResolvedValue(\n mockClient as OAuthClientEntity,\n );\n\n const result = await service.findClient('Test Client');\n\n expect(clientRepository.findOne).toHaveBeenCalledWith({\n where: { client_name: 'Test Client' },\n });\n expect(result).toEqual(mockClient);\n });\n\n it('should return undefined when client name not found', async () => {\n clientRepository.findOne.mockResolvedValue(null);\n\n const result = await service.findClient('Non-existent Client');\n\n expect(result).toBeUndefined();\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n clientRepository.findOne.mockRejectedValue(error);\n\n await expect(service.findClient('Test Client')).rejects.toThrow(\n 'Database error',\n );\n });\n });\n });\n\n describe('Authorization Code Management', () => {\n const mockAuthCode: AuthorizationCode = {\n code: 'test-auth-code',\n user_id: 'user-123',\n client_id: 'client-123',\n redirect_uri: 'http://localhost:3000/callback',\n code_challenge: 'test-challenge',\n code_challenge_method: 'S256',\n expires_at: Date.now() + 600000, // 10 minutes from now\n github_access_token: 'github-token-123',\n };\n\n const expiredAuthCode: AuthorizationCode = {\n ...mockAuthCode,\n expires_at: Date.now() - 1000, // 1 second ago\n };\n\n describe('storeAuthCode', () => {\n it('should store an authorization code', async () => {\n authCodeRepository.save.mockResolvedValue(\n mockAuthCode as AuthorizationCodeEntity,\n );\n\n await service.storeAuthCode(mockAuthCode);\n\n expect(authCodeRepository.save).toHaveBeenCalledWith(mockAuthCode);\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n authCodeRepository.save.mockRejectedValue(error);\n\n await expect(service.storeAuthCode(mockAuthCode)).rejects.toThrow(\n 'Database error',\n );\n });\n });\n\n describe('getAuthCode', () => {\n it('should return authorization code when found and not expired', async () => {\n authCodeRepository.findOne.mockResolvedValue(\n mockAuthCode as AuthorizationCodeEntity,\n );\n\n const result = await service.getAuthCode('test-auth-code');\n\n expect(authCodeRepository.findOne).toHaveBeenCalledWith({\n where: { code: 'test-auth-code' },\n });\n expect(result).toEqual(mockAuthCode);\n });\n\n it('should return undefined and delete expired authorization code', async () => {\n authCodeRepository.findOne.mockResolvedValue(\n expiredAuthCode as AuthorizationCodeEntity,\n );\n authCodeRepository.delete.mockResolvedValue({\n raw: {},\n affected: 1,\n } as DeleteResult);\n\n const result = await service.getAuthCode('expired-code');\n\n expect(authCodeRepository.findOne).toHaveBeenCalledWith({\n where: { code: 'expired-code' },\n });\n expect(authCodeRepository.delete).toHaveBeenCalledWith({\n code: 'expired-code',\n });\n expect(result).toBeUndefined();\n });\n\n it('should return undefined when authorization code not found', async () => {\n authCodeRepository.findOne.mockResolvedValue(null);\n\n const result = await service.getAuthCode('non-existent-code');\n\n expect(result).toBeUndefined();\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n authCodeRepository.findOne.mockRejectedValue(error);\n\n await expect(service.getAuthCode('test-auth-code')).rejects.toThrow(\n 'Database error',\n );\n });\n });\n\n describe('removeAuthCode', () => {\n it('should remove an authorization code', async () => {\n authCodeRepository.delete.mockResolvedValue({\n raw: {},\n affected: 1,\n } as DeleteResult);\n\n await service.removeAuthCode('test-auth-code');\n\n expect(authCodeRepository.delete).toHaveBeenCalledWith({\n code: 'test-auth-code',\n });\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n authCodeRepository.delete.mockRejectedValue(error);\n\n await expect(service.removeAuthCode('test-auth-code')).rejects.toThrow(\n 'Database error',\n );\n });\n });\n });\n\n describe('OAuth Session Management', () => {\n const mockSession: OAuthSession = {\n sessionId: 'session-123',\n state: 'test-state',\n clientId: 'client-123',\n redirectUri: 'http://localhost:3000/callback',\n codeChallenge: 'test-challenge',\n codeChallengeMethod: 'S256',\n oauthState: 'oauth-state-123',\n resource: 'test-resource',\n expiresAt: Date.now() + 3600000, // 1 hour from now\n };\n\n const expiredSession: OAuthSession = {\n ...mockSession,\n sessionId: 'expired-session',\n expiresAt: Date.now() - 1000, // 1 second ago\n };\n\n describe('storeOAuthSession', () => {\n it('should store an OAuth session', async () => {\n const expectedEntity = { ...mockSession, sessionId: 'session-123' };\n sessionRepository.save.mockResolvedValue(\n expectedEntity as OAuthSessionEntity,\n );\n\n await service.storeOAuthSession('session-123', mockSession);\n\n expect(sessionRepository.save).toHaveBeenCalledWith(expectedEntity);\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n sessionRepository.save.mockRejectedValue(error);\n\n await expect(\n service.storeOAuthSession('session-123', mockSession),\n ).rejects.toThrow('Database error');\n });\n });\n\n describe('getOAuthSession', () => {\n it('should return OAuth session when found and not expired', async () => {\n sessionRepository.findOne.mockResolvedValue(\n mockSession as OAuthSessionEntity,\n );\n\n const result = await service.getOAuthSession('session-123');\n\n expect(sessionRepository.findOne).toHaveBeenCalledWith({\n where: { sessionId: 'session-123' },\n });\n expect(result).toEqual(mockSession);\n });\n\n it('should return undefined and delete expired OAuth session', async () => {\n sessionRepository.findOne.mockResolvedValue(\n expiredSession as OAuthSessionEntity,\n );\n sessionRepository.delete.mockResolvedValue({\n raw: {},\n affected: 1,\n } as DeleteResult);\n\n const result = await service.getOAuthSession('expired-session');\n\n expect(sessionRepository.findOne).toHaveBeenCalledWith({\n where: { sessionId: 'expired-session' },\n });\n expect(sessionRepository.delete).toHaveBeenCalledWith({\n sessionId: 'expired-session',\n });\n expect(result).toBeUndefined();\n });\n\n it('should return undefined when OAuth session not found', async () => {\n sessionRepository.findOne.mockResolvedValue(null);\n\n const result = await service.getOAuthSession('non-existent-session');\n\n expect(result).toBeUndefined();\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n sessionRepository.findOne.mockRejectedValue(error);\n\n await expect(service.getOAuthSession('session-123')).rejects.toThrow(\n 'Database error',\n );\n });\n });\n\n describe('removeOAuthSession', () => {\n it('should remove an OAuth session', async () => {\n sessionRepository.delete.mockResolvedValue({\n raw: {},\n affected: 1,\n } as DeleteResult);\n\n await service.removeOAuthSession('session-123');\n\n expect(sessionRepository.delete).toHaveBeenCalledWith({\n sessionId: 'session-123',\n });\n });\n\n it('should handle database errors', async () => {\n const error = new Error('Database error');\n sessionRepository.delete.mockRejectedValue(error);\n\n await expect(service.removeOAuthSession('session-123')).rejects.toThrow(\n 'Database error',\n );\n });\n });\n });\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/unbound-method */
|
|
1
2
|
import { Test, TestingModule } from '@nestjs/testing';
|
|
2
3
|
import { getRepositoryToken } from '@nestjs/typeorm';
|
|
3
|
-
import { Repository } from 'typeorm';
|
|
4
|
+
import { Repository, DeleteResult } from 'typeorm';
|
|
4
5
|
import { TypeOrmStore } from './typeorm-store.service';
|
|
5
6
|
import {
|
|
6
7
|
OAuthClientEntity,
|
|
@@ -10,13 +11,13 @@ import {
|
|
|
10
11
|
} from './entities';
|
|
11
12
|
import { OAuthClient, AuthorizationCode } from '../oauth-store.interface';
|
|
12
13
|
import { OAuthSession } from '../../providers/oauth-provider.interface';
|
|
14
|
+
import { OAUTH_TYPEORM_CONNECTION_NAME } from './constants';
|
|
13
15
|
|
|
14
16
|
describe('TypeOrmStore', () => {
|
|
15
17
|
let service: TypeOrmStore;
|
|
16
18
|
let clientRepository: jest.Mocked<Repository<OAuthClientEntity>>;
|
|
17
19
|
let authCodeRepository: jest.Mocked<Repository<AuthorizationCodeEntity>>;
|
|
18
20
|
let sessionRepository: jest.Mocked<Repository<OAuthSessionEntity>>;
|
|
19
|
-
let userProfileRepository: jest.Mocked<Repository<OAuthUserProfileEntity>>;
|
|
20
21
|
|
|
21
22
|
beforeEach(async () => {
|
|
22
23
|
// Create mocked repositories
|
|
@@ -38,7 +39,7 @@ describe('TypeOrmStore', () => {
|
|
|
38
39
|
delete: jest.fn(),
|
|
39
40
|
};
|
|
40
41
|
|
|
41
|
-
const
|
|
42
|
+
const mockUserProfileRepository = {
|
|
42
43
|
save: jest.fn(),
|
|
43
44
|
findOne: jest.fn(),
|
|
44
45
|
delete: jest.fn(),
|
|
@@ -48,30 +49,50 @@ describe('TypeOrmStore', () => {
|
|
|
48
49
|
providers: [
|
|
49
50
|
TypeOrmStore,
|
|
50
51
|
{
|
|
51
|
-
provide: getRepositoryToken(
|
|
52
|
+
provide: getRepositoryToken(
|
|
53
|
+
OAuthClientEntity,
|
|
54
|
+
OAUTH_TYPEORM_CONNECTION_NAME,
|
|
55
|
+
),
|
|
52
56
|
useValue: mockClientRepository,
|
|
53
57
|
},
|
|
54
58
|
{
|
|
55
|
-
provide: getRepositoryToken(
|
|
59
|
+
provide: getRepositoryToken(
|
|
60
|
+
AuthorizationCodeEntity,
|
|
61
|
+
OAUTH_TYPEORM_CONNECTION_NAME,
|
|
62
|
+
),
|
|
56
63
|
useValue: mockAuthCodeRepository,
|
|
57
64
|
},
|
|
58
65
|
{
|
|
59
|
-
provide: getRepositoryToken(
|
|
66
|
+
provide: getRepositoryToken(
|
|
67
|
+
OAuthSessionEntity,
|
|
68
|
+
OAUTH_TYPEORM_CONNECTION_NAME,
|
|
69
|
+
),
|
|
60
70
|
useValue: mockSessionRepository,
|
|
61
71
|
},
|
|
62
72
|
{
|
|
63
|
-
provide: getRepositoryToken(
|
|
64
|
-
|
|
73
|
+
provide: getRepositoryToken(
|
|
74
|
+
OAuthUserProfileEntity,
|
|
75
|
+
OAUTH_TYPEORM_CONNECTION_NAME,
|
|
76
|
+
),
|
|
77
|
+
useValue: mockUserProfileRepository,
|
|
65
78
|
},
|
|
66
79
|
],
|
|
67
80
|
}).compile();
|
|
68
81
|
|
|
69
82
|
service = module.get<TypeOrmStore>(TypeOrmStore);
|
|
70
|
-
clientRepository = module.get(
|
|
83
|
+
clientRepository = module.get(
|
|
84
|
+
getRepositoryToken(OAuthClientEntity, OAUTH_TYPEORM_CONNECTION_NAME),
|
|
85
|
+
);
|
|
71
86
|
authCodeRepository = module.get(
|
|
72
|
-
getRepositoryToken(
|
|
87
|
+
getRepositoryToken(
|
|
88
|
+
AuthorizationCodeEntity,
|
|
89
|
+
OAUTH_TYPEORM_CONNECTION_NAME,
|
|
90
|
+
),
|
|
91
|
+
);
|
|
92
|
+
sessionRepository = module.get(
|
|
93
|
+
getRepositoryToken(OAuthSessionEntity, OAUTH_TYPEORM_CONNECTION_NAME),
|
|
73
94
|
);
|
|
74
|
-
|
|
95
|
+
// Note: userProfileRepository is not directly used in tests below; it's provided for completeness
|
|
75
96
|
});
|
|
76
97
|
|
|
77
98
|
afterEach(() => {
|
|
@@ -295,7 +316,10 @@ describe('TypeOrmStore', () => {
|
|
|
295
316
|
authCodeRepository.findOne.mockResolvedValue(
|
|
296
317
|
expiredAuthCode as AuthorizationCodeEntity,
|
|
297
318
|
);
|
|
298
|
-
authCodeRepository.delete.mockResolvedValue({
|
|
319
|
+
authCodeRepository.delete.mockResolvedValue({
|
|
320
|
+
raw: {},
|
|
321
|
+
affected: 1,
|
|
322
|
+
} as DeleteResult);
|
|
299
323
|
|
|
300
324
|
const result = await service.getAuthCode('expired-code');
|
|
301
325
|
|
|
@@ -328,7 +352,10 @@ describe('TypeOrmStore', () => {
|
|
|
328
352
|
|
|
329
353
|
describe('removeAuthCode', () => {
|
|
330
354
|
it('should remove an authorization code', async () => {
|
|
331
|
-
authCodeRepository.delete.mockResolvedValue({
|
|
355
|
+
authCodeRepository.delete.mockResolvedValue({
|
|
356
|
+
raw: {},
|
|
357
|
+
affected: 1,
|
|
358
|
+
} as DeleteResult);
|
|
332
359
|
|
|
333
360
|
await service.removeAuthCode('test-auth-code');
|
|
334
361
|
|
|
@@ -407,7 +434,10 @@ describe('TypeOrmStore', () => {
|
|
|
407
434
|
sessionRepository.findOne.mockResolvedValue(
|
|
408
435
|
expiredSession as OAuthSessionEntity,
|
|
409
436
|
);
|
|
410
|
-
sessionRepository.delete.mockResolvedValue({
|
|
437
|
+
sessionRepository.delete.mockResolvedValue({
|
|
438
|
+
raw: {},
|
|
439
|
+
affected: 1,
|
|
440
|
+
} as DeleteResult);
|
|
411
441
|
|
|
412
442
|
const result = await service.getOAuthSession('expired-session');
|
|
413
443
|
|
|
@@ -440,7 +470,10 @@ describe('TypeOrmStore', () => {
|
|
|
440
470
|
|
|
441
471
|
describe('removeOAuthSession', () => {
|
|
442
472
|
it('should remove an OAuth session', async () => {
|
|
443
|
-
sessionRepository.delete.mockResolvedValue({
|
|
473
|
+
sessionRepository.delete.mockResolvedValue({
|
|
474
|
+
raw: {},
|
|
475
|
+
affected: 1,
|
|
476
|
+
} as DeleteResult);
|
|
444
477
|
|
|
445
478
|
await service.removeOAuthSession('session-123');
|
|
446
479
|
|