Skip to content

Commit c8d2e34

Browse files
committed
CSHARP-1439: Add document validation support to create collection (2.x Legacy API).
1 parent e3def97 commit c8d2e34

File tree

5 files changed

+156
-1
lines changed

5 files changed

+156
-1
lines changed

src/MongoDB.Driver.Core.Tests/Core/Operations/CreateCollectionOperationTests.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,36 @@ public void Execute_should_create_collection_when_UsePowerOf2Sizes_is_set(
468468
}
469469
}
470470

471+
[Test]
472+
[RequiresServer("DropCollection", MinimumVersion = "3.2.0-rc0")]
473+
public void Execute_should_create_collection_when_Validator_is_set(
474+
[Values(false, true)] bool async)
475+
{
476+
var subject = new CreateCollectionOperation(_collectionNamespace, _messageEncoderSettings)
477+
{
478+
ValidationAction = DocumentValidationAction.Error,
479+
ValidationLevel = DocumentValidationLevel.Strict,
480+
Validator = new BsonDocument("_id", new BsonDocument("$exists", true))
481+
};
482+
483+
using (var binding = CoreTestConfiguration.GetReadWriteBinding())
484+
{
485+
var result = ExecuteOperation(subject, binding, async);
486+
487+
result["ok"].ToBoolean().Should().BeTrue();
488+
var commandOperation = new ReadCommandOperation<BsonDocument>(
489+
_collectionNamespace.DatabaseNamespace,
490+
new BsonDocument("listCollections", 1),
491+
BsonDocumentSerializer.Instance,
492+
new MessageEncoderSettings());
493+
var commandResult = commandOperation.Execute(binding, CancellationToken.None);
494+
var collectionInfo = commandResult["cursor"]["firstBatch"].AsBsonArray.Where(c => c["name"] == _collectionNamespace.CollectionName).Single();
495+
Assert.That(collectionInfo["options"]["validator"], Is.EqualTo(new BsonDocument("_id", new BsonDocument("$exists", true))));
496+
Assert.That(collectionInfo["options"]["validationAction"].AsString, Is.EqualTo("error"));
497+
Assert.That(collectionInfo["options"]["validationLevel"].AsString, Is.EqualTo("strict"));
498+
}
499+
}
500+
471501
[Test]
472502
public void IndexOptionDefaults_should_work()
473503
{

src/MongoDB.Driver.Legacy.Tests/Builders/CollectionOptionsBuilderTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,5 +89,29 @@ public void TestSetNone()
8989
var expected = "{ }".Replace("'", "\"");
9090
Assert.AreEqual(expected, options.ToJson());
9191
}
92+
93+
[Test]
94+
public void TestSetValidationAction()
95+
{
96+
var options = CollectionOptions.SetValidationAction(DocumentValidationAction.Error);
97+
var expected = "{ \"validationAction\" : \"error\" }";
98+
Assert.AreEqual(expected, options.ToJson());
99+
}
100+
101+
[Test]
102+
public void TestSetValidationLevel()
103+
{
104+
var options = CollectionOptions.SetValidationLevel(DocumentValidationLevel.Strict);
105+
var expected = "{ \"validationLevel\" : \"strict\" }";
106+
Assert.AreEqual(expected, options.ToJson());
107+
}
108+
109+
[Test]
110+
public void TestSetValidator()
111+
{
112+
var options = CollectionOptions.SetValidator(new QueryDocument("_id", new BsonDocument("$exists", true)));
113+
var expected = "{ \"validator\" : { \"_id\" : { \"$exists\" : true } } }";
114+
Assert.AreEqual(expected, options.ToJson());
115+
}
92116
}
93117
}

src/MongoDB.Driver.Legacy.Tests/MongoDatabaseTests.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,27 @@ public void TestCreateCollectionSetStorageEngine()
9292
Assert.AreEqual(storageEngineOptions, resultCollection["options"]["storageEngine"]);
9393
}
9494

