2020
2121import java .util .Collections ;
2222import java .util .Date ;
23+ import java .util .List ;
2324import java .util .concurrent .TimeUnit ;
2425
2526import org .junit .jupiter .api .BeforeEach ;
4647import com .mongodb .MongoException ;
4748import com .mongodb .client .MongoCollection ;
4849import com .mongodb .client .MongoDatabase ;
50+ import com .mongodb .client .model .CreateIndexOptions ;
51+ import com .mongodb .client .model .IndexModel ;
4952import com .mongodb .client .model .IndexOptions ;
5053
5154/**
@@ -67,25 +70,22 @@ public class MongoPersistentEntityIndexCreatorUnitTests {
6770 private @ Mock MongoCollection <org .bson .Document > collection ;
6871 private MongoTemplate mongoTemplate ;
6972
70- private ArgumentCaptor <org .bson .Document > keysCaptor ;
71- private ArgumentCaptor <IndexOptions > optionsCaptor ;
73+ private ArgumentCaptor <List <IndexModel >> indexModelCaptor ;
7274 private ArgumentCaptor <String > collectionCaptor ;
7375
7476 @ BeforeEach
7577 void setUp () {
7678
77- keysCaptor = ArgumentCaptor .forClass (org .bson .Document .class );
78- optionsCaptor = ArgumentCaptor .forClass (IndexOptions .class );
7979 collectionCaptor = ArgumentCaptor .forClass (String .class );
80+ indexModelCaptor = ArgumentCaptor .forClass (List .class );
8081
8182 when (factory .getMongoDatabase ()).thenReturn (db );
8283 when (factory .getExceptionTranslator ()).thenReturn (new MongoExceptionTranslator ());
8384 when (db .getCollection (collectionCaptor .capture (), eq (org .bson .Document .class )))
8485 .thenReturn ((MongoCollection ) collection );
8586
8687 mongoTemplate = new MongoTemplate (factory );
87-
88- when (collection .createIndex (keysCaptor .capture (), optionsCaptor .capture ())).thenReturn ("OK" );
88+ when (collection .createIndexes (indexModelCaptor .capture (), any (CreateIndexOptions .class ))).thenReturn (List .of ("OK" ));
8989 }
9090
9191 @ Test
@@ -95,10 +95,12 @@ void buildsIndexDefinitionUsingFieldName() {
9595
9696 new MongoPersistentEntityIndexCreator (mappingContext , mongoTemplate );
9797
98- assertThat (keysCaptor .getValue ()).isNotNull ().containsKey ("fieldname" );
99- assertThat (optionsCaptor .getValue ().getName ()).isEqualTo ("indexName" );
100- assertThat (optionsCaptor .getValue ().isBackground ()).isFalse ();
101- assertThat (optionsCaptor .getValue ().getExpireAfter (TimeUnit .SECONDS )).isNull ();
98+ IndexModel indexModel = indexModelCaptor .getValue ().get (0 );
99+
100+ assertThat (indexModel .getKeys ().toBsonDocument ()).isNotNull ().containsKey ("fieldname" );
101+ assertThat (indexModel .getOptions ().getName ()).isEqualTo ("indexName" );
102+ assertThat (indexModel .getOptions ().isBackground ()).isFalse ();
103+ assertThat (indexModel .getOptions ().getExpireAfter (TimeUnit .SECONDS )).isNull ();
102104 }
103105
104106 @ Test
@@ -135,10 +137,12 @@ void triggersBackgroundIndexingIfConfigured() {
135137 MongoMappingContext mappingContext = prepareMappingContext (AnotherPerson .class );
136138 new MongoPersistentEntityIndexCreator (mappingContext , mongoTemplate );
137139
138- assertThat (keysCaptor .getValue ()).isNotNull ().containsKey ("lastname" );
139- assertThat (optionsCaptor .getValue ().getName ()).isEqualTo ("lastname" );
140- assertThat (optionsCaptor .getValue ().isBackground ()).isTrue ();
141- assertThat (optionsCaptor .getValue ().getExpireAfter (TimeUnit .SECONDS )).isNull ();
140+ IndexModel indexModel = indexModelCaptor .getValue ().get (0 );
141+
142+ assertThat (indexModel .getKeys ().toBsonDocument ()).isNotNull ().containsKey ("lastname" );
143+ assertThat (indexModel .getOptions ().getName ()).isEqualTo ("lastname" );
144+ assertThat (indexModel .getOptions ().isBackground ()).isTrue ();
145+ assertThat (indexModel .getOptions ().getExpireAfter (TimeUnit .SECONDS )).isNull ();
142146 }
143147
144148 @ Test // DATAMONGO-544
@@ -147,8 +151,10 @@ void expireAfterSecondsIfConfigured() {
147151 MongoMappingContext mappingContext = prepareMappingContext (Milk .class );
148152 new MongoPersistentEntityIndexCreator (mappingContext , mongoTemplate );
149153
150- assertThat (keysCaptor .getValue ()).isNotNull ().containsKey ("expiry" );
151- assertThat (optionsCaptor .getValue ().getExpireAfter (TimeUnit .SECONDS )).isEqualTo (60 );
154+ IndexModel indexModel = indexModelCaptor .getValue ().get (0 );
155+
156+ assertThat (indexModel .getKeys ().toBsonDocument ()).isNotNull ().containsKey ("expiry" );
157+ assertThat (indexModel .getOptions ().getExpireAfter (TimeUnit .SECONDS )).isEqualTo (60 );
152158 }
153159
154160 @ Test // DATAMONGO-899
@@ -157,9 +163,11 @@ void createsNotNestedGeoSpatialIndexCorrectly() {
157163 MongoMappingContext mappingContext = prepareMappingContext (Wrapper .class );
158164 new MongoPersistentEntityIndexCreator (mappingContext , mongoTemplate );
159165
160- assertThat (keysCaptor .getValue ()).isEqualTo (new org .bson .Document ("company.address.location" , "2d" ));
166+ IndexModel indexModel = indexModelCaptor .getValue ().get (0 );
167+
168+ assertThat (indexModel .getKeys ()).isEqualTo (new org .bson .Document ("company.address.location" , "2d" ));
161169
162- IndexOptions opts = optionsCaptor . getValue ();
170+ IndexOptions opts = indexModel . getOptions ();
163171 assertThat (opts .getName ()).isEqualTo ("company.address.location" );
164172 assertThat (opts .getMin ()).isCloseTo (-180d , offset (0d ));
165173 assertThat (opts .getMax ()).isCloseTo (180d , offset (0d ));
@@ -172,8 +180,10 @@ void autoGeneratedIndexNameShouldGenerateNoName() {
172180 MongoMappingContext mappingContext = prepareMappingContext (EntityWithGeneratedIndexName .class );
173181 new MongoPersistentEntityIndexCreator (mappingContext , mongoTemplate );
174182
175- assertThat (keysCaptor .getValue ()).doesNotContainKey ("name" ).containsKey ("lastname" );
176- assertThat (optionsCaptor .getValue ().getName ()).isNull ();
183+ IndexModel indexModel = indexModelCaptor .getValue ().get (0 );
184+
185+ assertThat (indexModel .getKeys ().toBsonDocument ()).doesNotContainKey ("name" ).containsKey ("lastname" );
186+ assertThat (indexModel .getOptions ().getName ()).isNull ();
177187 }
178188
179189 @ Test // DATAMONGO-367
@@ -203,8 +213,8 @@ void indexCreationShouldNotCreateNewCollectionForNestedIndexStructures() {
203213 @ Test // DATAMONGO-1125
204214 void createIndexShouldUsePersistenceExceptionTranslatorForNonDataIntegrityConcerns () {
205215
206- doThrow (new MongoException (6 , "HostUnreachable" )).when (collection ).createIndex ( any ( org . bson . Document . class ),
207- any (IndexOptions .class ));
216+ doThrow (new MongoException (6 , "HostUnreachable" )).when (collection ).createIndexes ( anyList ( ),
217+ any (CreateIndexOptions .class ));
208218
209219 MongoMappingContext mappingContext = prepareMappingContext (Person .class );
210220
@@ -215,8 +225,7 @@ void createIndexShouldUsePersistenceExceptionTranslatorForNonDataIntegrityConcer
215225 @ Test // DATAMONGO-1125
216226 void createIndexShouldNotConvertUnknownExceptionTypes () {
217227
218- doThrow (new ClassCastException ("o_O" )).when (collection ).createIndex (any (org .bson .Document .class ),
219- any (IndexOptions .class ));
228+ doThrow (new ClassCastException ("o_O" )).when (collection ).createIndexes (anyList (), any (CreateIndexOptions .class ));
220229
221230 MongoMappingContext mappingContext = prepareMappingContext (Person .class );
222231
0 commit comments