summaryrefslogtreecommitdiff
path: root/jstests/aggregation/expressions/date_diff.js
blob: 2c33451dd06269b99917ed7818d83bd9bfb8318b (plain)
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);
}());