Skip to content

Commit d86c999

Browse files
committed
将 KnexDriver 测试用例中的主键字段更改为 '_id',并添加 Schema 同步测试用例以验证表和列的创建与更新
1 parent 710cd1d commit d86c999

File tree

2 files changed

+127
-10
lines changed

2 files changed

+127
-10
lines changed

packages/driver-knex/test/index.test.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@ describe('KnexDriver (SQLite Integration)', () => {
1717
const k = (driver as any).knex;
1818

1919
await k.schema.createTable('users', (t: any) => {
20-
t.increments('id');
20+
t.string('_id').primary();
2121
t.string('name');
2222
t.integer('age');
2323
});
2424

2525
await k('users').insert([
26-
{ name: 'Alice', age: 25 },
27-
{ name: 'Bob', age: 17 },
28-
{ name: 'Charlie', age: 30 },
29-
{ name: 'Dave', age: 17 }
26+
{ _id: '1', name: 'Alice', age: 25 },
27+
{ _id: '2', name: 'Bob', age: 17 },
28+
{ _id: '3', name: 'Charlie', age: 30 },
29+
{ _id: '4', name: 'Dave', age: 17 }
3030
]);
3131
});
3232

@@ -71,7 +71,7 @@ describe('KnexDriver (SQLite Integration)', () => {
7171
const [alice] = await driver.find('users', { filters: [['name', '=', 'Alice']] });
7272
expect(alice).toBeDefined();
7373

74-
const fetched = await driver.findOne('users', alice.id);
74+
const fetched = await driver.findOne('users', alice._id);
7575
expect(fetched).toBeDefined();
7676
expect(fetched.name).toBe('Alice');
7777
});
@@ -87,17 +87,17 @@ describe('KnexDriver (SQLite Integration)', () => {
8787

8888
it('should update an object', async () => {
8989
const [bob] = await driver.find('users', { filters: [['name', '=', 'Bob']] });
90-
await driver.update('users', bob.id, { age: 18 });
90+
await driver.update('users', bob._id, { age: 18 });
9191

92-
const updated = await driver.findOne('users', bob.id);
92+
const updated = await driver.findOne('users', bob._id);
9393
expect(updated.age).toBe(18);
9494
});
9595

9696
it('should delete an object', async () => {
9797
const [charlie] = await driver.find('users', { filters: [['name', '=', 'Charlie']] });
98-
await driver.delete('users', charlie.id);
98+
await driver.delete('users', charlie._id);
9999

100-
const deleted = await driver.findOne('users', charlie.id);
100+
const deleted = await driver.findOne('users', charlie._id);
101101
expect(deleted).toBeUndefined();
102102
});
103103

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
import { KnexDriver } from '../src';
2+
3+
describe('KnexDriver Schema Sync (SQLite)', () => {
4+
let driver: KnexDriver;
5+
let knexInstance: any;
6+
7+
beforeEach(async () => {
8+
// Init ephemeral in-memory database
9+
driver = new KnexDriver({
10+
client: 'sqlite3',
11+
connection: {
12+
filename: ':memory:'
13+
},
14+
useNullAsDefault: true
15+
});
16+
knexInstance = (driver as any).knex;
17+
});
18+
19+
afterEach(async () => {
20+
await knexInstance.destroy();
21+
});
22+
23+
it('should create table if not exists', async () => {
24+
const objects = [{
25+
name: 'test_obj',
26+
fields: {
27+
name: { type: 'string' },
28+
age: { type: 'integer' }
29+
}
30+
}];
31+
32+
await driver.init(objects);
33+
34+
const exists = await knexInstance.schema.hasTable('test_obj');
35+
expect(exists).toBe(true);
36+
37+
const columns = await knexInstance('test_obj').columnInfo();
38+
expect(columns).toHaveProperty('_id');
39+
expect(columns).toHaveProperty('created_at');
40+
expect(columns).toHaveProperty('updated_at');
41+
expect(columns).toHaveProperty('name');
42+
expect(columns).toHaveProperty('age');
43+
});
44+
45+
it('should add new columns if table exists', async () => {
46+
// 1. Setup existing table with subset of columns
47+
await knexInstance.schema.createTable('test_obj', (t: any) => {
48+
t.string('_id').primary();
49+
t.string('name');
50+
});
51+
52+
// 2. Insert some data
53+
await knexInstance('test_obj').insert({ _id: '1', name: 'Old Data' });
54+
55+
// 3. Init with new fields
56+
const objects = [{
57+
name: 'test_obj',
58+
fields: {
59+
name: { type: 'string' },
60+
age: { type: 'integer' }, // New field
61+
active: { type: 'boolean' } // New field
62+
}
63+
}];
64+
65+
await driver.init(objects);
66+
67+
// 4. Verify columns
68+
const columns = await knexInstance('test_obj').columnInfo();
69+
expect(columns).toHaveProperty('age');
70+
expect(columns).toHaveProperty('active');
71+
72+
// 5. Verify data is intact
73+
const row = await knexInstance('test_obj').where('_id', '1').first();
74+
expect(row.name).toBe('Old Data');
75+
});
76+
77+
it('should not delete existing columns', async () => {
78+
// 1. Setup table with extra column
79+
await knexInstance.schema.createTable('test_obj', (t: any) => {
80+
t.string('_id').primary();
81+
t.string('name');
82+
t.string('extra_column'); // Should stay
83+
});
84+
85+
// 2. Init with only 'name'
86+
const objects = [{
87+
name: 'test_obj',
88+
fields: {
89+
name: { type: 'string' }
90+
}
91+
}];
92+
93+
await driver.init(objects);
94+
95+
const columns = await knexInstance('test_obj').columnInfo();
96+
expect(columns).toHaveProperty('name');
97+
expect(columns).toHaveProperty('extra_column'); // Preservation check
98+
});
99+
100+
it('should not fail if table creation is repeated', async () => {
101+
const objects = [{
102+
name: 'test_obj',
103+
fields: {
104+
name: { type: 'string' }
105+
}
106+
}];
107+
108+
// First init
109+
await driver.init(objects);
110+
111+
// Second init (should be idempotent-ish, or just skip creation)
112+
await driver.init(objects);
113+
114+
const exists = await knexInstance.schema.hasTable('test_obj');
115+
expect(exists).toBe(true);
116+
});
117+
});

0 commit comments

Comments
 (0)