Compare commits

...

3 Commits

Author SHA1 Message Date
Christoph Strobl
d58f780536 DATAMONGO-2574 - Polishing.
Fix issue in reactive API and add unit tests.
2020-06-18 17:39:06 +02:00
konradend
eb3df505e8 Do not overwrite contentType for GridFsFile 2020-06-18 17:32:52 +02:00
Christoph Strobl
ded2b234b6 DATAMONGO-2574 - Prepare issue branch. 2020-06-18 17:32:52 +02:00
8 changed files with 174 additions and 12 deletions

View File

@@ -5,7 +5,7 @@
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId>
<version>3.1.0-SNAPSHOT</version>
<version>3.1.0-DATAMONGO-2574-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Spring Data MongoDB</name>

View File

@@ -7,7 +7,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId>
<version>3.1.0-SNAPSHOT</version>
<version>3.1.0-DATAMONGO-2574-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

View File

@@ -14,7 +14,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId>
<version>3.1.0-SNAPSHOT</version>
<version>3.1.0-DATAMONGO-2574-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

View File

@@ -11,7 +11,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId>
<version>3.1.0-SNAPSHOT</version>
<version>3.1.0-DATAMONGO-2574-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

View File

@@ -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.
*/
@@ -140,12 +140,12 @@ public interface GridFsOperations extends ResourcePatternResolver {
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());
}

View File

@@ -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());
}

View File

@@ -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<?, InputStream> capturedUpload;
GridFsTemplateStub() {
super(mock(MongoDatabaseFactory.class), mock(MongoConverter.class));
}
@Override
public <T> T store(GridFsObject<T, InputStream> upload) {
this.capturedUpload = upload;
return (T) onStoreResult;
}
GridFsTemplateStub onStoreReturn(Object result) {
this.onStoreResult = result;
return this;
}
GridFsObject<?, InputStream> capturedUpload() {
return capturedUpload;
}
}
}

View File

@@ -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<?, Publisher<DataBuffer>> capturedUpload;
ReactiveGridFsTemplateStub() {
super(mock(ReactiveMongoDatabaseFactory.class), mock(MongoConverter.class));
}
@Override
public <T> Mono<T> store(GridFsObject<T, Publisher<DataBuffer>> upload) {
capturedUpload = upload;
return Mono.just((T) onStoreResult);
}
ReactiveGridFsTemplateStub onStoreReturn(Object result) {
this.onStoreResult = result;
return this;
}
GridFsObject<?, Publisher<DataBuffer>> capturedUpload() {
return capturedUpload;
}
}
}