This repository has been archived on 2025-08-03. You can view files and clone it, but cannot push or open issues or pull requests.
anonpenguin 1cbca09352 Add unit tests for RelationshipManager and ShardManager
- Implement comprehensive tests for RelationshipManager covering various relationship types (BelongsTo, HasMany, HasOne, ManyToMany) and eager loading functionality.
- Include caching mechanisms and error handling in RelationshipManager tests.
- Create unit tests for ShardManager to validate shard creation, routing, management, global index operations, and query functionalities.
- Ensure tests cover different sharding strategies (hash, range, user) and handle edge cases like errors and non-existent models.
2025-06-19 11:20:13 +03:00

154 lines
3.3 KiB
TypeScript

// Mock OrbitDB for testing
export class MockOrbitDB {
private databases = new Map<string, MockDatabase>();
private isOpen = false;
async open(name: string, options: any = {}) {
if (!this.databases.has(name)) {
this.databases.set(name, new MockDatabase(name, options));
}
return this.databases.get(name);
}
async stop() {
this.isOpen = false;
for (const db of this.databases.values()) {
await db.close();
}
}
async start() {
this.isOpen = true;
}
get address() {
return 'mock-orbitdb-address';
}
}
export class MockDatabase {
private data = new Map<string, any>();
private _events: Array<{ type: string; payload: any }> = [];
public name: string;
public type: string;
constructor(name: string, options: any = {}) {
this.name = name;
this.type = options.type || 'docstore';
}
// DocStore methods
async put(doc: any, options?: any) {
const id = doc._id || doc.id || this.generateId();
const record = { ...doc, _id: id };
this.data.set(id, record);
this._events.push({ type: 'write', payload: record });
return id;
}
async get(id: string) {
return this.data.get(id) || null;
}
async del(id: string) {
const deleted = this.data.delete(id);
if (deleted) {
this._events.push({ type: 'delete', payload: { _id: id } });
}
return deleted;
}
async query(filter?: (doc: any) => boolean) {
const docs = Array.from(this.data.values());
return filter ? docs.filter(filter) : docs;
}
async all() {
return Array.from(this.data.values());
}
// EventLog methods
async add(data: any) {
const entry = {
payload: data,
hash: this.generateId(),
clock: { time: Date.now() }
};
this._events.push(entry);
return entry.hash;
}
async iterator(options?: any) {
const events = this._events.slice();
return {
collect: () => events,
[Symbol.iterator]: function* () {
for (const event of events) {
yield event;
}
}
};
}
// KeyValue methods
async set(key: string, value: any) {
this.data.set(key, value);
this._events.push({ type: 'put', payload: { key, value } });
return key;
}
// Counter methods
async inc(amount: number = 1) {
const current = this.data.get('counter') || 0;
const newValue = current + amount;
this.data.set('counter', newValue);
this._events.push({ type: 'increment', payload: { amount, value: newValue } });
return newValue;
}
get value() {
return this.data.get('counter') || 0;
}
// General methods
async close() {
// Mock close
}
async drop() {
this.data.clear();
this._events = [];
}
get address() {
return `mock-db-${this.name}`;
}
get events() {
return this._events;
}
// Event emitter mock
on(event: string, callback: Function) {
// Mock event listener
}
off(event: string, callback: Function) {
// Mock event listener removal
}
private generateId(): string {
return `mock-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
}
}
export const createOrbitDB = jest.fn(async (options: any) => {
return new MockOrbitDB();
});
// Default export for ES modules
export default {
createOrbitDB,
MockOrbitDB,
MockDatabase
};