219 lines
5.7 KiB
TypeScript
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;`);
|
|
});
|