UNPKG

3.8 kBPlain TextView Raw
1const Debug: any = require('debug');
2import * as portfinder from 'portfinder';
3import * as os from 'os';
4import * as path from 'path';
5import * as fs from 'fs-extra';
6import {MongodHelper} from 'mongodb-prebuilt';
7import {MockgooseHelper} from './mockgoose-helper';
8//const uuidV4 = require('uuid/v4');
9const uuidV4: any = require('uuid/v4');
10
11export class Mockgoose {
12
13 helper: MockgooseHelper;
14 mongodHelper: MongodHelper = new MongodHelper();
15 debug: any;
16 mongooseObj: any;
17
18 constructor(mongooseObj: any) {
19 this.debug = Debug('Mockgoose');
20 this.helper = new MockgooseHelper(mongooseObj, this);
21
22 this.mongooseObj = mongooseObj;
23 this.mongooseObj.mocked = true;
24 }
25
26 prepareStorage(): Promise<void> {
27 return new Promise<void>((resolve, reject) => {
28 let tempDBPathPromise: Promise<string> = this.getTempDBPath();
29 let openPortPromise: Promise<number> = this.getOpenPort();
30
31 Promise.all([tempDBPathPromise, openPortPromise]).then((promiseValues) => {
32 let dbPath: string = promiseValues[0];
33 let openPort: string = promiseValues[1].toString();
34 let storageEngine: string = this.getMemoryStorageName();
35 let mongodArgs: string[] = [
36 '--port', openPort,
37 '--storageEngine', storageEngine,
38 '--dbpath', dbPath
39 ];
40 this.debug(`@prepareStorage mongod args, ${mongodArgs}`);
41 this.mongodHelper.mongoBin.commandArguments = mongodArgs;
42 this.mongodHelper.run().then(() => {
43 let connectionString: string = this.getMockConnectionString(openPort);
44 this.mockConnectCalls(connectionString);
45 resolve();
46 }, (e: any) => {
47 throw e;
48 // return this.prepareStorage();
49 });
50 });
51 });
52 }
53
54 getMockConnectionString(port: string): string {
55 const dbName: string = 'mockgoose-temp-db-' + uuidV4();
56 const connectionString: string = `mongodb://localhost:${port}/${dbName}`;
57 return connectionString;
58 }
59
60 mockConnectCalls(connection: string) {
61 let createConnection: ConnectionWrapper = new ConnectionWrapper('createConnection', this.mongooseObj, connection);
62 this.mongooseObj.createConnection = function() { return createConnection.run(arguments) };
63 let connect: ConnectionWrapper = new ConnectionWrapper('connect', this.mongooseObj, connection);
64 this.mongooseObj.connect = function() { return connect.run(arguments) };
65 }
66
67 getOpenPort(): Promise<number> {
68 return new Promise<number>((resolve, reject) => {
69 portfinder.getPort({port: 27017}, function (err, port) {
70 if ( err ) {
71 reject(err)
72 } else {
73 resolve(port);
74 }
75 });
76 });
77 }
78
79 // todo: add support to mongodb-download or prebuilt to return version
80 getMemoryStorageName(): string {
81 return "ephemeralForTest";
82
83 }
84
85 getTempDBPath(): Promise<string> {
86 return new Promise<string>((resolve, reject) => {
87 let tempDir: string = path.resolve(os.tmpdir(), "mockgoose", Date.now().toString());
88 fs.ensureDir(tempDir, (err: any) => {
89 if (err) throw err;
90 resolve(tempDir);
91 });
92 });
93 }
94}
95
96export class ConnectionWrapper {
97
98 originalArguments: any;
99 functionName: string;
100 functionCode: any;
101 mongoose: any;
102 connectionString: string;
103
104 constructor(
105 functionName: string, mongoose: any, connectionString: string
106 ) {
107 this.functionName = functionName;
108 this.mongoose = mongoose;
109 this.functionCode = mongoose[functionName];
110 this.connectionString = connectionString;
111 }
112
113 run(args: any): void {
114 this.originalArguments = args;
115 let mockedArgs: any = args;
116 mockedArgs[0] = this.connectionString;
117 return this.functionCode.apply(this.mongoose, mockedArgs);
118 }
119
120}
121
122
123
124
\No newline at end of file