#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:
Mark Paluch
2019-03-10 11:29:11 +01:00
parent 455e9a59de
commit 369522231f
13 changed files with 529 additions and 350 deletions

View File

@@ -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;

View File

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

View File

@@ -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

View File

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

View File

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

View File

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