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
|
/**
* Tests $dateDiff expression.
* @tags: [
* sbe_incompatible,
* requires_fcv_49
* ]
*/
(function() {
"use strict";
const testDB = db.getSiblingDB(jsTestName());
const coll = testDB.collection;
// Drop the test database.
assert.commandWorked(testDB.dropDatabase());
// Executes a test case that inserts documents, issues an aggregate command on a collection and
// compares the results with the expected.
function executeTestCase(testCase) {
jsTestLog(tojson(testCase));
coll.remove({});
// Insert some documents into the collection.
assert.commandWorked(coll.insert(testCase.inputDocuments));
// Issue an aggregate command and verify the result.
try {
const actualResults = coll.aggregate(testCase.pipeline).toArray();
assert(testCase.expectedErrorCode === undefined,
`Expected an exception with code ${testCase.expectedErrorCode}`);
assert.eq(actualResults, testCase.expectedResults);
} catch (error) {
if (testCase.expectedErrorCode === undefined) {
throw error;
}
assert.eq(testCase.expectedErrorCode, error.code, tojson(error));
}
}
const someDate = new Date("2020-11-01T18:23:36Z");
const testCases = [
{
// Parameters are constants, timezone is not specified.
pipeline: [{
$project: {
_id: true,
date_diff: {
$dateDiff: {
startDate: new Date("2020-11-01T18:23:36Z"),
endDate: new Date("2020-11-02T00:00:00Z"),
unit: "hour"
}
}
}
}],
inputDocuments: [{_id: 1}],
expectedResults: [{_id: 1, date_diff: NumberLong("6")}]
},
{
// Parameters are field paths.
pipeline: [{
$project: {
_id: true,
date_diff: {
$dateDiff: {
startDate: "$startDate",
endDate: "$endDate",
unit: "$units",
timezone: "$timeZone"
}
}
}
}],
inputDocuments: [{
_id: 1,
startDate: new Date("2020-11-01T18:23:36Z"),
endDate: new Date("2020-11-02T00:00:00Z"),
units: "hour",
timeZone: "America/New_York"
}],
expectedResults: [{_id: 1, date_diff: NumberLong("6")}]
},
{
// Invalid inputs.
pipeline: [{
$project: {
_id: true,
date_diff: {
$dateDiff: {
startDate: "$startDate",
endDate: "$endDate",
unit: "$units",
timezone: "$timeZone"
}
}
}
}],
inputDocuments:
[{_id: 1, startDate: "string", endDate: someDate, units: "decade", timeZone: "UTC"}],
expectedErrorCode: 5166307,
}
];
testCases.forEach(executeTestCase);
}());
|