emigrate/packages/cli/src/collect-migrations.test.ts
Joakim Carlstein b56b6daf73 fix(cli): handle migration history entries without file extensions correctly
...even when the migration file names include periods in their names.
2024-01-23 11:36:47 +01:00

99 lines
3.5 KiB
TypeScript

import { describe, it } from 'node:test';
import assert from 'node:assert';
import { collectMigrations } from './collect-migrations.js';
import { toEntries, toEntry, toMigration, toMigrations } from './test-utils.js';
import { arrayFromAsync } from './array-from-async.js';
import { MigrationHistoryError } from './errors.js';
describe('collect-migrations', () => {
it('returns all migrations from the history and all pending migrations', async () => {
const cwd = '/cwd';
const directory = 'directory';
const history = {
async *[Symbol.asyncIterator]() {
yield* toEntries(['migration1.js', 'migration2.js']);
},
};
const getMigrations = async () => toMigrations(cwd, directory, ['migration1.js', 'migration2.js', 'migration3.js']);
const result = await arrayFromAsync(collectMigrations(cwd, directory, history, getMigrations));
assert.deepStrictEqual(result, [
{
...toMigration(cwd, directory, 'migration1.js'),
duration: 0,
status: 'done',
},
{
...toMigration(cwd, directory, 'migration2.js'),
duration: 0,
status: 'done',
},
toMigration(cwd, directory, 'migration3.js'),
]);
});
it('includes any errors from the history', async () => {
const entry = toEntry('migration1.js', 'failed');
const cwd = '/cwd';
const directory = 'directory';
const history = {
async *[Symbol.asyncIterator]() {
yield* [entry];
},
};
const getMigrations = async () => toMigrations(cwd, directory, ['migration1.js', 'migration2.js', 'migration3.js']);
const result = await arrayFromAsync(collectMigrations(cwd, directory, history, getMigrations));
assert.deepStrictEqual(result, [
{
...toMigration(cwd, directory, 'migration1.js'),
duration: 0,
status: 'failed',
error: MigrationHistoryError.fromHistoryEntry(entry),
},
toMigration(cwd, directory, 'migration2.js'),
toMigration(cwd, directory, 'migration3.js'),
]);
});
it('can handle a migration history without file extensions', async () => {
const cwd = '/cwd';
const directory = 'directory';
const history = {
async *[Symbol.asyncIterator]() {
yield* toEntries(['migration1']);
},
};
const getMigrations = async () => toMigrations(cwd, directory, ['migration1.js', 'migration2.js', 'migration3.js']);
const result = await arrayFromAsync(collectMigrations(cwd, directory, history, getMigrations));
assert.deepStrictEqual(result, [
{ ...toMigration(cwd, directory, 'migration1.js'), duration: 0, status: 'done' },
toMigration(cwd, directory, 'migration2.js'),
toMigration(cwd, directory, 'migration3.js'),
]);
});
it('can handle a migration history without file extensions even if the migration name contains periods', async () => {
const cwd = '/cwd';
const directory = 'directory';
const history = {
async *[Symbol.asyncIterator]() {
yield* toEntries(['mig.ration1']);
},
};
const getMigrations = async () =>
toMigrations(cwd, directory, ['mig.ration1.js', 'migration2.js', 'migration3.js']);
const result = await arrayFromAsync(collectMigrations(cwd, directory, history, getMigrations));
assert.deepStrictEqual(result, [
{ ...toMigration(cwd, directory, 'mig.ration1.js'), duration: 0, status: 'done' },
toMigration(cwd, directory, 'migration2.js'),
toMigration(cwd, directory, 'migration3.js'),
]);
});
});