geocrop-platform./apps/nextgen/server/tests/users-gender-migration.test.js

53 lines
1.9 KiB
JavaScript

const knex = require('knex');
const migration = require('../src/database/migrations/knex/2026073000000000_users_gender');
describe('users gender migration', () => {
let database;
beforeEach(async () => {
database = knex({
client: 'better-sqlite3',
connection: { filename: ':memory:' },
useNullAsDefault: true,
});
await database.schema.createTable('users', (table) => {
table.increments('id');
table.text('email').notNullable();
});
});
afterEach(async () => {
await database.destroy();
});
it('adds a constrained gender field to legacy user tables', async () => {
await migration.up(database);
expect(await database.schema.hasColumn('users', 'gender')).toBe(true);
await database('users').insert({ email: 'valid@example.com', gender: 'female' });
await expect(database('users').insert({ email: 'invalid@example.com', gender: 'invalid' })).rejects.toThrow();
});
it('enforces valid values when an unconstrained gender field already exists', async () => {
await database.schema.alterTable('users', (table) => {
table.text('gender');
});
await database('users').insert([
{ email: 'uppercase@example.com', gender: 'Female' },
{ email: 'legacy-invalid@example.com', gender: 'unknown' },
]);
await migration.up(database);
expect((await database('users').where({ email: 'uppercase@example.com' }).first()).gender).toBe('female');
expect((await database('users').where({ email: 'legacy-invalid@example.com' }).first()).gender).toBeNull();
await database('users').insert({ email: 'valid-existing@example.com', gender: 'other' });
await expect(database('users').insert({ email: 'invalid-existing@example.com', gender: 'invalid' })).rejects.toThrow();
});
it('is idempotent when gender already exists', async () => {
await migration.up(database);
await expect(migration.up(database)).resolves.toBeUndefined();
});
});