From 63615ffbaf6d774b73c6fed66221496e98b6339e Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Tue, 12 Jan 2021 17:33:14 +0000 Subject: [PATCH] Server: Unit test request routing --- packages/server/src/routes/api/ping.test.ts | 30 ++++++++++++++++ .../src/utils/testing/koa/FakeCookies.ts | 13 +++++++ .../src/utils/testing/koa/FakeRequest.ts | 5 +++ .../src/utils/testing/koa/FakeResponse.ts | 6 ++++ .../server/src/utils/testing/testUtils.ts | 34 +++++++------------ 5 files changed, 67 insertions(+), 21 deletions(-) create mode 100644 packages/server/src/routes/api/ping.test.ts create mode 100644 packages/server/src/utils/testing/koa/FakeCookies.ts create mode 100644 packages/server/src/utils/testing/koa/FakeRequest.ts create mode 100644 packages/server/src/utils/testing/koa/FakeResponse.ts diff --git a/packages/server/src/routes/api/ping.test.ts b/packages/server/src/routes/api/ping.test.ts new file mode 100644 index 0000000000..1b620b3d54 --- /dev/null +++ b/packages/server/src/routes/api/ping.test.ts @@ -0,0 +1,30 @@ +import routeHandler from '../../middleware/routeHandler'; +import { beforeAllDb, afterAllDb, beforeEachDb, koaAppContext } from '../../utils/testing/testUtils'; + +describe('api_ping', function() { + + beforeAll(async () => { + await beforeAllDb('api_ping'); + }); + + afterAll(async () => { + await afterAllDb(); + }); + + beforeEach(async () => { + await beforeEachDb(); + }); + + test('should ping', async function() { + const context = await koaAppContext({ + path: '/api/ping', + }); + + await routeHandler(context); + + expect(context.response.status).toBe(200); + expect(context.response.body.status).toBe('ok'); + expect(context.response.body.message).toBe('Joplin Server is running'); + }); + +}); diff --git a/packages/server/src/utils/testing/koa/FakeCookies.ts b/packages/server/src/utils/testing/koa/FakeCookies.ts new file mode 100644 index 0000000000..ee2b88670c --- /dev/null +++ b/packages/server/src/utils/testing/koa/FakeCookies.ts @@ -0,0 +1,13 @@ +export default class FakeCookies { + + private values_: Record = {}; + + public get(name: string): string { + return this.values_[name]; + } + + public set(name: string, value: string) { + this.values_[name] = value; + } + +} diff --git a/packages/server/src/utils/testing/koa/FakeRequest.ts b/packages/server/src/utils/testing/koa/FakeRequest.ts new file mode 100644 index 0000000000..f2909a4688 --- /dev/null +++ b/packages/server/src/utils/testing/koa/FakeRequest.ts @@ -0,0 +1,5 @@ +export default class FakeRequest { + + public method: string = 'GET'; + +} diff --git a/packages/server/src/utils/testing/koa/FakeResponse.ts b/packages/server/src/utils/testing/koa/FakeResponse.ts new file mode 100644 index 0000000000..26971efe55 --- /dev/null +++ b/packages/server/src/utils/testing/koa/FakeResponse.ts @@ -0,0 +1,6 @@ +export default class FakeResponse { + + public status: number = 200; + public body: any = null; + +} diff --git a/packages/server/src/utils/testing/testUtils.ts b/packages/server/src/utils/testing/testUtils.ts index 9dfac8c82b..9809b44f75 100644 --- a/packages/server/src/utils/testing/testUtils.ts +++ b/packages/server/src/utils/testing/testUtils.ts @@ -7,10 +7,13 @@ import { AppContext, Config, Env } from '../types'; import { initConfig } from '../../config'; import FileModel from '../../models/FileModel'; import Logger from '@joplin/lib/Logger'; +import FakeCookies from './koa/FakeCookies'; +import FakeRequest from './koa/FakeRequest'; +import FakeResponse from './koa/FakeResponse'; // Takes into account the fact that this file will be inside the /dist directory // when it runs. -const packageRootDir = `${__dirname}/../..`; +const packageRootDir = `${__dirname}/../../..`; let db_: DbConnection = null; @@ -45,26 +48,9 @@ interface AppContextTestOptions { sessionId?: string; } -let koaAppContextUserAndSession_: UserAndSession = null; - -export async function koaAppContextUserAndSession(): Promise { - if (koaAppContextUserAndSession_) return koaAppContextUserAndSession_; - koaAppContextUserAndSession_ = await createUserAndSession(1, false); - return koaAppContextUserAndSession_; -} - -class FakeCookies { - - private values_: Record = {}; - - public get(name: string): string { - return this.values_[name]; - } - - public set(name: string, value: string) { - this.values_[name] = value; - } - +function initGlobalLogger() { + const globalLogger = new Logger(); + Logger.initializeGlobalLogger(globalLogger); } export async function koaAppContext(options: AppContextTestOptions = null): Promise { @@ -75,8 +61,12 @@ export async function koaAppContext(options: AppContextTestOptions = null): Prom ...options, }; + initGlobalLogger(); + const appLogger = Logger.create('AppTest'); + // Set type to "any" because the Koa context has many properties and we + // don't need to mock all of them. const appContext: any = {}; appContext.env = Env.Dev; @@ -88,6 +78,8 @@ export async function koaAppContext(options: AppContextTestOptions = null): Prom appContext.path = options.path; appContext.owner = options.owner; appContext.cookies = new FakeCookies(); + appContext.request = new FakeRequest(); + appContext.response = new FakeResponse(); if (options.sessionId) { appContext.cookies.set('sessionId', options.sessionId);