/* * Copyright 2015 MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.mongodb.client; import org.bson.BsonArray; import org.bson.BsonDocument; import org.bson.BsonValue; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import util.JsonPoweredTestHelper; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import static com.mongodb.ClusterFixture.serverVersionGreaterThan; import static com.mongodb.ClusterFixture.serverVersionLessThan; import static org.junit.Assert.assertEquals; // See https://github.com/mongodb/specifications/tree/master/source/crud/tests @RunWith(Parameterized.class) public class CrudTest extends DatabaseTestCase { private final String filename; private final String description; private final BsonArray data; private final BsonDocument definition; private MongoCollection<BsonDocument> collection; private JsonPoweredCrudTestHelper helper; public CrudTest(final String filename, final String description, final BsonArray data, final BsonDocument definition) { this.filename = filename; this.description = description; this.data = data; this.definition = definition; } @Before public void setUp() { super.setUp(); List<BsonDocument> documents = new ArrayList<BsonDocument>(); for (BsonValue document: data) { documents.add(document.asDocument()); } getCollectionHelper().insertDocuments(documents); collection = database.getCollection(getClass().getName(), BsonDocument.class); helper = new JsonPoweredCrudTestHelper(description, collection); } @Test public void shouldPassAllOutcomes() { BsonDocument outcome = helper.getOperationResults(definition.getDocument("operation")); BsonDocument expectedOutcome = definition.getDocument("outcome"); assertEquals(description, expectedOutcome.get("result"), outcome.get("result")); if (expectedOutcome.containsKey("collection")) { assertCollectionEquals(expectedOutcome.getDocument("collection")); } } @Parameterized.Parameters(name = "{1}") public static Collection<Object[]> data() throws URISyntaxException, IOException { List<Object[]> data = new ArrayList<Object[]>(); for (File file : JsonPoweredTestHelper.getTestFiles("/crud")) { BsonDocument testDocument = util.JsonPoweredTestHelper.getTestDocument(file); if (testDocument.containsKey("minServerVersion") && serverVersionLessThan(testDocument.getString("minServerVersion").getValue())) { continue; } if (testDocument.containsKey("maxServerVersion") && serverVersionGreaterThan(testDocument.getString("maxServerVersion").getValue())) { continue; } for (BsonValue test: testDocument.getArray("tests")) { data.add(new Object[]{file.getName(), test.asDocument().getString("description").getValue(), testDocument.getArray("data"), test.asDocument()}); } } return data; } private void assertCollectionEquals(final BsonDocument expectedCollection) { MongoCollection<BsonDocument> collectionToCompare = collection; if (expectedCollection.containsKey("name")) { collectionToCompare = database.getCollection(expectedCollection.getString("name").getValue(), BsonDocument.class); } assertEquals(description, expectedCollection.getArray("data"), collectionToCompare.find().into(new BsonArray())); } }