gcp-monorepo-secret-manager
Version:
A Google Cloud Secret Manager utility for managing environment variables across different environments and services within a monorepo.
167 lines • 7.08 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const ConfigManager_1 = require("../ConfigManager");
const fs = __importStar(require("fs"));
// Mock fs module
jest.mock('fs');
const mockFs = fs;
describe('ConfigManager', () => {
const mockConfig = {
serviceAccountPaths: {
staging: 'staging-sa.json',
production: 'prod-sa.json'
},
projectIds: {
staging: 'test-staging',
production: 'test-production'
},
services: [
{
name: 'app',
envPath: '.environments/.app.{env}.env',
targetPath: 'services/app/.env',
secretPrefix: 'app-env-vars'
},
{
name: 'api',
envPath: '.environments/.api.{env}.env',
targetPath: 'services/api/.env',
secretPrefix: 'api-env-vars'
}
]
};
beforeEach(() => {
jest.clearAllMocks();
});
describe('constructor', () => {
it('should load config from default path when no path provided', () => {
mockFs.existsSync.mockReturnValue(true);
mockFs.readFileSync.mockReturnValue(JSON.stringify(mockConfig));
const configManager = new ConfigManager_1.ConfigManager();
expect(mockFs.existsSync).toHaveBeenCalledWith('.secrets-config');
expect(mockFs.readFileSync).toHaveBeenCalledWith('.secrets-config', 'utf8');
});
it('should load config from custom path when provided', () => {
const customPath = 'custom-config.json';
mockFs.existsSync.mockReturnValue(true);
mockFs.readFileSync.mockReturnValue(JSON.stringify(mockConfig));
const configManager = new ConfigManager_1.ConfigManager(customPath);
expect(mockFs.existsSync).toHaveBeenCalledWith(customPath);
expect(mockFs.readFileSync).toHaveBeenCalledWith(customPath, 'utf8');
});
it('should throw error when config file does not exist', () => {
mockFs.existsSync.mockReturnValue(false);
expect(() => new ConfigManager_1.ConfigManager()).toThrow('Configuration file not found at .secrets-config');
});
it('should throw error when config file has invalid JSON', () => {
mockFs.existsSync.mockReturnValue(true);
mockFs.readFileSync.mockReturnValue('invalid json');
expect(() => new ConfigManager_1.ConfigManager()).toThrow('Failed to parse configuration file');
});
});
describe('getProjectId', () => {
let configManager;
beforeEach(() => {
mockFs.existsSync.mockReturnValue(true);
mockFs.readFileSync.mockReturnValue(JSON.stringify(mockConfig));
configManager = new ConfigManager_1.ConfigManager();
});
it('should return staging project ID', () => {
expect(configManager.getProjectId('staging')).toBe('test-staging');
});
it('should return production project ID', () => {
expect(configManager.getProjectId('production')).toBe('test-production');
});
});
describe('getServiceAccountPath', () => {
let configManager;
beforeEach(() => {
mockFs.existsSync.mockReturnValue(true);
mockFs.readFileSync.mockReturnValue(JSON.stringify(mockConfig));
configManager = new ConfigManager_1.ConfigManager();
});
it('should return staging service account path', () => {
expect(configManager.getServiceAccountPath('staging')).toBe('staging-sa.json');
});
it('should return production service account path', () => {
expect(configManager.getServiceAccountPath('production')).toBe('prod-sa.json');
});
});
describe('getServiceNames', () => {
let configManager;
beforeEach(() => {
mockFs.existsSync.mockReturnValue(true);
mockFs.readFileSync.mockReturnValue(JSON.stringify(mockConfig));
configManager = new ConfigManager_1.ConfigManager();
});
it('should return all service names', () => {
expect(configManager.getServiceNames()).toEqual(['app', 'api']);
});
});
describe('getServiceByName', () => {
let configManager;
beforeEach(() => {
mockFs.existsSync.mockReturnValue(true);
mockFs.readFileSync.mockReturnValue(JSON.stringify(mockConfig));
configManager = new ConfigManager_1.ConfigManager();
});
it('should return service config when service exists', () => {
const service = configManager.getServiceByName('app');
expect(service).toEqual({
name: 'app',
envPath: '.environments/.app.{env}.env',
targetPath: 'services/app/.env',
secretPrefix: 'app-env-vars'
});
});
it('should return undefined when service does not exist', () => {
const service = configManager.getServiceByName('nonexistent');
expect(service).toBeUndefined();
});
});
describe('getServices', () => {
let configManager;
beforeEach(() => {
mockFs.existsSync.mockReturnValue(true);
mockFs.readFileSync.mockReturnValue(JSON.stringify(mockConfig));
configManager = new ConfigManager_1.ConfigManager();
});
it('should return all services', () => {
expect(configManager.getServices()).toEqual(mockConfig.services);
});
});
});
//# sourceMappingURL=ConfigManager.test.js.map