UNPKG

@kenniy/godeye-data-contracts

Version:

Enterprise-grade base repository architecture for GOD-EYE microservices with zero overhead and maximum code reuse

302 lines (301 loc) 10.5 kB
"use strict"; /** * Kong Authentication Context Factory * Provides consistent Kong user context generation for auth testing */ Object.defineProperty(exports, "__esModule", { value: true }); exports.AuthScenarios = exports.KongContextBuilder = exports.KongContextFactory = void 0; const auth_constants_1 = require("../../constants/auth.constants"); /** * Kong Context Factory - Creates Kong authentication contexts and headers */ class KongContextFactory { static generateUserId() { return `kong_user_${this.userIdCounter++}`; } /** * Creates basic Kong headers with required fields */ static createBasicHeaders(overrides = {}) { const userId = this.generateUserId(); return { [auth_constants_1.KONG_HEADERS.USER_ID]: userId, [auth_constants_1.KONG_HEADERS.USER_EMAIL]: `user${userId}@example.com`, ...overrides, }; } /** * Creates complete Kong headers with all optional fields */ static createCompleteHeaders(overrides = {}) { const userId = this.generateUserId(); return { [auth_constants_1.KONG_HEADERS.USER_ID]: userId, [auth_constants_1.KONG_HEADERS.USER_EMAIL]: `user${userId}@example.com`, [auth_constants_1.KONG_HEADERS.USER_TYPE]: 'user', [auth_constants_1.KONG_HEADERS.PROFILE_ID]: `profile_${userId}`, [auth_constants_1.KONG_HEADERS.PROFILE_KIND]: 'patient', [auth_constants_1.KONG_HEADERS.PHONE]: '+1234567890', [auth_constants_1.KONG_HEADERS.FIRST_NAME]: 'Test', [auth_constants_1.KONG_HEADERS.LAST_NAME]: 'User', ...overrides, }; } /** * Creates Kong user context object (extracted from headers) */ static createUserContext(overrides = {}) { const userId = this.generateUserId(); return { id: userId, email: `user${userId}@example.com`, type: [], ...overrides, }; } /** * Creates user context with multiple roles */ static createUserContextWithRoles(roles = ['user'], overrides = {}) { const userId = this.generateUserId(); return { id: userId, email: `user${userId}@example.com`, type: roles, profile_id: `profile_${userId}`, profile_kind: 'patient', phone: '+1234567890', first_name: 'Test', last_name: 'User', ...overrides, }; } /** * Creates mock request object with Kong headers */ static createMockRequest(headers = {}, overrides = {}) { const defaultHeaders = this.createBasicHeaders(); return { headers: { ...defaultHeaders, ...headers }, url: '/api/test', route: { path: '/api/test' }, ...overrides, }; } /** * Creates mock execution context for guard testing */ static createMockExecutionContext(request, response = {}) { const mockRequest = this.createMockRequest(request?.headers, request); const mockHttpContext = { getRequest: jest.fn().mockReturnValue(mockRequest), getResponse: jest.fn().mockReturnValue(response), }; return { switchToHttp: jest.fn().mockReturnValue(mockHttpContext), }; } /** * Creates headers for specific user types */ static createAdminHeaders(overrides = {}) { return this.createCompleteHeaders({ [auth_constants_1.KONG_HEADERS.USER_TYPE]: 'admin,user', [auth_constants_1.KONG_HEADERS.USER_EMAIL]: 'admin@system.com', [auth_constants_1.KONG_HEADERS.FIRST_NAME]: 'System', [auth_constants_1.KONG_HEADERS.LAST_NAME]: 'Administrator', [auth_constants_1.KONG_HEADERS.PROFILE_KIND]: 'admin', ...overrides, }); } static createDoctorHeaders(overrides = {}) { const userId = this.generateUserId(); return this.createCompleteHeaders({ [auth_constants_1.KONG_HEADERS.USER_TYPE]: 'doctor,user', [auth_constants_1.KONG_HEADERS.USER_EMAIL]: `doctor${userId}@clinic.com`, [auth_constants_1.KONG_HEADERS.FIRST_NAME]: 'Dr. John', [auth_constants_1.KONG_HEADERS.LAST_NAME]: 'Smith', [auth_constants_1.KONG_HEADERS.PROFILE_KIND]: 'doctor', ...overrides, }); } static createBusinessHeaders(overrides = {}) { const userId = this.generateUserId(); return this.createCompleteHeaders({ [auth_constants_1.KONG_HEADERS.USER_TYPE]: 'business,user', [auth_constants_1.KONG_HEADERS.USER_EMAIL]: `business${userId}@company.com`, [auth_constants_1.KONG_HEADERS.FIRST_NAME]: 'Business', [auth_constants_1.KONG_HEADERS.LAST_NAME]: 'Owner', [auth_constants_1.KONG_HEADERS.PROFILE_KIND]: 'business', ...overrides, }); } /** * Creates headers with missing required fields (for error testing) */ static createIncompleteHeaders(missingFields = []) { const headers = this.createCompleteHeaders(); missingFields.forEach(field => { delete headers[field]; }); return headers; } /** * Creates headers with array values (for normalization testing) */ static createArrayHeaders(overrides = {}) { return { [auth_constants_1.KONG_HEADERS.USER_ID]: this.generateUserId(), [auth_constants_1.KONG_HEADERS.USER_EMAIL]: 'test@example.com', [auth_constants_1.KONG_HEADERS.USER_TYPE]: ['admin', 'user'], // Array format [auth_constants_1.KONG_HEADERS.FIRST_NAME]: ['John'], // Single item array ...overrides, }; } /** * Reset user ID counter for consistent test runs */ static resetUserIdCounter() { this.userIdCounter = 1000; } } exports.KongContextFactory = KongContextFactory; KongContextFactory.userIdCounter = 1000; /** * Kong Context Builder - Fluent interface for complex context creation */ class KongContextBuilder { constructor() { this.headers = {}; this.request = {}; } static create() { return new KongContextBuilder(); } withUserId(userId) { this.headers[auth_constants_1.KONG_HEADERS.USER_ID] = userId; return this; } withEmail(email) { this.headers[auth_constants_1.KONG_HEADERS.USER_EMAIL] = email; return this; } withRoles(roles) { this.headers[auth_constants_1.KONG_HEADERS.USER_TYPE] = roles.join(','); return this; } withProfile(profileId, kind) { this.headers[auth_constants_1.KONG_HEADERS.PROFILE_ID] = profileId; this.headers[auth_constants_1.KONG_HEADERS.PROFILE_KIND] = kind; return this; } withName(firstName, lastName) { this.headers[auth_constants_1.KONG_HEADERS.FIRST_NAME] = firstName; this.headers[auth_constants_1.KONG_HEADERS.LAST_NAME] = lastName; return this; } withPhone(phone) { this.headers[auth_constants_1.KONG_HEADERS.PHONE] = phone; return this; } withUrl(url) { this.request.url = url; this.request.route = { path: url }; return this; } withExistingHeaders(existingHeaders) { this.headers = { ...this.headers, ...existingHeaders }; return this; } buildHeaders() { // Ensure required fields have defaults if (!this.headers[auth_constants_1.KONG_HEADERS.USER_ID]) { this.headers[auth_constants_1.KONG_HEADERS.USER_ID] = KongContextFactory.generateUserId(); } if (!this.headers[auth_constants_1.KONG_HEADERS.USER_EMAIL]) { this.headers[auth_constants_1.KONG_HEADERS.USER_EMAIL] = 'builder@example.com'; } return this.headers; } buildRequest() { return KongContextFactory.createMockRequest(this.buildHeaders(), this.request); } buildExecutionContext() { return KongContextFactory.createMockExecutionContext(this.buildRequest()); } } exports.KongContextBuilder = KongContextBuilder; /** * Auth Scenario Factory - Common authentication scenarios */ class AuthScenarios { /** * Valid authenticated user scenario */ static authenticatedUser() { return KongContextFactory.createMockExecutionContext({ headers: KongContextFactory.createCompleteHeaders(), }); } /** * Admin user scenario */ static adminUser() { return KongContextFactory.createMockExecutionContext({ headers: KongContextFactory.createAdminHeaders(), }); } /** * Doctor user scenario */ static doctorUser() { return KongContextFactory.createMockExecutionContext({ headers: KongContextFactory.createDoctorHeaders(), }); } /** * Business user scenario */ static businessUser() { return KongContextFactory.createMockExecutionContext({ headers: KongContextFactory.createBusinessHeaders(), }); } /** * Unauthenticated user scenario (no headers) */ static unauthenticatedUser() { return KongContextFactory.createMockExecutionContext({ headers: {}, }); } /** * Invalid user scenario (missing required fields) */ static invalidUser(missingFields = [auth_constants_1.KONG_HEADERS.USER_EMAIL]) { return KongContextFactory.createMockExecutionContext({ headers: KongContextFactory.createIncompleteHeaders(missingFields), }); } /** * User accessing health check endpoint (should skip auth) */ static healthCheckAccess() { return KongContextFactory.createMockExecutionContext({ headers: {}, url: '/api/health', route: { path: '/api/health' }, }); } /** * User with insufficient roles */ static userWithInsufficientRoles() { return KongContextFactory.createMockExecutionContext({ headers: KongContextFactory.createCompleteHeaders({ [auth_constants_1.KONG_HEADERS.USER_TYPE]: 'user', // Only user role, no admin }), }); } } exports.AuthScenarios = AuthScenarios;