nestjs-request-deduplication
Version:
[](https://www.npmjs.com/package/nestjs-request-deduplication) [](https://gith
90 lines (89 loc) • 4.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const memcached_adapter_1 = require("./memcached.adapter");
const keyv_1 = tslib_1.__importDefault(require("keyv"));
const memcache_1 = tslib_1.__importDefault(require("@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 memcached_adapter_1.MemcachedAdapter(mockOptions);
});
describe('init', () => {
it('should initialize keyv with memcached store', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
var _a;
yield adapter.init();
expect(memcache_1.default).toHaveBeenCalledWith((_a = mockOptions.memcachedConfig) === null || _a === void 0 ? void 0 : _a.uri, mockOptions.memcachedConfig);
expect(keyv_1.default).toHaveBeenCalledWith({
store: expect.any(memcache_1.default),
namespace: 'request-deduplication',
});
}));
it('should throw error if memcached config is missing', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
adapter = new memcached_adapter_1.MemcachedAdapter({});
yield expect(adapter.init()).rejects.toThrow('Memcached configuration is required');
}));
});
describe('get', () => {
it('should retrieve value from storage', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const mockValue = { data: 'test' };
const mockGet = jest.fn().mockResolvedValue(mockValue);
keyv_1.default.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', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const mockGet = jest.fn().mockResolvedValue(undefined);
keyv_1.default.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', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const mockGet = jest.fn().mockRejectedValue(new Error('Connection error'));
keyv_1.default.mockImplementation(() => ({ get: mockGet }));
yield adapter.init();
yield expect(adapter.get('test-key')).rejects.toThrow('Connection error');
}));
});
describe('set', () => {
it('should store value with ttl', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const mockSet = jest.fn().mockResolvedValue(undefined);
keyv_1.default.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', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const mockSet = jest.fn().mockRejectedValue(new Error('Storage error'));
keyv_1.default.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', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const mockDelete = jest.fn().mockResolvedValue(true);
keyv_1.default.mockImplementation(() => ({ delete: mockDelete }));
yield adapter.init();
yield adapter.delete('test-key');
expect(mockDelete).toHaveBeenCalledWith('test-key');
}));
it('should handle delete errors', () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const mockDelete = jest.fn().mockRejectedValue(new Error('Delete error'));
keyv_1.default.mockImplementation(() => ({ delete: mockDelete }));
yield adapter.init();
yield expect(adapter.delete('test-key')).rejects.toThrow('Delete error');
}));
});
});