// // 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); }); }); }); }); });