forked from tsai/budibase
committed by
GitHub
10 changed files with 167 additions and 9 deletions
@ -0,0 +1,61 @@ |
|||||
|
const { DocumentTypes } = require("../db/constants") |
||||
|
const { getGlobalDB } = require("../tenancy") |
||||
|
|
||||
|
exports.MIGRATION_DBS = { |
||||
|
GLOBAL_DB: "GLOBAL_DB", |
||||
|
} |
||||
|
|
||||
|
exports.MIGRATIONS = { |
||||
|
USER_EMAIL_VIEW_CASING: "user_email_view_casing", |
||||
|
} |
||||
|
|
||||
|
const DB_LOOKUP = { |
||||
|
[exports.MIGRATION_DBS.GLOBAL_DB]: [ |
||||
|
exports.MIGRATIONS.USER_EMAIL_VIEW_CASING, |
||||
|
], |
||||
|
} |
||||
|
|
||||
|
exports.getMigrationsDoc = async db => { |
||||
|
// get the migrations doc
|
||||
|
try { |
||||
|
return await db.get(DocumentTypes.MIGRATIONS) |
||||
|
} catch (err) { |
||||
|
if (err.status && err.status === 404) { |
||||
|
return { _id: DocumentTypes.MIGRATIONS } |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
exports.migrateIfRequired = async (migrationDb, migrationName, migrateFn) => { |
||||
|
try { |
||||
|
let db |
||||
|
if (migrationDb === exports.MIGRATION_DBS.GLOBAL_DB) { |
||||
|
db = getGlobalDB() |
||||
|
} else { |
||||
|
throw new Error(`Unrecognised migration db [${migrationDb}]`) |
||||
|
} |
||||
|
|
||||
|
if (!DB_LOOKUP[migrationDb].includes(migrationName)) { |
||||
|
throw new Error( |
||||
|
`Unrecognised migration name [${migrationName}] for db [${migrationDb}]` |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
const doc = await exports.getMigrationsDoc(db) |
||||
|
// exit if the migration has been performed
|
||||
|
if (doc[migrationName]) { |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
console.log(`Performing migration: ${migrationName}`) |
||||
|
await migrateFn() |
||||
|
console.log(`Migration complete: ${migrationName}`) |
||||
|
|
||||
|
// mark as complete
|
||||
|
doc[migrationName] = Date.now() |
||||
|
await db.put(doc) |
||||
|
} catch (err) { |
||||
|
console.error(`Error performing migration: ${migrationName}: `, err) |
||||
|
throw err |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP |
||||
|
|
||||
|
exports[`migrations should match snapshot 1`] = ` |
||||
|
Object { |
||||
|
"_id": "migrations", |
||||
|
"_rev": "1-af6c272fe081efafecd2ea49a8fcbb40", |
||||
|
"user_email_view_casing": 1487076708000, |
||||
|
} |
||||
|
`; |
||||
@ -0,0 +1,60 @@ |
|||||
|
require("../../tests/utilities/dbConfig") |
||||
|
|
||||
|
const { migrateIfRequired, MIGRATION_DBS, MIGRATIONS, getMigrationsDoc } = require("../index") |
||||
|
const database = require("../../db") |
||||
|
const { |
||||
|
StaticDatabases, |
||||
|
} = require("../../db/utils") |
||||
|
|
||||
|
Date.now = jest.fn(() => 1487076708000) |
||||
|
let db |
||||
|
|
||||
|
describe("migrations", () => { |
||||
|
|
||||
|
const migrationFunction = jest.fn() |
||||
|
|
||||
|
beforeEach(() => { |
||||
|
db = database.getDB(StaticDatabases.GLOBAL.name) |
||||
|
}) |
||||
|
|
||||
|
afterEach(async () => { |
||||
|
jest.clearAllMocks() |
||||
|
await db.destroy() |
||||
|
}) |
||||
|
|
||||
|
const validMigration = () => { |
||||
|
return migrateIfRequired(MIGRATION_DBS.GLOBAL_DB, MIGRATIONS.USER_EMAIL_VIEW_CASING, migrationFunction) |
||||
|
} |
||||
|
|
||||
|
it("should run a new migration", async () => { |
||||
|
await validMigration() |
||||
|
expect(migrationFunction).toHaveBeenCalled() |
||||
|
}) |
||||
|
|
||||
|
it("should match snapshot", async () => { |
||||
|
await validMigration() |
||||
|
const doc = await getMigrationsDoc(db) |
||||
|
expect(doc).toMatchSnapshot() |
||||
|
}) |
||||
|
|
||||
|
it("should skip a previously run migration", async () => { |
||||
|
await validMigration() |
||||
|
await validMigration() |
||||
|
expect(migrationFunction).toHaveBeenCalledTimes(1) |
||||
|
}) |
||||
|
|
||||
|
it("should reject an unknown migration name", async () => { |
||||
|
expect(async () => { |
||||
|
await migrateIfRequired(MIGRATION_DBS.GLOBAL_DB, "bogus_name", migrationFunction) |
||||
|
}).rejects.toThrow() |
||||
|
expect(migrationFunction).not.toHaveBeenCalled() |
||||
|
}) |
||||
|
|
||||
|
it("should reject an unknown database name", async () => { |
||||
|
expect(async () => { |
||||
|
await migrateIfRequired("bogus_db", MIGRATIONS.USER_EMAIL_VIEW_CASING, migrationFunction) |
||||
|
}).rejects.toThrow() |
||||
|
expect(migrationFunction).not.toHaveBeenCalled() |
||||
|
}) |
||||
|
|
||||
|
}) |
||||
@ -1,5 +1,5 @@ |
|||||
const PouchDB = require("pouchdb") |
const PouchDB = require("pouchdb") |
||||
const env = require("../../../../environment") |
const env = require("../../environment") |
||||
|
|
||||
let POUCH_DB_DEFAULTS |
let POUCH_DB_DEFAULTS |
||||
|
|
||||
@ -1,3 +1,3 @@ |
|||||
const packageConfiguration = require("../../../../index") |
const packageConfiguration = require("../../index") |
||||
const CouchDB = require("./db") |
const CouchDB = require("./db") |
||||
packageConfiguration.init(CouchDB) |
packageConfiguration.init(CouchDB) |
||||
Loading…
Reference in new issue