Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,27 @@ public static Object findOneAndDelete(Object mongoCollection, @ThirdPartyCast(ac
return handleDelete("findOneAndDeleteClientSessionBsonFindOneAndDeleteOptions", mongoCollection, Arrays.asList(clientSession, filter, options), filter);
}

@Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO)
public static Object findOneAndUpdate(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update) {
return handleUpdate("findOneAndUpdateBson", mongoCollection, Arrays.asList(filter, update), filter);
}

@Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateBsonFindOneAndUpdateOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO)
public static Object findOneAndUpdate(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update, @ThirdPartyCast(actualType = "com.mongodb.client.model.FindOneAndUpdateOptions") Object options) {
return handleUpdate("findOneAndUpdateBsonFindOneAndUpdateOptions", mongoCollection, Arrays.asList(filter, update, options), filter);
}

@Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateClientSessionBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO)
public static Object findOneAndUpdate_EM_0(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update) {
return handleUpdate("findOneAndUpdateClientSessionBson", mongoCollection, Arrays.asList(clientSession, filter, update), filter);
}

@Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateClientSessionBsonFindOneAndUpdateOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO)
public static Object findOneAndUpdate(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update, @ThirdPartyCast(actualType = "com.mongodb.client.model.FindOneAndUpdateOptions") Object options) {
return handleUpdate("findOneAndUpdateClientSessionBsonFindOneAndUpdateOptions", mongoCollection, Arrays.asList(clientSession, filter, update, options), filter);
}


