Files
2026-07-13 12:10:05 +08:00

219 lines
5.7 KiB
TypeScript

import { sql } from 'drizzle-orm';
import { int, sqliteTable, sqliteView } from 'drizzle-orm/sqlite-core';
import { expect, test } from 'vitest';
import { diffTestSchemasLibSQL } from './schemaDiffer';
test('create view', async () => {
const users = sqliteTable('users', { id: int('id').default(1) });
const view = sqliteView('view').as((qb) => qb.select().from(users));
const to = {
users: users,
testView: view,
};
const { statements, sqlStatements } = await diffTestSchemasLibSQL({}, to, []);
expect(statements.length).toBe(2);
expect(statements[0]).toStrictEqual({
type: 'sqlite_create_table',
tableName: 'users',
columns: [{
autoincrement: false,
default: 1,
name: 'id',
type: 'integer',
primaryKey: false,
notNull: false,
}],
compositePKs: [],
uniqueConstraints: [],
referenceData: [],
checkConstraints: [],
});
expect(statements[1]).toStrictEqual({
type: 'sqlite_create_view',
name: 'view',
definition: 'select "id" from "users"',
});
expect(sqlStatements.length).toBe(2);
expect(sqlStatements[0]).toBe(`CREATE TABLE \`users\` (
\t\`id\` integer DEFAULT 1
);\n`);
expect(sqlStatements[1]).toBe(`CREATE VIEW \`view\` AS select "id" from "users";`);
});
test('drop view', async () => {
const users = sqliteTable('users', {
id: int('id').primaryKey({ autoIncrement: true }),
});
const from = {
users: users,
testView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users`),
};
const to = {
users,
};
const { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, []);
expect(statements.length).toBe(1);
expect(statements[0]).toStrictEqual({
name: 'view',
type: 'drop_view',
});
expect(sqlStatements.length).toBe(1);
expect(sqlStatements[0]).toBe(
`DROP VIEW \`view\`;`,
);
});
test('alter view', async () => {
const users = sqliteTable('users', {
id: int('id').primaryKey({ autoIncrement: true }),
});
const from = {
users: users,
testView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users`),
};
const to = {
users,
testView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users WHERE users.id = 1`),
};
const { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, []);
expect(statements.length).toBe(2);
expect(statements[0]).toStrictEqual({
name: 'view',
type: 'drop_view',
});
expect(statements[1]).toStrictEqual({
name: 'view',
type: 'sqlite_create_view',
definition: 'SELECT * FROM users WHERE users.id = 1',
});
expect(sqlStatements.length).toBe(2);
expect(sqlStatements[0]).toBe(
`DROP VIEW \`view\`;`,
);
expect(sqlStatements[1]).toBe(
`CREATE VIEW \`view\` AS SELECT * FROM users WHERE users.id = 1;`,
);
});
test('create view with existing flag', async () => {
const view = sqliteView('view', {}).existing();
const to = {
testView: view,
};
const { statements, sqlStatements } = await diffTestSchemasLibSQL({}, to, []);
expect(statements.length).toBe(0);
expect(sqlStatements.length).toBe(0);
});
test('drop view with existing flag', async () => {
const users = sqliteTable('users', {
id: int('id').primaryKey({ autoIncrement: true }),
});
const from = {
users: users,
testView: sqliteView('view', { id: int('id') }).existing(),
};
const to = {
users,
};
const { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, []);
expect(statements.length).toBe(0);
expect(sqlStatements.length).toBe(0);
});
test('rename view with existing flag', async () => {
const users = sqliteTable('users', {
id: int('id').primaryKey({ autoIncrement: true }),
});
const from = {
users: users,
testView: sqliteView('view', { id: int('id') }).existing(),
};
const to = {
users,
testView: sqliteView('new_view', { id: int('id') }).existing(),
};
const { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, ['view->new_view']);
expect(statements.length).toBe(0);
expect(sqlStatements.length).toBe(0);
});
test('rename view and drop existing flag', async () => {
const users = sqliteTable('users', {
id: int('id').primaryKey({ autoIncrement: true }),
});
const from = {
users: users,
testView: sqliteView('view', { id: int('id') }).existing(),
};
const to = {
users,
testView: sqliteView('new_view', { id: int('id') }).as(sql`SELECT * FROM users`),
};
const { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, ['view->new_view']);
expect(statements.length).toBe(2);
expect(statements[0]).toStrictEqual({
name: 'view',
type: 'drop_view',
});
expect(statements[1]).toStrictEqual({
type: 'sqlite_create_view',
name: 'new_view',
definition: 'SELECT * FROM users',
});
expect(sqlStatements.length).toBe(2);
expect(sqlStatements[0]).toBe('DROP VIEW `view`;');
expect(sqlStatements[1]).toBe(`CREATE VIEW \`new_view\` AS SELECT * FROM users;`);
});
test('rename view and alter ".as"', async () => {
const users = sqliteTable('users', {
id: int('id').primaryKey({ autoIncrement: true }),
});
const from = {
users: users,
testView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users`),
};
const to = {
users,
testView: sqliteView('new_view', { id: int('id') }).as(sql`SELECT * FROM users WHERE 1=1`),
};
const { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, ['view->new_view']);
expect(statements.length).toBe(2);
expect(statements[0]).toStrictEqual({
name: 'view',
type: 'drop_view',
});
expect(statements[1]).toStrictEqual({
type: 'sqlite_create_view',
name: 'new_view',
definition: 'SELECT * FROM users WHERE 1=1',
});
expect(sqlStatements.length).toBe(2);
expect(sqlStatements[0]).toBe('DROP VIEW `view`;');
expect(sqlStatements[1]).toBe(`CREATE VIEW \`new_view\` AS SELECT * FROM users WHERE 1=1;`);
});