|
19 | 19 | import static org.mockito.ArgumentMatchers.*; |
20 | 20 | import static org.mockito.Mockito.*; |
21 | 21 |
|
| 22 | +import io.r2dbc.spi.test.MockColumnMetadata; |
| 23 | +import io.r2dbc.spi.test.MockResult; |
| 24 | +import io.r2dbc.spi.test.MockRow; |
| 25 | +import io.r2dbc.spi.test.MockRowMetadata; |
| 26 | +import reactor.core.publisher.Flux; |
| 27 | +import reactor.test.StepVerifier; |
| 28 | + |
22 | 29 | import java.lang.reflect.Method; |
| 30 | +import java.time.LocalDate; |
23 | 31 |
|
24 | 32 | import org.junit.jupiter.api.BeforeEach; |
25 | 33 | import org.junit.jupiter.api.Test; |
|
38 | 46 | import org.springframework.data.r2dbc.dialect.PostgresDialect; |
39 | 47 | import org.springframework.data.r2dbc.mapping.R2dbcMappingContext; |
40 | 48 | import org.springframework.data.r2dbc.repository.Query; |
| 49 | +import org.springframework.data.r2dbc.testing.StatementRecorder; |
41 | 50 | import org.springframework.data.relational.core.mapping.RelationalMappingContext; |
42 | 51 | import org.springframework.data.repository.Repository; |
43 | 52 | import org.springframework.data.repository.core.RepositoryMetadata; |
@@ -274,6 +283,29 @@ void usesDtoTypeForDtoResultMapping() { |
274 | 283 | assertThat(query.resolveResultType(query.getQueryMethod().getResultProcessor())).isEqualTo(PersonDto.class); |
275 | 284 | } |
276 | 285 |
|
| 286 | + @Test // gh-612 |
| 287 | + void selectsSimpleType() { |
| 288 | + |
| 289 | + MockRowMetadata metadata = MockRowMetadata.builder() |
| 290 | + .columnMetadata(MockColumnMetadata.builder().name("date").build()).build(); |
| 291 | + LocalDate value = LocalDate.now(); |
| 292 | + MockResult result = MockResult.builder().rowMetadata(metadata) |
| 293 | + .row(MockRow.builder().identified(0, LocalDate.class, value).build()).build(); |
| 294 | + |
| 295 | + StatementRecorder recorder = StatementRecorder.newInstance(); |
| 296 | + recorder.addStubbing(s -> s.equals("SELECT MAX(DATE)"), result); |
| 297 | + |
| 298 | + databaseClient = DatabaseClient.builder() // |
| 299 | + .connectionFactory(recorder) // |
| 300 | + .bindMarkers(PostgresDialect.INSTANCE.getBindMarkersFactory()).build(); |
| 301 | + |
| 302 | + StringBasedR2dbcQuery query = getQueryMethod("findAllLocalDates"); |
| 303 | + |
| 304 | + Flux<Object> flux = (Flux) query.execute(new Object[0]); |
| 305 | + |
| 306 | + flux.as(StepVerifier::create).expectNext(value).verifyComplete(); |
| 307 | + } |
| 308 | + |
277 | 309 | private StringBasedR2dbcQuery getQueryMethod(String name, Class<?>... args) { |
278 | 310 |
|
279 | 311 | Method method = ReflectionUtils.findMethod(SampleRepository.class, name, args); |
@@ -328,6 +360,9 @@ private interface SampleRepository extends Repository<Person, String> { |
328 | 360 |
|
329 | 361 | @Query("SELECT * FROM person") |
330 | 362 | PersonProjection findAsInterfaceProjection(); |
| 363 | + |
| 364 | + @Query("SELECT MAX(DATE)") |
| 365 | + Flux<LocalDate> findAllLocalDates(); |
331 | 366 | } |
332 | 367 |
|
333 | 368 | static class PersonDto { |
|
0 commit comments