#41 - Polishing.
Rename RowDataConverter to R2dbcConverters. Introduce R2dbcSimpleTypeHolder. Apply custom conversions check in MappingR2dbcConverter. Extend tests. Original pull request: #65.
This commit is contained in:
@@ -16,7 +16,9 @@
|
||||
package org.springframework.data.r2dbc.function.convert;
|
||||
|
||||
import static org.assertj.core.api.Assertions.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
import io.r2dbc.spi.Row;
|
||||
import lombok.AllArgsConstructor;
|
||||
|
||||
import org.junit.Test;
|
||||
@@ -45,6 +47,27 @@ public class MappingR2dbcConverterUnitTests {
|
||||
assertThat(row).containsEntry("lastname", new SettableValue("White", String.class));
|
||||
}
|
||||
|
||||
@Test // gh-41
|
||||
public void shouldPassThroughRow() {
|
||||
|
||||
Row rowMock = mock(Row.class);
|
||||
|
||||
Row result = converter.read(Row.class, rowMock);
|
||||
|
||||
assertThat(result).isSameAs(rowMock);
|
||||
}
|
||||
|
||||
@Test // gh-41
|
||||
public void shouldConvertRowToNumber() {
|
||||
|
||||
Row rowMock = mock(Row.class);
|
||||
when(rowMock.get(0, Integer.class)).thenReturn(42);
|
||||
|
||||
Integer result = converter.read(Integer.class, rowMock);
|
||||
|
||||
assertThat(result).isEqualTo(42);
|
||||
}
|
||||
|
||||
@AllArgsConstructor
|
||||
static class Person {
|
||||
@Id String id;
|
||||
|
||||
@@ -0,0 +1,150 @@
|
||||
/*
|
||||
* Copyright 2019 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
|
||||
*
|
||||
* http://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.r2dbc.function.convert;
|
||||
|
||||
import static org.assertj.core.api.Assertions.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
import io.r2dbc.spi.Row;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.LocalTime;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.core.convert.converter.Converter;
|
||||
import org.springframework.data.r2dbc.function.convert.R2dbcConverters.RowToBooleanConverter;
|
||||
import org.springframework.data.r2dbc.function.convert.R2dbcConverters.RowToLocalDateConverter;
|
||||
import org.springframework.data.r2dbc.function.convert.R2dbcConverters.RowToLocalDateTimeConverter;
|
||||
import org.springframework.data.r2dbc.function.convert.R2dbcConverters.RowToLocalTimeConverter;
|
||||
import org.springframework.data.r2dbc.function.convert.R2dbcConverters.RowToNumberConverterFactory;
|
||||
import org.springframework.data.r2dbc.function.convert.R2dbcConverters.RowToNumberConverterFactory.RowToOffsetDateTimeConverter;
|
||||
import org.springframework.data.r2dbc.function.convert.R2dbcConverters.RowToNumberConverterFactory.RowToStringConverter;
|
||||
import org.springframework.data.r2dbc.function.convert.R2dbcConverters.RowToNumberConverterFactory.RowToUuidConverter;
|
||||
import org.springframework.data.r2dbc.function.convert.R2dbcConverters.RowToNumberConverterFactory.RowToZonedDateTimeConverter;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link R2dbcConverters}.
|
||||
*
|
||||
* @author Hebert Coelho
|
||||
* @author Mark Paluch
|
||||
*/
|
||||
public class R2dbcConvertersUnitTests {
|
||||
|
||||
@Test // gh-41
|
||||
public void isReturningAllCreatedConverts() {
|
||||
assertThat(R2dbcConverters.getConvertersToRegister()).hasSize(9);
|
||||
}
|
||||
|
||||
@Test // gh-41
|
||||
public void isConvertingBoolean() {
|
||||
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, Boolean.class)).thenReturn(true);
|
||||
|
||||
assertThat(RowToBooleanConverter.INSTANCE.convert(row)).isTrue();
|
||||
}
|
||||
|
||||
@Test // gh-41
|
||||
public void isConvertingLocalDate() {
|
||||
|
||||
LocalDate now = LocalDate.now();
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, LocalDate.class)).thenReturn(now);
|
||||
|
||||
assertThat(RowToLocalDateConverter.INSTANCE.convert(row)).isEqualTo(now);
|
||||
}
|
||||
|
||||
@Test // gh-41
|
||||
public void isConvertingLocalDateTime() {
|
||||
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, LocalDateTime.class)).thenReturn(now);
|
||||
|
||||
assertThat(RowToLocalDateTimeConverter.INSTANCE.convert(row)).isEqualTo(now);
|
||||
}
|
||||
|
||||
@Test // gh-41
|
||||
public void isConvertingLocalTime() {
|
||||
|
||||
LocalTime now = LocalTime.now();
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, LocalTime.class)).thenReturn(now);
|
||||
|
||||
assertThat(RowToLocalTimeConverter.INSTANCE.convert(row)).isEqualTo(now);
|
||||
}
|
||||
|
||||
@Test // gh-41
|
||||
public void isConvertingOffsetDateTime() {
|
||||
|
||||
OffsetDateTime now = OffsetDateTime.now();
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, OffsetDateTime.class)).thenReturn(now);
|
||||
|
||||
assertThat(RowToOffsetDateTimeConverter.INSTANCE.convert(row)).isEqualTo(now);
|
||||
}
|
||||
|
||||
@Test // gh-41
|
||||
public void isConvertingString() {
|
||||
|
||||
String value = "aValue";
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, String.class)).thenReturn(value);
|
||||
|
||||
assertThat(RowToStringConverter.INSTANCE.convert(row)).isEqualTo(value);
|
||||
}
|
||||
|
||||
@Test // gh-41
|
||||
public void isConvertingUUID() {
|
||||
|
||||
UUID value = UUID.randomUUID();
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, UUID.class)).thenReturn(value);
|
||||
|
||||
assertThat(RowToUuidConverter.INSTANCE.convert(row)).isEqualTo(value);
|
||||
}
|
||||
|
||||
@Test // gh-41
|
||||
public void isConvertingZonedDateTime() {
|
||||
|
||||
ZonedDateTime now = ZonedDateTime.now();
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, ZonedDateTime.class)).thenReturn(now);
|
||||
|
||||
assertThat(RowToZonedDateTimeConverter.INSTANCE.convert(row)).isEqualTo(now);
|
||||
}
|
||||
|
||||
@Test // gh-41
|
||||
public void isConvertingNumber() {
|
||||
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, Integer.class)).thenReturn(33);
|
||||
|
||||
final Converter<Row, Integer> converter = RowToNumberConverterFactory.INSTANCE.getConverter(Integer.class);
|
||||
|
||||
assertThat(converter.convert(row)).isEqualTo(33);
|
||||
}
|
||||
|
||||
@Test // gh-41
|
||||
public void isRaisingExceptionForInvalidNumber() {
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> RowToNumberConverterFactory.INSTANCE.getConverter(null));
|
||||
}
|
||||
}
|
||||
@@ -157,6 +157,19 @@ public abstract class AbstractR2dbcRepositoryIntegrationTests extends R2dbcInteg
|
||||
}).verifyComplete();
|
||||
}
|
||||
|
||||
@Test // gh-41
|
||||
public void shouldFindApplyingSimpleTypeProjection() {
|
||||
|
||||
shouldInsertNewItems();
|
||||
|
||||
repository.findAllIds() //
|
||||
.collectList() //
|
||||
.as(StepVerifier::create) //
|
||||
.consumeNextWith(actual -> {
|
||||
assertThat(actual).hasSize(2).allMatch(Integer.class::isInstance);
|
||||
}).verifyComplete();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldInsertItemsTransactional() {
|
||||
|
||||
@@ -196,6 +209,8 @@ public abstract class AbstractR2dbcRepositoryIntegrationTests extends R2dbcInteg
|
||||
Flux<Named> findAsProjection();
|
||||
|
||||
Mono<LegoSet> findByManual(int manual);
|
||||
|
||||
Flux<Integer> findAllIds();
|
||||
}
|
||||
|
||||
@Data
|
||||
|
||||
@@ -23,6 +23,7 @@ import javax.sql.DataSource;
|
||||
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.context.annotation.ComponentScan.Filter;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.FilterType;
|
||||
@@ -90,5 +91,9 @@ public class PostgresR2dbcRepositoryIntegrationTests extends AbstractR2dbcReposi
|
||||
@Override
|
||||
@Query("SELECT * FROM legoset WHERE manual = :manual")
|
||||
Mono<LegoSet> findByManual(int manual);
|
||||
|
||||
@Override
|
||||
@Query("SELECT id FROM legoset")
|
||||
Flux<Integer> findAllIds();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import javax.sql.DataSource;
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.context.annotation.ComponentScan.Filter;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.FilterType;
|
||||
@@ -95,5 +96,9 @@ public class SqlServerR2dbcRepositoryIntegrationTests extends AbstractR2dbcRepos
|
||||
@Override
|
||||
@Query("SELECT * FROM legoset WHERE manual = :manual")
|
||||
Mono<LegoSet> findByManual(int manual);
|
||||
|
||||
@Override
|
||||
@Query("SELECT id FROM legoset")
|
||||
Flux<Integer> findAllIds();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,125 +0,0 @@
|
||||
package org.springframework.data.r2dbc.repository.query;
|
||||
|
||||
import io.r2dbc.spi.Row;
|
||||
import org.junit.Test;
|
||||
import org.springframework.core.convert.converter.Converter;
|
||||
import org.springframework.data.r2dbc.repository.query.RowDataConverter.RowToBooleanConverter;
|
||||
import org.springframework.data.r2dbc.repository.query.RowDataConverter.RowToLocalDateConverter;
|
||||
import org.springframework.data.r2dbc.repository.query.RowDataConverter.RowToLocalDateTimeConverter;
|
||||
import org.springframework.data.r2dbc.repository.query.RowDataConverter.RowToLocalTimeConverter;
|
||||
import org.springframework.data.r2dbc.repository.query.RowDataConverter.RowToNumberConverterFactory;
|
||||
import org.springframework.data.r2dbc.repository.query.RowDataConverter.RowToNumberConverterFactory.RowToOffsetDateTimeConverter;
|
||||
import org.springframework.data.r2dbc.repository.query.RowDataConverter.RowToNumberConverterFactory.RowToStringConverter;
|
||||
import org.springframework.data.r2dbc.repository.query.RowDataConverter.RowToNumberConverterFactory.RowToUuidConverter;
|
||||
import org.springframework.data.r2dbc.repository.query.RowDataConverter.RowToNumberConverterFactory.RowToZonedDateTimeConverter;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.LocalTime;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
public class RowDataConverterTests {
|
||||
private static final int TOTAL_REGISTERED_CONVERTERS = 8;
|
||||
|
||||
@Test
|
||||
public void isReturningAllCreatedConverts() {
|
||||
assertThat(RowDataConverter.getConvertersToRegister().size())
|
||||
.isEqualTo(TOTAL_REGISTERED_CONVERTERS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isConvertingBoolean() {
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, Boolean.class)).thenReturn(true);
|
||||
|
||||
assertTrue(RowToBooleanConverter.INSTANCE.convert(row));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isConvertingLocalDate() {
|
||||
LocalDate now = LocalDate.now();
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, LocalDate.class)).thenReturn(now);
|
||||
|
||||
assertThat(RowToLocalDateConverter.INSTANCE.convert(row)).isEqualTo(now);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isConvertingLocalDateTime() {
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, LocalDateTime.class)).thenReturn(now);
|
||||
|
||||
assertThat(RowToLocalDateTimeConverter.INSTANCE.convert(row)).isEqualTo(now);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isConvertingLocalTime() {
|
||||
LocalTime now = LocalTime.now();
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, LocalTime.class)).thenReturn(now);
|
||||
|
||||
assertThat(RowToLocalTimeConverter.INSTANCE.convert(row)).isEqualTo(now);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isConvertingOffsetDateTime() {
|
||||
OffsetDateTime now = OffsetDateTime.now();
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, OffsetDateTime.class)).thenReturn(now);
|
||||
|
||||
assertThat(RowToOffsetDateTimeConverter.INSTANCE.convert(row)).isEqualTo(now);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isConvertingString() {
|
||||
String value = "aValue";
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, String.class)).thenReturn(value);
|
||||
|
||||
assertThat(RowToStringConverter.INSTANCE.convert(row)).isEqualTo(value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isConvertingUUID() {
|
||||
UUID value = UUID.randomUUID();
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, UUID.class)).thenReturn(value);
|
||||
|
||||
assertThat(RowToUuidConverter.INSTANCE.convert(row)).isEqualTo(value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isConvertingZonedDateTime() {
|
||||
ZonedDateTime now = ZonedDateTime.now();
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, ZonedDateTime.class)).thenReturn(now);
|
||||
|
||||
assertThat(RowToZonedDateTimeConverter.INSTANCE.convert(row)).isEqualTo(now);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isConvertingNumber() {
|
||||
Row row = mock(Row.class);
|
||||
when(row.get(0, Integer.class)).thenReturn(33);
|
||||
|
||||
final Converter<Row, Integer> converter = RowToNumberConverterFactory.INSTANCE.getConverter(Integer.class);
|
||||
|
||||
assertThat(converter.convert(row)).isEqualTo(33);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isRaisingExceptionForInvalidNumber() {
|
||||
assertThatIllegalArgumentException().isThrownBy(
|
||||
() -> RowToNumberConverterFactory.INSTANCE.getConverter(null)
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user