49 lines
2.0 KiB
TypeScript
49 lines
2.0 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { MockAdapter } from './MockAdapter';
|
|
|
|
// MockAdapter 测试:列表行数、排序筛选与变更集提交。
|
|
|
|
describe('MockAdapter', () => {
|
|
it('ships users and orders with 500 rows each', async () => {
|
|
const adapter = new MockAdapter({ latencyMs: 0 });
|
|
const tables = await adapter.listTables('chusql');
|
|
expect(tables.map((table) => [table.name, table.rowCount])).toEqual([
|
|
['users', 500],
|
|
['orders', 500],
|
|
]);
|
|
});
|
|
|
|
it('sorts and filters before paginating', async () => {
|
|
const adapter = new MockAdapter({ latencyMs: 0 });
|
|
const result = await adapter.fetchRows({
|
|
db: 'chusql', table: 'users', page: 0, pageSize: 3,
|
|
sort: [{ column: 'age', dir: 'desc' }], filters: [{ column: 'age', expression: '>60' }],
|
|
});
|
|
expect(result.total).toBeGreaterThan(3);
|
|
expect(result.rows).toHaveLength(3);
|
|
expect(Number(result.rows[0].age)).toBeGreaterThanOrEqual(Number(result.rows[1].age));
|
|
});
|
|
|
|
it('applies a complete change set in one call', async () => {
|
|
const adapter = new MockAdapter({ latencyMs: 0 });
|
|
const response = await adapter.commitChanges({
|
|
db: 'chusql',
|
|
changes: [
|
|
{ op: 'update', table: 'users', pk: 1, set: { name: 'edited' } },
|
|
{ op: 'delete', table: 'users', pk: 2 },
|
|
],
|
|
});
|
|
expect(response).toEqual({ ok: true, applied: 2 });
|
|
const page = await adapter.fetchRows({ db: 'chusql', table: 'users', page: 0, pageSize: 3, sort: [], filters: [] });
|
|
expect(page.rows[0].name).toBe('edited');
|
|
expect(page.rows.some((row) => row.id === 2)).toBe(false);
|
|
});
|
|
|
|
it('refuses an index on a column that holds duplicate values', async () => {
|
|
const adapter = new MockAdapter({ latencyMs: 0 });
|
|
await expect(adapter.createIndex('users', 'age')).rejects.toThrow('duplicate values');
|
|
const users = (await adapter.listTables('chusql')).find((table) => table.name === 'users')!;
|
|
expect(users.columns.find((column) => column.name === 'age')?.indexed).toBeFalsy();
|
|
});
|
|
});
|