Moved test jstest/[a-i].js -> jstests/core/ and made changes to comply with write command api
120 lines
4.5 KiB
JavaScript
120 lines
4.5 KiB
JavaScript
//
|
|
// Test input validation for geoNear command.
|
|
//
|
|
var t = db.geonear_cmd_input_validation;
|
|
t.drop();
|
|
t.ensureIndex({loc: "2dsphere"});
|
|
|
|
// The test matrix. Some combinations are not supported:
|
|
// 2d index and minDistance.
|
|
// 2d index and GeoJSON
|
|
// 2dsphere index and spherical=false
|
|
var indexTypes = ['2d', '2dsphere'],
|
|
pointTypes = [
|
|
{type: 'Point', coordinates: [0, 0]},
|
|
[0, 0]],
|
|
sphericalOptions = [true, false],
|
|
optionNames = ['minDistance', 'maxDistance'],
|
|
badNumbers = [-1, undefined, 'foo'];
|
|
|
|
indexTypes.forEach(function(indexType) {
|
|
t.drop();
|
|
t.createIndex({'loc': indexType});
|
|
|
|
pointTypes.forEach(function(pointType) {
|
|
sphericalOptions.forEach(function(spherical) {
|
|
optionNames.forEach(function(optionName) {
|
|
var isLegacy = Array.isArray(pointType),
|
|
pointDescription = (isLegacy ? "legacy coordinates" : "GeoJSON point");
|
|
|
|
function makeCommand(distance) {
|
|
var command = {
|
|
geoNear: t.getName(),
|
|
near: pointType,
|
|
spherical: spherical
|
|
};
|
|
command[optionName] = distance;
|
|
return command;
|
|
}
|
|
|
|
// Unsupported combinations should return errors.
|
|
if (
|
|
(indexType == '2d' && optionName == 'minDistance') ||
|
|
(indexType == '2d' && !isLegacy) ||
|
|
(indexType == '2dsphere' && !spherical)
|
|
) {
|
|
assert.commandFailed(
|
|
db.runCommand(makeCommand(1)),
|
|
"geoNear with spherical=" + spherical + " and " + indexType
|
|
+ " index and " + pointDescription
|
|
+ " should've failed."
|
|
);
|
|
|
|
// Stop processing this combination in the test matrix.
|
|
return;
|
|
}
|
|
|
|
// This is a supported combination. No error.
|
|
assert.commandWorked(db.runCommand({
|
|
geoNear: t.getName(),
|
|
near: pointType,
|
|
spherical: spherical
|
|
}));
|
|
|
|
// No error with min/maxDistance 1.
|
|
db.runCommand(makeCommand(1));
|
|
|
|
var outOfRangeDistances = [];
|
|
if (indexType == '2d') {
|
|
// maxDistance unlimited; no error.
|
|
db.runCommand(makeCommand(1e10));
|
|
}
|
|
|
|
// Try several bad values for min/maxDistance.
|
|
badNumbers.concat(outOfRangeDistances).forEach(function(badDistance) {
|
|
|
|
var msg = (
|
|
"geoNear with spherical=" + spherical + " and "
|
|
+ pointDescription + " and " + indexType
|
|
+ " index should've failed with "
|
|
+ optionName + " " + badDistance);
|
|
|
|
assert.commandFailed(
|
|
db.runCommand(makeCommand(badDistance)),
|
|
msg);
|
|
});
|
|
|
|
// Bad values for limit / num.
|
|
['num', 'limit'].forEach(function(limitOptionName) {
|
|
[-1, 'foo'].forEach(function(badLimit) {
|
|
|
|
var msg = (
|
|
"geoNear with spherical=" + spherical + " and "
|
|
+ pointDescription + " and " + indexType
|
|
+ " index should've failed with '"
|
|
+ limitOptionName + "' " + badLimit);
|
|
|
|
var command = makeCommand(1);
|
|
command[limitOptionName] = badLimit;
|
|
assert.commandFailed(db.runCommand(command), msg);
|
|
});
|
|
});
|
|
|
|
// Bad values for distanceMultiplier.
|
|
badNumbers.forEach(function(badNumber) {
|
|
|
|
var msg = (
|
|
"geoNear with spherical=" + spherical + " and "
|
|
+ pointDescription + " and " + indexType
|
|
+ " index should've failed with distanceMultiplier "
|
|
+ badNumber);
|
|
|
|
var command = makeCommand(1);
|
|
command['distanceMultiplier'] = badNumber;
|
|
assert.commandFailed(db.runCommand(command), msg);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|