@react-native-async-storage/async-storage
Version:
Asynchronous, persistent, key-value storage system for React Native.
110 lines (86 loc) • 2.63 kB
JavaScript
/**
* @format
*/
const merge = require('merge-options').bind({
concatArrays: true,
ignoreUndefined: true,
});
const asMock = {
__INTERNAL_MOCK_STORAGE__: {},
setItem: jest.fn(async (key, value, callback) => {
const setResult = await asMock.multiSet([[key, value]], undefined);
callback && callback(setResult);
return setResult;
}),
getItem: jest.fn(async (key, callback) => {
const getResult = await asMock.multiGet([key], undefined);
const result = getResult[0] ? getResult[0][1] : null;
callback && callback(null, result);
return result;
}),
removeItem: jest.fn((key, callback) => asMock.multiRemove([key], callback)),
mergeItem: jest.fn((key, value, callback) =>
asMock.multiMerge([[key, value]], callback)
),
clear: jest.fn(_clear),
getAllKeys: jest.fn(_getAllKeys),
flushGetRequests: jest.fn(),
multiGet: jest.fn(_multiGet),
multiSet: jest.fn(_multiSet),
multiRemove: jest.fn(_multiRemove),
multiMerge: jest.fn(_multiMerge),
useAsyncStorage: jest.fn((key) => {
return {
getItem: (...args) => asMock.getItem(key, ...args),
setItem: (...args) => asMock.setItem(key, ...args),
mergeItem: (...args) => asMock.mergeItem(key, ...args),
removeItem: (...args) => asMock.removeItem(key, ...args),
};
}),
};
async function _multiSet(keyValuePairs, callback) {
keyValuePairs.forEach((keyValue) => {
const key = keyValue[0];
asMock.__INTERNAL_MOCK_STORAGE__[key] = keyValue[1];
});
callback && callback(null);
return null;
}
async function _multiGet(keys, callback) {
const values = keys.map((key) => [
key,
asMock.__INTERNAL_MOCK_STORAGE__[key] || null,
]);
callback && callback(null, values);
return values;
}
async function _multiRemove(keys, callback) {
keys.forEach((key) => {
if (asMock.__INTERNAL_MOCK_STORAGE__[key]) {
delete asMock.__INTERNAL_MOCK_STORAGE__[key];
}
});
callback && callback(null);
return null;
}
async function _clear(callback) {
asMock.__INTERNAL_MOCK_STORAGE__ = {};
callback && callback(null);
return null;
}
async function _getAllKeys() {
return Object.keys(asMock.__INTERNAL_MOCK_STORAGE__);
}
async function _multiMerge(keyValuePairs, callback) {
keyValuePairs.forEach((keyValue) => {
const [key, value] = keyValue;
const oldValue = asMock.__INTERNAL_MOCK_STORAGE__[key];
asMock.__INTERNAL_MOCK_STORAGE__[key] =
oldValue != null
? JSON.stringify(merge(JSON.parse(oldValue), JSON.parse(value)))
: value;
});
callback && callback(null);
return null;
}
module.exports = asMock;