Skip to content

Commit bc8874a

Browse files
committed
test(cli): refactor test utilities and modernize test suites
1 parent c135c69 commit bc8874a

File tree

10 files changed

+96
-104
lines changed

10 files changed

+96
-104
lines changed

packages/cli/test/check.test.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,37 +36,37 @@ model Post {
3636
`;
3737

3838
describe('CLI validate command test', () => {
39-
it('should validate a valid schema successfully', () => {
40-
const workDir = createProject(validModel);
39+
it('should validate a valid schema successfully', async () => {
40+
const { workDir } = await createProject(validModel);
4141

4242
// Should not throw an error
4343
expect(() => runCli('check', workDir)).not.toThrow();
4444
});
4545

46-
it('should fail validation for invalid schema', () => {
47-
const workDir = createProject(invalidModel);
46+
it('should fail validation for invalid schema', async () => {
47+
const { workDir } = await createProject(invalidModel);
4848

4949
// Should throw an error due to validation failure
5050
expect(() => runCli('check', workDir)).toThrow();
5151
});
5252

53-
it('should respect custom schema location', () => {
54-
const workDir = createProject(validModel);
53+
it('should respect custom schema location', async () => {
54+
const { workDir } = await createProject(validModel);
5555
fs.renameSync(path.join(workDir, 'zenstack/schema.zmodel'), path.join(workDir, 'zenstack/custom.zmodel'));
5656

5757
// Should not throw an error when using custom schema path
5858
expect(() => runCli('check --schema ./zenstack/custom.zmodel', workDir)).not.toThrow();
5959
});
6060

61-
it('should fail when schema file does not exist', () => {
62-
const workDir = createProject(validModel);
61+
it('should fail when schema file does not exist', async () => {
62+
const { workDir } = await createProject(validModel);
6363

6464
// Should throw an error when schema file doesn't exist
6565
expect(() => runCli('check --schema ./nonexistent.zmodel', workDir)).toThrow();
6666
});
6767

68-
it('should respect package.json config', () => {
69-
const workDir = createProject(validModel);
68+
it('should respect package.json config', async () => {
69+
const { workDir } = await createProject(validModel);
7070
fs.mkdirSync(path.join(workDir, 'foo'));
7171
fs.renameSync(path.join(workDir, 'zenstack/schema.zmodel'), path.join(workDir, 'foo/schema.zmodel'));
7272
fs.rmdirSync(path.join(workDir, 'zenstack'));
@@ -81,14 +81,14 @@ describe('CLI validate command test', () => {
8181
expect(() => runCli('check', workDir)).not.toThrow();
8282
});
8383

84-
it('should validate schema with syntax errors', () => {
84+
it('should validate schema with syntax errors', async () => {
8585
const modelWithSyntaxError = `
8686
model User {
8787
id String @id @default(cuid())
8888
email String @unique
8989
// Missing closing brace - syntax error
9090
`;
91-
const workDir = createProject(modelWithSyntaxError);
91+
const { workDir } = await createProject(modelWithSyntaxError);
9292

9393
// Should throw an error due to syntax error
9494
expect(() => runCli('check', workDir)).toThrow();

packages/cli/test/db.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ model User {
1010
`;
1111

1212
describe('CLI db commands test', () => {
13-
it('should generate a database with db push', () => {
14-
const workDir = createProject(model, { provider: 'sqlite' });
13+
it('should generate a database with db push', async () => {
14+
const { workDir } = await createProject(model, { provider: 'sqlite' });
1515
runCli('db push', workDir);
1616
expect(fs.existsSync(path.join(workDir, 'zenstack/test.db'))).toBe(true);
1717
});
1818

19-
it('should seed the database with db seed with seed script', () => {
20-
const workDir = createProject(model, { provider: 'sqlite' });
19+
it('should seed the database with db seed with seed script', async () => {
20+
const { workDir } = await createProject(model, { provider: 'sqlite' });
2121
const pkgJson = JSON.parse(fs.readFileSync(path.join(workDir, 'package.json'), 'utf8'));
2222
pkgJson.zenstack = {
2323
seed: 'node seed.js',
@@ -35,8 +35,8 @@ fs.writeFileSync('seed.txt', 'success');
3535
expect(fs.readFileSync(path.join(workDir, 'seed.txt'), 'utf8')).toBe('success');
3636
});
3737

38-
it('should seed the database after migrate reset', () => {
39-
const workDir = createProject(model, { provider: 'sqlite' });
38+
it('should seed the database after migrate reset', async () => {
39+
const { workDir } = await createProject(model, { provider: 'sqlite' });
4040
const pkgJson = JSON.parse(fs.readFileSync(path.join(workDir, 'package.json'), 'utf8'));
4141
pkgJson.zenstack = {
4242
seed: 'node seed.js',
@@ -54,8 +54,8 @@ fs.writeFileSync('seed.txt', 'success');
5454
expect(fs.readFileSync(path.join(workDir, 'seed.txt'), 'utf8')).toBe('success');
5555
});
5656

57-
it('should skip seeding the database without seed script', () => {
58-
const workDir = createProject(model, { provider: 'sqlite' });
57+
it('should skip seeding the database without seed script', async () => {
58+
const { workDir } = await createProject(model, { provider: 'sqlite' });
5959
runCli('db seed', workDir);
6060
});
6161
});

packages/cli/test/db/pull.test.ts

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import fs from 'node:fs';
22
import path from 'node:path';
33
import { describe, expect, it } from 'vitest';
4-
import { createFormattedProject, createProject, getDefaultPrelude, runCli } from '../utils';
4+
import { createProject, getDefaultPrelude, runCli } from '../utils';
55
import { formatDocument } from '@zenstackhq/language';
66
import { getTestDbProvider } from '@zenstackhq/testtools';
77

@@ -10,7 +10,7 @@ const getSchema = (workDir: string) => fs.readFileSync(path.join(workDir, 'zenst
1010
describe('DB pull - Common features (all providers)', () => {
1111
describe('Pull from zero - restore complete schema from database', () => {
1212
it('should restore basic schema with all supported types', async () => {
13-
const { workDir, schema } = await createFormattedProject(
13+
const { workDir, schema } = await createProject(
1414
`model User {
1515
id Int @id @default(autoincrement())
1616
email String @unique
@@ -43,7 +43,7 @@ describe('DB pull - Common features (all providers)', () => {
4343
});
4444

4545
it('should restore schema with relations', async () => {
46-
const { workDir, schema } = await createFormattedProject(
46+
const { workDir, schema } = await createProject(
4747
`model Post {
4848
id Int @id @default(autoincrement())
4949
title String
@@ -69,7 +69,7 @@ model User {
6969
});
7070

7171
it('should restore schema with many-to-many relations', async () => {
72-
const { workDir, schema } = await createFormattedProject(
72+
const { workDir, schema } = await createProject(
7373
`model Post {
7474
id Int @id @default(autoincrement())
7575
title String
@@ -103,7 +103,7 @@ model Tag {
103103
});
104104

105105
it('should restore one-to-one relation when FK is the single-column primary key', async () => {
106-
const { workDir, schema } = await createFormattedProject(
106+
const { workDir, schema } = await createProject(
107107
`model Profile {
108108
user User @relation(fields: [id], references: [id], onDelete: Cascade)
109109
id Int @id @default(autoincrement())
@@ -128,7 +128,7 @@ model User {
128128
});
129129

130130
it('should restore schema with indexes and unique constraints', async () => {
131-
const { workDir, schema } = await createFormattedProject(
131+
const { workDir, schema } = await createProject(
132132
`model User {
133133
id Int @id @default(autoincrement())
134134
email String @unique
@@ -155,7 +155,7 @@ model User {
155155
});
156156

157157
it('should restore schema with composite primary keys', async () => {
158-
const { workDir, schema } = await createFormattedProject(
158+
const { workDir, schema } = await createProject(
159159
`model UserRole {
160160
userId String
161161
role String
@@ -176,7 +176,7 @@ model User {
176176
});
177177

178178
it('should preserve Decimal and Float default value precision', async () => {
179-
const { workDir, schema } = await createFormattedProject(
179+
const { workDir, schema } = await createProject(
180180
`model Product {
181181
id Int @id @default(autoincrement())
182182
price Decimal @default(99.99)
@@ -202,7 +202,7 @@ model User {
202202

203203
describe('Pull with existing schema - preserve schema features', () => {
204204
it('should preserve field and table mappings', async () => {
205-
const { workDir, schema } = await createFormattedProject(
205+
const { workDir, schema } = await createProject(
206206
`model User {
207207
id Int @id @default(autoincrement())
208208
email String @unique @map('email_address')
@@ -220,7 +220,7 @@ model User {
220220
});
221221

222222
it('should not modify a comprehensive schema with all features', async () => {
223-
const { workDir, schema } = await createFormattedProject(`model User {
223+
const { workDir, schema } = await createProject(`model User {
224224
id Int @id @default(autoincrement())
225225
email String @unique @map('email_address')
226226
name String? @default('Anonymous')
@@ -308,7 +308,7 @@ enum users_role {
308308
});
309309

310310
it('should preserve imports when pulling with multi-file schema', async () => {
311-
const workDir = createProject('', { customPrelude: true });
311+
const { workDir } = await createProject('', { customPrelude: true });
312312
const schemaPath = path.join(workDir, 'zenstack/schema.zmodel');
313313
const modelsDir = path.join(workDir, 'zenstack/models');
314314

@@ -364,7 +364,7 @@ model Post {
364364
describe('Pull should update existing field definitions when database changes', () => {
365365
it('should update field type when database column type changes', async () => {
366366
// Step 1: Create initial schema with String field
367-
const { workDir } = await createFormattedProject(
367+
const { workDir } = await createProject(
368368
`model User {
369369
id Int @id @default(autoincrement())
370370
email String @unique
@@ -405,7 +405,7 @@ model User {
405405

406406
it('should update field optionality when database column nullability changes', async () => {
407407
// Step 1: Create initial schema with required field
408-
const { workDir } = await createFormattedProject(
408+
const { workDir } = await createProject(
409409
`model User {
410410
id Int @id @default(autoincrement())
411411
email String @unique
@@ -446,7 +446,7 @@ model User {
446446

447447
it('should update default value when database default changes', async () => {
448448
// Step 1: Create initial schema with default value
449-
const { workDir } = await createFormattedProject(
449+
const { workDir } = await createProject(
450450
`model User {
451451
id Int @id @default(autoincrement())
452452
email String @unique
@@ -494,7 +494,7 @@ describe('DB pull - PostgreSQL specific features', () => {
494494
skip();
495495
return;
496496
}
497-
const { workDir, schema } = await createFormattedProject(
497+
const { workDir, schema } = await createProject(
498498
`model User {
499499
id Int @id @default(autoincrement())
500500
email String @unique
@@ -511,13 +511,13 @@ model Post {
511511
512512
@@schema('content')
513513
}`,
514-
{ provider: 'postgresql', extra:{ schemas: ['public', 'content', 'auth'] } },
514+
{ provider: 'postgresql', datasourceFields:{ schemas: ['public', 'content', 'auth'] } },
515515
);
516516
runCli('db push', workDir);
517517

518518
const schemaFile = path.join(workDir, 'zenstack/schema.zmodel');
519519

520-
fs.writeFileSync(schemaFile, getDefaultPrelude({ provider: 'postgresql', extra:{ schemas: ['public', 'content', 'auth']} }));
520+
fs.writeFileSync(schemaFile, getDefaultPrelude({ provider: 'postgresql', datasourceFields:{ schemas: ['public', 'content', 'auth']} }));
521521
runCli('db pull --indent 4', workDir);
522522

523523
const restoredSchema = getSchema(workDir);
@@ -530,7 +530,7 @@ model Post {
530530
skip();
531531
return;
532532
}
533-
const { workDir, schema } = await createFormattedProject(
533+
const { workDir, schema } = await createProject(
534534
`model User {
535535
id Int @id @default(autoincrement())
536536
email String @unique
@@ -565,7 +565,7 @@ enum UserRole {
565565
skip();
566566
return;
567567
}
568-
const { workDir, schema } = await createFormattedProject(
568+
const { workDir, schema } = await createProject(
569569
`model User {
570570
id Int @id @default(autoincrement())
571571
email String @unique
@@ -593,7 +593,7 @@ enum UserStatus {
593593
INACTIVE
594594
SUSPENDED
595595
}`,
596-
{ provider: 'postgresql', extra:{ schemas: ['public', 'content', 'auth'] } },
596+
{ provider: 'postgresql', datasourceFields:{ schemas: ['public', 'content', 'auth'] } },
597597
);
598598
runCli('db push', workDir);
599599

@@ -613,7 +613,7 @@ enum UserStatus {
613613
// This test verifies the mapping works correctly.
614614
// Note: Default native types (jsonb for Json, bytea for Bytes) are not added when pulling from zero
615615
// because they match the default database type for that field type.
616-
const { workDir } = await createFormattedProject(
616+
const { workDir } = await createProject(
617617
`model TypeTest {
618618
id Int @id @default(autoincrement())
619619
smallNumber Int @db.SmallInt()
@@ -666,14 +666,14 @@ describe('DB pull - SQL specific features', () => {
666666
return;
667667
}
668668

669-
const { workDir, schema } = await createFormattedProject(
669+
const { workDir, schema } = await createProject(
670670
`model User {
671671
id Int @id @default(autoincrement())
672672
email String @unique
673-
status User_status @default(ACTIVE)
673+
status UserStatus @default(ACTIVE)
674674
}
675675
676-
enum User_status {
676+
enum UserStatus {
677677
ACTIVE
678678
INACTIVE
679679
SUSPENDED

packages/cli/test/db/push.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ model User {
1010
`;
1111

1212
describe('CLI db commands test', () => {
13-
it('should generate a database with db push', () => {
14-
const workDir = createProject(model, { provider: 'sqlite' });
13+
it('should generate a database with db push', async () => {
14+
const { workDir } = await createProject(model, { provider: 'sqlite' });
1515
runCli('db push', workDir);
1616
expect(fs.existsSync(path.join(workDir, 'zenstack/test.db'))).toBe(true);
1717
});

packages/cli/test/format.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ model User {
1010
`;
1111

1212
describe('CLI format command test', () => {
13-
it('should format a valid schema successfully', () => {
14-
const workDir = createProject(model);
13+
it('should format a valid schema successfully', async () => {
14+
const { workDir } = await createProject(model);
1515
expect(() => runCli('format', workDir)).not.toThrow();
1616
const updatedContent = fs.readFileSync(`${workDir}/zenstack/schema.zmodel`, 'utf-8');
1717
expect(
@@ -22,12 +22,12 @@ describe('CLI format command test', () => {
2222
).toBeTruthy();
2323
});
2424

25-
it('should silently ignore invalid schema', () => {
25+
it('should silently ignore invalid schema', async () => {
2626
const invalidModel = `
2727
model User {
2828
id String @id @default(cuid())
2929
`;
30-
const workDir = createProject(invalidModel);
30+
const { workDir } = await createProject(invalidModel);
3131
expect(() => runCli('format', workDir)).not.toThrow();
3232
});
3333
});

0 commit comments

Comments
 (0)