diff options
author | James Wahlin <james@mongodb.com> | 2019-03-07 08:30:27 -0500 |
---|---|---|
committer | James Wahlin <james@mongodb.com> | 2019-04-11 14:59:55 -0400 |
commit | 6b47868e5a82822a21176db3a7d3abd2df429e1f (patch) | |
tree | ca2adddd4590b62cdefbc641d97cc58b5cc05479 /src/mongo/db/update/update_driver_test.cpp | |
parent | 95bb948f7e5e573ca1473ba43dd6fd8e53cb5f50 (diff) | |
download | mongo-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.cpp | 27 |
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) { |