diff options
author | Nick Zolnierz <nicholas.zolnierz@mongodb.com> | 2018-02-26 16:33:48 -0500 |
---|---|---|
committer | Nick Zolnierz <nicholas.zolnierz@mongodb.com> | 2018-02-27 17:12:05 -0500 |
commit | ad0e38e91dea6b1e49807c6dc0e50197917d2804 (patch) | |
tree | 9a36b826dbb7f45c7706861206ac5f524078594d /src/mongo/db/pipeline/expression_convert_test.cpp | |
parent | 9be3128cbba97456dd70647174a011c0a85ed88b (diff) | |
download | mongo-3.6.3.tar.gz |
SERVER-33169: Add string to date conversions to $convert3.6.3
Diffstat (limited to 'src/mongo/db/pipeline/expression_convert_test.cpp')
-rw-r--r-- | src/mongo/db/pipeline/expression_convert_test.cpp | 114 |
1 files changed, 112 insertions, 2 deletions
diff --git a/src/mongo/db/pipeline/expression_convert_test.cpp b/src/mongo/db/pipeline/expression_convert_test.cpp index 51f579ceede..b91c4a37d9a 100644 --- a/src/mongo/db/pipeline/expression_convert_test.cpp +++ b/src/mongo/db/pipeline/expression_convert_test.cpp @@ -2380,7 +2380,7 @@ TEST_F(ExpressionConvertTest, ConvertStringToOID) { convertExp->evaluate({}), OID("123456789abcdef123456789"), BSONType::jstOID); } -TEST_F(ExpressionConvertTest, ConvertToOIDFailsForInvalidHexStrings) { +TEST_F(ExpressionConvertTest, ConvertStringToOIDFailsForInvalidHexStrings) { auto expCtx = getExpCtx(); auto spec = fromjson("{$convert: {input: 'InvalidHexButSizeCorrect', to: 'objectId'}}"); @@ -2408,7 +2408,7 @@ TEST_F(ExpressionConvertTest, ConvertToOIDFailsForInvalidHexStrings) { }); } -TEST_F(ExpressionConvertTest, ConvertToOIDWithOnError) { +TEST_F(ExpressionConvertTest, ConvertStringToOIDWithOnError) { auto expCtx = getExpCtx(); const auto onErrorValue = "><(((((>"_sd; @@ -2429,6 +2429,116 @@ TEST_F(ExpressionConvertTest, ConvertToOIDWithOnError) { ASSERT_VALUE_CONTENTS_AND_TYPE(convertExp->evaluate({}), onErrorValue, BSONType::String); } +TEST_F(ExpressionConvertTest, ConvertStringToDateRejectsUnparsableString) { + auto expCtx = getExpCtx(); + + auto spec = fromjson("{$convert: {input: '60.Monday1770/06:59', to: 'date'}}"); + auto convertExp = Expression::parseExpression(expCtx, spec, expCtx->variablesParseState); + ASSERT_THROWS_CODE(convertExp->evaluate({}), AssertionException, ErrorCodes::ConversionFailure); + + spec = fromjson("{$convert: {input: 'Definitely not a date', to: 'date'}}"); + convertExp = Expression::parseExpression(expCtx, spec, expCtx->variablesParseState); + ASSERT_THROWS_CODE(convertExp->evaluate({}), AssertionException, ErrorCodes::ConversionFailure); +} + +TEST_F(ExpressionConvertTest, ConvertStringToDateRejectsTimezoneNameInString) { + auto expCtx = getExpCtx(); + + auto spec = fromjson("{$convert: {input: '2017-07-13T10:02:57 Europe/London', to: 'date'}}"); + auto convertExp = Expression::parseExpression(expCtx, spec, expCtx->variablesParseState); + ASSERT_THROWS_CODE(convertExp->evaluate({}), AssertionException, ErrorCodes::ConversionFailure); + + spec = fromjson("{$convert: {input: 'July 4, 2017 Europe/London', to: 'date'}}"); + convertExp = Expression::parseExpression(expCtx, spec, expCtx->variablesParseState); + ASSERT_THROWS_CODE(convertExp->evaluate({}), AssertionException, ErrorCodes::ConversionFailure); +} + +TEST_F(ExpressionConvertTest, ConvertStringToDate) { + auto expCtx = getExpCtx(); + + auto spec = fromjson("{$convert: {input: '$path1', to: 'date'}}"); + auto convertExp = Expression::parseExpression(expCtx, spec, expCtx->variablesParseState); + + auto result = convertExp->evaluate({{"path1", Value("2017-07-06T12:35:37Z"_sd)}}); + ASSERT_EQ(result.getType(), BSONType::Date); + ASSERT_EQ("2017-07-06T12:35:37.000Z", result.toString()); + + result = convertExp->evaluate({{"path1", Value("2017-07-06T12:35:37.513Z"_sd)}}); + ASSERT_EQ(result.getType(), BSONType::Date); + ASSERT_EQ("2017-07-06T12:35:37.513Z", result.toString()); + + result = convertExp->evaluate({{"path1", Value("2017-07-06"_sd)}}); + ASSERT_EQ(result.getType(), BSONType::Date); + ASSERT_EQ("2017-07-06T00:00:00.000Z", result.toString()); +} + +TEST_F(ExpressionConvertTest, ConvertStringWithTimezoneToDate) { + auto expCtx = getExpCtx(); + + auto spec = fromjson("{$convert: {input: '$path1', to: 'date'}}"); + auto convertExp = Expression::parseExpression(expCtx, spec, expCtx->variablesParseState); + + auto result = convertExp->evaluate({{"path1", Value("2017-07-14T12:02:44.771 GMT+02:00"_sd)}}); + ASSERT_EQ(result.getType(), BSONType::Date); + ASSERT_EQ("2017-07-14T10:02:44.771Z", result.toString()); + + result = convertExp->evaluate({{"path1", Value("2017-07-14T12:02:44.771 A"_sd)}}); + ASSERT_EQ(result.getType(), BSONType::Date); + ASSERT_EQ("2017-07-14T11:02:44.771Z", result.toString()); +} + +TEST_F(ExpressionConvertTest, ConvertVerbalStringToDate) { + auto expCtx = getExpCtx(); + + auto spec = fromjson("{$convert: {input: '$path1', to: 'date'}}"); + auto convertExp = Expression::parseExpression(expCtx, spec, expCtx->variablesParseState); + + auto result = convertExp->evaluate({{"path1", Value("July 4th, 2017"_sd)}}); + ASSERT_EQ(result.getType(), BSONType::Date); + ASSERT_EQ("2017-07-04T00:00:00.000Z", result.toString()); + + result = convertExp->evaluate({{"path1", Value("July 4th, 2017 12pm"_sd)}}); + ASSERT_EQ(result.getType(), BSONType::Date); + ASSERT_EQ("2017-07-04T12:00:00.000Z", result.toString()); + + result = convertExp->evaluate({{"path1", Value("2017-Jul-04 noon"_sd)}}); + ASSERT_EQ(result.getType(), BSONType::Date); + ASSERT_EQ("2017-07-04T12:00:00.000Z", result.toString()); +} + +TEST_F(ExpressionConvertTest, ConvertStringToDateWithOnError) { + auto expCtx = getExpCtx(); + const auto onErrorValue = "(-_-)"_sd; + + auto spec = + fromjson("{$convert: {input: '$path1', to: 'date', onError: '" + onErrorValue + "'}}"); + auto convertExp = Expression::parseExpression(expCtx, spec, expCtx->variablesParseState); + + auto result = convertExp->evaluate({{"path1", Value("Not a date"_sd)}}); + ASSERT_VALUE_CONTENTS_AND_TYPE(result, onErrorValue, BSONType::String); + + result = convertExp->evaluate({{"path1", Value("60.Monday1770/06:59"_sd)}}); + ASSERT_VALUE_CONTENTS_AND_TYPE(result, onErrorValue, BSONType::String); + + result = convertExp->evaluate({{"path1", Value("2017-07-13T10:02:57 Europe/London"_sd)}}); + ASSERT_VALUE_CONTENTS_AND_TYPE(result, onErrorValue, BSONType::String); +} + +TEST_F(ExpressionConvertTest, ConvertStringToDateWithOnNull) { + auto expCtx = getExpCtx(); + const auto onNullValue = "(-_-)"_sd; + + auto spec = + fromjson("{$convert: {input: '$path1', to: 'date', onNull: '" + onNullValue + "'}}"); + auto convertExp = Expression::parseExpression(expCtx, spec, expCtx->variablesParseState); + + auto result = convertExp->evaluate({}); + ASSERT_VALUE_CONTENTS_AND_TYPE(result, onNullValue, BSONType::String); + + result = convertExp->evaluate({{"path1", Value(BSONNULL)}}); + ASSERT_VALUE_CONTENTS_AND_TYPE(result, onNullValue, BSONType::String); +} + } // namespace ExpressionConvertTest } // namespace mongo |