-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmod.ts
125 lines (105 loc) · 5.92 KB
/
mod.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import { spy, Collection, Filter, CountOptions, AggregatePipeline, AggregateOptions, DeleteOptions, DropOptions, DropIndexOptions, DistinctOptions, FindOptions, InsertOptions, UpdateOptions, CreateIndexOptions, FindAndModifyOptions, InsertDocument, Document, Bson, FindCursor, AggregateCursor, ListIndexesCursor, UpdateFilter} from "./deps.ts"
export class MockCollection<T> extends Collection<T> {
static instance: Collection<any>
static getInstance(): Collection<any> {
return MockCollection.instance;
}
static initMock<T>(additional: Partial<Collection<T>>) {
MockCollection.instance = MockCollection.getMockCollection<T>(additional)
}
static getMockWithProxy<T>() {
return MockCollection.getMockCollection({
aggregate: (pipeline: AggregatePipeline<any>[], options?: AggregateOptions | undefined): AggregateCursor<any> => MockCollection.instance.aggregate(pipeline, options),
countDocuments: (filter?: Filter<unknown> | undefined, options?: CountOptions | undefined): Promise<number> => MockCollection.instance.countDocuments(filter, options),
createIndexes: (options: CreateIndexOptions): Promise<{
ok: number;
createdCollectionAutomatically: boolean;
numIndexesBefore: number;
numIndexesAfter: number;
}> => MockCollection.instance.createIndexes(options),
delete: (filter: Filter<unknown>, options?: DeleteOptions | undefined): Promise<number> => MockCollection.instance.delete(filter, options),
deleteMany: (filter: Filter<unknown>, options?: DeleteOptions | undefined): Promise<number> => MockCollection.instance.deleteMany(filter, options),
deleteOne: (filter: Filter<unknown>, options?: DeleteOptions | undefined): Promise<number> => MockCollection.instance.deleteOne(filter, options),
distinct: (key: string, query?: Filter<unknown> | undefined, options?: DistinctOptions | undefined): Promise<any> => MockCollection.instance.distinct(key, query, options),
drop: (options?: DropOptions | undefined): Promise<void> => MockCollection.instance.drop(options),
dropIndexes: (options: DropIndexOptions): Promise<{
ok: number;
nIndexesWas: number;
}> => MockCollection.instance.dropIndexes(options),
estimatedDocumentCount: (): Promise<number> => MockCollection.instance.estimatedDocumentCount(),
find: (filter?: Filter<unknown> | undefined, options?: FindOptions | undefined): FindCursor<unknown> => MockCollection.instance.find(filter, options),
findAndModify: (filter?: Filter<unknown> | undefined, options?: FindAndModifyOptions<unknown> | undefined): Promise<unknown> => MockCollection.instance.findAndModify(filter, options),
findOne: (filter?: Filter<unknown> | undefined, options?: FindOptions | undefined): Promise<unknown> => MockCollection.instance.findOne(filter, options),
insertMany: (docs: InsertDocument<T>[], options?: InsertOptions | undefined): Promise<{
insertedIds: unknown[];
insertedCount: number;
}> => MockCollection.instance.insertMany(docs, options),
insertOne: (doc: InsertDocument<T>, options?: InsertOptions | undefined): Promise<unknown> => MockCollection.instance.insertOne(doc, options),
listIndexes: (): ListIndexesCursor<{
v: number;
key: Document;
name: string;
ns?: string | undefined;
}> => MockCollection.instance.listIndexes(),
replaceOne: (filter: Filter<unknown>, replacement: InsertDocument<T>, options?: UpdateOptions | undefined): Promise<{
upsertedId: Bson.ObjectId;
upsertedCount: number;
matchedCount: number;
modifiedCount: number;
}> => MockCollection.instance.replaceOne(filter, replacement, options),
updateMany: (filter: Filter<unknown>, doc: UpdateFilter<unknown>, options?: UpdateOptions | undefined): Promise<{
upsertedIds: Bson.ObjectId[] | undefined;
upsertedCount: number;
modifiedCount: number;
matchedCount: number;
}> => MockCollection.instance.updateMany(filter, doc, options),
updateOne: (filter: Filter<unknown>, update: UpdateFilter<unknown>, options?: UpdateOptions | undefined): Promise<{
upsertedId: Bson.ObjectId;
upsertedCount: number;
matchedCount: number;
modifiedCount: number;
}> => MockCollection.instance.updateOne(filter, update, options)
})
}
private static getMockCollection<T>(additional: Partial<Collection<T>>): Collection<T> {
const props: Partial<Collection<T>> = {
name: "",
}
const methods: (keyof Omit<Collection<T>, "name">)[] = [
"aggregate",
"count",
"countDocuments",
"createIndexes",
"delete",
"deleteMany",
"deleteOne",
"distinct",
"drop",
"dropIndexes",
"estimatedDocumentCount",
"find",
"findAndModify",
"findOne",
"insert",
"insertMany",
"insertOne",
"listIndexes",
"replaceOne",
"updateMany",
"updateOne"
]
const mockCollection = {
...props,
...additional
}
methods.forEach((method) => {
mockCollection[method] = additional ? _wrapSpy(mockCollection[method]) : _wrapSpy();
});
return mockCollection as Collection<T>
}
}
export function _wrapSpy(func?: Function) {
// deno-lint-ignore no-explicit-any
return func ? spy(func as any) as any : spy();
}
export default MockCollection.getMockWithProxy()