diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsOperations.java index 8337cc671..bd5709ef5 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsOperations.java @@ -129,7 +129,7 @@ public interface GridFsOperations extends ResourcePatternResolver { * * @param content must not be {@literal null}. * @param filename must not be {@literal null} or empty. - * @param contentType can be {@literal null}. + * @param contentType can be {@literal null}. If not empty, may override content type within {@literal metadata}. * @param metadata can be {@literal null}. * @return the {@link ObjectId} of the {@link com.mongodb.client.gridfs.model.GridFSFile} just created. */ diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/ReactiveGridFsOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/ReactiveGridFsOperations.java index fe7f5bd14..ae2f2e107 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/ReactiveGridFsOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/ReactiveGridFsOperations.java @@ -135,7 +135,7 @@ public interface ReactiveGridFsOperations { * * @param content must not be {@literal null}. * @param filename must not be {@literal null} or empty. - * @param contentType can be {@literal null}. + * @param contentType can be {@literal null}. If not empty, may override content type within {@literal metadata}. * @param metadata can be {@literal null}. * @return a {@link Mono} emitting the {@link ObjectId} of the {@link com.mongodb.client.gridfs.model.GridFSFile} just * created. @@ -148,12 +148,12 @@ public interface ReactiveGridFsOperations { if (StringUtils.hasText(filename)) { uploadBuilder.filename(filename); } - if (StringUtils.hasText(contentType)) { - uploadBuilder.contentType(contentType); - } if (!ObjectUtils.isEmpty(metadata)) { uploadBuilder.metadata(metadata); } + if (StringUtils.hasText(contentType)) { + uploadBuilder.contentType(contentType); + } return store(uploadBuilder.build()); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/gridfs/GridFsTemplateUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/gridfs/GridFsTemplateUnitTests.java new file mode 100644 index 000000000..d87094075 --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/gridfs/GridFsTemplateUnitTests.java @@ -0,0 +1,79 @@ +/* + * Copyright 2020 the original author or authors. + * + * 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 + * + * https://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 org.springframework.data.mongodb.gridfs; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import org.bson.Document; +import org.bson.types.ObjectId; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.data.mongodb.MongoDatabaseFactory; +import org.springframework.data.mongodb.core.convert.MongoConverter; + +/** + * @author Christoph Strobl + */ +class GridFsTemplateUnitTests { + + private GridFsTemplateStub template; + + @BeforeEach + void beforeEach() { + template = new GridFsTemplateStub(); + } + + @Test // DATAMONGO-2574 + void contentMetadataDoesNotOverrideContentTypeIfSet() { + + template.onStoreReturn(new ObjectId()); + template.store(new ByteArrayInputStream(new byte[] {}), "filename", "json", new Document("meta", "data")); + + assertThat(template.capturedUpload().getOptions().getContentType()).isEqualTo("json"); + assertThat(template.capturedUpload().getOptions().getMetadata()).containsEntry("meta", "data"); + } + + private static class GridFsTemplateStub extends GridFsTemplate { + + private Object onStoreResult; + private GridFsObject capturedUpload; + + GridFsTemplateStub() { + super(mock(MongoDatabaseFactory.class), mock(MongoConverter.class)); + } + + @Override + public T store(GridFsObject upload) { + + this.capturedUpload = upload; + return (T) onStoreResult; + } + + GridFsTemplateStub onStoreReturn(Object result) { + + this.onStoreResult = result; + return this; + } + + GridFsObject capturedUpload() { + return capturedUpload; + } + } +} diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/gridfs/ReactiveGridFsTemplateUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/gridfs/ReactiveGridFsTemplateUnitTests.java new file mode 100644 index 000000000..d55cdd5e3 --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/gridfs/ReactiveGridFsTemplateUnitTests.java @@ -0,0 +1,83 @@ +/* + * Copyright 2020 the original author or authors. + * + * 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 + * + * https://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 org.springframework.data.mongodb.gridfs; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.io.InputStream; + +import org.bson.Document; +import org.bson.types.ObjectId; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.reactivestreams.Publisher; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.data.mongodb.ReactiveMongoDatabaseFactory; +import org.springframework.data.mongodb.core.convert.MongoConverter; + +/** + * @author Christoph Strobl + */ +class ReactiveGridFsTemplateUnitTests { + + private ReactiveGridFsTemplateStub template; + + @BeforeEach + void beforeEach() { + template = new ReactiveGridFsTemplateStub(); + } + + @Test // DATAMONGO-2574 + void contentMetadataDoesNotOverrideContentTypeIfSet() { + + template.onStoreReturn(new ObjectId()); + template.store(Flux.empty(), "filename", "json", new Document("meta", "data")); + + assertThat(template.capturedUpload().getOptions().getContentType()).isEqualTo("json"); + assertThat(template.capturedUpload().getOptions().getMetadata()).containsEntry("meta", "data"); + } + + private static class ReactiveGridFsTemplateStub extends ReactiveGridFsTemplate { + + private Object onStoreResult; + private GridFsObject> capturedUpload; + + ReactiveGridFsTemplateStub() { + super(mock(ReactiveMongoDatabaseFactory.class), mock(MongoConverter.class)); + } + + @Override + public Mono store(GridFsObject> upload) { + + capturedUpload = upload; + return Mono.just((T) onStoreResult); + } + + ReactiveGridFsTemplateStub onStoreReturn(Object result) { + + this.onStoreResult = result; + return this; + } + + GridFsObject> capturedUpload() { + return capturedUpload; + } + } +}