From 71c9fcf59bb9a67e716b8c4332a6bd1113bd1427 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Mon, 8 Aug 2022 12:06:54 +0200 Subject: [PATCH] test: Avoid creation of new server/app instance for each route test --- server/routes/api/attachments.test.ts | 8 ++------ server/routes/api/auth.test.ts | 8 ++------ server/routes/api/authenticationProviders.test.ts | 8 ++------ server/routes/api/collections.test.ts | 8 ++------ server/routes/api/cron.test.ts | 8 ++------ server/routes/api/documents.test.ts | 8 ++------ server/routes/api/events.test.ts | 8 ++------ server/routes/api/fileOperations.test.ts | 8 ++------ server/routes/api/groups.test.ts | 8 ++------ server/routes/api/hooks.test.ts | 9 +++------ server/routes/api/index.test.ts | 9 +++------ server/routes/api/integrations.test.ts | 8 ++------ server/routes/api/middlewares/pagination.test.ts | 8 ++------ server/routes/api/revisions.test.ts | 8 ++------ server/routes/api/shares.test.ts | 8 ++------ server/routes/api/stars.test.ts | 8 ++------ server/routes/api/team.test.ts | 8 ++------ server/routes/api/views.test.ts | 8 ++------ server/routes/auth/index.test.ts | 8 ++------ server/routes/auth/providers/email.test.ts | 12 +++--------- server/routes/index.test.ts | 8 ++------ server/test/support.ts | 14 ++++++++++++++ 22 files changed, 59 insertions(+), 129 deletions(-) diff --git a/server/routes/api/attachments.test.ts b/server/routes/api/attachments.test.ts index f8ff03758..a67ceb4b3 100644 --- a/server/routes/api/attachments.test.ts +++ b/server/routes/api/attachments.test.ts @@ -1,6 +1,4 @@ -import TestServer from "fetch-test-server"; import Attachment from "@server/models/Attachment"; -import webService from "@server/services/web"; import { buildUser, buildAdmin, @@ -8,15 +6,13 @@ import { buildAttachment, buildDocument, } from "@server/test/factories"; -import { flushdb } from "@server/test/support"; +import { flushdb, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); jest.mock("@server/utils/s3"); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#attachments.create", () => { it("should require authentication", async () => { diff --git a/server/routes/api/auth.test.ts b/server/routes/api/auth.test.ts index 1e2449613..1bf2907b6 100644 --- a/server/routes/api/auth.test.ts +++ b/server/routes/api/auth.test.ts @@ -1,14 +1,10 @@ -import TestServer from "fetch-test-server"; import sharedEnv from "@shared/env"; import env from "@server/env"; -import webService from "@server/services/web"; import { buildUser, buildTeam } from "@server/test/factories"; -import { flushdb } from "@server/test/support"; +import { flushdb, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#auth.info", () => { it("should return current authentication", async () => { diff --git a/server/routes/api/authenticationProviders.test.ts b/server/routes/api/authenticationProviders.test.ts index cd8e6c303..54587f62c 100644 --- a/server/routes/api/authenticationProviders.test.ts +++ b/server/routes/api/authenticationProviders.test.ts @@ -1,14 +1,10 @@ -import TestServer from "fetch-test-server"; import { v4 as uuidv4 } from "uuid"; -import webService from "@server/services/web"; import { buildUser, buildAdmin, buildTeam } from "@server/test/factories"; -import { flushdb } from "@server/test/support"; +import { flushdb, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#authenticationProviders.info", () => { it("should return auth provider", async () => { diff --git a/server/routes/api/collections.test.ts b/server/routes/api/collections.test.ts index 8a25d2b76..8a5f42752 100644 --- a/server/routes/api/collections.test.ts +++ b/server/routes/api/collections.test.ts @@ -1,7 +1,5 @@ -import TestServer from "fetch-test-server"; import { colorPalette } from "@shared/utils/collections"; import { Document, CollectionUser, CollectionGroup } from "@server/models"; -import webService from "@server/services/web"; import { buildUser, buildAdmin, @@ -9,12 +7,10 @@ import { buildCollection, buildDocument, } from "@server/test/factories"; -import { flushdb, seed } from "@server/test/support"; +import { flushdb, seed, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#collections.list", () => { it("should require authentication", async () => { diff --git a/server/routes/api/cron.test.ts b/server/routes/api/cron.test.ts index 6c82a4ff8..8eed54d5d 100644 --- a/server/routes/api/cron.test.ts +++ b/server/routes/api/cron.test.ts @@ -1,12 +1,8 @@ -import TestServer from "fetch-test-server"; -import webService from "@server/services/web"; -import { flushdb } from "@server/test/support"; +import { flushdb, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#cron.daily", () => { it("should require authentication", async () => { diff --git a/server/routes/api/documents.test.ts b/server/routes/api/documents.test.ts index 54c0fe45c..88f195305 100644 --- a/server/routes/api/documents.test.ts +++ b/server/routes/api/documents.test.ts @@ -1,4 +1,3 @@ -import TestServer from "fetch-test-server"; import { Document, View, @@ -9,7 +8,6 @@ import { SearchQuery, Event, } from "@server/models"; -import webService from "@server/services/web"; import { buildShare, buildCollection, @@ -17,12 +15,10 @@ import { buildDocument, buildViewer, } from "@server/test/factories"; -import { flushdb, seed } from "@server/test/support"; +import { flushdb, seed, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#documents.info", () => { it("should return published document", async () => { diff --git a/server/routes/api/events.test.ts b/server/routes/api/events.test.ts index a5ceca4e5..9e0bc4f6e 100644 --- a/server/routes/api/events.test.ts +++ b/server/routes/api/events.test.ts @@ -1,12 +1,8 @@ -import TestServer from "fetch-test-server"; -import webService from "@server/services/web"; import { buildEvent, buildUser } from "@server/test/factories"; -import { flushdb, seed } from "@server/test/support"; +import { flushdb, seed, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#events.list", () => { it("should only return activity events", async () => { diff --git a/server/routes/api/fileOperations.test.ts b/server/routes/api/fileOperations.test.ts index 2b4b1d5c8..c1ddbf51c 100644 --- a/server/routes/api/fileOperations.test.ts +++ b/server/routes/api/fileOperations.test.ts @@ -1,10 +1,8 @@ -import TestServer from "fetch-test-server"; import { Collection, User, Event, FileOperation } from "@server/models"; import { FileOperationState, FileOperationType, } from "@server/models/FileOperation"; -import webService from "@server/services/web"; import { buildAdmin, buildCollection, @@ -12,15 +10,13 @@ import { buildTeam, buildUser, } from "@server/test/factories"; -import { flushdb } from "@server/test/support"; +import { flushdb, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); jest.mock("@server/utils/s3"); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#fileOperations.info", () => { it("should return fileOperation", async () => { diff --git a/server/routes/api/groups.test.ts b/server/routes/api/groups.test.ts index d35b74f6e..4d3bd170c 100644 --- a/server/routes/api/groups.test.ts +++ b/server/routes/api/groups.test.ts @@ -1,13 +1,9 @@ -import TestServer from "fetch-test-server"; import { Event } from "@server/models"; -import webService from "@server/services/web"; import { buildUser, buildAdmin, buildGroup } from "@server/test/factories"; -import { flushdb } from "@server/test/support"; +import { flushdb, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#groups.create", () => { it("should create a group", async () => { diff --git a/server/routes/api/hooks.test.ts b/server/routes/api/hooks.test.ts index f78732568..b5b3d1701 100644 --- a/server/routes/api/hooks.test.ts +++ b/server/routes/api/hooks.test.ts @@ -1,15 +1,12 @@ -import TestServer from "fetch-test-server"; import env from "@server/env"; import { IntegrationAuthentication, SearchQuery } from "@server/models"; -import webService from "@server/services/web"; import { buildDocument, buildIntegration } from "@server/test/factories"; -import { flushdb, seed } from "@server/test/support"; +import { flushdb, seed, getTestServer } from "@server/test/support"; import * as Slack from "@server/utils/slack"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); + jest.mock("../../utils/slack", () => ({ post: jest.fn(), })); diff --git a/server/routes/api/index.test.ts b/server/routes/api/index.test.ts index e0b60c9ee..d666392dd 100644 --- a/server/routes/api/index.test.ts +++ b/server/routes/api/index.test.ts @@ -1,11 +1,8 @@ -import TestServer from "fetch-test-server"; -import webService from "@server/services/web"; -import { flushdb } from "@server/test/support"; +import { flushdb, getTestServer } from "@server/test/support"; + +const server = getTestServer(); -const app = webService(); -const server = new TestServer(app.callback()); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("POST unknown endpoint", () => { it("should be not found", async () => { diff --git a/server/routes/api/integrations.test.ts b/server/routes/api/integrations.test.ts index 2b08e8874..14cb0ebf4 100644 --- a/server/routes/api/integrations.test.ts +++ b/server/routes/api/integrations.test.ts @@ -1,18 +1,14 @@ -import TestServer from "fetch-test-server"; -import webService from "@server/services/web"; import { buildAdmin, buildTeam, buildUser, buildIntegration, } from "@server/test/factories"; -import { flushdb } from "@server/test/support"; +import { flushdb, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#integrations.update", () => { it("should allow updating integration events", async () => { diff --git a/server/routes/api/middlewares/pagination.test.ts b/server/routes/api/middlewares/pagination.test.ts index a624f7f39..294f4329f 100644 --- a/server/routes/api/middlewares/pagination.test.ts +++ b/server/routes/api/middlewares/pagination.test.ts @@ -1,11 +1,7 @@ -import TestServer from "fetch-test-server"; -import webService from "@server/services/web"; -import { flushdb, seed } from "@server/test/support"; +import { flushdb, seed, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#pagination", () => { it("should allow offset and limit", async () => { diff --git a/server/routes/api/revisions.test.ts b/server/routes/api/revisions.test.ts index d51ff1b58..23f777d67 100644 --- a/server/routes/api/revisions.test.ts +++ b/server/routes/api/revisions.test.ts @@ -1,13 +1,9 @@ -import TestServer from "fetch-test-server"; import { Revision } from "@server/models"; -import webService from "@server/services/web"; import { buildDocument, buildUser } from "@server/test/factories"; -import { flushdb, seed } from "@server/test/support"; +import { flushdb, seed, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#revisions.info", () => { it("should return a document revision", async () => { diff --git a/server/routes/api/shares.test.ts b/server/routes/api/shares.test.ts index f1010539a..eadbc0da5 100644 --- a/server/routes/api/shares.test.ts +++ b/server/routes/api/shares.test.ts @@ -1,6 +1,4 @@ -import TestServer from "fetch-test-server"; import { CollectionUser } from "@server/models"; -import webService from "@server/services/web"; import { buildUser, buildDocument, @@ -8,12 +6,10 @@ import { buildAdmin, buildCollection, } from "@server/test/factories"; -import { flushdb, seed } from "@server/test/support"; +import { flushdb, seed, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#shares.list", () => { it("should only return shares created by user", async () => { diff --git a/server/routes/api/stars.test.ts b/server/routes/api/stars.test.ts index fd9197536..b2c7a6d6a 100644 --- a/server/routes/api/stars.test.ts +++ b/server/routes/api/stars.test.ts @@ -1,12 +1,8 @@ -import TestServer from "fetch-test-server"; -import webService from "@server/services/web"; import { buildUser, buildStar, buildDocument } from "@server/test/factories"; -import { flushdb } from "@server/test/support"; +import { flushdb, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#stars.create", () => { it("should create a star", async () => { diff --git a/server/routes/api/team.test.ts b/server/routes/api/team.test.ts index 0bd54d621..e2b5b4acb 100644 --- a/server/routes/api/team.test.ts +++ b/server/routes/api/team.test.ts @@ -1,13 +1,9 @@ -import TestServer from "fetch-test-server"; import { TeamDomain } from "@server/models"; -import webService from "@server/services/web"; import { buildAdmin, buildCollection, buildTeam } from "@server/test/factories"; -import { flushdb, seed } from "@server/test/support"; +import { flushdb, seed, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#team.update", () => { it("should update team details", async () => { diff --git a/server/routes/api/views.test.ts b/server/routes/api/views.test.ts index e84e8d7d9..1ed64dc69 100644 --- a/server/routes/api/views.test.ts +++ b/server/routes/api/views.test.ts @@ -1,13 +1,9 @@ -import TestServer from "fetch-test-server"; import { View, CollectionUser } from "@server/models"; -import webService from "@server/services/web"; import { buildUser } from "@server/test/factories"; -import { flushdb, seed } from "@server/test/support"; +import { flushdb, seed, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("#views.list", () => { it("should return views for a document", async () => { diff --git a/server/routes/auth/index.test.ts b/server/routes/auth/index.test.ts index 5f5b4ac36..5cf771119 100644 --- a/server/routes/auth/index.test.ts +++ b/server/routes/auth/index.test.ts @@ -1,13 +1,9 @@ -import TestServer from "fetch-test-server"; -import webService from "@server/services/web"; import { buildUser, buildCollection } from "@server/test/factories"; -import { flushdb } from "@server/test/support"; +import { flushdb, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("auth/redirect", () => { it("should redirect to home", async () => { diff --git a/server/routes/auth/providers/email.test.ts b/server/routes/auth/providers/email.test.ts index a2090fdbb..abf3b821d 100644 --- a/server/routes/auth/providers/email.test.ts +++ b/server/routes/auth/providers/email.test.ts @@ -1,19 +1,13 @@ -import TestServer from "fetch-test-server"; import sharedEnv from "@shared/env"; import SigninEmail from "@server/emails/templates/SigninEmail"; import WelcomeEmail from "@server/emails/templates/WelcomeEmail"; import env from "@server/env"; -import webService from "@server/services/web"; import { buildUser, buildGuestUser, buildTeam } from "@server/test/factories"; -import { flushdb } from "@server/test/support"; +import { flushdb, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); -beforeEach(async () => { - await flushdb(); -}); -afterAll(() => server.close()); +beforeEach(() => flushdb()); describe("email", () => { it("should require email param", async () => { diff --git a/server/routes/index.test.ts b/server/routes/index.test.ts index a0f2bc0f4..b952549ae 100644 --- a/server/routes/index.test.ts +++ b/server/routes/index.test.ts @@ -1,12 +1,8 @@ -import TestServer from "fetch-test-server"; import { buildShare, buildDocument } from "@server/test/factories"; -import { flushdb } from "@server/test/support"; -import webService from "../services/web"; +import { flushdb, getTestServer } from "@server/test/support"; -const app = webService(); -const server = new TestServer(app.callback()); +const server = getTestServer(); beforeEach(() => flushdb()); -afterAll(() => server.close()); describe("/share/:id", () => { it("should return standard title in html when loading unpublished share", async () => { diff --git a/server/test/support.ts b/server/test/support.ts index 43337bc0d..4d31e05cf 100644 --- a/server/test/support.ts +++ b/server/test/support.ts @@ -1,6 +1,8 @@ +import TestServer from "fetch-test-server"; import { v4 as uuidv4 } from "uuid"; import { sequelize } from "@server/database/sequelize"; import { User, Document, Collection, Team } from "@server/models"; +import webService from "@server/services/web"; const sql = sequelize.getQueryInterface(); const tables = Object.keys(sequelize.models).map((model) => { @@ -109,3 +111,15 @@ export const seed = async () => { }; }); }; + +let testServer: typeof TestServer | undefined; + +export function getTestServer() { + if (testServer) { + return testServer; + } + + const app = webService(); + testServer = new TestServer(app.callback()); + return testServer; +}