/**
* Processes the count handling based on the provided parameters.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,4 +109,25 @@ public static Object updateMany(Object mongoCollection, @ThirdPartyCast(actualTy
return handleEagerQuery(singleton, "updateManyClientSessionBsonPipelineUpdateOptions", mongoCollection, Arrays.asList(clientSession, filter, pipeline, options), filter);
}

@Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateBsonPipeline", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO)
public static Object findOneAndUpdate(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, List<?> pipeline) {
return handleEagerQuery(singleton,"findOneAndUpdateBsonPipeline", mongoCollection, Arrays.asList(filter, pipeline), filter);
}

@Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateBsonPipelineFindOneAndUpdateOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO)
public static Object findOneAndUpdate(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, List<?> pipeline, @ThirdPartyCast(actualType = "com.mongodb.client.model.FindOneAndUpdateOptions") Object options) {
return handleEagerQuery(singleton,"findOneAndUpdateBsonPipelineFindOneAndUpdateOptions", mongoCollection, Arrays.asList(filter, pipeline, options), filter);
}

@Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateClientSessionBsonPipeline", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO)
public static Object findOneAndUpdate(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, List<?> pipeline) {
return handleEagerQuery(singleton,"findOneAndUpdateClientSessionBsonPipeline", mongoCollection, Arrays.asList(clientSession, filter, pipeline), filter);
}

@Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateClientSessionBsonPipelineFindOneAndUpdateOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO)
public static Object findOneAndUpdate(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, List<?> pipeline, @ThirdPartyCast(actualType = "com.mongodb.client.model.FindOneAndUpdateOptions") Object options) {
return handleEagerQuery(singleton,"findOneAndUpdateClientSessionBsonPipelineFindOneAndUpdateOptions", mongoCollection, Arrays.asList(clientSession, filter, pipeline, options), filter);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.mongodb.MongoQueryException;
import com.mongodb.client.*;
import com.mongodb.client.model.DeleteOptions;
import com.mongodb.client.model.FindOneAndUpdateOptions;
import com.mongodb.client.model.FindOneAndDeleteOptions;
import com.mongodb.client.result.DeleteResult;
import org.bson.BsonDocument;
Expand Down Expand Up @@ -621,4 +622,102 @@ public void testFindOneAndDeleteWithInvalidFilter() {
BsonDocument retrievedQuery = assertSingleRecordedCommand(false);
assertEquals(-1, retrievedQuery.getDocument("tags").getInt32("$size").getValue());
}

@Test
public void testFindOneAndUpdateWithFilter() {
final MongoCollection<Document> collection = getMongoCollection();
insertPerson("John Doe", 30);
insertPerson("Jim Roe", 25);

ExecutionTracer.setExecutingInitMongo(false);
Document found = (Document) MongoCollectionClassReplacement.findOneAndUpdate(collection, new Document("age", 30), setVerified());

assertNotNull(found);
assertEquals("John Doe", found.getString("name"));
assertEquals(1, collection.countDocuments(new Document("verified", true)));
BsonDocument retrievedQuery = assertSingleRecordedCommand(true);
assertEquals(30, retrievedQuery.getInt32("age").getValue());
}

@Test
public void testFindOneAndUpdateWithFilterAndOptions() {
final MongoCollection<Document> collection = getMongoCollection();
insertPerson("John Doe", 30);
insertPerson("Jim Roe", 25);

ExecutionTracer.setExecutingInitMongo(false);
Document found = (Document) MongoCollectionClassReplacement.findOneAndUpdate(collection, new Document("age", 30), setVerified(), new FindOneAndUpdateOptions());

assertNotNull(found);
assertEquals("John Doe", found.getString("name"));
assertEquals(1, collection.countDocuments(new Document("verified", true)));
BsonDocument retrievedQuery = assertSingleRecordedCommand(true);
assertEquals(30, retrievedQuery.getInt32("age").getValue());
}

@Test
public void testFindOneAndUpdateWithClientSessionAndFilter() {
try (ClientSession clientSession = mongoClient.startSession()) {
final MongoCollection<Document> collection = getMongoCollection();
insertPerson("John Doe", 30);
insertPerson("Jim Roe", 25);

ExecutionTracer.setExecutingInitMongo(false);
Document found = (Document) MongoCollectionClassReplacement.findOneAndUpdate_EM_0(collection, clientSession, new Document("age", 30), setVerified());

assertNotNull(found);
assertEquals("John Doe", found.getString("name"));
assertEquals(1, collection.countDocuments(new Document("verified", true)));
BsonDocument retrievedQuery = assertSingleRecordedCommand(true);
assertEquals(30, retrievedQuery.getInt32("age").getValue());
}
}

@Test
public void testFindOneAndUpdateWithClientSessionFilterAndOptions() {
try (ClientSession clientSession = mongoClient.startSession()) {
final MongoCollection<Document> collection = getMongoCollection();
insertPerson("John Doe", 30);
insertPerson("Jim Roe", 25);

ExecutionTracer.setExecutingInitMongo(false);
Document found = (Document) MongoCollectionClassReplacement.findOneAndUpdate(collection, clientSession, new Document("age", 30), setVerified(), new FindOneAndUpdateOptions());

assertNotNull(found);
assertEquals("John Doe", found.getString("name"));
assertEquals(1, collection.countDocuments(new Document("verified", true)));
BsonDocument retrievedQuery = assertSingleRecordedCommand(true);
assertEquals(30, retrievedQuery.getInt32("age").getValue());
}
}





@Test
public void testFindOneAndUpdateWithFilterNoMatch() {
final MongoCollection<Document> collection = getMongoCollection();

ExecutionTracer.setExecutingInitMongo(false);
Document found = (Document) MongoCollectionClassReplacement.findOneAndUpdate(collection, new Document("age", 99), setVerified());

assertNull(found);
BsonDocument retrievedQuery = assertSingleRecordedCommand(true);
assertEquals(99, retrievedQuery.getInt32("age").getValue());
}

@Test
public void testFindOneAndUpdateWithInvalidFilter() {
final MongoCollection<Document> collection = getMongoCollection();
insertPerson("John Doe", 30);

Document invalidFilter = new Document("tags", new Document("$size", -1));

ExecutionTracer.setExecutingInitMongo(false);
assertThrows(com.mongodb.MongoException.class, () -> MongoCollectionClassReplacement.findOneAndUpdate(collection, invalidFilter, setVerified()));

BsonDocument retrievedQuery = assertSingleRecordedCommand(false);
assertEquals(-1, retrievedQuery.getDocument("tags").getInt32("$size").getValue());
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.evomaster.client.java.instrumentation.coverage.methodreplacement.thirdpartyclasses;

import com.mongodb.client.*;
import com.mongodb.client.model.FindOneAndUpdateOptions;
import com.mongodb.client.model.UpdateOptions;
import com.mongodb.client.result.UpdateResult;
import org.bson.BsonDocument;
Expand Down Expand Up @@ -122,4 +123,75 @@ public void testUpdateOneWithFilterPipelineAndOptions() {
BsonDocument retrievedQuery = assertSingleRecordedCommand(true);
assertEquals(30, retrievedQuery.getInt32("age").getValue());
}

@Test
public void testFindOneAndUpdateWithClientSessionFilterAndPipeline() {
try (ClientSession clientSession = mongoClient.startSession()) {
final MongoCollection<Document> collection = getMongoCollection();
insertPerson("John Doe", 30);
insertPerson("Jim Roe", 25);

ExecutionTracer.setExecutingInitMongo(false);
Document found = (Document) MongoCollectionPipelineUpdateClassReplacement.findOneAndUpdate(collection, clientSession, new Document("age", 30), verifiedPipeline());

assertNotNull(found);
assertEquals("John Doe", found.getString("name"));
assertEquals(1, collection.countDocuments(new Document("verified", true)));
BsonDocument retrievedQuery = assertSingleRecordedCommand(true);
assertEquals(30, retrievedQuery.getInt32("age").getValue());
}
}


@Test
public void testFindOneAndUpdateWithClientSessionFilterPipelineAndOptions() {
try (ClientSession clientSession = mongoClient.startSession()) {
final MongoCollection<Document> collection = getMongoCollection();
insertPerson("John Doe", 30);
insertPerson("Jim Roe", 25);

ExecutionTracer.setExecutingInitMongo(false);
Document found = (Document) MongoCollectionPipelineUpdateClassReplacement.findOneAndUpdate(collection, clientSession, new Document("age", 30), verifiedPipeline(), new FindOneAndUpdateOptions());

assertNotNull(found);
assertEquals("John Doe", found.getString("name"));
assertEquals(1, collection.countDocuments(new Document("verified", true)));
BsonDocument retrievedQuery = assertSingleRecordedCommand(true);
assertEquals(30, retrievedQuery.getInt32("age").getValue());
}
}

@Test
public void testFindOneAndUpdateWithFilterAndPipeline() {
final MongoCollection<Document> collection = getMongoCollection();
insertPerson("John Doe", 30);
insertPerson("Jim Roe", 25);

ExecutionTracer.setExecutingInitMongo(false);
Document found = (Document) MongoCollectionPipelineUpdateClassReplacement.findOneAndUpdate(collection, new Document("age", 30), verifiedPipeline());

assertNotNull(found);
assertEquals("John Doe", found.getString("name"));
assertEquals(1, collection.countDocuments(new Document("verified", true)));
BsonDocument retrievedQuery = assertSingleRecordedCommand(true);
assertEquals(30, retrievedQuery.getInt32("age").getValue());
}


@Test
public void testFindOneAndUpdateWithFilterPipelineAndOptions() {
final MongoCollection<Document> collection = getMongoCollection();
insertPerson("John Doe", 30);
insertPerson("Jim Roe", 25);

ExecutionTracer.setExecutingInitMongo(false);
Document found = (Document) MongoCollectionPipelineUpdateClassReplacement.findOneAndUpdate(collection, new Document("age", 30), verifiedPipeline(), new FindOneAndUpdateOptions());

assertNotNull(found);
assertEquals("John Doe", found.getString("name"));
assertEquals(1, collection.countDocuments(new Document("verified", true)));
BsonDocument retrievedQuery = assertSingleRecordedCommand(true);
assertEquals(30, retrievedQuery.getInt32("age").getValue());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.mongo.findoneandupdate;

import com.mongo.SwaggerConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@EnableSwagger2
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
public class MongoFindOneAndUpdateApp extends SwaggerConfiguration {
public MongoFindOneAndUpdateApp() {
super("mongofindoneandupdate");
}

public static void main(String[] args) {
SpringApplication.run(MongoFindOneAndUpdateApp.class, args);
}

}
Loading
Loading