diff --git a/shared/database/src/schema.ts b/shared/database/src/schema.ts index 27cb154b..1b731153 100644 --- a/shared/database/src/schema.ts +++ b/shared/database/src/schema.ts @@ -394,15 +394,19 @@ export const shows = wxyc_schema.table('shows', { export type NewShowDJ = InferInsertModel; export type ShowDJ = InferSelectModel; -export const show_djs = wxyc_schema.table('show_djs', { - show_id: integer('show_id') - .references(() => shows.id) - .notNull(), - dj_id: varchar('dj_id', { length: 255 }) - .references(() => user.id, { onDelete: 'cascade' }) - .notNull(), - active: boolean('active').default(true), -}); +export const show_djs = wxyc_schema.table( + 'show_djs', + { + show_id: integer('show_id') + .references(() => shows.id) + .notNull(), + dj_id: varchar('dj_id', { length: 255 }) + .references(() => user.id, { onDelete: 'cascade' }) + .notNull(), + active: boolean('active').default(true), + }, + (table) => [uniqueIndex('show_djs_show_id_dj_id_unique').on(table.show_id, table.dj_id)] +); //create entry w/ ID 0 for regular shows export type NewSpecialtyShow = InferInsertModel; diff --git a/tests/__mocks__/drizzle-orm.ts b/tests/__mocks__/drizzle-orm.ts index f94cc79f..100bc350 100644 --- a/tests/__mocks__/drizzle-orm.ts +++ b/tests/__mocks__/drizzle-orm.ts @@ -1,5 +1,7 @@ // Mock drizzle-orm for unit tests export const eq = jest.fn((a, b) => ({ eq: [a, b] })); +export const and = jest.fn((...conditions: unknown[]) => ({ and: conditions })); +export const or = jest.fn((...conditions: unknown[]) => ({ or: conditions })); export const sql = Object.assign( jest.fn((strings: TemplateStringsArray, ...values: unknown[]) => ({ sql: strings, diff --git a/tests/unit/database/schema.show-djs.test.ts b/tests/unit/database/schema.show-djs.test.ts new file mode 100644 index 00000000..a3bda349 --- /dev/null +++ b/tests/unit/database/schema.show-djs.test.ts @@ -0,0 +1,18 @@ +import { getTableConfig } from 'drizzle-orm/pg-core'; +import { show_djs } from '../../../shared/database/src/schema'; + +describe('show_djs schema', () => { + it('has a unique index on (show_id, dj_id)', () => { + const config = getTableConfig(show_djs); + const uniqueIndexes = config.indexes.filter((idx) => idx.config.unique); + + const showDjIndex = uniqueIndexes.find( + (idx) => + idx.config.columns.length === 2 && + idx.config.columns.some((col) => 'name' in col && col.name === 'show_id') && + idx.config.columns.some((col) => 'name' in col && col.name === 'dj_id') + ); + + expect(showDjIndex).toBeDefined(); + }); +});