]> git.basschouten.com Git - openhab-addons.git/blob
2fdb8e5e88c9f994d0201793bff0291d4945a496
[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;
14
15 import static org.junit.jupiter.api.Assertions.assertEquals;
16 import static org.mockito.ArgumentMatchers.anyString;
17 import static org.mockito.ArgumentMatchers.eq;
18 import static org.mockito.ArgumentMatchers.same;
19 import static org.mockito.Mockito.lenient;
20 import static org.mockito.Mockito.times;
21 import static org.mockito.Mockito.verify;
22
23 import java.util.concurrent.ExecutionException;
24 import java.util.concurrent.TimeoutException;
25
26 import javax.measure.quantity.Energy;
27 import javax.measure.quantity.Power;
28
29 import org.eclipse.jdt.annotation.NonNullByDefault;
30 import org.junit.jupiter.api.BeforeEach;
31 import org.junit.jupiter.api.Test;
32 import org.mockito.ArgumentCaptor;
33 import org.mockito.Captor;
34 import org.openhab.binding.boschshc.internal.exceptions.BoschSHCException;
35 import org.openhab.binding.boschshc.internal.services.powermeter.dto.PowerMeterServiceState;
36 import org.openhab.core.library.types.QuantityType;
37 import org.openhab.core.library.unit.Units;
38 import org.openhab.core.types.RefreshType;
39
40 import com.google.gson.JsonElement;
41 import com.google.gson.JsonParser;
42
43 /**
44  * Abstract unit test implementation for power switch handler with power meter support.
45  * 
46  * @author David Pace - Initial contribution
47  *
48  * @param <T> type of the handler to be tested
49  */
50 @NonNullByDefault
51 public abstract class AbstractPowerSwitchHandlerWithPowerMeterTest<T extends AbstractPowerSwitchHandlerWithPowerMeter>
52         extends AbstractPowerSwitchHandlerTest<T> {
53
54     private @Captor @NonNullByDefault({}) ArgumentCaptor<QuantityType<Power>> powerCaptor;
55
56     private @Captor @NonNullByDefault({}) ArgumentCaptor<QuantityType<Energy>> energyCaptor;
57
58     @BeforeEach
59     public void beforeEach() throws InterruptedException, TimeoutException, ExecutionException, BoschSHCException {
60         PowerMeterServiceState powerMeterServiceState = new PowerMeterServiceState();
61         powerMeterServiceState.powerConsumption = 12.34d;
62         powerMeterServiceState.energyConsumption = 56.78d;
63         lenient().when(getBridgeHandler().getState(anyString(), eq("PowerMeter"), same(PowerMeterServiceState.class)))
64                 .thenReturn(powerMeterServiceState);
65
66         super.beforeEach();
67     }
68
69     @Test
70     public void testUpdateChannelPowerMeterServiceState() {
71         JsonElement jsonObject = JsonParser.parseString("""
72                 {
73                   "@type": "powerMeterState",
74                   "powerConsumption": "23",
75                   "energyConsumption": 42
76                 }\
77                 """);
78         getFixture().processUpdate("PowerMeter", jsonObject);
79
80         // state is updated twice: via short poll in initialize() and via long poll result in this test
81         verify(getCallback(), times(2)).stateUpdated(
82                 eq(getChannelUID(BoschSHCBindingConstants.CHANNEL_POWER_CONSUMPTION)), powerCaptor.capture());
83         QuantityType<Power> powerValue = powerCaptor.getValue();
84         assertEquals(23, powerValue.intValue());
85
86         // state is updated twice: via short poll in initialize() and via long poll result in this test
87         verify(getCallback(), times(2)).stateUpdated(
88                 eq(getChannelUID(BoschSHCBindingConstants.CHANNEL_ENERGY_CONSUMPTION)), energyCaptor.capture());
89         QuantityType<Energy> energyValue = energyCaptor.getValue();
90         assertEquals(42, energyValue.intValue());
91     }
92
93     @Test
94     public void testHandleCommandRefreshPowerConsumptionChannel() {
95         getFixture().handleCommand(getChannelUID(BoschSHCBindingConstants.CHANNEL_POWER_CONSUMPTION),
96                 RefreshType.REFRESH);
97
98         // state is updated twice: via short poll in initialize() and via refresh command in this test
99         verify(getCallback(), times(2)).stateUpdated(getChannelUID(BoschSHCBindingConstants.CHANNEL_POWER_CONSUMPTION),
100                 new QuantityType<>(12.34d, Units.WATT));
101     }
102
103     @Test
104     public void testHandleCommandRefreshEnergyConsumptionChannel() {
105         getFixture().handleCommand(getChannelUID(BoschSHCBindingConstants.CHANNEL_ENERGY_CONSUMPTION),
106                 RefreshType.REFRESH);
107
108         // state is updated twice: via short poll in initialize() and via refresh command in this test
109         verify(getCallback(), times(2)).stateUpdated(getChannelUID(BoschSHCBindingConstants.CHANNEL_ENERGY_CONSUMPTION),
110                 new QuantityType<>(56.78d, Units.WATT_HOUR));
111     }
112 }