- Next.js 14+ with App Router and TypeScript - Tailwind CSS and ShadCN UI styling - Zustand state management - Dexie.js for IndexedDB (local-first data) - Auth.js v5 for authentication - BMAD framework integration Co-Authored-By: Claude <noreply@anthropic.com>
53 lines
1.7 KiB
TypeScript
53 lines
1.7 KiB
TypeScript
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
import { SecureStorage } from '../../../src/services/secure-storage'; // Implementation doesn't exist yet
|
|
|
|
describe('SecureStorage Service', () => {
|
|
const TEST_KEY = 'test_api_key_123';
|
|
const STORAGE_KEY = 'llm_provider_config';
|
|
|
|
beforeEach(() => {
|
|
localStorage.clear();
|
|
});
|
|
|
|
afterEach(() => {
|
|
localStorage.clear();
|
|
});
|
|
|
|
it('should save API key with basic encoding (not plain text)', () => {
|
|
SecureStorage.saveKey(TEST_KEY);
|
|
|
|
// Direct access to localStorage to verify obfuscation
|
|
const storedValue = localStorage.getItem(STORAGE_KEY);
|
|
expect(storedValue).toBeDefined();
|
|
expect(storedValue).not.toBe(TEST_KEY); // Should NOT be plain text
|
|
expect(storedValue).not.toContain(TEST_KEY); // Should not contain the key
|
|
});
|
|
|
|
it('should retrieve the original API key correctly', () => {
|
|
SecureStorage.saveKey(TEST_KEY);
|
|
|
|
const retrievedKey = SecureStorage.getKey();
|
|
expect(retrievedKey).toBe(TEST_KEY);
|
|
});
|
|
|
|
it('should return null if no key is stored', () => {
|
|
const retrievedKey = SecureStorage.getKey();
|
|
expect(retrievedKey).toBeNull();
|
|
});
|
|
|
|
it('should overwrite existing key when saving new one', () => {
|
|
SecureStorage.saveKey('old_key');
|
|
SecureStorage.saveKey('new_key');
|
|
|
|
expect(SecureStorage.getKey()).toBe('new_key');
|
|
});
|
|
|
|
it('should clear key when requested', () => {
|
|
SecureStorage.saveKey(TEST_KEY);
|
|
SecureStorage.clearKey();
|
|
|
|
expect(SecureStorage.getKey()).toBeNull();
|
|
expect(localStorage.getItem(STORAGE_KEY)).toBeNull();
|
|
});
|
|
});
|