93 lines
3.3 KiB
JavaScript
93 lines
3.3 KiB
JavaScript
/**
|
|
* 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]}}}}
|
|
}));
|
|
}());
|