From 09ced5cdffc0d7def35a9c4c47d19790bc37f4a3 Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 11 Aug 2020 10:14:36 +0800 Subject: [PATCH] add db mock --- .gitignore | 4 +- jest-mongodb-config.js | 12 ++++++ jest.config.js | 11 ++---- package.json | 1 + packages/hydrooj/src/service/__mocks__/db.ts | 31 +++++++++++++++ packages/hydrooj/test/db.ts | 18 +++++++++ packages/hydrooj/test/model.problem.spec.ts | 41 ++++++++++++++++++++ 7 files changed, 109 insertions(+), 9 deletions(-) create mode 100644 jest-mongodb-config.js create mode 100644 packages/hydrooj/src/service/__mocks__/db.ts create mode 100644 packages/hydrooj/test/db.ts create mode 100644 packages/hydrooj/test/model.problem.spec.ts diff --git a/.gitignore b/.gitignore index eb6a7a10..92c8cbec 100644 --- a/.gitignore +++ b/.gitignore @@ -24,4 +24,6 @@ packages/**/*.d.ts *.mmdb -.coverage \ No newline at end of file +.coverage +!__mocks__ +globalConfig.json \ No newline at end of file diff --git a/jest-mongodb-config.js b/jest-mongodb-config.js new file mode 100644 index 00000000..1eff779c --- /dev/null +++ b/jest-mongodb-config.js @@ -0,0 +1,12 @@ +module.exports = { + mongodbMemoryServerOptions: { + binary: { + version: '4.0.3', + skipMD5: true + }, + instance: { + dbName: 'jest' + }, + autoStart: false + } +}; \ No newline at end of file diff --git a/jest.config.js b/jest.config.js index 6880d4e2..b9dea98c 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,13 +1,8 @@ module.exports = { - globals: { - 'ts-jest': { - diagnostics: { - warnOnly: true, - }, - }, + preset: '@shelf/jest-mongodb', + transform: { + '^.+\\.ts?$': 'ts-jest' }, - preset: 'ts-jest', - testEnvironment: 'node', moduleFileExtensions: ['ts', 'js', 'json'], collectCoverage: true, coverageDirectory: '/.coverage', diff --git a/package.json b/package.json index 30b60859..2e6d9d50 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "version": "1.0.0", "license": "AGPL-3.0-only", "devDependencies": { + "@shelf/jest-mongodb": "^1.2.2", "@types/cross-spawn": "^6.0.2", "@types/jest": "^26.0.9", "@types/node": "^14.0.27", diff --git a/packages/hydrooj/src/service/__mocks__/db.ts b/packages/hydrooj/src/service/__mocks__/db.ts new file mode 100644 index 00000000..123ca6e5 --- /dev/null +++ b/packages/hydrooj/src/service/__mocks__/db.ts @@ -0,0 +1,31 @@ +/* eslint-disable import/no-mutable-exports */ +import { EventEmitter } from 'events'; +import mongodb, { Db, MongoClient } from 'mongodb'; + +export let db: Db = null; +export let client: MongoClient = null; + +export const bus = new EventEmitter(); + +mongodb.MongoClient.connect( + // @ts-ignore + global.__MONGO_URI__, + { useNewUrlParser: true, useUnifiedTopology: true }, +).then((c) => { + // @ts-ignore + db = c.db(global.__MONGO_DB_NAME__); + client = c; + bus.emit('connect'); +}); + +export function collection(c: string) { + return db.collection(c); +} + +export function getClient() { + return client; +} + +export function getDb() { + return db; +} diff --git a/packages/hydrooj/test/db.ts b/packages/hydrooj/test/db.ts new file mode 100644 index 00000000..708a5a3e --- /dev/null +++ b/packages/hydrooj/test/db.ts @@ -0,0 +1,18 @@ +import 'hydrooj/src/utils'; + +jest.mock('hydrooj/src/service/db'); + +export async function connect() { + await new Promise((resolve) => { + const db = require('hydrooj/src/service/db'); + db.bus.once('connect', resolve); + }); + const script = require('../src/script/upgrade0_1'); + await script.run(); +} + +export async function dispose() { + const db = require('hydrooj/src/service/db'); + await db.getClient().close(); + await db.getDb().close(); +} diff --git a/packages/hydrooj/test/model.problem.spec.ts b/packages/hydrooj/test/model.problem.spec.ts new file mode 100644 index 00000000..1ffbea8f --- /dev/null +++ b/packages/hydrooj/test/model.problem.spec.ts @@ -0,0 +1,41 @@ +import 'hydrooj'; +import { connect, dispose } from './db'; + +const DOMAIN_ID = 'system'; +const TITLE = 'dummy_title'; +const CONTENT = 'dummy_content'; +const UID = 22; +const PNAME = 'aaa'; + +describe('Model.Problem', () => { + let problem: typeof import('hydrooj/src/model/problem'); + + beforeAll(async () => { + await connect(); + problem = require('hydrooj/src/model/problem'); + }); + + test('add_get', async () => { + const pid = await problem.add(DOMAIN_ID, PNAME, TITLE, CONTENT, UID); + let pdoc = await problem.get(DOMAIN_ID, PNAME); + expect(pdoc.domainId).toStrictEqual(DOMAIN_ID); + expect(pdoc.title).toStrictEqual(TITLE); + expect(pdoc.content).toStrictEqual(CONTENT); + expect(pdoc.owner).toStrictEqual(UID); + expect(pdoc.docId).toStrictEqual(pid); + expect(pdoc.pid).toStrictEqual(PNAME); + pdoc = await problem.get(DOMAIN_ID, pid); + expect(pdoc.domainId).toStrictEqual(DOMAIN_ID); + expect(pdoc.title).toStrictEqual(TITLE); + expect(pdoc.content).toStrictEqual(CONTENT); + expect(pdoc.owner).toStrictEqual(UID); + expect(pdoc.docId).toStrictEqual(pid); + expect(pdoc.pid).toStrictEqual(PNAME); + const pdocs = await problem.getMulti(DOMAIN_ID, {}).toArray(); + expect(pdocs.length).toStrictEqual(1); + expect(pdocs[0].docId).toStrictEqual(pid); + expect(pdocs[0].title).toStrictEqual(TITLE); + }); + + afterAll(dispose); +}) \ No newline at end of file