Skip to content

Commit

Permalink
Make sure unique names are always generated for sqlite
Browse files Browse the repository at this point in the history
Update tests for SQLite uniques
  • Loading branch information
AndriiSherman committed Jul 6, 2023
1 parent 0ca9a8c commit 7b55cc2
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 6 deletions.
13 changes: 12 additions & 1 deletion drizzle-orm/src/sqlite-core/columns/common.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import type { ColumnBaseConfig, ColumnHKT, ColumnHKTBase } from '~/column';
import { Column } from '~/column';
import type { ColumnBuilderBaseConfig, ColumnBuilderHKTBase, MakeColumnConfig } from '~/column-builder';
import type { ColumnBuilderBaseConfig, ColumnBuilderHKTBase, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder';
import { ColumnBuilder } from '~/column-builder';
import { entityKind } from '~/entity';
import { type Assume, type Update } from '~/utils';

import type { ForeignKey, UpdateDeleteAction } from '~/sqlite-core/foreign-keys';
import { ForeignKeyBuilder } from '~/sqlite-core/foreign-keys';
import type { AnySQLiteTable } from '~/sqlite-core/table';
import { uniqueKeyName } from '../unique-constraint';

export interface ReferenceConfig {
ref: () => AnySQLiteColumn;
Expand Down Expand Up @@ -89,6 +90,16 @@ export abstract class SQLiteColumn<
TRuntimeConfig extends object = {},
> extends Column<THKT, T, TRuntimeConfig, { sqliteBrand: 'SQLiteColumn' }> {
static readonly [entityKind]: string = 'SQLiteColumn';

constructor(
override readonly table: AnySQLiteTable,
config: ColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig,
) {
if (!config.uniqueName) {
config.uniqueName = uniqueKeyName(table, [config.name]);
}
super(table, config);
}
}

export type AnySQLiteColumn<TPartial extends Partial<ColumnBaseConfig> = {}> = SQLiteColumn<
Expand Down
2 changes: 1 addition & 1 deletion drizzle-orm/src/sqlite-core/unique-constraint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,6 @@ export class UniqueConstraint {
}

getName() {
return `${this.table[SQLiteTable.Symbol.Name]}_${this.columns.join('_')}_unique`;
return this.name;
}
}
17 changes: 14 additions & 3 deletions integration-tests/tests/better-sqlite.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
sqliteView,
text,
unique,
uniqueKeyName,
} from 'drizzle-orm/sqlite-core';
import { Expect } from './utils';

Expand Down Expand Up @@ -193,36 +194,46 @@ test.serial('table configs: unique third param', async (t) => {
state: text('state'),
}, (t) => ({
f: unique().on(t.name, t.state),
f1: unique().on(t.name, t.state),
f1: unique('custom').on(t.name, t.state),
}));

const tableConfig = getTableConfig(cities1Table);

t.assert(tableConfig.uniqueConstraints.length === 2);

t.deepEqual(tableConfig.uniqueConstraints[0]?.columns.map((t) => t.name), ['name', 'state']);
t.assert(
tableConfig.uniqueConstraints[0]?.name
=== uniqueKeyName(cities1Table, tableConfig.uniqueConstraints[0]?.columns?.map((column) => column.name) ?? []),
);

t.deepEqual(tableConfig.uniqueConstraints[0]?.columns.map((t) => t.name), ['name', 'state']);
t.deepEqual(tableConfig.uniqueConstraints[1]?.columns.map((t) => t.name), ['name', 'state']);
t.assert(tableConfig.uniqueConstraints[1]?.name === 'custom');
});

test.serial('table configs: unique in column', async (t) => {
const cities1Table = sqliteTable('cities1', {
id: int('id').primaryKey(),
name: text('name').notNull().unique(),
state: text('state').unique(),
state: text('state').unique('custom'),
field: text('field').unique(),
});

const tableConfig = getTableConfig(cities1Table);

console.log(tableConfig)

const columnName = tableConfig.columns.find((it) => it.name === 'name');
t.assert(columnName?.isUnique);
t.assert(columnName?.uniqueName === uniqueKeyName(cities1Table, [columnName!.name]));

const columnState = tableConfig.columns.find((it) => it.name === 'state');
t.assert(columnState?.isUnique);
t.assert(columnState?.uniqueName === 'custom');

const columnField = tableConfig.columns.find((it) => it.name === 'field');
t.assert(columnField?.isUnique);
t.assert(columnField?.uniqueName === uniqueKeyName(cities1Table, [columnField!.name]));
});

test.serial('insert bigint values', async (t) => {
Expand Down
2 changes: 1 addition & 1 deletion integration-tests/tests/mysql.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ test.serial('table configs: unique third param', async (t) => {
t.deepEqual(tableConfig.uniqueConstraints[0]?.columns.map((t) => t.name), ['name', 'state']);

t.assert(tableConfig.uniqueConstraints[1]?.name, 'custom_name1');
t.deepEqual(tableConfig.uniqueConstraints[0]?.columns.map((t) => t.name), ['name', 'state']);
t.deepEqual(tableConfig.uniqueConstraints[1]?.columns.map((t) => t.name), ['name', 'state']);
});

test.serial('table configs: unique in column', async (t) => {
Expand Down

0 comments on commit 7b55cc2

Please sign in to comment.