]> git.basschouten.com Git - openhab-addons.git/blob
5ca0f3b8e52430a64d69e9b9f09bf1c3b00bc87c
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2024 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.boschshc.internal.devices.bridge;
14
15 import static org.mockito.Mockito.*;
16
17 import java.util.List;
18 import java.util.UUID;
19 import java.util.concurrent.ExecutionException;
20 import java.util.concurrent.TimeoutException;
21
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;
34
35 /**
36  * Unit tests for {@link ScenarioHandler}.
37  *
38  * @author Patrick Gell - Initial contribution
39  *
40  */
41 @NonNullByDefault
42 @ExtendWith(MockitoExtension.class)
43 class ScenarioHandlerTest {
44
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()))
50
51     ).toArray(Scenario[]::new);
52
53     protected static Exception[] exceptionData() {
54         return List.of(new BoschSHCException(), new InterruptedException(), new TimeoutException(),
55                 new ExecutionException(new BoschSHCException())).toArray(Exception[]::new);
56     }
57
58     protected static Exception[] httpExceptionData() {
59         return List
60                 .of(new InterruptedException(), new TimeoutException(), new ExecutionException(new BoschSHCException()))
61                 .toArray(Exception[]::new);
62     }
63
64     @Test
65     void triggerScenarioShouldSendPOSTToBoschAPI() throws Exception {
66         // GIVEN
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);
76
77         final var handler = new ScenarioHandler();
78
79         // WHEN
80         handler.triggerScenario(httpClient, "Scenario 1");
81
82         // THEN
83         verify(httpClient).getBoschSmartHomeUrl("scenarios");
84         verify(request).send();
85     }
86
87     @Test
88     void triggerScenarioShouldNoSendPOSTToScenarioNameDoesNotExist() throws Exception {
89         // GIVEN
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);
96
97         final var handler = new ScenarioHandler();
98
99         // WHEN
100         handler.triggerScenario(httpClient, "not existing Scenario");
101
102         // THEN
103         verify(httpClient).getBoschSmartHomeUrl("scenarios");
104         verify(request, times(0)).send();
105     }
106
107     @ParameterizedTest
108     @MethodSource("exceptionData")
109     void triggerScenarioShouldNotPanicIfBoschAPIThrowsException(final Exception exception) throws Exception {
110         // GIVEN
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);
117
118         final var handler = new ScenarioHandler();
119
120         // WHEN
121         handler.triggerScenario(httpClient, "Scenario 1");
122
123         // THEN
124         verify(httpClient).getBoschSmartHomeUrl("scenarios");
125         verify(request, times(0)).send();
126     }
127
128     @Test
129     void triggerScenarioShouldNotPanicIfPOSTIsNotSuccessful() throws Exception {
130         // GIVEN
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);
140
141         final var handler = new ScenarioHandler();
142
143         // WHEN
144         handler.triggerScenario(httpClient, "Scenario 1");
145
146         // THEN
147         verify(httpClient).getBoschSmartHomeUrl("scenarios");
148         verify(request).send();
149     }
150
151     @ParameterizedTest
152     @MethodSource("httpExceptionData")
153     void triggerScenarioShouldNotPanicIfPOSTThrowsException(final Exception exception) throws Exception {
154         // GIVEN
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);
162
163         final var handler = new ScenarioHandler();
164
165         // WHEN
166         handler.triggerScenario(httpClient, "Scenario 1");
167
168         // THEN
169         verify(httpClient).getBoschSmartHomeUrl("scenarios");
170         verify(request).send();
171     }
172 }