[mielecloud] Fix failing integration tests (#14791)
* Revert "Disable mielecloud tests (#14762)"
This reverts commit 09c394b928
.
* Configuration flow integration tests only resolve redirect URL
Signed-off-by: Björn Lange <bjoern.lange@itemis.de>
This commit is contained in:
parent
6772add88c
commit
e3efe0cc86
|
@ -17,10 +17,13 @@ import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.Mockito.*;
|
import static org.mockito.Mockito.*;
|
||||||
import static org.openhab.binding.mielecloud.internal.util.ReflectionUtil.setPrivate;
|
import static org.openhab.binding.mielecloud.internal.util.ReflectionUtil.setPrivate;
|
||||||
|
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLDecoder;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.junit.jupiter.api.Disabled;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.openhab.binding.mielecloud.internal.config.servlet.CreateBridgeServlet;
|
import org.openhab.binding.mielecloud.internal.config.servlet.CreateBridgeServlet;
|
||||||
import org.openhab.binding.mielecloud.internal.config.servlet.ForwardToLoginServlet;
|
import org.openhab.binding.mielecloud.internal.config.servlet.ForwardToLoginServlet;
|
||||||
|
@ -29,7 +32,6 @@ import org.openhab.binding.mielecloud.internal.handler.MieleHandlerFactory;
|
||||||
import org.openhab.binding.mielecloud.internal.util.AbstractConfigFlowTest;
|
import org.openhab.binding.mielecloud.internal.util.AbstractConfigFlowTest;
|
||||||
import org.openhab.binding.mielecloud.internal.util.MieleCloudBindingIntegrationTestConstants;
|
import org.openhab.binding.mielecloud.internal.util.MieleCloudBindingIntegrationTestConstants;
|
||||||
import org.openhab.binding.mielecloud.internal.util.Website;
|
import org.openhab.binding.mielecloud.internal.util.Website;
|
||||||
import org.openhab.binding.mielecloud.internal.util.WebsiteCrawler;
|
|
||||||
import org.openhab.binding.mielecloud.internal.webservice.MieleWebservice;
|
import org.openhab.binding.mielecloud.internal.webservice.MieleWebservice;
|
||||||
import org.openhab.binding.mielecloud.internal.webservice.MieleWebserviceFactory;
|
import org.openhab.binding.mielecloud.internal.webservice.MieleWebserviceFactory;
|
||||||
import org.openhab.core.thing.Thing;
|
import org.openhab.core.thing.Thing;
|
||||||
|
@ -73,6 +75,22 @@ public class ConfigFlowTest extends AbstractConfigFlowTest {
|
||||||
setPrivate(Objects.requireNonNull(handlerFactory), "webserviceFactory", webserviceFactory);
|
setPrivate(Objects.requireNonNull(handlerFactory), "webserviceFactory", webserviceFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Map<String, String> extractUrlParameters(String query) throws Exception {
|
||||||
|
var parameters = new HashMap<String, String>();
|
||||||
|
for (String param : query.split("&")) {
|
||||||
|
String[] pair = param.split("=");
|
||||||
|
String key = URLDecoder.decode(pair[0], "UTF-8");
|
||||||
|
String value = "";
|
||||||
|
if (pair.length > 1) {
|
||||||
|
value = URLDecoder.decode(pair[1], "UTF-8");
|
||||||
|
}
|
||||||
|
|
||||||
|
assertFalse(parameters.containsKey(key));
|
||||||
|
parameters.put(key, value);
|
||||||
|
}
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
|
||||||
private Website configureBridgeWithConfigFlow() throws Exception {
|
private Website configureBridgeWithConfigFlow() throws Exception {
|
||||||
Website accountOverviewSite = getCrawler().doGetRelative("/mielecloud");
|
Website accountOverviewSite = getCrawler().doGetRelative("/mielecloud");
|
||||||
String pairAccountUrl = accountOverviewSite.getTargetOfLink("Pair Account");
|
String pairAccountUrl = accountOverviewSite.getTargetOfLink("Pair Account");
|
||||||
|
@ -80,7 +98,7 @@ public class ConfigFlowTest extends AbstractConfigFlowTest {
|
||||||
Website pairAccountSite = getCrawler().doGetRelative(pairAccountUrl);
|
Website pairAccountSite = getCrawler().doGetRelative(pairAccountUrl);
|
||||||
String forwardToLoginUrl = pairAccountSite.getFormAction();
|
String forwardToLoginUrl = pairAccountSite.getFormAction();
|
||||||
|
|
||||||
Website mieleLoginSite = getCrawler().doGetRelative(forwardToLoginUrl + "?"
|
String mieleLoginSiteUrl = getCrawler().doGetRedirectUrlRelative(forwardToLoginUrl + "?"
|
||||||
+ ForwardToLoginServlet.CLIENT_ID_PARAMETER_NAME + "="
|
+ ForwardToLoginServlet.CLIENT_ID_PARAMETER_NAME + "="
|
||||||
+ MieleCloudBindingIntegrationTestConstants.CLIENT_ID + "&"
|
+ MieleCloudBindingIntegrationTestConstants.CLIENT_ID + "&"
|
||||||
+ ForwardToLoginServlet.CLIENT_SECRET_PARAMETER_NAME + "="
|
+ ForwardToLoginServlet.CLIENT_SECRET_PARAMETER_NAME + "="
|
||||||
|
@ -88,11 +106,17 @@ public class ConfigFlowTest extends AbstractConfigFlowTest {
|
||||||
+ ForwardToLoginServlet.BRIDGE_ID_PARAMETER_NAME + "="
|
+ ForwardToLoginServlet.BRIDGE_ID_PARAMETER_NAME + "="
|
||||||
+ MieleCloudBindingIntegrationTestConstants.BRIDGE_ID + "&" + ForwardToLoginServlet.EMAIL_PARAMETER_NAME
|
+ MieleCloudBindingIntegrationTestConstants.BRIDGE_ID + "&" + ForwardToLoginServlet.EMAIL_PARAMETER_NAME
|
||||||
+ "=" + MieleCloudBindingIntegrationTestConstants.EMAIL);
|
+ "=" + MieleCloudBindingIntegrationTestConstants.EMAIL);
|
||||||
String redirectionUrl = mieleLoginSite.getValueOfInput("redirect_uri")
|
|
||||||
.replace("http://127.0.0.1:" + WebsiteCrawler.getServerPort(), "");
|
|
||||||
String state = mieleLoginSite.getValueOfInput("state");
|
|
||||||
|
|
||||||
Website resultSite = getCrawler().doGetRelative(redirectionUrl + "?code="
|
var loginSiteUrl = new URL(mieleLoginSiteUrl);
|
||||||
|
assertEquals(loginSiteUrl.getHost(), "api.mcs3.miele.com");
|
||||||
|
assertEquals(loginSiteUrl.getPath(), "/thirdparty/login");
|
||||||
|
|
||||||
|
Map<String, String> parameters = extractUrlParameters(loginSiteUrl.getQuery());
|
||||||
|
|
||||||
|
String redirectionUrl = parameters.get("redirect_uri");
|
||||||
|
String state = parameters.get("state");
|
||||||
|
|
||||||
|
Website resultSite = getCrawler().doGet(redirectionUrl + "?code="
|
||||||
+ MieleCloudBindingIntegrationTestConstants.AUTHORIZATION_CODE + "&state=" + state);
|
+ MieleCloudBindingIntegrationTestConstants.AUTHORIZATION_CODE + "&state=" + state);
|
||||||
String createBridgeUrl = resultSite.getFormAction();
|
String createBridgeUrl = resultSite.getFormAction();
|
||||||
|
|
||||||
|
@ -104,7 +128,6 @@ public class ConfigFlowTest extends AbstractConfigFlowTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Disabled
|
|
||||||
public void configFlowHappyPathCreatesABridge() throws Exception {
|
public void configFlowHappyPathCreatesABridge() throws Exception {
|
||||||
// given:
|
// given:
|
||||||
setUpAuthorizationHandler();
|
setUpAuthorizationHandler();
|
||||||
|
@ -122,7 +145,6 @@ public class ConfigFlowTest extends AbstractConfigFlowTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Disabled
|
|
||||||
public void configFlowWaitTimeoutExpiresWhenBridgeDoesNotComeOnline() throws Exception {
|
public void configFlowWaitTimeoutExpiresWhenBridgeDoesNotComeOnline() throws Exception {
|
||||||
// given:
|
// given:
|
||||||
setUpAuthorizationHandler();
|
setUpAuthorizationHandler();
|
||||||
|
|
|
@ -18,6 +18,7 @@ import java.util.Objects;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.eclipse.jdt.annotation.Nullable;
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.openhab.binding.mielecloud.internal.config.MieleCloudConfigService;
|
import org.openhab.binding.mielecloud.internal.config.MieleCloudConfigService;
|
||||||
import org.openhab.binding.mielecloud.internal.config.servlet.AccountOverviewServlet;
|
import org.openhab.binding.mielecloud.internal.config.servlet.AccountOverviewServlet;
|
||||||
|
@ -89,12 +90,12 @@ public abstract class AbstractConfigFlowTest extends OpenHabOsgiTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public final void setUpConfigFlowTest() {
|
public final void setUpConfigFlowTest() throws Exception {
|
||||||
setUpCrawler();
|
setUpCrawler();
|
||||||
setUpServlets();
|
setUpServlets();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpCrawler() {
|
private void setUpCrawler() throws Exception {
|
||||||
HttpClientFactory clientFactory = getService(HttpClientFactory.class);
|
HttpClientFactory clientFactory = getService(HttpClientFactory.class);
|
||||||
assertNotNull(clientFactory);
|
assertNotNull(clientFactory);
|
||||||
crawler = new WebsiteCrawler(Objects.requireNonNull(clientFactory));
|
crawler = new WebsiteCrawler(Objects.requireNonNull(clientFactory));
|
||||||
|
@ -110,4 +111,9 @@ public abstract class AbstractConfigFlowTest extends OpenHabOsgiTest {
|
||||||
successServlet = configService.getSuccessServlet();
|
successServlet = configService.getSuccessServlet();
|
||||||
createBridgeServlet = configService.getCreateBridgeServlet();
|
createBridgeServlet = configService.getCreateBridgeServlet();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
public final void tearDown() throws Exception {
|
||||||
|
getCrawler().close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.eclipse.jetty.client.HttpClient;
|
import org.eclipse.jetty.client.HttpClient;
|
||||||
import org.eclipse.jetty.client.api.ContentResponse;
|
import org.eclipse.jetty.client.api.ContentResponse;
|
||||||
|
import org.eclipse.jetty.http.HttpHeader;
|
||||||
import org.openhab.core.io.net.http.HttpClientFactory;
|
import org.openhab.core.io.net.http.HttpClientFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -25,24 +26,54 @@ import org.openhab.core.io.net.http.HttpClientFactory;
|
||||||
* @author Björn Lange - Initial Contribution
|
* @author Björn Lange - Initial Contribution
|
||||||
*/
|
*/
|
||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public final class WebsiteCrawler {
|
public final class WebsiteCrawler implements AutoCloseable {
|
||||||
private HttpClient httpClient;
|
private HttpClient httpClient;
|
||||||
|
|
||||||
public WebsiteCrawler(HttpClientFactory httpClientFactory) {
|
public WebsiteCrawler(HttpClientFactory httpClientFactory) throws Exception {
|
||||||
this.httpClient = httpClientFactory.getCommonHttpClient();
|
this.httpClient = httpClientFactory.createHttpClient("mielecloud-int-tests");
|
||||||
|
this.httpClient.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a website during integration tests.
|
||||||
|
* The resulting website will be the one obtained after following all redirections.
|
||||||
|
*
|
||||||
|
* @param url The URL.
|
||||||
|
* @return The website.
|
||||||
|
* @throws Exception if anything goes wrong.
|
||||||
|
*/
|
||||||
|
public Website doGet(String url) throws Exception {
|
||||||
|
httpClient.setFollowRedirects(true);
|
||||||
|
ContentResponse response = httpClient.GET(url);
|
||||||
|
assertEquals(200, response.getStatus());
|
||||||
|
return new Website(response.getContentAsString());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a website relative to the address of the openHAB installation running in test mode during integration tests.
|
* Gets a website relative to the address of the openHAB installation running in test mode during integration tests.
|
||||||
|
* The resulting website will be the one obtained after following all redirections.
|
||||||
*
|
*
|
||||||
* @param relativeUrl The relative URL.
|
* @param relativeUrl The relative URL.
|
||||||
* @return The website.
|
* @return The website.
|
||||||
* @throws Exception if anything goes wrong.
|
* @throws Exception if anything goes wrong.
|
||||||
*/
|
*/
|
||||||
public Website doGetRelative(String relativeUrl) throws Exception {
|
public Website doGetRelative(String relativeUrl) throws Exception {
|
||||||
|
return doGet("http://127.0.0.1:" + getServerPort() + relativeUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a redirection URL from an URL relative to the address of the openHAB installation running in test mode
|
||||||
|
* during integration tests expecting to receive a 302 Found response.
|
||||||
|
*
|
||||||
|
* @param relativeUrl The relative URL.
|
||||||
|
* @return The website that the client was redirected to.
|
||||||
|
* @throws Exception if anything goes wrong.
|
||||||
|
*/
|
||||||
|
public String doGetRedirectUrlRelative(String relativeUrl) throws Exception {
|
||||||
|
httpClient.setFollowRedirects(false);
|
||||||
ContentResponse response = httpClient.GET("http://127.0.0.1:" + getServerPort() + relativeUrl);
|
ContentResponse response = httpClient.GET("http://127.0.0.1:" + getServerPort() + relativeUrl);
|
||||||
assertEquals(200, response.getStatus());
|
assertEquals(302, response.getStatus());
|
||||||
return new Website(response.getContentAsString());
|
return response.getHeaders().get(HttpHeader.LOCATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -52,4 +83,9 @@ public final class WebsiteCrawler {
|
||||||
public static int getServerPort() {
|
public static int getServerPort() {
|
||||||
return Integer.getInteger("org.osgi.service.http.port", 8080);
|
return Integer.getInteger("org.osgi.service.http.port", 8080);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
httpClient.stop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue