From 957ce7ef04e9a46b2c0708fb04418a44292b43c3 Mon Sep 17 00:00:00 2001 From: Rory Powell Date: Tue, 26 Oct 2021 15:47:36 +0100 Subject: [PATCH] Add migration unit tests --- .../passport/tests/third-party-common.spec.js | 2 +- packages/auth/src/migrations/index.js | 32 +++++----- .../tests/__snapshots__/index.spec.js.snap | 9 +++ .../auth/src/migrations/tests/index.spec.js | 60 +++++++++++++++++++ .../passport => }/tests/utilities/db.js | 2 +- .../utilities/dbConfig.js} | 2 +- 6 files changed, 86 insertions(+), 21 deletions(-) create mode 100644 packages/auth/src/migrations/tests/__snapshots__/index.spec.js.snap create mode 100644 packages/auth/src/migrations/tests/index.spec.js rename packages/auth/src/{middleware/passport => }/tests/utilities/db.js (87%) rename packages/auth/src/{middleware/passport/tests/utilities/test-config.js => tests/utilities/dbConfig.js} (53%) diff --git a/packages/auth/src/middleware/passport/tests/third-party-common.spec.js b/packages/auth/src/middleware/passport/tests/third-party-common.spec.js index 81b8c3e6b0..3a3c55bfa0 100644 --- a/packages/auth/src/middleware/passport/tests/third-party-common.spec.js +++ b/packages/auth/src/middleware/passport/tests/third-party-common.spec.js @@ -1,6 +1,6 @@ // Mock data -require("./utilities/test-config") +require("../../../tests/utilities/dbConfig") const database = require("../../../db") const { authenticateThirdParty } = require("../third-party-common") diff --git a/packages/auth/src/migrations/index.js b/packages/auth/src/migrations/index.js index ca06188a8a..7492e94511 100644 --- a/packages/auth/src/migrations/index.js +++ b/packages/auth/src/migrations/index.js @@ -15,7 +15,7 @@ const DB_LOOKUP = { ], } -const getMigrationsDoc = async db => { +exports.getMigrationsDoc = async db => { // get the migrations doc try { return await db.get(DocumentTypes.MIGRATIONS) @@ -27,25 +27,21 @@ const getMigrationsDoc = async db => { } exports.migrateIfRequired = async (migrationDb, migrationName, migrateFn) => { - 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}]` - ) - } - return tryMigrate(db, migrationName, migrateFn) -} - -const tryMigrate = async (db, migrationName, migrateFn) => { try { - const doc = await getMigrationsDoc(db) + 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 diff --git a/packages/auth/src/migrations/tests/__snapshots__/index.spec.js.snap b/packages/auth/src/migrations/tests/__snapshots__/index.spec.js.snap new file mode 100644 index 0000000000..e9a18eadde --- /dev/null +++ b/packages/auth/src/migrations/tests/__snapshots__/index.spec.js.snap @@ -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, +} +`; diff --git a/packages/auth/src/migrations/tests/index.spec.js b/packages/auth/src/migrations/tests/index.spec.js new file mode 100644 index 0000000000..0ed16fc184 --- /dev/null +++ b/packages/auth/src/migrations/tests/index.spec.js @@ -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() + }) + +}) \ No newline at end of file diff --git a/packages/auth/src/middleware/passport/tests/utilities/db.js b/packages/auth/src/tests/utilities/db.js similarity index 87% rename from packages/auth/src/middleware/passport/tests/utilities/db.js rename to packages/auth/src/tests/utilities/db.js index e83784471b..bb99592d1c 100644 --- a/packages/auth/src/middleware/passport/tests/utilities/db.js +++ b/packages/auth/src/tests/utilities/db.js @@ -1,5 +1,5 @@ const PouchDB = require("pouchdb") -const env = require("../../../../environment") +const env = require("../../environment") let POUCH_DB_DEFAULTS diff --git a/packages/auth/src/middleware/passport/tests/utilities/test-config.js b/packages/auth/src/tests/utilities/dbConfig.js similarity index 53% rename from packages/auth/src/middleware/passport/tests/utilities/test-config.js rename to packages/auth/src/tests/utilities/dbConfig.js index 57768d4071..45b9ff33f9 100644 --- a/packages/auth/src/middleware/passport/tests/utilities/test-config.js +++ b/packages/auth/src/tests/utilities/dbConfig.js @@ -1,3 +1,3 @@ -const packageConfiguration = require("../../../../index") +const packageConfiguration = require("../../index") const CouchDB = require("./db") packageConfiguration.init(CouchDB)