197 lines
6 KiB
TypeScript
197 lines
6 KiB
TypeScript
import { beforeEach, describe, expect, it } from 'bun:test';
|
|
import { SimpleMongoDBClient } from '../src/simple-mongodb';
|
|
|
|
describe('MongoDBClient', () => {
|
|
let client: SimpleMongoDBClient;
|
|
const config = {
|
|
uri: 'mongodb://localhost:27017',
|
|
database: 'test-db',
|
|
};
|
|
|
|
beforeEach(() => {
|
|
client = new SimpleMongoDBClient(config);
|
|
});
|
|
|
|
describe('connection', () => {
|
|
it('should connect on first operation', async () => {
|
|
const results = await client.find('test-collection', {});
|
|
|
|
expect(results).toBeDefined();
|
|
expect(results).toEqual([]);
|
|
});
|
|
|
|
it('should handle health check', async () => {
|
|
// Connect first by doing an operation
|
|
await client.find('test', {});
|
|
|
|
const health = await client.healthCheck();
|
|
|
|
expect(health.status).toBe('healthy');
|
|
expect(health.isConnected).toBe(true);
|
|
});
|
|
|
|
it('should disconnect properly', async () => {
|
|
await client.find('test', {});
|
|
await client.disconnect();
|
|
|
|
const health = await client.healthCheck();
|
|
expect(health.isConnected).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('CRUD operations', () => {
|
|
it('should find documents', async () => {
|
|
await client.insert('users', { id: 1, active: true });
|
|
await client.insert('users', { id: 2, active: true });
|
|
await client.insert('users', { id: 3, active: false });
|
|
|
|
const results = await client.find('users', { active: true });
|
|
|
|
expect(results).toHaveLength(2);
|
|
expect(results[0].active).toBe(true);
|
|
expect(results[1].active).toBe(true);
|
|
});
|
|
|
|
it('should find one document', async () => {
|
|
await client.insert('users', { id: 1, name: 'Test' });
|
|
await client.insert('users', { id: 2, name: 'Other' });
|
|
|
|
const result = await client.findOne('users', { id: 1 });
|
|
|
|
expect(result).toBeDefined();
|
|
expect(result.id).toBe(1);
|
|
expect(result.name).toBe('Test');
|
|
});
|
|
|
|
it('should insert documents', async () => {
|
|
const doc = { name: 'Test User', email: 'test@example.com' };
|
|
|
|
await client.insert('users', doc);
|
|
|
|
const result = await client.findOne('users', { email: 'test@example.com' });
|
|
expect(result).toBeDefined();
|
|
expect(result.name).toBe('Test User');
|
|
});
|
|
|
|
it('should insert many documents', async () => {
|
|
const docs = [{ name: 'User 1' }, { name: 'User 2' }];
|
|
|
|
await client.insertMany('users', docs);
|
|
|
|
const all = await client.find('users', {});
|
|
expect(all).toHaveLength(2);
|
|
});
|
|
|
|
it('should update documents', async () => {
|
|
await client.insert('users', { id: 1, active: true });
|
|
|
|
const updated = await client.update('users', { id: 1 }, { $set: { active: false } });
|
|
|
|
expect(updated).toBe(1);
|
|
const result = await client.findOne('users', { id: 1 });
|
|
expect(result.active).toBe(false);
|
|
});
|
|
|
|
it('should update many documents', async () => {
|
|
await client.insert('users', { id: 1, active: true });
|
|
await client.insert('users', { id: 2, active: true });
|
|
await client.insert('users', { id: 3, active: false });
|
|
|
|
const updated = await client.updateMany(
|
|
'users',
|
|
{ active: true },
|
|
{ $set: { status: 'active' } }
|
|
);
|
|
|
|
expect(updated).toBe(2);
|
|
const activeUsers = await client.find('users', { status: 'active' });
|
|
expect(activeUsers).toHaveLength(2);
|
|
});
|
|
|
|
it('should delete documents', async () => {
|
|
await client.insert('users', { id: 1 });
|
|
await client.insert('users', { id: 2 });
|
|
|
|
const deleted = await client.delete('users', { id: 1 });
|
|
|
|
expect(deleted).toBe(1);
|
|
const remaining = await client.find('users', {});
|
|
expect(remaining).toHaveLength(1);
|
|
expect(remaining[0].id).toBe(2);
|
|
});
|
|
|
|
it('should delete many documents', async () => {
|
|
await client.insert('users', { id: 1, active: true });
|
|
await client.insert('users', { id: 2, active: false });
|
|
await client.insert('users', { id: 3, active: false });
|
|
|
|
const deleted = await client.deleteMany('users', { active: false });
|
|
|
|
expect(deleted).toBe(2);
|
|
const remaining = await client.find('users', {});
|
|
expect(remaining).toHaveLength(1);
|
|
expect(remaining[0].active).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('batch operations', () => {
|
|
it('should perform batch upsert', async () => {
|
|
const docs = [
|
|
{ id: 1, name: 'User 1' },
|
|
{ id: 2, name: 'User 2' },
|
|
];
|
|
|
|
await client.batchUpsert('users', docs, ['id']);
|
|
|
|
const all = await client.find('users', {});
|
|
expect(all).toHaveLength(2);
|
|
|
|
// Update existing
|
|
await client.batchUpsert('users', [{ id: 1, name: 'Updated User 1' }], ['id']);
|
|
|
|
const updated = await client.findOne('users', { id: 1 });
|
|
expect(updated.name).toBe('Updated User 1');
|
|
});
|
|
|
|
it('should handle empty batch', async () => {
|
|
await client.batchUpsert('users', [], ['id']);
|
|
|
|
const all = await client.find('users', {});
|
|
expect(all).toHaveLength(0);
|
|
});
|
|
});
|
|
|
|
describe('utility methods', () => {
|
|
it('should count documents', async () => {
|
|
await client.insert('users', { active: true });
|
|
await client.insert('users', { active: true });
|
|
await client.insert('users', { active: false });
|
|
|
|
const count = await client.count('users', { active: true });
|
|
|
|
expect(count).toBe(2);
|
|
});
|
|
|
|
it('should create indexes', async () => {
|
|
await client.createIndex('users', { email: 1 }, { unique: true });
|
|
|
|
// Simple implementation doesn't throw, just no-op
|
|
expect(true).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('error handling', () => {
|
|
it('should handle disconnected state', async () => {
|
|
await client.disconnect();
|
|
|
|
// Simple implementation auto-reconnects
|
|
const results = await client.find('users', {});
|
|
expect(results).toBeDefined();
|
|
});
|
|
|
|
it('should return empty array for non-existent collection', async () => {
|
|
const results = await client.find('non-existent', {});
|
|
expect(results).toEqual([]);
|
|
});
|
|
});
|
|
});
|