mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-25 14:25:02 +00:00
142 lines
4.2 KiB
TypeScript
142 lines
4.2 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
import { DBALClient } from '../../src/core/client'
|
|
import { DBALErrorCode } from '../../src/core/errors'
|
|
|
|
const mockAdapter = vi.hoisted(() => ({
|
|
create: vi.fn(),
|
|
read: vi.fn(),
|
|
update: vi.fn(),
|
|
delete: vi.fn(),
|
|
list: vi.fn(),
|
|
findFirst: vi.fn(),
|
|
findByField: vi.fn(),
|
|
upsert: vi.fn(),
|
|
updateByField: vi.fn(),
|
|
deleteByField: vi.fn(),
|
|
deleteMany: vi.fn(),
|
|
createMany: vi.fn(),
|
|
updateMany: vi.fn(),
|
|
getCapabilities: vi.fn(),
|
|
close: vi.fn(),
|
|
}))
|
|
|
|
vi.mock('../../src/adapters/prisma-adapter', () => ({
|
|
PrismaAdapter: vi.fn(() => mockAdapter),
|
|
}))
|
|
|
|
const baseConfig = {
|
|
mode: 'development' as const,
|
|
adapter: 'prisma' as const,
|
|
database: { url: 'file:memory' },
|
|
}
|
|
|
|
const userBatch = [
|
|
{ username: 'alpha', email: 'alpha@example.com', role: 'user' as const },
|
|
{ username: 'beta', email: 'beta@example.com', role: 'admin' as const },
|
|
]
|
|
|
|
const packageBatch = [
|
|
{
|
|
name: 'forum',
|
|
version: '1.0.0',
|
|
author: 'MetaBuilder',
|
|
manifest: { entry: 'index.lua' },
|
|
isInstalled: false,
|
|
},
|
|
{
|
|
name: 'chat',
|
|
version: '2.1.0',
|
|
author: 'MetaBuilder',
|
|
manifest: { entry: 'chat.lua' },
|
|
isInstalled: true,
|
|
},
|
|
]
|
|
|
|
beforeEach(() => {
|
|
Object.values(mockAdapter).forEach(value => {
|
|
if (typeof value === 'function' && 'mockReset' in value) {
|
|
value.mockReset()
|
|
}
|
|
})
|
|
})
|
|
|
|
describe('DBALClient batch operations', () => {
|
|
it('creates users in bulk via adapter', async () => {
|
|
mockAdapter.createMany.mockResolvedValue(2)
|
|
|
|
const client = new DBALClient(baseConfig)
|
|
const result = await client.users.createMany(userBatch)
|
|
|
|
expect(mockAdapter.createMany).toHaveBeenCalledWith('User', userBatch)
|
|
expect(result).toBe(2)
|
|
})
|
|
|
|
it('rejects bulk user create with invalid data', async () => {
|
|
const client = new DBALClient(baseConfig)
|
|
|
|
await expect(client.users.createMany([
|
|
{ username: '', email: 'bad', role: 'user' as const },
|
|
])).rejects.toMatchObject({ code: DBALErrorCode.VALIDATION_ERROR })
|
|
|
|
expect(mockAdapter.createMany).not.toHaveBeenCalled()
|
|
})
|
|
|
|
it('updates users in bulk with a filter', async () => {
|
|
mockAdapter.updateMany.mockResolvedValue(1)
|
|
|
|
const client = new DBALClient(baseConfig)
|
|
const result = await client.users.updateMany({ role: 'user' }, { role: 'admin' })
|
|
|
|
expect(mockAdapter.updateMany).toHaveBeenCalledWith('User', { role: 'user' }, { role: 'admin' })
|
|
expect(result).toBe(1)
|
|
})
|
|
|
|
it('rejects bulk user update without a filter', async () => {
|
|
const client = new DBALClient(baseConfig)
|
|
|
|
await expect(client.users.updateMany({}, { role: 'admin' })).rejects.toMatchObject({
|
|
code: DBALErrorCode.VALIDATION_ERROR,
|
|
})
|
|
})
|
|
|
|
it('deletes users in bulk with a filter', async () => {
|
|
mockAdapter.deleteMany.mockResolvedValue(2)
|
|
|
|
const client = new DBALClient(baseConfig)
|
|
const result = await client.users.deleteMany({ role: 'user' })
|
|
|
|
expect(mockAdapter.deleteMany).toHaveBeenCalledWith('User', { role: 'user' })
|
|
expect(result).toBe(2)
|
|
})
|
|
|
|
it('creates packages in bulk via adapter', async () => {
|
|
mockAdapter.createMany.mockResolvedValue(2)
|
|
|
|
const client = new DBALClient(baseConfig)
|
|
const result = await client.packages.createMany(packageBatch)
|
|
|
|
expect(mockAdapter.createMany).toHaveBeenCalledWith('Package', packageBatch)
|
|
expect(result).toBe(2)
|
|
})
|
|
|
|
it('updates packages in bulk with a filter', async () => {
|
|
mockAdapter.updateMany.mockResolvedValue(3)
|
|
|
|
const client = new DBALClient(baseConfig)
|
|
const result = await client.packages.updateMany({ isInstalled: false }, { isInstalled: true })
|
|
|
|
expect(mockAdapter.updateMany).toHaveBeenCalledWith('Package', { isInstalled: false }, { isInstalled: true })
|
|
expect(result).toBe(3)
|
|
})
|
|
|
|
it('deletes packages in bulk with a filter', async () => {
|
|
mockAdapter.deleteMany.mockResolvedValue(1)
|
|
|
|
const client = new DBALClient(baseConfig)
|
|
const result = await client.packages.deleteMany({ name: 'forum' })
|
|
|
|
expect(mockAdapter.deleteMany).toHaveBeenCalledWith('Package', { name: 'forum' })
|
|
expect(result).toBe(1)
|
|
})
|
|
})
|