@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
JavaScript
"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}.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}.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}.com`,
type: [],
...overrides,
};
}
/**
* Creates user context with multiple roles
*/
static createUserContextWithRoles(roles = ['user'], overrides = {}) {
const userId = this.generateUserId();
return {
id: userId,
email: `user${userId}.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}.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}.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;