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.boschshc.internal.devices.bridge;
15 import static org.mockito.Mockito.*;
17 import java.util.List;
18 import java.util.UUID;
19 import java.util.concurrent.ExecutionException;
20 import java.util.concurrent.TimeoutException;
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.eclipse.jetty.client.api.ContentResponse;
24 import org.eclipse.jetty.client.api.Request;
25 import org.eclipse.jetty.http.HttpMethod;
26 import org.eclipse.jetty.http.HttpStatus;
27 import org.junit.jupiter.api.Test;
28 import org.junit.jupiter.api.extension.ExtendWith;
29 import org.junit.jupiter.params.ParameterizedTest;
30 import org.junit.jupiter.params.provider.MethodSource;
31 import org.mockito.junit.jupiter.MockitoExtension;
32 import org.openhab.binding.boschshc.internal.devices.bridge.dto.Scenario;
33 import org.openhab.binding.boschshc.internal.exceptions.BoschSHCException;
36 * Unit tests for {@link ScenarioHandler}.
38 * @author Patrick Gell - Initial contribution
42 @ExtendWith(MockitoExtension.class)
43 class ScenarioHandlerTest {
45 private final Scenario[] existingScenarios = List.of(
46 Scenario.createScenario(UUID.randomUUID().toString(), "Scenario 1",
47 String.valueOf(System.currentTimeMillis())),
48 Scenario.createScenario(UUID.randomUUID().toString(), "Scenario 2",
49 String.valueOf(System.currentTimeMillis()))
51 ).toArray(Scenario[]::new);
53 protected static Exception[] exceptionData() {
54 return List.of(new BoschSHCException(), new InterruptedException(), new TimeoutException(),
55 new ExecutionException(new BoschSHCException())).toArray(Exception[]::new);
58 protected static Exception[] httpExceptionData() {
60 .of(new InterruptedException(), new TimeoutException(), new ExecutionException(new BoschSHCException()))
61 .toArray(Exception[]::new);
65 void triggerScenarioShouldSendPOSTToBoschAPI() throws Exception {
67 final var httpClient = mock(BoschHttpClient.class);
68 final var request = mock(Request.class);
69 final var contentResponse = mock(ContentResponse.class);
70 when(httpClient.getBoschSmartHomeUrl(anyString())).thenReturn("http://localhost/smartHome/scenarios")
71 .thenReturn("http://localhost/smartHome/scenarios/1234/triggers");
72 when(httpClient.createRequest(anyString(), any(HttpMethod.class))).thenReturn(request).thenReturn(request);
73 when(httpClient.sendRequest(any(Request.class), any(), any(), any())).thenReturn(existingScenarios);
74 when(request.send()).thenReturn(contentResponse);
75 when(contentResponse.getStatus()).thenReturn(HttpStatus.OK_200);
77 final var handler = new ScenarioHandler();
80 handler.triggerScenario(httpClient, "Scenario 1");
83 verify(httpClient).getBoschSmartHomeUrl("scenarios");
84 verify(request).send();
88 void triggerScenarioShouldNoSendPOSTToScenarioNameDoesNotExist() throws Exception {
90 final var httpClient = mock(BoschHttpClient.class);
91 final var request = mock(Request.class);
92 when(httpClient.getBoschSmartHomeUrl(anyString())).thenReturn("http://localhost/smartHome/scenarios")
93 .thenReturn("http://localhost/smartHome/scenarios/1234/triggers");
94 when(httpClient.createRequest(anyString(), any(HttpMethod.class))).thenReturn(request).thenReturn(request);
95 when(httpClient.sendRequest(any(Request.class), any(), any(), any())).thenReturn(existingScenarios);
97 final var handler = new ScenarioHandler();
100 handler.triggerScenario(httpClient, "not existing Scenario");
103 verify(httpClient).getBoschSmartHomeUrl("scenarios");
104 verify(request, times(0)).send();
108 @MethodSource("exceptionData")
109 void triggerScenarioShouldNotPanicIfBoschAPIThrowsException(final Exception exception) throws Exception {
111 final var httpClient = mock(BoschHttpClient.class);
112 final var request = mock(Request.class);
113 when(httpClient.getBoschSmartHomeUrl(anyString())).thenReturn("http://localhost/smartHome/scenarios")
114 .thenReturn("http://localhost/smartHome/scenarios/1234/triggers");
115 when(httpClient.createRequest(anyString(), any(HttpMethod.class))).thenReturn(request);
116 when(httpClient.sendRequest(any(Request.class), any(), any(), any())).thenThrow(exception);
118 final var handler = new ScenarioHandler();
121 handler.triggerScenario(httpClient, "Scenario 1");
124 verify(httpClient).getBoschSmartHomeUrl("scenarios");
125 verify(request, times(0)).send();
129 void triggerScenarioShouldNotPanicIfPOSTIsNotSuccessful() throws Exception {
131 final var httpClient = mock(BoschHttpClient.class);
132 final var request = mock(Request.class);
133 final var contentResponse = mock(ContentResponse.class);
134 when(httpClient.getBoschSmartHomeUrl(anyString())).thenReturn("http://localhost/smartHome/scenarios")
135 .thenReturn("http://localhost/smartHome/scenarios/1234/triggers");
136 when(httpClient.createRequest(anyString(), any(HttpMethod.class))).thenReturn(request).thenReturn(request);
137 when(httpClient.sendRequest(any(Request.class), any(), any(), any())).thenReturn(existingScenarios);
138 when(request.send()).thenReturn(contentResponse);
139 when(contentResponse.getStatus()).thenReturn(HttpStatus.METHOD_NOT_ALLOWED_405);
141 final var handler = new ScenarioHandler();
144 handler.triggerScenario(httpClient, "Scenario 1");
147 verify(httpClient).getBoschSmartHomeUrl("scenarios");
148 verify(request).send();
152 @MethodSource("httpExceptionData")
153 void triggerScenarioShouldNotPanicIfPOSTThrowsException(final Exception exception) throws Exception {
155 final var httpClient = mock(BoschHttpClient.class);
156 final var request = mock(Request.class);
157 when(httpClient.getBoschSmartHomeUrl(anyString())).thenReturn("http://localhost/smartHome/scenarios")
158 .thenReturn("http://localhost/smartHome/scenarios/1234/triggers");
159 when(httpClient.createRequest(anyString(), any(HttpMethod.class))).thenReturn(request).thenReturn(request);
160 when(httpClient.sendRequest(any(Request.class), any(), any(), any())).thenReturn(existingScenarios);
161 when(request.send()).thenThrow(exception);
163 final var handler = new ScenarioHandler();
166 handler.triggerScenario(httpClient, "Scenario 1");
169 verify(httpClient).getBoschSmartHomeUrl("scenarios");
170 verify(request).send();