summaryrefslogtreecommitdiff
path: root/jstests/core/list_databases.js
blob: 2a1db9fc5d11603887f4a758715ef86c33f93b54 (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
/**
 * Tests for the listDatabases command.
 */
(function() {
"use strict";

// Given the output from the listDatabases command, ensures that the total size reported is the
// sum of the individual db sizes.
function verifySizeSum(listDatabasesOut) {
    assert(listDatabasesOut.hasOwnProperty("databases"));
    const dbList = listDatabasesOut.databases;
    let sizeSum = 0;
    for (let i = 0; i < dbList.length; i++) {
        sizeSum += dbList[i].sizeOnDisk;
    }
    assert.eq(sizeSum, listDatabasesOut.totalSize);
}

function verifyNameOnly(listDatabasesOut) {
    for (let field in listDatabasesOut) {
        assert(['databases', 'nameOnly', 'ok', 'operationTime', '$clusterTime'].some((f) => f ==
                                                                                         field),
               'unexpected field ' + field);
    }
    listDatabasesOut.databases.forEach((database) => {
        for (let field in database) {
            assert.eq(field, "name", "expected name only");
        }
    });
}

// Make 4 test databases.
db.getSiblingDB("jstest_list_databases_foo").coll.insert({});
db.getSiblingDB("jstest_list_databases_bar").coll.insert({});
db.getSiblingDB("jstest_list_databases_baz").coll.insert({});
db.getSiblingDB("jstest_list_databases_zap").coll.insert({});

let cmdRes = assert.commandWorked(
    db.adminCommand({listDatabases: 1, filter: {name: /jstest_list_databases/}}));
assert.eq(4, cmdRes.databases.length);
verifySizeSum(cmdRes);

// Now only list databases starting with a particular prefix.
cmdRes = assert.commandWorked(
    db.adminCommand({listDatabases: 1, filter: {name: /^jstest_list_databases_ba/}}));
assert.eq(2, cmdRes.databases.length);
verifySizeSum(cmdRes);

// Now return only the admin database.
cmdRes = assert.commandWorked(db.adminCommand({listDatabases: 1, filter: {name: "admin"}}));
assert.eq(1, cmdRes.databases.length);
verifySizeSum(cmdRes);

// Now return only the names.
cmdRes = assert.commandWorked(db.adminCommand({listDatabases: 1, nameOnly: true}));
assert.lte(4, cmdRes.databases.length, tojson(cmdRes));
verifyNameOnly(cmdRes);

// Now return only the name of the zap database.
cmdRes = assert.commandWorked(
    db.adminCommand({listDatabases: 1, nameOnly: true, filter: {name: /zap/}}));
assert.eq(1, cmdRes.databases.length, tojson(cmdRes));
verifyNameOnly(cmdRes);

// $expr in filter.
cmdRes = assert.commandWorked(db.adminCommand(
    {listDatabases: 1, filter: {$expr: {$eq: ["$name", "jstest_list_databases_zap"]}}}));
assert.eq(1, cmdRes.databases.length, tojson(cmdRes));
assert.eq("jstest_list_databases_zap", cmdRes.databases[0].name, tojson(cmdRes));

// $expr with an unbound variable in filter.
assert.commandFailed(
    db.adminCommand({listDatabases: 1, filter: {$expr: {$eq: ["$name", "$$unbound"]}}}));

// $expr with a filter that throws at runtime.
assert.commandFailed(db.adminCommand({listDatabases: 1, filter: {$expr: {$abs: "$name"}}}));

// No extensions are allowed in filters.
assert.commandFailed(db.adminCommand({listDatabases: 1, filter: {$text: {$search: "str"}}}));
assert.commandFailed(db.adminCommand({
    listDatabases: 1,
    filter: {
        $where: function() {
            return true;
        }
    }
}));
assert.commandFailed(db.adminCommand({
    listDatabases: 1,
    filter: {a: {$nearSphere: {$geometry: {type: "Point", coordinates: [0, 0]}}}}
}));
}());