api.js/tests/data/storage-read-test.ts

254 lines
5.6 KiB
TypeScript

import { unlinkSync } from 'node:fs';
import { appConfig } from '../../lib/config/app';
import { createStorage, createStoredItem } from '../../lib/data/storage/create';
import { getStoredItem } from '../../lib/data/storage/get';
import { uniqueCacheDir } from '../helpers';
describe('Reading stored data', () => {
test('Instant callback', () => {
return new Promise((fulfill, reject) => {
try {
const dir = uniqueCacheDir();
const cacheDir = '{cache}/' + dir;
const storage = createStorage({
cacheDir,
maxCount: 2,
});
// Config
expect(storage.config).toEqual({
cacheDir,
maxCount: 2,
});
// Timer should not exist
expect(storage.timer).toBeUndefined();
// Add one item
let isSync = true;
const content = {
test: true,
};
const item = createStoredItem(storage, content, 'foo.json', false, () => {
// Data should be set
expect(item.data).toEqual(content);
// Timer should not be set
if (storage.timer) {
clearInterval(storage.timer);
reject('Timer is active');
}
fulfill(true);
});
// Get data
getStoredItem(storage, item, (data) => {
try {
// Should be sync
expect(isSync).toBeTruthy();
expect(data).toEqual(content);
} catch (err) {
reject(err);
}
});
isSync = false;
// Test continues in callback in getStoredItem(), then in callback in createStoredItem()...
} catch (err) {
reject(err);
}
});
});
test('Instant callback, autoCleanup', () => {
return new Promise((fulfill, reject) => {
try {
const dir = uniqueCacheDir();
const cacheDir = '{cache}/' + dir;
const storage = createStorage({
cacheDir,
maxCount: 2,
});
// Config
expect(storage.config).toEqual({
cacheDir,
maxCount: 2,
});
// Timer should not exist
expect(storage.timer).toBeUndefined();
// Add one item
let isSync = true;
const content = {
test: true,
};
const item = createStoredItem(storage, content, 'foo.json', true, () => {
// Data should be set, even though autoCleanup is enabled because read was called earlier
expect(item.data).toEqual(content);
// Timer should not be set
if (storage.timer) {
clearInterval(storage.timer);
reject('Timer is active');
}
fulfill(true);
});
// Get data
getStoredItem(storage, item, (data) => {
try {
// Should be sync
expect(isSync).toBeTruthy();
expect(data).toEqual(content);
} catch (err) {
reject(err);
}
});
isSync = false;
// Test continues in callback in getStoredItem(), then in callback in createStoredItem()...
} catch (err) {
reject(err);
}
});
});
test('Delayed callback', () => {
return new Promise((fulfill, reject) => {
try {
const dir = uniqueCacheDir();
const cacheDir = '{cache}/' + dir;
const storage = createStorage({
cacheDir,
maxCount: 2,
});
// Config
expect(storage.config).toEqual({
cacheDir,
maxCount: 2,
});
// Timer should not exist
expect(storage.timer).toBeUndefined();
// Add one item
const content = {
test: true,
};
const item = createStoredItem(storage, content, 'foo.json', true, () => {
try {
let isSync = true;
let cb1 = false;
let cb2 = false;
// Data should be unset
expect(item.data).toBeUndefined();
// Get data, attempt #1
getStoredItem(storage, item, (data) => {
try {
// Should be async
expect(isSync).toBeFalsy();
expect(data).toEqual(content);
expect(cb1).toBeFalsy();
cb1 = true;
// Content should be set, but not identical to original data
expect(item.data).toEqual(content);
expect(item.data).not.toBe(content);
} catch (err) {
reject(err);
}
});
// Get data, attempt #2
getStoredItem(storage, item, (data) => {
try {
// Should be async
expect(isSync).toBeFalsy();
expect(data).toEqual(content);
expect(cb2).toBeFalsy();
cb2 = true;
// Attempt #1 should have been done too
expect(cb1).toBeTruthy();
// Timer should not be set
if (storage.timer) {
clearInterval(storage.timer);
reject('Timer is active');
}
// Done
fulfill(true);
} catch (err) {
reject(err);
}
});
isSync = false;
// Test continues in callbacks in getStoredItem()...
} catch (err) {
reject(err);
}
});
} catch (err) {
reject(err);
}
});
});
test('Error reading cache', () => {
return new Promise((fulfill, reject) => {
try {
const dir = uniqueCacheDir();
const cacheDir = '{cache}/' + dir;
const actualCacheDir = cacheDir.replace('{cache}', appConfig.cacheRootDir);
const storage = createStorage({
cacheDir,
maxCount: 1,
});
// Add one item
const content = {
test: true,
};
createStoredItem(storage, content, 'foo.json', true, (item, err) => {
try {
// Data should be written to cache
expect(item.data).toBeUndefined();
// Remove cache file
unlinkSync(actualCacheDir + '/foo.json');
// Attempt to read data
getStoredItem(storage, item, (data) => {
try {
expect(data).toBeFalsy();
fulfill(true);
} catch (err) {
reject(err);
}
});
} catch (err) {
reject(err);
}
});
// Test continues in callback in createStoredItem()...
} catch (err) {
reject(err);
}
});
});
});