UNPKG

11.1 kBPlain TextView Raw
1require('reflect-metadata/reflect');
2import {MetaUtils} from '../core/metadata/utils';
3import {Decorators} from '../core/constants';
4import {DecoratorType} from '../core/enums/decorator-type';
5import * as Utils from "../mongoose/utils";
6import * as modeEntity from '../core/dynamic/model-entity';
7import {Strict} from '../mongoose/enums/';
8import Mongoose = require("mongoose");
9import {course} from './models/course';
10import {student} from './models/student';
11import * as Enumerable from 'linq';
12var Q = require('q');
13
14var database: { [key: string]: Array<any> } = <any>{};
15var _mongooseModel: { [key: string]: any } = <any>{};
16var _databaseCalls: { [key: string]: any } = <any>{};
17
18class ModelNames {
19 public static course: string = course.prototype.constructor.name;
20 public static student: string = student.prototype.constructor.name;
21}
22
23class courseRepository{
24
25 find(param: any): Q.Promise<any> {
26 return MongoDbMock.find(param, database[ModelNames.course]);
27 }
28
29 findOne(param: any): Q.Promise<any> {
30 return MongoDbMock.findOne(param, database[ModelNames.course]);
31 }
32
33 create(object: any): Q.Promise<any> {
34 return MongoDbMock.create(object, _mongooseModel[ModelNames.course], database[ModelNames.course]);
35 }
36
37 findOneAndRemove(query: any): Q.Promise<any> {
38 return MongoDbMock.findOneAndRemove(query, database[ModelNames.course]);
39 }
40
41 findOneAndUpdate(query: any, object: any, param: any): Q.Promise<any> {
42 return MongoDbMock.findOneAndUpdate(query, object, param, database[ModelNames.course]);
43 }
44
45 update(query: any, object: any, param: any): Q.Promise<any> {
46 return MongoDbMock.update(query, object, param, database[ModelNames.course]);
47 }
48}
49
50class studentRepository1{
51 find(param: any): Q.Promise<any> {
52 return MongoDbMock.find(param, database[ModelNames.student]);
53 }
54
55 findOne(param: any): Q.Promise<any> {
56 return MongoDbMock.findOne(param, database[ModelNames.student]);
57 }
58
59 create(object: any): Q.Promise<any> {
60 return MongoDbMock.create(object, _mongooseModel[ModelNames.student], database[ModelNames.student]);
61 }
62
63 findOneAndRemove(query: any): Q.Promise<any> {
64 return MongoDbMock.findOneAndRemove(query, database[ModelNames.student]);
65 }
66
67 findOneAndUpdate(query: any, object: any, param: any): Q.Promise<any> {
68 return MongoDbMock.findOneAndUpdate(query, object, param, database[ModelNames.student]);
69 }
70
71 update(query: any, object: any, param: any): Q.Promise<any> {
72 return MongoDbMock.update(query, object, param, database[ModelNames.student]);
73 }
74}
75
76export class MongoDbMock {
77
78 static setEmptytoObject(obj: any) {
79 if (obj == undefined || obj != {}) {
80 obj['toObject'] = function () {
81 return {};
82 }
83 }
84 }
85
86 public static find(param: any, collection: Array<any>): Q.Promise<any> {
87 var res = [];
88 if (JSON.stringify(param) === JSON.stringify({})) {
89 res = collection;
90 }
91 else {
92 var prop;
93 for (var p in param) {
94 prop = p;
95 break;
96 }
97 if (prop == '_id') {
98 if (param[prop]['$in']) {
99 var arr: Array<any> = param[prop]['$in'];
100 res = Enumerable.from(collection).where(x => arr.find(id => x['_id'] == id.toString())).toArray();
101 }
102 else {
103 res = Enumerable.from(collection).where(x => x['_doc'][prop] == param[prop].toString()).firstOrDefault();
104 }
105 }
106 else {
107 var arr: Array<any> = param[prop]['$in'];
108 if (arr) {
109 Enumerable.from(collection).forEach(x => {
110 if (x['_doc'][prop]) {
111 var f = x['_doc'][prop].find(x => arr.find(id => x.toString() == id));
112 if (f) {
113 res.push(x);
114 }
115 }
116 });
117 }
118 else {
119 res = Enumerable.from(collection).where(x => x['_doc'][prop] == param[prop].toString()).firstOrDefault();
120 }
121 }
122 }
123 //console.log('find (', param, ') => ', res);
124 return Q.when(res);
125 }
126
127 public static findOne(param: any, collection: Array<any>): Q.Promise<any> {
128 var res = {};
129 for (var item in param) {
130 var id = param[item].toString();
131 res = Enumerable.from(collection).where(x => x['_doc'][item] == param[item].toString()).firstOrDefault();
132 break;
133 }
134 //console.log('findOne (', param, ') => ', res);
135 return Q.when(res);
136 }
137
138 public static create(object: any, model: any, collection: Array<any>): Q.Promise<any> {
139 var res;
140 if (object instanceof Array) {
141 res = [];
142 Enumerable.from(object).forEach(x => {
143 var obj = new model(x);
144 collection.push(obj);
145 res.push(obj);
146 });
147 }
148 else {
149 var obj = new model(object);
150 collection.push(obj);
151 res = obj;
152 }
153 //console.log('create(', object, ')=> ', obj);
154 return Q.when(res);
155 }
156
157 public static findOneAndRemove(query: any, collection: Array<any>): Q.Promise<any> {
158 var res = {};
159 for (var item in query) {
160 res = Enumerable.from(collection).where(x => x['_doc'][item] == query[item].toString()).firstOrDefault();
161 if (res) {
162 collection.splice(collection.indexOf(res), 1);
163 }
164 break;
165 }
166 //console.log('findOneAndRemove (', query, ') => ', res);
167 return Q.when(res);
168 }
169
170 public static findOneAndUpdate(query: any, object: any, param: any, collection: Array<any>): Q.Promise<any> {
171 var res = {};
172 for (var item in query) {
173 res = Enumerable.from(collection).where(x => x['_doc'][item] == query[item].toString()).firstOrDefault();
174 if (res) {
175 var setObject, unsetObject, pushObject;
176 if (object['$set']) {
177 setObject = object['$set'];
178 }
179 if (object['$unset']) {
180 unsetObject = object['$unset'];
181 }
182 if (object['$push']) {
183 pushObject = object['$push'];
184 }
185 for (var prop in setObject) {
186 res['_doc'][prop] = setObject[prop];
187 }
188 for (var prop in unsetObject) {
189 delete res['_doc'][prop];
190 }
191 for (var prop in pushObject) {
192 var vals = pushObject[prop]['$each'];
193 if (!res['_doc'][prop]) {
194 res['_doc'][prop] = [];
195 }
196 Enumerable.from(vals).forEach(x => res['_doc'][prop].push(x));
197 }
198 }
199 break;
200 }
201 //console.log('findOneAndUpdate (', query, object, param, ') => ', res);
202 return Q.when(res);
203 }
204
205 public static update(query: any, object: any, param: any, collection: Array<any>): Q.Promise<any> {
206 var res = [];
207 if (JSON.stringify(query) === JSON.stringify(MongoDbMock.updateCondition) ||
208 (JSON.stringify(query) === JSON.stringify({}) &&
209 JSON.stringify(object) === JSON.stringify(MongoDbMock.updateCondition))) {
210
211 var id = MongoDbMock.updateResult['_id'].toString();
212 res = collection.find(x => x['_id'] == id);
213 for (var ind in MongoDbMock.updateResult) {
214 res['_doc'][ind] = MongoDbMock.updateResult[ind];
215 }
216 res = [res];
217 //console.log('condition matched', res, id);
218 }
219 //console.log('update (', query, object, param), ') =>', res);
220 return Q.when(res);
221 }
222
223 private static updateCondition;
224 private static updateResult;
225 public static setOnUpdate(model: any, cond: any, object: any) {
226 //console.log('setOnUpdate - ', cond, object);
227 MongoDbMock.updateCondition = cond;
228 MongoDbMock.updateResult = object;
229 }
230}
231
232export function AddAllFakeFunctions() {
233 database[ModelNames.course] = [];
234 _mongooseModel[ModelNames.course] = Mongoose.model(ModelNames.course, new Mongoose.Schema(course.prototype.schema()));
235 _databaseCalls[ModelNames.course] = new courseRepository();
236
237 database[ModelNames.student] = [];
238 _mongooseModel[ModelNames.student] = Mongoose.model(ModelNames.student, new Mongoose.Schema(student.prototype.schema()));
239 _databaseCalls[ModelNames.student] = new studentRepository1();
240
241 console.log('added all faked function');
242}
243
244export function createMongooseModel(name: Function, object: any): Mongoose.Model<any> {
245 object['_id'] = new Mongoose.Types.ObjectId();
246 var model = new _mongooseModel[name.prototype.constructor.name](object);
247 database[name.prototype.constructor.name].push(model);
248 return model;
249}
250
251export function getMongooseModel(name: Function): Mongoose.Model<any> {
252 return _mongooseModel[name.prototype.constructor.name];
253}
254
255export function getFakeFunctionForMongoose(func, model): any {
256 var fn: Function = func as Function;
257 var res = _databaseCalls[model.modelName][func.name];
258 if (!res) {
259 //console.log('return fake function - ', model.modelName, fn.length, fn.arguments, fn);
260 if (fn.length == 4) {
261 return _databaseCalls[model.modelName]['findOneAndUpdate'];
262 }
263 else if (fn.length == 3) {
264 return _databaseCalls[model.modelName]['findOneAndRemove'];
265 }
266 }
267 return res;
268}
269
270export function clearDatabase() {
271 database[ModelNames.course] = [];
272 database[ModelNames.student] = [];
273}
274
275export class mockedFunctions {
276
277 castToMongooseType(value, schemaType) {
278 //console.log('castToMongooseType - ', value, schemaType);
279 if (value['_id']) {
280 return value['_id'];
281 }
282 else {
283 return value;
284 }
285 }
286
287 getEntity(object: any) {
288 //console.log('getEntity - ', object);
289
290 switch (object) {
291 case ModelNames.course:
292 return course;
293 case ModelNames.student:
294 return student;
295 }
296 }
297
298 getModel(object: any) {
299 //console.log('getModel - ', object);
300 return _mongooseModel[object];
301 }
302
303 getDbSpecifcModel(object: any, schema: any) {
304 return _mongooseModel[object];
305 }
306
307 //getMetaData(entity: any, decprator: any) {
308 //}
309
310 //getMetaDataForPropKey(entity: any, prop: any) {
311 //}
312
313 //getAllRelationsForTargetInternal(entity: any) {
314 //}
315
316 //getAllRelationsForTarget(entity: any) {
317 //}
318
319 //isRelationDecorator(decorator: any) {
320 //}
321
322 //getPrimaryKeyMetadata(entity: any) {
323 //}
324}