22
22
import reactor .core .publisher .Mono ;
23
23
import reactor .test .StepVerifier ;
24
24
25
+ import java .net .URI ;
26
+ import java .util .Optional ;
25
27
import java .util .function .Function ;
26
28
29
+ import org .elasticsearch .ElasticsearchStatusException ;
30
+ import org .elasticsearch .action .get .GetRequest ;
27
31
import org .elasticsearch .action .search .SearchRequest ;
28
32
import org .elasticsearch .client .Request ;
29
33
import org .elasticsearch .index .query .QueryBuilders ;
30
34
import org .elasticsearch .search .builder .SearchSourceBuilder ;
31
35
import org .elasticsearch .search .fetch .subphase .FetchSourceContext ;
32
- import org .junit .jupiter .api .BeforeEach ;
36
+ import org .junit .jupiter .api .DisplayName ;
33
37
import org .junit .jupiter .api .Test ;
34
38
import org .junit .jupiter .api .extension .ExtendWith ;
35
39
import org .mockito .ArgumentCaptor ;
36
40
import org .mockito .Mock ;
41
+ import org .mockito .Spy ;
37
42
import org .mockito .junit .jupiter .MockitoExtension ;
43
+ import org .springframework .http .HttpStatus ;
44
+ import org .springframework .web .reactive .function .client .ClientResponse ;
45
+ import org .springframework .web .reactive .function .client .WebClient ;
38
46
import org .springframework .web .reactive .function .client .WebClient .ResponseSpec ;
47
+ import org .springframework .web .util .UriBuilder ;
39
48
40
49
/**
41
50
* @author Peter-Josef Meisch
@@ -46,30 +55,24 @@ class DefaultReactiveElasticsearchClientTest {
46
55
@ Mock private HostProvider hostProvider ;
47
56
48
57
@ Mock private Function <SearchRequest , Request > searchRequestConverter ;
58
+ @ Spy private RequestCreator requestCreator ;
49
59
50
- private DefaultReactiveElasticsearchClient client ;
51
-
52
- @ BeforeEach
53
- void setUp () {
54
- client = new DefaultReactiveElasticsearchClient (hostProvider , new RequestCreator () {
55
- @ Override
56
- public Function <SearchRequest , Request > search () {
57
- return searchRequestConverter ;
58
- }
59
- }) {
60
- @ Override
61
- public Mono <ResponseSpec > execute (ReactiveElasticsearchClientCallback callback ) {
62
- return Mono .empty ();
63
- }
64
- };
65
- }
60
+ @ Mock private WebClient webClient ;
66
61
67
62
@ Test
68
63
void shouldSetAppropriateRequestParametersOnCount () {
69
64
65
+ when (requestCreator .search ()).thenReturn (searchRequestConverter );
70
66
SearchRequest searchRequest = new SearchRequest ("someindex" ) //
71
67
.source (new SearchSourceBuilder ().query (QueryBuilders .matchAllQuery ()));
72
68
69
+ ReactiveElasticsearchClient client = new DefaultReactiveElasticsearchClient (hostProvider , requestCreator ) {
70
+ @ Override
71
+ public Mono <ResponseSpec > execute (ReactiveElasticsearchClientCallback callback ) {
72
+ return Mono .empty ();
73
+ }
74
+ };
75
+
73
76
client .count (searchRequest ).as (StepVerifier ::create ).verifyComplete ();
74
77
75
78
ArgumentCaptor <SearchRequest > captor = ArgumentCaptor .forClass (SearchRequest .class );
@@ -79,4 +82,33 @@ void shouldSetAppropriateRequestParametersOnCount() {
79
82
assertThat (source .trackTotalHitsUpTo ()).isEqualTo (TRACK_TOTAL_HITS_ACCURATE );
80
83
assertThat (source .fetchSource ()).isEqualTo (FetchSourceContext .DO_NOT_FETCH_SOURCE );
81
84
}
85
+
86
+ @ Test // #1712
87
+ @ DisplayName ("should throw ElasticsearchStatusException on server 5xx with empty body" )
88
+ void shouldThrowElasticsearchStatusExceptionOnServer5xxWithEmptyBody () {
89
+
90
+ when (hostProvider .getActive (any ())).thenReturn (Mono .just (webClient ));
91
+ WebClient .RequestBodyUriSpec requestBodyUriSpec = mock (WebClient .RequestBodyUriSpec .class );
92
+ when (requestBodyUriSpec .uri ((Function <UriBuilder , URI >) any ())).thenReturn (requestBodyUriSpec );
93
+ when (requestBodyUriSpec .attribute (any (), any ())).thenReturn (requestBodyUriSpec );
94
+ when (requestBodyUriSpec .headers (any ())).thenReturn (requestBodyUriSpec );
95
+ when (webClient .method (any ())).thenReturn (requestBodyUriSpec );
96
+ when (requestBodyUriSpec .exchangeToMono (any ())).thenAnswer (invocationOnMock -> {
97
+ Function <ClientResponse , ? extends Mono <?>> responseHandler = invocationOnMock .getArgument (0 );
98
+ ClientResponse clientResponse = mock (ClientResponse .class );
99
+ when (clientResponse .statusCode ()).thenReturn (HttpStatus .SERVICE_UNAVAILABLE );
100
+ ClientResponse .Headers headers = mock (ClientResponse .Headers .class );
101
+ when (headers .contentType ()).thenReturn (Optional .empty ());
102
+ when (clientResponse .headers ()).thenReturn (headers );
103
+ when (clientResponse .body (any ())).thenReturn (Mono .empty ());
104
+ return responseHandler .apply (clientResponse );
105
+ });
106
+
107
+ ReactiveElasticsearchClient client = new DefaultReactiveElasticsearchClient (hostProvider , requestCreator );
108
+
109
+ client .get (new GetRequest ("42" )) //
110
+ .as (StepVerifier ::create ) //
111
+ .expectError (ElasticsearchStatusException .class ) //
112
+ .verify (); //
113
+ }
82
114
}
0 commit comments