11package grails.mongodb.bootstrap
22
33import com.mongodb.client.MongoClient
4+ import de.flapdoodle.embed.mongo.commands.ServerAddress
5+ import de.flapdoodle.embed.mongo.distribution.Version
6+ import de.flapdoodle.embed.mongo.transitions.ImmutableMongod
7+ import de.flapdoodle.embed.mongo.transitions.Mongod
8+ import de.flapdoodle.embed.mongo.transitions.RunningMongodProcess
9+ import de.flapdoodle.reverse.TransitionWalker
10+ import spock.lang.Shared
11+
412import grails.mongodb.MongoEntity
513import grails.mongodb.geo.Point
614import grails.persistence.Entity
715import org.bson.Document
16+
17+ import grails.validation.ValidationException
18+
819import org.grails.datastore.gorm.mongo.Birthday
920import org.grails.datastore.gorm.mongo.BirthdayCodec
21+ import org.grails.datastore.mapping.config.Settings
22+ import org.grails.datastore.mapping.core.DatastoreUtils
1023import org.grails.datastore.mapping.engine.types.AbstractMappingAwareCustomTypeMarshaller
1124import org.grails.datastore.mapping.model.MappingContext
1225import org.grails.datastore.mapping.model.PersistentProperty
1326import org.grails.datastore.mapping.mongo.MongoDatastore
1427import org.grails.datastore.mapping.mongo.config.MongoMappingContext
28+ import org.grails.datastore.mapping.mongo.config.MongoSettings
1529import org.grails.datastore.mapping.query.Query
1630import org.springframework.context.annotation.AnnotationConfigApplicationContext
1731import spock.lang.Ignore
@@ -23,9 +37,40 @@ import spock.lang.Specification
2337 */
2438class MongoDbDataStoreSpringInitializerSpec extends Specification {
2539
40+ @Shared
41+ Map config
42+
43+ @Shared
44+ protected TransitionWalker.ReachedState < RunningMongodProcess > running
45+
46+ @Shared
47+ protected ServerAddress serverAddress
48+
49+ void setupSpec () {
50+ ImmutableMongod mongodbConfig = Mongod . instance()
51+ Version.Main version = Version.Main . V7_0
52+
53+ this . running = mongodbConfig. start(version)
54+ this . serverAddress = running. current(). getServerAddress()
55+
56+ this . config = [
57+ (Settings . SETTING_FAIL_ON_ERROR ): true ,
58+ (MongoSettings . SETTING_URL ) : " mongodb://$serverAddress " . toString()
59+ ]
60+ }
61+
62+ void cleanupSpec () {
63+ this . serverAddress = null
64+ if (this . running != null ) {
65+ this . running. close()
66+ }
67+ this . running = null
68+ this . config. clear()
69+ }
70+
2671 void " Test that MongoDbDatastoreSpringInitializer can setup GORM for MongoDB from scratch" () {
2772 when :" the initializer used to setup GORM for MongoDB"
28- def initializer = new MongoDbDataStoreSpringInitializer (Person )
73+ def initializer = new MongoDbDataStoreSpringInitializer (DatastoreUtils . createPropertyResolver(config), Person )
2974 def applicationContext = initializer. configure()
3075 def mongo = applicationContext. getBean(MongoClient )
3176 mongo. getDatabase(MongoDbDataStoreSpringInitializer . DEFAULT_DATABASE_NAME ). drop()
@@ -37,7 +82,8 @@ class MongoDbDataStoreSpringInitializerSpec extends Specification{
3782
3883 void " Test specify mongo database name settings" () {
3984 when :" the initializer used to setup GORM for MongoDB"
40- def initializer = new MongoDbDataStoreSpringInitializer ([' grails.mongodb.databaseName' :' foo' ],Person )
85+ config[' grails.mongodb.databaseName' ] = ' foo'
86+ def initializer = new MongoDbDataStoreSpringInitializer (DatastoreUtils . createPropertyResolver(config), Person )
4187 def applicationContext = initializer. configure()
4288 def mongoDatastore = applicationContext. getBean(MongoDatastore )
4389
@@ -50,7 +96,8 @@ class MongoDbDataStoreSpringInitializerSpec extends Specification{
5096
5197 void " Test the alias is created when it is the primary datastore" () {
5298 when :" the initializer used to setup GORM for MongoDB"
53- def initializer = new MongoDbDataStoreSpringInitializer ([' grails.mongodb.databaseName' :' foo' ],Person )
99+ config[' grails.mongodb.databaseName' ] = ' foo'
100+ def initializer = new MongoDbDataStoreSpringInitializer (DatastoreUtils . createPropertyResolver(config), Person )
54101 def applicationContext = initializer. configure()
55102 def mongoDatastore = applicationContext. getBean(MongoDatastore )
56103
@@ -63,7 +110,8 @@ class MongoDbDataStoreSpringInitializerSpec extends Specification{
63110
64111 void " Test the alias is not created when it is the secondary datastore" () {
65112 when :" the initializer used to setup GORM for MongoDB"
66- def initializer = new MongoDbDataStoreSpringInitializer ([' grails.mongodb.databaseName' :' foo' ],Person )
113+ config[' grails.mongodb.databaseName' ] = ' foo'
114+ def initializer = new MongoDbDataStoreSpringInitializer (DatastoreUtils . createPropertyResolver(config), Person )
67115 initializer. setSecondaryDatastore(true )
68116 def applicationContext = initializer. configure()
69117 def mongoDatastore = applicationContext. getBean(MongoDatastore )
@@ -79,7 +127,7 @@ class MongoDbDataStoreSpringInitializerSpec extends Specification{
79127 @Ignore // The MongoDB API for this test has been altered / removed with no apparent replacement for getting the number of pooled connections in use
80128 void " Test withTransaction returns connections when used without session handling" () {
81129 given :" the initializer used to setup GORM for MongoDB"
82- def initializer = new MongoDbDataStoreSpringInitializer (Person )
130+ def initializer = new MongoDbDataStoreSpringInitializer (DatastoreUtils . createPropertyResolver(config), Person )
83131 def applicationContext = initializer. configure()
84132 def mongo = applicationContext. getBean(Mongo )
85133
@@ -100,16 +148,15 @@ class MongoDbDataStoreSpringInitializerSpec extends Specification{
100148
101149 void " Test that constraints and Geo types work" () {
102150 given :" the initializer used to setup GORM for MongoDB"
103- def initializer = new MongoDbDataStoreSpringInitializer (Person )
151+ def initializer = new MongoDbDataStoreSpringInitializer (DatastoreUtils . createPropertyResolver(config), Person )
104152 initializer. configure()
105153 Person . DB . drop()
106154
107155 when :" we try to persist an invalid object"
108156 def p = new Person (). save(flush :true )
109157
110- then :" The object is null and not persisted"
111- p == null
112- Person . count() == 0
158+ then :" Throw ValidationException"
159+ thrown(ValidationException )
113160
114161 when :" We persist a Geo type"
115162 Person . withNewSession {
@@ -126,7 +173,7 @@ class MongoDbDataStoreSpringInitializerSpec extends Specification{
126173 @Ignore
127174 void " Test custom codecs from Spring" () {
128175 given :" the initializer used to setup GORM for MongoDB"
129- def initializer = new MongoDbDataStoreSpringInitializer (Person )
176+ def initializer = new MongoDbDataStoreSpringInitializer (DatastoreUtils . createPropertyResolver(config), Person )
130177 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext ()
131178 applicationContext. beanFactory. registerSingleton(" birthdayCodec" , new BirthdayCodec ())
132179
@@ -146,7 +193,7 @@ class MongoDbDataStoreSpringInitializerSpec extends Specification{
146193 @Ignore
147194 void " Test custom type marshallers from Spring" () {
148195 given :" the initializer used to setup GORM for MongoDB"
149- def initializer = new MongoDbDataStoreSpringInitializer (Person )
196+ def initializer = new MongoDbDataStoreSpringInitializer (DatastoreUtils . createPropertyResolver(config), Person )
150197 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext ()
151198 applicationContext. beanFactory. registerSingleton(" birthdayMarshaller" , new BirthdayCustomTypeMarshaller ())
152199
0 commit comments