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.config.servlet;
15 import static org.junit.jupiter.api.Assertions.assertTrue;
16 import static org.mockito.ArgumentMatchers.anyString;
17 import static org.mockito.Mockito.*;
18 import static org.openhab.binding.mielecloud.internal.util.ReflectionUtil.setPrivate;
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.junit.jupiter.api.Test;
22 import org.openhab.binding.mielecloud.internal.auth.OAuthException;
23 import org.openhab.binding.mielecloud.internal.config.OAuthAuthorizationHandler;
24 import org.openhab.binding.mielecloud.internal.config.exception.NoOngoingAuthorizationException;
25 import org.openhab.binding.mielecloud.internal.util.AbstractConfigFlowTest;
26 import org.openhab.binding.mielecloud.internal.util.Website;
29 * @author Björn Lange - Initial Contribution
32 public class ResultServletTest extends AbstractConfigFlowTest {
34 public void whenOAuthErrorAccessDeniedIsReturnedByMieleServiceThenTheFailurePageWithAccordingErrorMessageIsDisplayed()
37 Website website = getCrawler().doGetRelative("/mielecloud/result?" + ResultServlet.ERROR_PARAMETER_NAME + "="
38 + FailureServlet.OAUTH2_ERROR_ACCESS_DENIED);
41 assertTrue(website.contains("Pairing failed!"));
42 assertTrue(website.contains("OAuth2 authentication with Miele cloud service failed: Access denied."));
46 public void whenOAuthErrorInvalidRequestIsReturnedByMieleServiceThenTheFailurePageWithAccordingErrorMessageIsDisplayed()
49 Website website = getCrawler().doGetRelative("/mielecloud/result?" + ResultServlet.ERROR_PARAMETER_NAME + "="
50 + FailureServlet.OAUTH2_ERROR_INVALID_REQUEST);
53 assertTrue(website.contains("Pairing failed!"));
54 assertTrue(website.contains("OAuth2 authentication with Miele cloud service failed: Malformed request."));
58 public void whenOAuthErrorUnauthorizedClientIsReturnedByMieleServiceThenTheFailurePageWithAccordingErrorMessageIsDisplayed()
61 Website website = getCrawler().doGetRelative("/mielecloud/result?" + ResultServlet.ERROR_PARAMETER_NAME + "="
62 + FailureServlet.OAUTH2_ERROR_UNAUTHORIZED_CLIENT);
65 assertTrue(website.contains("Pairing failed!"));
66 assertTrue(website.contains(
67 "OAuth2 authentication with Miele cloud service failed: Account not authorized to request authorization code."));
71 public void whenOAuthErrorUnsupportedResponseTypeIsReturnedByMieleServiceThenTheFailurePageWithAccordingErrorMessageIsDisplayed()
74 Website website = getCrawler().doGetRelative("/mielecloud/result?" + ResultServlet.ERROR_PARAMETER_NAME + "="
75 + FailureServlet.OAUTH2_ERROR_UNSUPPORTED_RESPONSE_TYPE);
78 assertTrue(website.contains("Pairing failed!"));
79 assertTrue(website.contains(
80 "OAuth2 authentication with Miele cloud service failed: Obtaining an authorization code is not supported."));
84 public void whenOAuthErrorInvalidScopeIsReturnedByMieleServiceThenTheFailurePageWithAccordingErrorMessageIsDisplayed()
87 Website website = getCrawler().doGetRelative("/mielecloud/result?" + ResultServlet.ERROR_PARAMETER_NAME + "="
88 + FailureServlet.OAUTH2_ERROR_INVALID_SCOPE);
91 assertTrue(website.contains("Pairing failed!"));
92 assertTrue(website.contains("OAuth2 authentication with Miele cloud service failed: Invalid scope."));
96 public void whenOAuthErrorServerErrorIsReturnedByMieleServiceThenTheFailurePageWithAccordingErrorMessageIsDisplayed()
99 Website website = getCrawler().doGetRelative("/mielecloud/result?" + ResultServlet.ERROR_PARAMETER_NAME + "="
100 + FailureServlet.OAUTH2_ERROR_SERVER_ERROR);
103 assertTrue(website.contains("Pairing failed!"));
104 assertTrue(website.contains("OAuth2 authentication with Miele cloud service failed: Unexpected server error."));
108 public void whenOAuthErrorTemporarilyUnavailableIsReturnedByMieleServiceThenTheFailurePageWithAccordingErrorMessageIsDisplayed()
111 Website website = getCrawler().doGetRelative("/mielecloud/result?" + ResultServlet.ERROR_PARAMETER_NAME + "="
112 + FailureServlet.OAUTH2_ERROR_TEMPORARY_UNAVAILABLE);
115 assertTrue(website.contains("Pairing failed!"));
116 assertTrue(website.contains(
117 "OAuth2 authentication with Miele cloud service failed: Authorization server temporarily unavailable."));
121 public void whenUnknwonOAuthErrorIsReturnedByMieleServiceThenTheFailurePageWithAccordingErrorMessageIsDisplayed()
124 Website website = getCrawler()
125 .doGetRelative("/mielecloud/result?" + ResultServlet.ERROR_PARAMETER_NAME + "=unknown_oauth_2_error");
128 assertTrue(website.contains("Pairing failed!"));
129 assertTrue(website.contains(
130 "OAuth2 authentication with Miele cloud service failed: Unknown error code \"unknown_oauth_2_error\"."));
134 public void whenCodeParameterIsNotPassedByMieleServiceThenTheFailurePageWithAccordingErrorMessageIsDisplayed()
137 Website website = getCrawler()
138 .doGetRelative("/mielecloud/result?" + ResultServlet.STATE_PARAMETER_NAME + "=state");
141 assertTrue(website.contains("Pairing failed!"));
142 assertTrue(website.contains("Miele cloud service returned an illegal response."));
146 public void whenStateParameterIsNotPassedByMieleServiceThenTheFailurePageWithAccordingErrorMessageIsDisplayed()
149 Website website = getCrawler()
150 .doGetRelative("/mielecloud/result?" + ResultServlet.CODE_PARAMETER_NAME + "=code");
153 assertTrue(website.contains("Pairing failed!"));
154 assertTrue(website.contains("Miele cloud service returned an illegal response."));
158 public void whenNoAuthorizationIsOngoingThenTheFailurePageWithAccordingErrorMessageIsDisplayed() throws Exception {
160 OAuthAuthorizationHandler authorizationHandler = mock(OAuthAuthorizationHandler.class);
161 doThrow(new NoOngoingAuthorizationException("")).when(authorizationHandler).completeAuthorization(anyString());
162 setPrivate(getResultServlet(), "authorizationHandler", authorizationHandler);
165 Website website = getCrawler().doGetRelative("/mielecloud/result?" + ResultServlet.CODE_PARAMETER_NAME
166 + "=code&" + ResultServlet.STATE_PARAMETER_NAME + "=state");
169 assertTrue(website.contains("Pairing failed!"));
170 assertTrue(website.contains("There is no ongoing authorization. Please start an authorization first."));
174 public void whenLastStepOfAuthorizationFailsThenTheFailurePageWithAccordingErrorMessageIsDisplayed()
177 OAuthAuthorizationHandler authorizationHandler = mock(OAuthAuthorizationHandler.class);
178 doThrow(new OAuthException("")).when(authorizationHandler).completeAuthorization(anyString());
179 setPrivate(getResultServlet(), "authorizationHandler", authorizationHandler);
182 Website website = getCrawler().doGetRelative("/mielecloud/result?" + ResultServlet.CODE_PARAMETER_NAME
183 + "=code&" + ResultServlet.STATE_PARAMETER_NAME + "=state");
186 assertTrue(website.contains("Pairing failed!"));
188 .contains("Completing the final authorization request failed. Please try the config flow again."));