kubricate
Version:
A TypeScript framework for building reusable, type-safe Kubernetes infrastructure — without the YAML mess.
118 lines • 5.13 kB
JavaScript
// SecretManager.test.ts
import { beforeEach, describe, expect, it } from 'vitest';
import { InMemoryConnector } from './connectors/InMemoryConnector.js';
import { InMemoryProvider } from './providers/InMemoryProvider.js';
import { SecretManager } from './SecretManager.js';
describe('SecretManager', () => {
let manager;
beforeEach(() => {
manager = new SecretManager();
});
it('throws if no connector or provider is registered', () => {
expect(() => manager.build()).toThrow('No connectors registered');
});
it('adds and retrieves a connector and provider', () => {
manager = manager.addConnector('memory', new InMemoryConnector({}));
manager = manager.addProvider('kube', new InMemoryProvider({
name: 'my-secret'
}));
expect(() => manager.build()).toThrow('No secrets registered');
});
it('adds a secret with full options object', () => {
manager = manager.addConnector('memory', new InMemoryConnector({
DB_PASS: 'pw'
})).addProvider('kube', new InMemoryProvider({
name: 'secret'
})).setDefaultConnector('memory').setDefaultProvider('kube').addSecret({
name: 'DB_PASS',
connector: 'memory',
provider: 'kube'
});
expect(() => manager.build()).not.toThrow();
});
it('adds a secret and prepares it', async () => {
manager = manager.addConnector('memory', new InMemoryConnector({
API_KEY: '12345'
})).addProvider('kube', new InMemoryProvider({
name: 'my-secret'
})).setDefaultConnector('memory').setDefaultProvider('kube').addSecret('API_KEY');
const result = await manager.prepare();
expect(result.length).toBe(1);
expect(result[0].name).toBe('API_KEY');
expect(result[0].value).toBe('12345');
expect(Array.isArray(result[0].effects)).toBe(true);
});
it('throws if connector or provider does not exist', () => {
manager = manager.addConnector('valid', new InMemoryConnector({}));
expect(() => manager.getConnector('not-exist')).toThrow('Connector not-exist not found');
expect(() => manager.getProvider('not-exist')).toThrow('Provider not-exist not found');
});
it('prevents duplicate connector, provider, and secret', () => {
manager = manager.addConnector('memory', new InMemoryConnector({}));
expect(() => manager.addConnector('memory', new InMemoryConnector({}))).toThrow('Connector memory already exists');
manager = manager.addProvider('kube', new InMemoryProvider({
name: 'my-secret'
}));
expect(() => manager.addProvider('kube', new InMemoryProvider({
name: 'my-secret'
}))).toThrow('Provider kube already exists');
manager = manager.addSecret('DUPLICATE_SECRET');
expect(() => manager.addSecret('DUPLICATE_SECRET')).toThrow('Secret DUPLICATE_SECRET already exists');
});
it('auto-assigns default connector/provider when only one is registered', async () => {
manager = manager.addConnector('memory', new InMemoryConnector({
AUTO: 'ok'
})).addProvider('kube', new InMemoryProvider({
name: 'auto-secret'
})).addSecret('AUTO');
const result = await manager.prepare();
expect(result).toHaveLength(1);
expect(result[0].name).toBe('AUTO');
expect(result[0].value).toBe('ok');
});
it('throws when only secrets exist but no providers or connectors', () => {
manager = manager.addSecret('MISSING_BACKENDS');
expect(() => manager.build()).toThrow('No connectors registered');
});
it('throws when multiple providers but no default set', () => {
manager = manager.addConnector('memory', new InMemoryConnector({
X: '1'
})).addProvider('kube1', new InMemoryProvider({
name: 's1'
})).addProvider('kube2', new InMemoryProvider({
name: 's2'
})).addSecret('X');
expect(() => manager.build()).toThrow('No default provider set, and multiple providers registered');
});
it('throws when multiple connectors but no default set', () => {
manager = manager.addConnector('m1', new InMemoryConnector({
Y: '2'
})).addConnector('m2', new InMemoryConnector({
Y: '2'
})).addProvider('kube', new InMemoryProvider({
name: 's'
})).addSecret('Y');
expect(() => manager.build()).toThrow('No default connector set, and multiple connectors registered');
});
it('throws when adding duplicate secret via object form', () => {
manager = manager.addConnector('memory', new InMemoryConnector({})).addProvider('kube', new InMemoryProvider({
name: 'my-secret'
})).setDefaultConnector('memory').setDefaultProvider('kube').addSecret({
name: 'DB_PASSWORD',
connector: 'memory',
provider: 'kube'
});
expect(() =>
// Attempting to add the same secret again
manager.addSecret({
name: 'DB_PASSWORD'
})).toThrow('Secret DB_PASSWORD already exists');
});
it('throws when no providers are registered', () => {
manager = manager.addConnector('memory', new InMemoryConnector({
MY_TOKEN: 'secure'
})).addSecret('MY_TOKEN');
expect(() => manager.build()).toThrow('No providers registered');
});
});
//# sourceMappingURL=SecretManager.test.js.map