Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#35] Migrate project to start using testcontainers #45

Merged
merged 4 commits into from
Jan 4, 2021
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
7 changes: 0 additions & 7 deletions mongo/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,6 @@
<scope>test</scope>
</dependency>

<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>2.2.0</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
Expand Down

This file was deleted.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -17,76 +17,44 @@
package org.axonframework.extensions.mongo.eventsourcing.eventstore;

import com.mongodb.BasicDBObject;
import com.mongodb.client.MongoClient;
import de.flapdoodle.embed.mongo.MongodExecutable;
import de.flapdoodle.embed.mongo.MongodProcess;
import org.axonframework.common.jdbc.PersistenceExceptionResolver;
import org.axonframework.eventsourcing.eventstore.AbstractEventStorageEngine;
import org.axonframework.extensions.mongo.DefaultMongoTemplate;
import org.axonframework.extensions.mongo.MongoTestContext;
import org.axonframework.extensions.mongo.utils.MongoLauncher;
import org.axonframework.extensions.mongo.MongoTemplate;
import org.axonframework.extensions.mongo.util.MongoTemplateFactory;
import org.axonframework.serialization.upcasting.event.EventUpcaster;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

import java.io.IOException;
import java.util.Optional;

import static org.axonframework.eventsourcing.utils.EventStoreTestUtils.AGGREGATE;
import static org.axonframework.eventsourcing.utils.EventStoreTestUtils.createEvent;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.*;

