react-native-mmkv
Version:
⚡️ The fastest key/value storage for React Native.
104 lines (103 loc) • 3.23 kB
JavaScript
/**
* Mock MMKV instance when used in a Jest/Test environment.
*/
export function createMockMMKV(config = { id: 'mmkv.default' }) {
const storage = new Map();
const listeners = new Set();
const notifyListeners = (key) => {
listeners.forEach((listener) => {
listener(key);
});
};
return {
id: config.id,
get length() {
return storage.size;
},
get size() {
return this.byteSize;
},
get byteSize() {
// estimate - assumes UTF8
return JSON.stringify(storage).length;
},
isReadOnly: false,
isEncrypted: false,
clearAll: () => {
const keysBefore = storage.keys();
storage.clear();
// Notify all listeners for all keys that were cleared
for (const key of keysBefore) {
notifyListeners(key);
}
},
remove: (key) => {
const deleted = storage.delete(key);
if (deleted) {
notifyListeners(key);
}
return deleted;
},
set: (key, value) => {
if (key === '')
throw new Error('Cannot set a value for an empty key!');
storage.set(key, value);
notifyListeners(key);
},
getString: (key) => {
const result = storage.get(key);
return typeof result === 'string' ? result : undefined;
},
getNumber: (key) => {
const result = storage.get(key);
return typeof result === 'number' ? result : undefined;
},
getBoolean: (key) => {
const result = storage.get(key);
return typeof result === 'boolean' ? result : undefined;
},
getBuffer: (key) => {
const result = storage.get(key);
return result instanceof ArrayBuffer ? result : undefined;
},
getAllKeys: () => Array.from(storage.keys()),
contains: (key) => storage.has(key),
recrypt: () => {
console.warn('Encryption is not supported in mocked MMKV instances!');
},
encrypt: () => {
console.warn('Encryption is not supported in mocked MMKV instances!');
},
decrypt: () => {
console.warn('Encryption is not supported in mocked MMKV instances!');
},
trim: () => {
// no-op
},
name: 'MMKV',
dispose: () => { },
equals: () => {
return false;
},
addOnValueChangedListener: (listener) => {
listeners.add(listener);
return {
remove: () => {
listeners.delete(listener);
},
};
},
importAllFrom: (other) => {
const keys = other.getAllKeys();
let imported = 0;
for (const key of keys) {
const data = other.getBuffer(key);
if (data != null) {
storage.set(key, data);
imported++;
}
}
return imported;
},
};
}