Last active
June 13, 2024 02:45
-
-
Save hyb175/beb9ceed4c34300ba7c77d3d6d44ae52 to your computer and use it in GitHub Desktop.
Realm Mock for jest
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// https://github.com/realm/realm-js/issues/370#issuecomment-270849466 | |
export default class Realm { | |
constructor(params) { | |
this.schema = {}; | |
this.callbackList = []; | |
this.data = {}; | |
this.schemaCallbackList = {}; | |
params.schema.forEach((schema) => { | |
this.data[schema.name] = {}; | |
}); | |
params.schema.forEach((schema) => { | |
this.schema[schema.name] = schema; | |
}); | |
this.lastLookedUpModel = null; | |
} | |
objects(schemaName) { | |
this.lastLookedUpModel = schemaName; | |
const objects = Object.values(this.data[schemaName]); | |
objects.values = () => objects; | |
objects.sorted = () => this.compareFunc ? objects.sort(this.compareFunc) : objects.sort(); | |
objects.addListener = (cb) => { | |
if (this.schemaCallbackList[schemaName]) { | |
this.schemaCallbackList[schemaName].push(cb); | |
} else { | |
this.schemaCallbackList[schemaName] = [cb]; | |
} | |
}; | |
objects.removeListener = () => {}; | |
objects.filtered = this.filtered ? this.filtered.bind(this, schemaName) : () => objects; | |
return objects; | |
} | |
write(fn) { | |
this.writing = true; | |
fn(); | |
this.writing = false; | |
} | |
create(schemaName, object) { | |
const modelObject = object; | |
const properties = this.schema[schemaName].schema.properties; | |
Object.keys(properties).forEach((key) => { | |
if (modelObject[key] && modelObject[key].model) { | |
this.data[modelObject[key].model][modelObject[key].id] = this.create( | |
modelObject[key].model, modelObject[key], | |
); | |
} else if (modelObject[key] && modelObject[key].length && modelObject[key][0].model) { | |
modelObject[key].forEach((obj) => { | |
this.data[modelObject[key][0].model][obj.id] = obj; | |
}); | |
modelObject[key].filtered = this.filtered ? this.filtered : () => modelObject[key]; | |
modelObject[key].sorted = () => modelObject[key].sort(); | |
} else if (modelObject[key] === undefined) { | |
if (typeof properties[key] === 'object' && properties[key].optional) { | |
modelObject[key] = null; | |
} | |
if (typeof properties[key] === 'object' && ['list', 'linkingObjects'].includes(properties[key].type)) { | |
modelObject[key] = []; | |
modelObject[key].filtered = () => []; | |
modelObject[key].sorted = () => []; | |
} | |
} | |
}); | |
this.data[schemaName][modelObject.id] = modelObject; | |
if (this.writing) { | |
if (this.schemaCallbackList[schemaName]) { | |
this.schemaCallbackList[schemaName].forEach(cb => cb(schemaName, { | |
insertions: { length: 1 }, | |
modifications: { length: 0 }, | |
deletions: { length: 0 }, | |
})); | |
} | |
this.callbackList.forEach((cb) => { cb(); }); | |
} | |
return modelObject; | |
} | |
objectForPrimaryKey(model, id) { | |
this.lastLookedUpModel = model; | |
return this.data[model][id]; | |
} | |
delete(object) { | |
if (this.lastLookedUpModel || object.model) { | |
const model = object.model ? object.model : this.lastLookedUpModel | |
if (Array.isArray(object)) { | |
object.forEach((item) => { | |
delete this.data[model][item.id]; | |
}); | |
} | |
delete this.data[model][object.id]; | |
if (this.writing) { | |
if (this.schemaCallbackList[model]) { | |
this.schemaCallbackList[model].forEach(cb => cb(model, { | |
insertions: { length: 0 }, | |
modifications: { length: 0 }, | |
deletions: { length: 1 }, | |
})); | |
} | |
this.callbackList.forEach((cb) => { cb(); }); | |
} | |
} | |
} | |
deleteAll() { | |
Object.keys(this.schema).forEach((key) => { | |
if (this.writing && this.schemaCallbackList[this.schema[key].name]) { | |
this.schemaCallbackList[this.schema[key].name].forEach(cb => cb(key, { | |
insertions: { length: 0 }, | |
modifications: { length: 0 }, | |
deletions: { length: Object.values(this.data[this.schema[key].name]).length }, | |
})); | |
} | |
this.data[this.schema[key].name] = {}; | |
}); | |
if (this.writing) this.callbackList.forEach((cb) => { cb(); }); | |
} | |
addListener(event, callback) { | |
this.callbackList.push(callback); | |
} | |
prepareData(schemaName, objects) { | |
objects.forEach((object) => { | |
this.create(schemaName, object); | |
}); | |
} | |
} | |
Realm.Object = class Object { | |
isValid() { return true; } | |
}; |
When using require
you should export this file with module.exports = Realm
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Also needs a method for
close
, for those that use it.