/**
* Test class validating the {@link MongoEventStorageEngine}.
*
* @author Rene de Waele
*/
@DirtiesContext
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = MongoTestContext.class)
@Testcontainers
class MongoEventStorageEngineTest extends AbstractMongoEventStorageEngineTest {

private static MongodExecutable mongoExe;
private static MongodProcess mongod;

@Autowired
private ApplicationContext context;
private DefaultMongoTemplate mongoTemplate;
@Container
private static final MongoDBContainer MONGO_CONTAINER = new MongoDBContainer("mongo");

private MongoTemplate mongoTemplate;
private MongoEventStorageEngine testSubject;

@BeforeAll
static void start() throws IOException {
mongoExe = MongoLauncher.prepareExecutable();
mongod = mongoExe.start();
}

@AfterAll
static void shutdown() {
if (mongod != null) {
mongod.stop();
}
if (mongoExe != null) {
mongoExe.stop();
}
}

@BeforeEach
void setUp() {
MongoClient mongoClient = null;
try {
mongoClient = context.getBean(MongoClient.class);
} catch (Exception e) {
assumeTrue(true, "No Mongo instance found. Ignoring test.");
}
mongoTemplate = DefaultMongoTemplate.builder().mongoDatabase(mongoClient).build();
testSubject = context.getBean(MongoEventStorageEngine.class);
mongoTemplate = MongoTemplateFactory.build(
MONGO_CONTAINER.getHost(), MONGO_CONTAINER.getFirstMappedPort()
);
testSubject = MongoEventStorageEngine.builder()
.mongoTemplate(mongoTemplate)
.build();
setTestSubject(testSubject);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,84 +17,51 @@
package org.axonframework.extensions.mongo.eventsourcing.eventstore;

import com.mongodb.BasicDBObject;
import com.mongodb.client.MongoClient;
import com.mongodb.WriteConcern;
import de.flapdoodle.embed.mongo.MongodExecutable;
import de.flapdoodle.embed.mongo.MongodProcess;
import org.axonframework.common.jdbc.PersistenceExceptionResolver;
import org.axonframework.eventsourcing.eventstore.AbstractEventStorageEngine;
import org.axonframework.extensions.mongo.DefaultMongoTemplate;
import org.axonframework.extensions.mongo.MongoTemplate;
import org.axonframework.extensions.mongo.serialization.DBObjectXStreamSerializer;
import org.axonframework.extensions.mongo.utils.MongoLauncher;
import org.axonframework.extensions.mongo.util.MongoTemplateFactory;
import org.axonframework.serialization.Serializer;
import org.axonframework.serialization.upcasting.event.EventUpcaster;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.transaction.PlatformTransactionManager;

import java.io.IOException;

import static org.junit.jupiter.api.Assumptions.*;
import static org.mockito.Mockito.*;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

/**
* Test class validating the {@link MongoEventStorageEngine} with the {@link DBObjectXStreamSerializer}.
*
* @author Rene de Waele
*/
@DirtiesContext
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = MongoEventStorageEngineTest_DBObjectSerialization.TestContext.class)
@Testcontainers
class MongoEventStorageEngineTest_DBObjectSerialization extends AbstractMongoEventStorageEngineTest {

private static MongodExecutable mongoExe;
private static MongodProcess mongod;

@Autowired
private ApplicationContext context;
private DefaultMongoTemplate mongoTemplate;
@Container
private static final MongoDBContainer MONGO_CONTAINER = new MongoDBContainer("mongo");
private static final Serializer DB_OBJECT_XSTREAM_SERIALIZER = DBObjectXStreamSerializer.builder().build();

private MongoTemplate mongoTemplate;
@SuppressWarnings("FieldCanBeLocal")
private MongoEventStorageEngine testSubject;

@BeforeAll
static void start() throws IOException {
mongoExe = MongoLauncher.prepareExecutable();
mongod = mongoExe.start();
}

@AfterAll
static void shutdown() {
if (mongod != null) {
mongod.stop();
}
if (mongoExe != null) {
mongoExe.stop();
}
}

@BeforeEach
void setUp() {
MongoClient mongoClient = null;
try {
mongoClient = context.getBean(MongoClient.class);
} catch (Exception e) {
assumeTrue(true, "No Mongo instance found. Ignoring test.");
}
mongoTemplate = DefaultMongoTemplate.builder().mongoDatabase(mongoClient).build();
mongoTemplate = MongoTemplateFactory.build(
MONGO_CONTAINER.getHost(), MONGO_CONTAINER.getFirstMappedPort(),
mongoSettingsFactory -> mongoSettingsFactory.setWriteConcern(WriteConcern.JOURNALED)
);
mongoTemplate.eventCollection().deleteMany(new BasicDBObject());
mongoTemplate.snapshotCollection().deleteMany(new BasicDBObject());
mongoTemplate.eventCollection().dropIndexes();
mongoTemplate.snapshotCollection().dropIndexes();
testSubject = context.getBean(MongoEventStorageEngine.class);

testSubject = MongoEventStorageEngine.builder()
.snapshotSerializer(DB_OBJECT_XSTREAM_SERIALIZER)
.eventSerializer(DB_OBJECT_XSTREAM_SERIALIZER)
.mongoTemplate(mongoTemplate)
.build();
setTestSubject(testSubject);
}

Expand All @@ -109,74 +76,21 @@ public void tearDown() {

@Override
protected AbstractEventStorageEngine createEngine(EventUpcaster upcasterChain) {
Serializer serializer = context.getBean(Serializer.class);
return MongoEventStorageEngine.builder()
.snapshotSerializer(serializer)
.snapshotSerializer(DB_OBJECT_XSTREAM_SERIALIZER)
.upcasterChain(upcasterChain)
.eventSerializer(serializer)
.eventSerializer(DB_OBJECT_XSTREAM_SERIALIZER)
.mongoTemplate(mongoTemplate)
.build();
}

@Override
protected AbstractEventStorageEngine createEngine(PersistenceExceptionResolver persistenceExceptionResolver) {
Serializer serializer = context.getBean(Serializer.class);
return MongoEventStorageEngine.builder()
.snapshotSerializer(serializer)
.snapshotSerializer(DB_OBJECT_XSTREAM_SERIALIZER)
.persistenceExceptionResolver(persistenceExceptionResolver)
.eventSerializer(serializer)
.eventSerializer(DB_OBJECT_XSTREAM_SERIALIZER)
.mongoTemplate(mongoTemplate)
.build();
}

@Configuration
public static class TestContext {

@Bean
public MongoEventStorageEngine mongoEventStorageEngine(Serializer serializer, MongoTemplate mongoTemplate) {
return MongoEventStorageEngine.builder()
.snapshotSerializer(serializer)
.eventSerializer(serializer)
.mongoTemplate(mongoTemplate)
.build();
}

@Bean
public Serializer serializer() {
return DBObjectXStreamSerializer.builder().build();
}

@Bean
public MongoTemplate mongoTemplate(MongoClient mongoClient) {
return DefaultMongoTemplate.builder()
.mongoDatabase(mongoClient)
.build();
}

@Bean
public MongoClient mongoClient(MongoFactory mongoFactory) {
return mongoFactory.createMongo();
}

@Bean
public MongoFactory mongoFactoryBean(MongoSettingsFactory mongoSettingsFactory) {
MongoFactory mongoFactory = new MongoFactory();
mongoFactory.setMongoClientSettings(mongoSettingsFactory.createMongoClientSettings());

return mongoFactory;
}

@Bean
public MongoSettingsFactory mongoSettingsFactory() {
MongoSettingsFactory mongoSettingsFactory = new MongoSettingsFactory();
mongoSettingsFactory.setConnectionsPerHost(100);
mongoSettingsFactory.setWriteConcern(WriteConcern.JOURNALED);
return mongoSettingsFactory;
}

@Bean
public PlatformTransactionManager transactionManager() {
return mock(PlatformTransactionManager.class);
}
}
}
Loading