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.*;
16 import static org.mockito.ArgumentMatchers.*;
17 import static org.mockito.Mockito.*;
18 import static org.openhab.binding.mielecloud.internal.util.ReflectionUtil.setPrivate;
20 import java.util.Objects;
21 import java.util.Optional;
22 import java.util.concurrent.CompletableFuture;
23 import java.util.concurrent.ExecutionException;
24 import java.util.concurrent.TimeoutException;
26 import org.eclipse.jdt.annotation.NonNullByDefault;
27 import org.junit.jupiter.api.Test;
28 import org.openhab.binding.mielecloud.internal.MieleCloudBindingConstants;
29 import org.openhab.binding.mielecloud.internal.auth.OAuthTokenRefresher;
30 import org.openhab.binding.mielecloud.internal.config.MieleCloudConfigService;
31 import org.openhab.binding.mielecloud.internal.util.AbstractConfigFlowTest;
32 import org.openhab.binding.mielecloud.internal.util.MieleCloudBindingIntegrationTestConstants;
33 import org.openhab.binding.mielecloud.internal.util.Website;
34 import org.openhab.core.config.discovery.inbox.Inbox;
35 import org.openhab.core.thing.Thing;
36 import org.openhab.core.thing.ThingRegistry;
37 import org.openhab.core.thing.binding.ThingHandler;
40 * @author Björn Lange - Initial Contribution
43 public class CreateBridgeServletTest extends AbstractConfigFlowTest {
44 private void whenBridgeCreationFailsThenAWarningIsShownOnTheSuccessPage(
45 CompletableFuture<Boolean> addInboxEntryResult) throws Exception {
47 MieleCloudConfigService configService = getService(MieleCloudConfigService.class);
48 assertNotNull(configService);
50 CreateBridgeServlet createBridgeServlet = configService.getCreateBridgeServlet();
51 assertNotNull(createBridgeServlet);
53 ThingRegistry thingRegistry = mock(ThingRegistry.class);
54 when(thingRegistry.get(MieleCloudBindingIntegrationTestConstants.BRIDGE_THING_UID)).thenReturn(null);
55 setPrivate(Objects.requireNonNull(createBridgeServlet), "thingRegistry", thingRegistry);
57 Inbox inbox = mock(Inbox.class);
58 when(inbox.add(any())).thenReturn(addInboxEntryResult);
59 setPrivate(Objects.requireNonNull(createBridgeServlet), "inbox", inbox);
62 Website website = getCrawler().doGetRelative("/mielecloud/createBridgeThing?"
63 + CreateBridgeServlet.BRIDGE_UID_PARAMETER_NAME + "="
64 + MieleCloudBindingIntegrationTestConstants.BRIDGE_THING_UID.getAsString() + "&"
65 + CreateBridgeServlet.EMAIL_PARAMETER_NAME + "=" + MieleCloudBindingIntegrationTestConstants.EMAIL);
68 assertTrue(website.contains("Pairing successful!"));
69 assertTrue(website.contains(
70 "Could not auto configure the bridge. Failed to approve the bridge from the inbox. Please try the configuration flow again."));
74 public void whenBridgeCreationFailsBecauseInboxEntryCannotBeAddedThenAWarningIsShownOnTheSuccessPage()
76 whenBridgeCreationFailsThenAWarningIsShownOnTheSuccessPage(CompletableFuture.completedFuture(false));
80 public void whenBridgeCreationFailsBecauseInboxEntryAddResultIsNullThenAWarningIsShownOnTheSuccessPage()
82 whenBridgeCreationFailsThenAWarningIsShownOnTheSuccessPage(CompletableFuture.completedFuture(null));
85 @SuppressWarnings("unchecked")
86 private CompletableFuture<Boolean> mockBooleanResultCompletableFuture() {
87 return mock(CompletableFuture.class);
91 public void whenBridgeCreationFailBecauseInboxEntryCreationIsInterruptedThenAWarningIsShownOnTheSuccessPage()
93 CompletableFuture<Boolean> future = mockBooleanResultCompletableFuture();
94 when(future.get(anyLong(), any())).thenThrow(new InterruptedException());
96 whenBridgeCreationFailsThenAWarningIsShownOnTheSuccessPage(future);
100 public void whenBridgeCreationFailBecauseInboxEntryCreationFailsThenAWarningIsShownOnTheSuccessPage()
102 CompletableFuture<Boolean> future = mockBooleanResultCompletableFuture();
103 when(future.get(anyLong(), any())).thenThrow(new ExecutionException(new NullPointerException()));
105 whenBridgeCreationFailsThenAWarningIsShownOnTheSuccessPage(future);
109 public void whenBridgeCreationFailBecauseInboxEntryCreationTimesOutThenAWarningIsShownOnTheSuccessPage()
111 CompletableFuture<Boolean> future = mockBooleanResultCompletableFuture();
112 when(future.get(anyLong(), any())).thenThrow(new TimeoutException());
114 whenBridgeCreationFailsThenAWarningIsShownOnTheSuccessPage(future);
118 public void whenBridgeCreationFailBecauseInboxApprovalFailsThenAWarningIsShownOnTheSuccessPage() throws Exception {
120 MieleCloudConfigService configService = getService(MieleCloudConfigService.class);
121 assertNotNull(configService);
123 CreateBridgeServlet createBridgeServlet = configService.getCreateBridgeServlet();
124 assertNotNull(createBridgeServlet);
126 ThingRegistry thingRegistry = mock(ThingRegistry.class);
127 when(thingRegistry.get(MieleCloudBindingIntegrationTestConstants.BRIDGE_THING_UID)).thenReturn(null);
128 setPrivate(Objects.requireNonNull(createBridgeServlet), "thingRegistry", thingRegistry);
130 Inbox inbox = mock(Inbox.class);
131 when(inbox.add(any())).thenReturn(CompletableFuture.completedFuture(true));
132 when(inbox.approve(any(), anyString(), anyString())).thenReturn(null);
133 setPrivate(Objects.requireNonNull(createBridgeServlet), "inbox", inbox);
136 Website website = getCrawler().doGetRelative("/mielecloud/createBridgeThing?"
137 + CreateBridgeServlet.BRIDGE_UID_PARAMETER_NAME + "="
138 + MieleCloudBindingIntegrationTestConstants.BRIDGE_THING_UID.getAsString() + "&"
139 + CreateBridgeServlet.EMAIL_PARAMETER_NAME + "=" + MieleCloudBindingIntegrationTestConstants.EMAIL);
142 assertTrue(website.contains("Pairing successful!"));
143 assertTrue(website.contains(
144 "Could not auto configure the bridge. Failed to approve the bridge from the inbox. Please try the configuration flow again."));
148 public void whenBridgeReconfigurationFailsDueToMissingBridgeHandlerThenAWarningIsShownOnTheSuccessPage()
151 MieleCloudConfigService configService = getService(MieleCloudConfigService.class);
152 assertNotNull(configService);
154 CreateBridgeServlet createBridgeServlet = configService.getCreateBridgeServlet();
155 assertNotNull(createBridgeServlet);
157 Inbox inbox = mock(Inbox.class);
158 setPrivate(Objects.requireNonNull(createBridgeServlet), "inbox", inbox);
160 Thing bridge = mock(Thing.class);
161 when(bridge.getHandler()).thenReturn(null);
163 ThingRegistry thingRegistry = mock(ThingRegistry.class);
164 when(thingRegistry.get(any())).thenReturn(bridge);
165 setPrivate(Objects.requireNonNull(createBridgeServlet), "thingRegistry", thingRegistry);
168 Website website = getCrawler().doGetRelative("/mielecloud/createBridgeThing?"
169 + CreateBridgeServlet.BRIDGE_UID_PARAMETER_NAME + "="
170 + MieleCloudBindingIntegrationTestConstants.BRIDGE_THING_UID.getAsString() + "&"
171 + CreateBridgeServlet.EMAIL_PARAMETER_NAME + "=" + MieleCloudBindingIntegrationTestConstants.EMAIL);
174 assertTrue(website.contains("Pairing successful!"));
175 assertTrue(website.contains(
176 "Could not auto reconfigure the bridge. Bridge thing or thing handler is not available. Please try the configuration flow again."));
180 public void whenBridgeIsReconfiguredThenTheConfigurationParametersAreUpdatedAndTheOverviewPageIsDisplayed()
185 MieleCloudConfigService configService = getService(MieleCloudConfigService.class);
186 assertNotNull(configService);
188 CreateBridgeServlet createBridgeServlet = configService.getCreateBridgeServlet();
189 assertNotNull(createBridgeServlet);
191 OAuthTokenRefresher tokenRefresher = mock(OAuthTokenRefresher.class);
192 when(tokenRefresher.getAccessTokenFromStorage(anyString()))
193 .thenReturn(Optional.of(MieleCloudBindingIntegrationTestConstants.ALTERNATIVE_ACCESS_TOKEN));
195 Thing bridge = getThingRegistry().get(MieleCloudBindingIntegrationTestConstants.BRIDGE_THING_UID);
196 assertNotNull(bridge);
197 ThingHandler bridgeHandler = bridge.getHandler();
198 assertNotNull(bridgeHandler);
199 setPrivate(Objects.requireNonNull(bridgeHandler), "tokenRefresher", tokenRefresher);
202 Website website = getCrawler().doGetRelative("/mielecloud/createBridgeThing?"
203 + CreateBridgeServlet.BRIDGE_UID_PARAMETER_NAME + "="
204 + MieleCloudBindingIntegrationTestConstants.BRIDGE_THING_UID.getAsString() + "&"
205 + CreateBridgeServlet.EMAIL_PARAMETER_NAME + "=" + MieleCloudBindingIntegrationTestConstants.EMAIL);
208 assertTrue(website.contains("<li class=\"active\">Overview</li>"));
210 assertEquals(MieleCloudBindingIntegrationTestConstants.ALTERNATIVE_ACCESS_TOKEN,
211 bridge.getProperties().get(MieleCloudBindingConstants.PROPERTY_ACCESS_TOKEN));
215 public void whenNoBridgeUidIsPassedToBridgeCreationThenTheBrowserIsRedirectedToTheFailurePageAndAnErrorIsShown()
218 Website website = getCrawler().doGetRelative("/mielecloud/createBridgeThing?"
219 + CreateBridgeServlet.EMAIL_PARAMETER_NAME + "=" + MieleCloudBindingIntegrationTestConstants.EMAIL);
222 assertTrue(website.contains("Pairing failed!"));
223 assertTrue(website.contains("Missing bridge UID."));
227 public void whenAnEmptyBridgeUidIsPassedToBridgeCreationThenTheBrowserIsRedirectedToTheFailurePageAndAnErrorIsShown()
230 Website website = getCrawler().doGetRelative("/mielecloud/createBridgeThing?"
231 + CreateBridgeServlet.BRIDGE_UID_PARAMETER_NAME + "=&" + CreateBridgeServlet.EMAIL_PARAMETER_NAME + "="
232 + MieleCloudBindingIntegrationTestConstants.EMAIL);
235 assertTrue(website.contains("Pairing failed!"));
236 assertTrue(website.contains("Missing bridge UID."));
240 public void whenAMalformedBridgeUidIsPassedToBridgeCreationThenTheBrowserIsRedirectedToTheFailurePageAndAnErrorIsShown()
243 Website website = getCrawler().doGetRelative("/mielecloud/createBridgeThing?"
244 + CreateBridgeServlet.BRIDGE_UID_PARAMETER_NAME + "=gen!e!sis&"
245 + CreateBridgeServlet.EMAIL_PARAMETER_NAME + "=" + MieleCloudBindingIntegrationTestConstants.EMAIL);
248 assertTrue(website.contains("Pairing failed!"));
249 assertTrue(website.contains("Malformed bridge UID."));
253 public void whenNoEmailIsPassedToBridgeCreationThenTheBrowserIsRedirectedToTheFailurePageAndAnErrorIsShown()
256 Website website = getCrawler()
257 .doGetRelative("/mielecloud/createBridgeThing?" + CreateBridgeServlet.BRIDGE_UID_PARAMETER_NAME + "="
258 + MieleCloudBindingIntegrationTestConstants.BRIDGE_THING_UID.getAsString());
261 assertTrue(website.contains("Pairing failed!"));
262 assertTrue(website.contains("Missing e-mail address."));
266 public void whenAnEmptyEmailIsPassedToBridgeCreationThenTheBrowserIsRedirectedToTheFailurePageAndAnErrorIsShown()
269 Website website = getCrawler()
270 .doGetRelative("/mielecloud/createBridgeThing?" + CreateBridgeServlet.BRIDGE_UID_PARAMETER_NAME + "="
271 + MieleCloudBindingIntegrationTestConstants.BRIDGE_THING_UID.getAsString() + "&"
272 + CreateBridgeServlet.EMAIL_PARAMETER_NAME + "=");
275 assertTrue(website.contains("Pairing failed!"));
276 assertTrue(website.contains("Missing e-mail address."));