summaryrefslogtreecommitdiff
path: root/src/mongo/db/update/update_driver_test.cpp
diff options
context:
space:
mode:
authorJames Wahlin <james@mongodb.com>2019-03-07 08:30:27 -0500
committerJames Wahlin <james@mongodb.com>2019-04-11 14:59:55 -0400
commit6b47868e5a82822a21176db3a7d3abd2df429e1f (patch)
treeca2adddd4590b62cdefbc641d97cc58b5cc05479 /src/mongo/db/update/update_driver_test.cpp
parent95bb948f7e5e573ca1473ba43dd6fd8e53cb5f50 (diff)
downloadmongo-6b47868e5a82822a21176db3a7d3abd2df429e1f.tar.gz
SERVER-40381 Add the ability to specify a pipeline to an update command
Diffstat (limited to 'src/mongo/db/update/update_driver_test.cpp')
-rw-r--r--src/mongo/db/update/update_driver_test.cpp27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/mongo/db/update/update_driver_test.cpp b/src/mongo/db/update/update_driver_test.cpp
index 15e4eca2340..5cb065b528f 100644
--- a/src/mongo/db/update/update_driver_test.cpp
+++ b/src/mongo/db/update/update_driver_test.cpp
@@ -38,6 +38,7 @@
#include "mongo/bson/bsonelement_comparator.h"
#include "mongo/bson/mutable/document.h"
#include "mongo/bson/mutable/mutable_bson_test_utils.h"
+#include "mongo/db/commands/test_commands_enabled.h"
#include "mongo/db/field_ref.h"
#include "mongo/db/json.h"
#include "mongo/db/pipeline/expression_context_for_test.h"
@@ -66,7 +67,7 @@ TEST(Parse, Normal) {
UpdateDriver driver(expCtx);
std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters;
ASSERT_DOES_NOT_THROW(driver.parse(fromjson("{$set:{a:1}}"), arrayFilters));
- ASSERT_FALSE(driver.isDocReplacement());
+ ASSERT_FALSE(driver.type() == UpdateDriver::UpdateType::kReplacement);
}
TEST(Parse, MultiMods) {
@@ -74,7 +75,7 @@ TEST(Parse, MultiMods) {
UpdateDriver driver(expCtx);
std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters;
ASSERT_DOES_NOT_THROW(driver.parse(fromjson("{$set:{a:1, b:1}}"), arrayFilters));
- ASSERT_FALSE(driver.isDocReplacement());
+ ASSERT_FALSE(driver.type() == UpdateDriver::UpdateType::kReplacement);
}
TEST(Parse, MixingMods) {
@@ -82,7 +83,7 @@ TEST(Parse, MixingMods) {
UpdateDriver driver(expCtx);
std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters;
ASSERT_DOES_NOT_THROW(driver.parse(fromjson("{$set:{a:1}, $unset:{b:1}}"), arrayFilters));
- ASSERT_FALSE(driver.isDocReplacement());
+ ASSERT_FALSE(driver.type() == UpdateDriver::UpdateType::kReplacement);
}
TEST(Parse, ObjectReplacment) {
@@ -90,7 +91,17 @@ TEST(Parse, ObjectReplacment) {
UpdateDriver driver(expCtx);
std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters;
ASSERT_DOES_NOT_THROW(driver.parse(fromjson("{obj: \"obj replacement\"}"), arrayFilters));
- ASSERT_TRUE(driver.isDocReplacement());
+ ASSERT_TRUE(driver.type() == UpdateDriver::UpdateType::kReplacement);
+}
+
+TEST(Parse, ParseUpdateWithPipeline) {
+ setTestCommandsEnabled(true);
+ boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
+ UpdateDriver driver(expCtx);
+ std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters;
+ auto updateObj = BSON("u" << BSON_ARRAY(BSON("$addFields" << BSON("a" << 1))));
+ ASSERT_DOES_NOT_THROW(driver.parse(updateObj["u"], arrayFilters));
+ ASSERT_TRUE(driver.type() == UpdateDriver::UpdateType::kPipeline);
}
TEST(Parse, EmptyMod) {
@@ -111,7 +122,8 @@ TEST(Parse, WrongMod) {
ASSERT_THROWS_CODE_AND_WHAT(driver.parse(fromjson("{$xyz:{a:1}}"), arrayFilters),
AssertionException,
ErrorCodes::FailedToParse,
- "Unknown modifier: $xyz");
+ "Unknown modifier: $xyz. Expected a valid update modifier or "
+ "pipeline-style update specified as an array");
}
TEST(Parse, WrongType) {
@@ -133,7 +145,8 @@ TEST(Parse, ModsWithLaterObjReplacement) {
driver.parse(fromjson("{$set:{a:1}, obj: \"obj replacement\"}"), arrayFilters),
AssertionException,
ErrorCodes::FailedToParse,
- "Unknown modifier: obj");
+ "Unknown modifier: obj. Expected a valid update modifier or pipeline-style update "
+ "specified as an array");
}
TEST(Parse, SetOnInsert) {
@@ -141,7 +154,7 @@ TEST(Parse, SetOnInsert) {
UpdateDriver driver(expCtx);
std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters;
ASSERT_DOES_NOT_THROW(driver.parse(fromjson("{$setOnInsert:{a:1}}"), arrayFilters));
- ASSERT_FALSE(driver.isDocReplacement());
+ ASSERT_FALSE(driver.type() == UpdateDriver::UpdateType::kReplacement);
}
TEST(Collator, SetCollationUpdatesModifierInterfaces) {