nestjs-request-deduplication
Version:
[](https://www.npmjs.com/package/nestjs-request-deduplication) [](https://gith
88 lines (87 loc) • 4.32 kB
JavaScript
import { __awaiter } from "tslib";
import { MemcachedAdapter } from './memcached.adapter';
import Keyv from 'keyv';
import KeyvMemcache from '@keyv/memcache';
jest.mock('keyv');
jest.mock('@keyv/memcache');
describe('MemcachedAdapter', () => {
let adapter;
const mockOptions = {
memcachedConfig: {
uri: 'localhost:11211',
options: { retries: 3 },
},
};
beforeEach(() => {
jest.clearAllMocks();
adapter = new MemcachedAdapter(mockOptions);
});
describe('init', () => {
it('should initialize keyv with memcached store', () => __awaiter(void 0, void 0, void 0, function* () {
var _a;
yield adapter.init();
expect(KeyvMemcache).toHaveBeenCalledWith((_a = mockOptions.memcachedConfig) === null || _a === void 0 ? void 0 : _a.uri, mockOptions.memcachedConfig);
expect(Keyv).toHaveBeenCalledWith({
store: expect.any(KeyvMemcache),
namespace: 'request-deduplication',
});
}));
it('should throw error if memcached config is missing', () => __awaiter(void 0, void 0, void 0, function* () {
adapter = new MemcachedAdapter({});
yield expect(adapter.init()).rejects.toThrow('Memcached configuration is required');
}));
});
describe('get', () => {
it('should retrieve value from storage', () => __awaiter(void 0, void 0, void 0, function* () {
const mockValue = { data: 'test' };
const mockGet = jest.fn().mockResolvedValue(mockValue);
Keyv.mockImplementation(() => ({ get: mockGet }));
yield adapter.init();
const result = yield adapter.get('test-key');
expect(mockGet).toHaveBeenCalledWith('test-key');
expect(result).toEqual(mockValue);
}));
it('should throw error when key not found', () => __awaiter(void 0, void 0, void 0, function* () {
const mockGet = jest.fn().mockResolvedValue(undefined);
Keyv.mockImplementation(() => ({ get: mockGet }));
yield adapter.init();
yield expect(adapter.get('non-existent-key')).rejects.toThrow('Key non-existent-key not found');
}));
it('should handle get errors', () => __awaiter(void 0, void 0, void 0, function* () {
const mockGet = jest.fn().mockRejectedValue(new Error('Connection error'));
Keyv.mockImplementation(() => ({ get: mockGet }));
yield adapter.init();
yield expect(adapter.get('test-key')).rejects.toThrow('Connection error');
}));
});
describe('set', () => {
it('should store value with ttl', () => __awaiter(void 0, void 0, void 0, function* () {
const mockSet = jest.fn().mockResolvedValue(undefined);
Keyv.mockImplementation(() => ({ set: mockSet }));
yield adapter.init();
yield adapter.set('test-key', 'test-value', 1000);
expect(mockSet).toHaveBeenCalledWith('test-key', 'test-value', 1000);
}));
it('should handle set errors', () => __awaiter(void 0, void 0, void 0, function* () {
const mockSet = jest.fn().mockRejectedValue(new Error('Storage error'));
Keyv.mockImplementation(() => ({ set: mockSet }));
yield adapter.init();
yield expect(adapter.set('test-key', 'test-value', 1000)).rejects.toThrow('Storage error');
}));
});
describe('delete', () => {
it('should delete value from storage', () => __awaiter(void 0, void 0, void 0, function* () {
const mockDelete = jest.fn().mockResolvedValue(true);
Keyv.mockImplementation(() => ({ delete: mockDelete }));
yield adapter.init();
yield adapter.delete('test-key');
expect(mockDelete).toHaveBeenCalledWith('test-key');
}));
it('should handle delete errors', () => __awaiter(void 0, void 0, void 0, function* () {
const mockDelete = jest.fn().mockRejectedValue(new Error('Delete error'));
Keyv.mockImplementation(() => ({ delete: mockDelete }));
yield adapter.init();
yield expect(adapter.delete('test-key')).rejects.toThrow('Delete error');
}));
});
});