95+
[Test]
96+
[RequiresServer(MinimumVersion = "3.2.0-rc0")]
97+
public void TestCreateCollectionSetValidator()
98+
{
99+
var collection = _database.GetCollection("testvalidation");
100+
collection.Drop();
101+
Assert.IsFalse(collection.Exists());
102+
var options = CollectionOptions
103+
.SetValidator(new QueryDocument("_id", new BsonDocument("$exists", true)))
104+
.SetValidationAction(DocumentValidationAction.Error)
105+
.SetValidationLevel(DocumentValidationLevel.Strict);
106+
107+
_database.CreateCollection(collection.Name, options);
108+
109+
var commandResult = _database.RunCommand("listCollections");
110+
var collectionInfo = commandResult.Response["cursor"]["firstBatch"].AsBsonArray.Where(c => c["name"] == collection.Name).Single();
111+
Assert.That(collectionInfo["options"]["validator"], Is.EqualTo(new BsonDocument("_id", new BsonDocument("$exists", true))));
112+
Assert.That(collectionInfo["options"]["validationAction"].AsString, Is.EqualTo("error"));
113+
Assert.That(collectionInfo["options"]["validationLevel"].AsString, Is.EqualTo("strict"));
114+
}
115+
95116
[Test]
96117
public void TestDropCollection()
97118
{

src/MongoDB.Driver.Legacy/Builders/CollectionOptionsBuilder.cs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,35 @@ public static CollectionOptionsBuilder SetStorageEngineOptions(BsonDocument valu
8585
{
8686
return new CollectionOptionsBuilder().SetStorageEngineOptions(value);
8787
}
88+
/// <summary>
89+
/// Sets the validation action.
90+
/// </summary>
91+
/// <param name="validationAction">The validation action.</param>
92+
/// <returns>The builder (so method calls can be chained).</returns>
93+
public static CollectionOptionsBuilder SetValidationAction(DocumentValidationAction validationAction)
94+
{
95+
return new CollectionOptionsBuilder().SetValidationAction(validationAction);
96+
}
97+
98+
/// <summary>
99+
/// Sets the validation level.
100+
/// </summary>
101+
/// <param name="validationLevel">The validation level.</param>
102+
/// <returns>The builder (so method calls can be chained).</returns>
103+
public static CollectionOptionsBuilder SetValidationLevel(DocumentValidationLevel validationLevel)
104+
{
105+
return new CollectionOptionsBuilder().SetValidationLevel(validationLevel);
106+
}
107+
108+
/// <summary>
109+
/// Sets the validator.
110+
/// </summary>
111+
/// <param name="validator">The validator.</param>
112+
/// <returns>The builder (so method calls can be chained).</returns>
113+
public static CollectionOptionsBuilder SetValidator(IMongoQuery validator)
114+
{
115+
return new CollectionOptionsBuilder().SetValidator(validator);
116+
}
88117
}
89118

90119
/// <summary>
@@ -162,6 +191,39 @@ public CollectionOptionsBuilder SetStorageEngineOptions(BsonDocument value)
162191
return this;
163192
}
164193

194+
/// <summary>
195+
/// Sets the validation action.
196+
/// </summary>
197+
/// <param name="validationAction">The validation action.</param>
198+
/// <returns>The builder (so method calls can be chained).</returns>
199+
public CollectionOptionsBuilder SetValidationAction(DocumentValidationAction validationAction)
200+
{
201+
_document["validationAction"] = validationAction.ToString().ToLowerInvariant();
202+
return this;
203+
}
204+
205+
/// <summary>
206+
/// Sets the validation level.
207+
/// </summary>
208+
/// <param name="validationLevel">The validation level.</param>
209+
/// <returns>The builder (so method calls can be chained).</returns>
210+
public CollectionOptionsBuilder SetValidationLevel(DocumentValidationLevel validationLevel)
211+
{
212+
_document["validationLevel"] = validationLevel.ToString().ToLowerInvariant();
213+
return this;
214+
}
215+
216+
/// <summary>
217+
/// Sets the validator.
218+
/// </summary>
219+
/// <param name="validator">The validator.</param>
220+
/// <returns>The builder (so method calls can be chained).</returns>
221+
public CollectionOptionsBuilder SetValidator(IMongoQuery validator)
222+
{
223+
_document["validator"] = validator.ToBsonDocument();
224+
return this;
225+
}
226+
165227
/// <summary>
166228
/// Returns the result of the builder as a BsonDocument.
167229
/// </summary>

src/MongoDB.Driver.Legacy/MongoDatabase.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ public virtual CommandResult CreateCollection(string collectionName, IMongoColle
211211
long? maxSize = null;
212212
BsonDocument storageEngine = null;
213213
bool? usePowerOf2Sizes = null;
214+
DocumentValidationAction? validationAction = null;
215+
DocumentValidationLevel? validationLevel = null;
216+
BsonDocument validator = null;
214217

215218
if (options != null)
216219
{
@@ -241,6 +244,18 @@ public virtual CommandResult CreateCollection(string collectionName, IMongoColle
241244
{
242245
usePowerOf2Sizes = value.ToInt32() == 1;
243246
}
247+
if (optionsDocument.TryGetValue("validationAction", out value))
248+
{
249+
validationAction = (DocumentValidationAction)Enum.Parse(typeof(DocumentValidationAction), value.AsString, ignoreCase: true);
250+
}
251+
if (optionsDocument.TryGetValue("validationLevel", out value))
252+
{
253+
validationLevel = (DocumentValidationLevel)Enum.Parse(typeof(DocumentValidationLevel), value.AsString, ignoreCase: true);
254+
}
255+
if (optionsDocument.TryGetValue("validator", out value))
256+
{
257+
validator = value.AsBsonDocument;
258+
}
244259
}
245260

246261
var operation = new CreateCollectionOperation(collectionNamespace, messageEncoderSettings)
@@ -250,7 +265,10 @@ public virtual CommandResult CreateCollection(string collectionName, IMongoColle
250265
MaxDocuments = maxDocuments,
251266
MaxSize = maxSize,
252267
StorageEngine = storageEngine,
253-
UsePowerOf2Sizes = usePowerOf2Sizes
268+
UsePowerOf2Sizes = usePowerOf2Sizes,
269+
ValidationAction = validationAction,
270+
ValidationLevel = validationLevel,
271+
Validator = validator
254272
};
255273

256274
var response = ExecuteWriteOperation(operation);

0 commit comments

Comments
 (0)