2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.mielecloud.internal.webservice;
15 import static org.junit.jupiter.api.Assertions.assertEquals;
16 import static org.mockito.ArgumentMatchers.*;
17 import static org.mockito.Mockito.*;
19 import java.nio.charset.StandardCharsets;
20 import java.util.ArrayList;
21 import java.util.List;
22 import java.util.Optional;
23 import java.util.concurrent.TimeUnit;
25 import org.eclipse.jdt.annotation.NonNullByDefault;
26 import org.eclipse.jdt.annotation.Nullable;
27 import org.eclipse.jetty.client.HttpClient;
28 import org.eclipse.jetty.client.api.Request;
29 import org.eclipse.jetty.client.util.StringContentProvider;
30 import org.eclipse.jetty.http.HttpMethod;
31 import org.junit.jupiter.api.Test;
32 import org.openhab.binding.mielecloud.internal.util.MockUtil;
33 import org.openhab.binding.mielecloud.internal.webservice.language.LanguageProvider;
34 import org.openhab.binding.mielecloud.internal.webservice.request.RequestFactoryImpl;
35 import org.openhab.core.io.net.http.HttpClientFactory;
38 * @author Björn Lange - Initial contribution
41 public class RequestFactoryImplTest {
42 private static final String URL = "https://www.openhab.org/";
43 private static final String ACCESS_TOKEN = "DE_0123456789abcdef0123456789abcdef";
44 private static final String JSON_CONTENT = "{ \"update\": 1 }";
46 private static final String LANGUAGE = "de";
48 private static final long REQUEST_TIMEOUT = 5;
49 private static final long EXTENDED_REQUEST_TIMEOUT = 10;
50 private static final TimeUnit REQUEST_TIMEOUT_UNIT = TimeUnit.SECONDS;
53 private String contentString;
55 private String contentType;
57 private final LanguageProvider defaultLanguageProvider = new LanguageProvider() {
59 public Optional<String> getLanguage() {
60 return Optional.of(LANGUAGE);
63 private final LanguageProvider emptyStringLanguageProvider = new LanguageProvider() {
65 public Optional<String> getLanguage() {
66 return Optional.of("");
70 private Request getRequestMock() {
71 Request requestMock = mock(Request.class);
72 when(requestMock.header(anyString(), anyString())).thenReturn(requestMock);
73 when(requestMock.timeout(anyLong(), any())).thenReturn(requestMock);
74 when(requestMock.method(any(HttpMethod.class))).thenReturn(requestMock);
75 when(requestMock.param(anyString(), anyString())).thenReturn(requestMock);
76 when(requestMock.content(any())).thenAnswer(i -> {
77 StringContentProvider provider = i.getArgument(0);
78 List<Byte> rawData = new ArrayList<Byte>();
79 provider.forEach(b -> {
81 while (b.hasRemaining()) {
85 byte[] data = new byte[rawData.size()];
86 for (int j = 0; j < data.length; j++) {
87 data[j] = rawData.get(j);
89 contentString = new String(data, StandardCharsets.UTF_8);
90 contentType = provider.getContentType();
96 private RequestFactoryImpl createRequestFactoryImpl(Request requestMock, LanguageProvider languageProvider) {
97 HttpClient httpClient = MockUtil.mockHttpClient(URL, requestMock);
99 HttpClientFactory httpClientFactory = mock(HttpClientFactory.class);
100 when(httpClientFactory.createHttpClient(anyString())).thenReturn(httpClient);
102 return new RequestFactoryImpl(httpClientFactory, languageProvider);
106 public void testCreateGetRequestReturnsRequestWithExpectedHeaders() {
108 Request requestMock = getRequestMock();
109 RequestFactoryImpl requestFactory = createRequestFactoryImpl(requestMock, defaultLanguageProvider);
112 Request request = requestFactory.createGetRequest(URL, ACCESS_TOKEN);
115 assertEquals(requestMock, request);
116 verify(request).header("Content-type", "application/json");
117 verify(request).header("Accept", "*/*");
118 verify(request).header("Authorization", "Bearer " + ACCESS_TOKEN);
119 verify(request).timeout(REQUEST_TIMEOUT, REQUEST_TIMEOUT_UNIT);
120 verify(request).method(HttpMethod.GET);
121 verify(request).param("language", LANGUAGE);
122 verifyNoMoreInteractions(request);
126 public void testCreatePutRequestReturnsRequestWithExpectedHeadersAndContent() {
127 Request requestMock = getRequestMock();
128 RequestFactoryImpl requestFactory = createRequestFactoryImpl(requestMock, defaultLanguageProvider);
131 Request request = requestFactory.createPutRequest(URL, ACCESS_TOKEN, JSON_CONTENT);
134 assertEquals(requestMock, request);
135 verify(request).header("Content-type", "application/json");
136 verify(request).header("Accept", "*/*");
137 verify(request).header("Authorization", "Bearer " + ACCESS_TOKEN);
138 verify(request).timeout(EXTENDED_REQUEST_TIMEOUT, REQUEST_TIMEOUT_UNIT);
139 verify(request).method(HttpMethod.PUT);
140 verify(request).content(any());
141 verify(request).param("language", LANGUAGE);
142 assertEquals(JSON_CONTENT, contentString);
143 assertEquals("application/json", contentType);
144 verifyNoMoreInteractions(request);
148 public void testCreatePostRequestReturnsRequestWithExpectedHeaders() {
149 Request requestMock = getRequestMock();
150 RequestFactoryImpl requestFactory = createRequestFactoryImpl(requestMock, defaultLanguageProvider);
153 Request request = requestFactory.createPostRequest(URL, ACCESS_TOKEN);
156 assertEquals(requestMock, request);
157 verify(request).header("Content-type", "application/json");
158 verify(request).header("Accept", "*/*");
159 verify(request).header("Authorization", "Bearer " + ACCESS_TOKEN);
160 verify(request).timeout(REQUEST_TIMEOUT, REQUEST_TIMEOUT_UNIT);
161 verify(request).method(HttpMethod.POST);
162 verify(request).param("language", LANGUAGE);
163 verifyNoMoreInteractions(request);
167 public void testCreateRequestWithoutSuppliedLangugeCreatesNoLanguageParameter() {
169 Request requestMock = getRequestMock();
170 RequestFactoryImpl requestFactory = createRequestFactoryImpl(requestMock, new LanguageProvider() {
172 public Optional<String> getLanguage() {
173 return Optional.empty();
178 Request request = requestFactory.createGetRequest(URL, ACCESS_TOKEN);
181 assertEquals(requestMock, request);
182 verify(request).header("Content-type", "application/json");
183 verify(request).header("Accept", "*/*");
184 verify(request).header("Authorization", "Bearer " + ACCESS_TOKEN);
185 verify(request).timeout(REQUEST_TIMEOUT, REQUEST_TIMEOUT_UNIT);
186 verify(request).method(HttpMethod.GET);
187 verifyNoMoreInteractions(request);
191 public void testCreateRequestWithEmptyLanguageCreatesNoLanguageParameter() {
193 Request requestMock = getRequestMock();
194 RequestFactoryImpl requestFactory = createRequestFactoryImpl(requestMock, emptyStringLanguageProvider);
197 Request request = requestFactory.createGetRequest(URL, ACCESS_TOKEN);
200 assertEquals(requestMock, request);
201 verify(request).header("Content-type", "application/json");
202 verify(request).header("Accept", "*/*");
203 verify(request).header("Authorization", "Bearer " + ACCESS_TOKEN);
204 verify(request).timeout(REQUEST_TIMEOUT, REQUEST_TIMEOUT_UNIT);
205 verify(request).method(HttpMethod.GET);
206 verifyNoMoreInteractions(request);
210 public void whenAnSseRequestIsCreatedWithoutLanguageThenTheRequiredParametersAreSet() {
211 Request requestMock = getRequestMock();
212 RequestFactoryImpl requestFactory = createRequestFactoryImpl(requestMock, emptyStringLanguageProvider);
215 Request request = requestFactory.createSseRequest(URL, ACCESS_TOKEN);
218 assertEquals(requestMock, request);
219 verify(request).header("Content-type", "application/json");
220 verify(request).header("Accept", "text/event-stream");
221 verify(request).header("Authorization", "Bearer " + ACCESS_TOKEN);
222 verifyNoMoreInteractions(request);
226 public void whenAnSseRequestIsCreatedWithLanguageThenTheAcceptLanguageHeaderIsSet() {
227 Request requestMock = getRequestMock();
228 RequestFactoryImpl requestFactory = createRequestFactoryImpl(requestMock, defaultLanguageProvider);
231 Request request = requestFactory.createSseRequest(URL, ACCESS_TOKEN);
234 assertEquals(requestMock, request);
235 verify(request).header("Content-type", "application/json");
236 verify(request).header("Accept", "text/event-stream");
237 verify(request).header("Authorization", "Bearer " + ACCESS_TOKEN);
238 verify(request).header("Accept-Language", LANGUAGE);
239 verifyNoMoreInteractions(request);